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.
|
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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue