From 1ea10e293391b006e634105bd58d2728b756598b Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sat, 13 Nov 2021 18:32:28 +0100 Subject: [PATCH] show how to call methods on plugins --- raven/pluginregistry.py | 22 +++++++++++++++++----- raven/plugins/filterplugin.py | 3 +++ raven/plugins/logfileviewerplugin.py | 3 +++ raven/ravenlog.py | 5 ++--- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/raven/pluginregistry.py b/raven/pluginregistry.py index 28886f9..3acdb31 100644 --- a/raven/pluginregistry.py +++ b/raven/pluginregistry.py @@ -5,6 +5,7 @@ from pkgutil import iter_modules from pathlib import Path from os.path import dirname from importlib import import_module +from inspect import signature from raven.pluginbase import PluginBase @@ -29,27 +30,38 @@ class PluginRegistry(): @staticmethod def load_module(module_name: str) -> ModuleType: module_name = f"plugins.{module_name}" - # import the module and iterate through its attributes module = import_module(module_name) PluginRegistry.modules.append(module) return module @staticmethod - def load_plugin(plugin_name: str): + def load_plugin(plugin_name: str) -> PluginBase: module_name = f"plugins.{plugin_name.lower()}" module = import_module(module_name) if plugin_name in dir(module): plugin_class = getattr(module, plugin_name) if isclass(plugin_class) and issubclass(plugin_class, PluginBase): - PluginRegistry.register_plugin(plugin_name, plugin_class) - print("%s -> %s :: %s in %s" % (plugin_name, plugin_class, module_name, module)) + PluginRegistry.register_plugin(plugin_name, plugin_class()) return plugin_class + raise RuntimeError("plugin %s not found" % plugin_name) @staticmethod def get_modules() -> [ModuleType]: return PluginRegistry.modules.copy() @staticmethod - def get_plugins() -> [ModuleType]: + def get_plugins() -> [PluginBase]: return PluginRegistry.modules.copy() + + @staticmethod + def execute(function_name: str, *args): + for plugin in PluginRegistry.plugins.values(): + fun = getattr(plugin, function_name, None) + + sig = signature(fun) + if callable(fun): + if len(sig.parameters) != len(args): + raise RuntimeError("method %s.%s has wrong number of arguments. expected %s but was %s " % ( + plugin, function_name, len(args), len(sig.parameters))) + fun(args) diff --git a/raven/plugins/filterplugin.py b/raven/plugins/filterplugin.py index caade22..7564428 100644 --- a/raven/plugins/filterplugin.py +++ b/raven/plugins/filterplugin.py @@ -6,6 +6,9 @@ class FilterPlugin(PluginBase): super(FilterPlugin, self).__init__() print("init FilterPlugin") + def say_hello(self, arg: str): + print("FilterPlugin says hello %s" % arg) + def init(): print("initializing filter plugin") diff --git a/raven/plugins/logfileviewerplugin.py b/raven/plugins/logfileviewerplugin.py index fecbc12..fa9406c 100644 --- a/raven/plugins/logfileviewerplugin.py +++ b/raven/plugins/logfileviewerplugin.py @@ -5,3 +5,6 @@ class LogFileViewerPlugin(PluginBase): def __init__(self): super(LogFileViewerPlugin, self).__init__() print("init LogFileViewerPlugin") + + def say_hello(self, *args): + print("LogFileViewerPlugin says hello") diff --git a/raven/ravenlog.py b/raven/ravenlog.py index 5ce3fab..229c93e 100644 --- a/raven/ravenlog.py +++ b/raven/ravenlog.py @@ -63,10 +63,9 @@ def set_window_icon(app: QApplication): if __name__ == "__main__": filterplugin = PluginRegistry.load_plugin("FilterPlugin") - filterplugin() - logfileviewerplugin = PluginRegistry.load_plugin("LogFileViewerPlugin") - logfileviewerplugin() + + PluginRegistry.execute("say_hello", "World") app = QApplication(sys.argv) set_window_icon(app)