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.
このコミットが含まれているのは:
コミット
540942de47
@ -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):
|
||||
|
||||
読み込み中…
新しいイシューから参照
ユーザーをブロックする