From e55677da22f1bb668c5f35ee080f6063bf047116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Fri, 19 Jun 2015 11:09:08 +0200 Subject: [PATCH] Plugin system now support pre/post implementation init methods --- src/octoprint/plugin/core.py | 38 ++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/octoprint/plugin/core.py b/src/octoprint/plugin/core.py index d5c59bd9..55973c2c 100644 --- a/src/octoprint/plugin/core.py +++ b/src/octoprint/plugin/core.py @@ -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