Plugin system now support pre/post implementation init methods
This commit is contained in:
parent
9f4a74cca0
commit
e55677da22
1 changed files with 32 additions and 6 deletions
|
|
@ -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.
|
||||
"""
|
||||
|
||||
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__)
|
||||
|
||||
if logging_prefix is None:
|
||||
|
|
@ -453,6 +455,8 @@ class PluginManager(object):
|
|||
|
||||
self.implementation_injects = dict()
|
||||
self.implementation_inject_factories = []
|
||||
self.implementation_pre_inits = []
|
||||
self.implementation_post_inits = []
|
||||
|
||||
self.on_plugin_loaded = lambda *args, **kwargs: None
|
||||
self.on_plugin_unloaded = lambda *args, **kwargs: None
|
||||
|
|
@ -849,27 +853,35 @@ class PluginManager(object):
|
|||
return False
|
||||
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():
|
||||
self.initialize_implementation_of_plugin(name, plugin,
|
||||
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)))
|
||||
|
||||
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:
|
||||
return
|
||||
|
||||
return self.initialize_implementation(name, plugin, plugin.implementation,
|
||||
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:
|
||||
additional_injects = dict()
|
||||
if additional_inject_factories is None:
|
||||
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.update(additional_injects)
|
||||
|
|
@ -877,6 +889,12 @@ class PluginManager(object):
|
|||
inject_factories = self.implementation_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:
|
||||
kwargs = dict(injects)
|
||||
|
||||
|
|
@ -904,8 +922,16 @@ class PluginManager(object):
|
|||
for arg, value in return_value.items():
|
||||
setattr(implementation, "_" + arg, value)
|
||||
|
||||
# execute any additional pre init methods
|
||||
for pre_init in pre_inits:
|
||||
pre_init(name, implementation)
|
||||
|
||||
implementation.initialize()
|
||||
|
||||
# execute any additional post init methods
|
||||
for post_init in post_inits:
|
||||
post_init(name, implementation)
|
||||
|
||||
except Exception as e:
|
||||
self._deactivate_plugin(name, plugin)
|
||||
plugin.enabled = False
|
||||
|
|
|
|||
Loading…
Reference in a new issue