qubes/ext: convert extensions to singletons

From now the extensions are instantiated once. They no longer have .app
attribute, but can access it from event handlers via vm.app.
このコミットが含まれているのは:
Wojtek Porczyk 2016-04-11 14:52:01 +02:00 committed by Marek Marczykowski-Górecki
コミット 540942de47
この署名に対応する既知のキーがデータベースに存在しません
GPGキーID: 063938BA42CFA724
2個のファイルの変更23行の追加18行の削除

ファイルの表示

@ -1186,9 +1186,7 @@ class Qubes(PropertyHolder):
#: logger instance for logging global messages
self.log = logging.getLogger('app')
# pylint: disable=no-member
self.extensions = set(ext.load()(self)
for ext in pkg_resources.iter_entry_points('qubes.ext'))
self._extensions = qubes.ext.get_extensions()
#: collection of all VMs managed by this Qubes instance
self.domains = VMCollection(self)

ファイルの表示

@ -29,20 +29,20 @@ some systems. They may be OS- or architecture-dependent or custom-developed for
particular customer.
'''
import pkg_resources
import qubes.events
class Extension(object):
'''Base class for all extensions
:param qubes.Qubes app: application object
''' # pylint: disable=too-few-public-methods
def __init__(self, app):
self.app = app
def __new__(cls):
if '_instance' not in cls.__dict__:
cls._instance = super(Extension, cls).__new__(cls)
for name in dir(self):
attr = getattr(self, name)
for name in cls.__dict__:
attr = getattr(cls._instance, name)
if not qubes.events.ishandler(attr):
continue
@ -52,7 +52,14 @@ class Extension(object):
else:
# global hook
for event in attr.ha_events:
self.app.add_handler(event, attr)
qubes.Qubes.add_handler(event, attr)
return cls._instance
def get_extensions():
return set(ext.load()()
for ext in pkg_resources.iter_entry_points('qubes.ext'))
def handler(*events, **kwargs):