Plugin system now support pre/post implementation init methods

This commit is contained in:
Gina Häußge 2015-06-19 11:09:08 +02:00
parent 9f4a74cca0
commit e55677da22

View file

@ -428,7 +428,9 @@ class PluginManager(object):
It is able to discover plugins both through possible file system locations as well as customizable entry points. It is able to discover plugins both through possible file system locations as well as customizable entry points.
""" """
def __init__(self, plugin_folders, plugin_types, plugin_entry_points, logging_prefix=None, plugin_disabled_list=None, plugin_restart_needing_hooks=None, plugin_obsolete_hooks=None, plugin_validators=None): def __init__(self, plugin_folders, plugin_types, plugin_entry_points, logging_prefix=None,
plugin_disabled_list=None, plugin_restart_needing_hooks=None, plugin_obsolete_hooks=None,
plugin_validators=None):
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
if logging_prefix is None: if logging_prefix is None:
@ -453,6 +455,8 @@ class PluginManager(object):
self.implementation_injects = dict() self.implementation_injects = dict()
self.implementation_inject_factories = [] self.implementation_inject_factories = []
self.implementation_pre_inits = []
self.implementation_post_inits = []
self.on_plugin_loaded = lambda *args, **kwargs: None self.on_plugin_loaded = lambda *args, **kwargs: None
self.on_plugin_unloaded = lambda *args, **kwargs: None self.on_plugin_unloaded = lambda *args, **kwargs: None
@ -849,27 +853,35 @@ class PluginManager(object):
return False return False
return hook in self.plugin_obsolete_hooks return hook in self.plugin_obsolete_hooks
def initialize_implementations(self, additional_injects=None, additional_inject_factories=None): def initialize_implementations(self, additional_injects=None, additional_inject_factories=None, additional_pre_inits=None, additional_post_inits=None):
for name, plugin in self.enabled_plugins.items(): for name, plugin in self.enabled_plugins.items():
self.initialize_implementation_of_plugin(name, plugin, self.initialize_implementation_of_plugin(name, plugin,
additional_injects=additional_injects, additional_injects=additional_injects,
additional_inject_factories=additional_inject_factories) additional_inject_factories=additional_inject_factories,
additional_pre_inits=additional_pre_inits,
additional_post_inits=additional_post_inits)
self.logger.info("Initialized {count} plugin(s)".format(count=len(self.plugin_implementations))) self.logger.info("Initialized {count} plugin(s)".format(count=len(self.plugin_implementations)))
def initialize_implementation_of_plugin(self, name, plugin, additional_injects=None, additional_inject_factories=None): def initialize_implementation_of_plugin(self, name, plugin, additional_injects=None, additional_inject_factories=None, additional_pre_inits=None, additional_post_inits=None):
if plugin.implementation is None: if plugin.implementation is None:
return return
return self.initialize_implementation(name, plugin, plugin.implementation, return self.initialize_implementation(name, plugin, plugin.implementation,
additional_injects=additional_injects, additional_injects=additional_injects,
additional_inject_factories=additional_inject_factories) additional_inject_factories=additional_inject_factories,
additional_pre_inits=additional_pre_inits,
additional_post_inits=additional_post_inits)
def initialize_implementation(self, name, plugin, implementation, additional_injects=None, additional_inject_factories=None): def initialize_implementation(self, name, plugin, implementation, additional_injects=None, additional_inject_factories=None, additional_pre_inits=None, additional_post_inits=None):
if additional_injects is None: if additional_injects is None:
additional_injects = dict() additional_injects = dict()
if additional_inject_factories is None: if additional_inject_factories is None:
additional_inject_factories = [] additional_inject_factories = []
if additional_pre_inits is None:
additional_pre_inits = []
if additional_post_inits is None:
additional_post_inits = []
injects = self.implementation_injects injects = self.implementation_injects
injects.update(additional_injects) injects.update(additional_injects)
@ -877,6 +889,12 @@ class PluginManager(object):
inject_factories = self.implementation_inject_factories inject_factories = self.implementation_inject_factories
inject_factories += additional_inject_factories inject_factories += additional_inject_factories
pre_inits = self.implementation_pre_inits
pre_inits += additional_pre_inits
post_inits = self.implementation_post_inits
post_inits += additional_post_inits
try: try:
kwargs = dict(injects) kwargs = dict(injects)
@ -904,8 +922,16 @@ class PluginManager(object):
for arg, value in return_value.items(): for arg, value in return_value.items():
setattr(implementation, "_" + arg, value) setattr(implementation, "_" + arg, value)
# execute any additional pre init methods
for pre_init in pre_inits:
pre_init(name, implementation)
implementation.initialize() implementation.initialize()
# execute any additional post init methods
for post_init in post_inits:
post_init(name, implementation)
except Exception as e: except Exception as e:
self._deactivate_plugin(name, plugin) self._deactivate_plugin(name, plugin)
plugin.enabled = False plugin.enabled = False