From b99421e8e73b51e2feb3f035b52344a4aed42eab Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sat, 12 Mar 2022 08:28:09 +0100 Subject: [PATCH] add copy to ZonedPluginRegistry --- src/pluginbase.py | 10 ++++++++++ src/pluginregistry.py | 10 +++++++++- src/zonedpluginregistry.py | 30 +++++++++++++++++++++++++++--- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/pluginbase.py b/src/pluginbase.py index 58eae01..7754009 100644 --- a/src/pluginbase.py +++ b/src/pluginbase.py @@ -1,4 +1,14 @@ +from abc import abstractmethod + class PluginBase(): def __init__(self): pass + + @abstractmethod + def copy(self): + """ + Subclasses that use state must implement this method and return a new instance of themselves. + :return: + """ + return self diff --git a/src/pluginregistry.py b/src/pluginregistry.py index dcc92bd..85a8634 100644 --- a/src/pluginregistry.py +++ b/src/pluginregistry.py @@ -8,7 +8,7 @@ from src.zonedpluginregistry import ZonedPluginRegistry class PluginRegistry(): - plugins = ZonedPluginRegistry({}) + plugins = ZonedPluginRegistry() @staticmethod def load_plugin(plugin_name: str): @@ -22,6 +22,10 @@ class PluginRegistry(): return raise RuntimeError("plugin %s not found" % plugin_name) + @staticmethod + def create_zoned_plugin_registry(): + return PluginRegistry.plugins.copy() + @staticmethod def execute_single(function_name: str, *args) -> Optional[any]: return PluginRegistry.plugins.execute_single(function_name, *args) @@ -29,3 +33,7 @@ class PluginRegistry(): @staticmethod def execute(function_name: str, *args) -> [any]: return PluginRegistry.plugins.execute(function_name, *args) + + @staticmethod + def execute_flat_map(function_name: str, *args) -> [any]: + return PluginRegistry.plugins.execute_flat_map(function_name, *args) diff --git a/src/zonedpluginregistry.py b/src/zonedpluginregistry.py index 72b51a6..9c35e00 100644 --- a/src/zonedpluginregistry.py +++ b/src/zonedpluginregistry.py @@ -1,23 +1,47 @@ +from functools import reduce from inspect import signature -from typing import Dict, Optional +from typing import Dict, Optional, List from src.pluginbase import PluginBase +def flat_map(array: List[List]) -> List: + return reduce(list.__add__, array) + + class ZonedPluginRegistry: - def __init__(self, plugins: Dict[str, PluginBase]): - self.plugins: Dict[str, PluginBase] = plugins + def __init__(self): + self.plugins: Dict[str, PluginBase] = {} def register_plugin(self, name: str, plugin: PluginBase): self.plugins[name] = plugin + def copy(self): + result = ZonedPluginRegistry() + for name in self.plugins.keys(): + plugin = self.plugins[name].copy() + result.register_plugin(name, plugin) + + return result + def execute_single(self, function_name: str, *args) -> Optional[any]: return self._execute(function_name, True, *args) def execute(self, function_name: str, *args) -> [any]: return self._execute(function_name, False, *args) + def execute_flat_map(self, function_name: str, *args) -> [any]: + return flat_map(self.execute(function_name, *args)) + + def execute_remove_falsy(self, function_name: str, *args) -> [any]: + result = self.execute(function_name, *args) + return [r for r in result if r] + + def execute_flat_map_remove_falsy(self, function_name: str, *args) -> [any]: + result = flat_map(self.execute(function_name, *args)) + return [r for r in result if r] + def _execute(self, function_name: str, return_first: bool, *args) -> []: result = [] for plugin in self.plugins.values():