diff --git a/example.py b/example.py index ce3ed26..abee367 100644 --- a/example.py +++ b/example.py @@ -1,5 +1,9 @@ +import time from xtendr.xtendrsystem import XtendRSystem +def my_callback(): + print("'example_plugin is finished pre-loading") + if __name__ == "__main__": """Example usage of the PluginSystem. @@ -15,7 +19,8 @@ if __name__ == "__main__": Detached plugin 'example_plugin'. """ system = XtendRSystem() - system.attach("example_plugin") # Assuming 'example_plugin/plugin_info.json' exists + system.attach("example_plugin", my_callback) # Assuming 'example_plugin/plugin_info.json' exists + time.sleep(6) system.run("example_plugin", test="Hello!") system.stop("example_plugin") system.run("example_plugin", 25) diff --git a/plugins/example_plugin/example_plugin.py b/plugins/example_plugin/example_plugin.py index 27fb2a4..5524d68 100644 --- a/plugins/example_plugin/example_plugin.py +++ b/plugins/example_plugin/example_plugin.py @@ -1,4 +1,5 @@ import threading +import time from xtendr.xtendrbase import XtendRBase class ExamplePlugin(XtendRBase): @@ -14,9 +15,6 @@ class ExamplePlugin(XtendRBase): >>> plugin.stop() ExamplePlugin has stopped! """ - self.pre_load_done = threading.Event() - self.use_pre_load:bool = False #Indicate that pre-loading isn't neccessary - def run(self, *args, **kwargs): arglen = len(args) keylen = len(kwargs) @@ -36,5 +34,6 @@ class ExamplePlugin(XtendRBase): def stop(self): print("ExamplePlugin has stopped!") - def pre_load(self): - pass + def pre_load(self, callback): + time.sleep(5) # Indicate long running pre-load. + callback() diff --git a/xtendr/xtendrbase.py b/xtendr/xtendrbase.py index 21ee84d..3a85940 100644 --- a/xtendr/xtendrbase.py +++ b/xtendr/xtendrbase.py @@ -25,6 +25,6 @@ class XtendRBase(ABC): pass @abstractmethod - def pre_load(self): + def pre_load(self, *args): pass \ No newline at end of file diff --git a/xtendr/xtendrsystem.py b/xtendr/xtendrsystem.py index 6effe80..9232dc7 100644 --- a/xtendr/xtendrsystem.py +++ b/xtendr/xtendrsystem.py @@ -5,7 +5,7 @@ import json import threading from xtendr.xtendrbase import XtendRBase -__version__ = "0.1.3" +__version__ = "0.3.0" class XtendRSystem: """Plugin system to manage plugins. @@ -29,7 +29,7 @@ class XtendRSystem: def version(self) -> str: return "XtendR v" + __version__ - def attach(self, name: str) -> None: + def attach(self, name: str, callback) -> None: """Dynamically load a plugin from its folder.""" if name in self.plugins: print(f"Plugin '{name}' is already attached.") @@ -68,15 +68,12 @@ class XtendRSystem: 'autorun': False } print(f"Attached plugin '{name}'.") + print(f"Running pre-load on '{name}'.") + thread = threading.Thread(target=self.plugins[name].pre_load(), args=(callback,)) + thread.start() except (ModuleNotFoundError, json.JSONDecodeError, AttributeError) as e: print(f"Failed to attach plugin '{name}': {e}") - def _pre_load(self, name: str): - """Pre-load data if needed""" - if name in plugins: - if self.plugins[name].use_pre_load: # Is pre-loading neccessary? - threading.Thread(target=self.plugins[name].pre_load()).start() - def run(self, name: str, *args, **kwargs): """Run the plugin's 'run' method if available.""" if name in self.plugins: