add copy to ZonedPluginRegistry

This commit is contained in:
2022-03-12 08:28:09 +01:00
parent edb264dbf5
commit b99421e8e7
3 changed files with 46 additions and 4 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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():