diff --git a/example.py b/example.py index ce3ed26..ec70d95 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,10 @@ 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 + for i in range(3): + print(f"Main program is running iteration {i+1}...") + time.sleep(2) 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 0dbef91..5524d68 100644 --- a/plugins/example_plugin/example_plugin.py +++ b/plugins/example_plugin/example_plugin.py @@ -1,3 +1,5 @@ +import threading +import time from xtendr.xtendrbase import XtendRBase class ExamplePlugin(XtendRBase): @@ -31,3 +33,7 @@ class ExamplePlugin(XtendRBase): def stop(self): print("ExamplePlugin has stopped!") + + def pre_load(self, callback): + time.sleep(5) # Indicate long running pre-load. + callback() diff --git a/setup.py b/setup.py index 302cc2b..a07cced 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ if __name__ == "__main__": setup( name="XtendR", - version="0.2.1", + version="0.3.2", packages=find_packages(), install_requires=[], author="Jan Lerking", diff --git a/xtendr/xtendrbase.py b/xtendr/xtendrbase.py index d5c9234..3a85940 100644 --- a/xtendr/xtendrbase.py +++ b/xtendr/xtendrbase.py @@ -23,3 +23,8 @@ class XtendRBase(ABC): @abstractmethod def stop(self): pass + + @abstractmethod + def pre_load(self, *args): + pass + \ No newline at end of file diff --git a/xtendr/xtendrsystem.py b/xtendr/xtendrsystem.py index b6de8ef..e01cef4 100644 --- a/xtendr/xtendrsystem.py +++ b/xtendr/xtendrsystem.py @@ -2,9 +2,10 @@ import importlib import sys import os import json +import threading from xtendr.xtendrbase import XtendRBase -__version__ = "0.1.3" +__version__ = "0.3.2" class XtendRSystem: """Plugin system to manage plugins. @@ -28,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.") @@ -67,6 +68,9 @@ class XtendRSystem: 'autorun': False } print(f"Attached plugin '{name}'.") + print(f"Running pre-load on '{name}'.") + thread = threading.Thread(target=self.plugins[name]['instance'].pre_load, args=(callback,)) + thread.start() except (ModuleNotFoundError, json.JSONDecodeError, AttributeError) as e: print(f"Failed to attach plugin '{name}': {e}")