From c5ee073d65139e9e01428519ff13097e1ff4a603 Mon Sep 17 00:00:00 2001 From: Lerking Date: Thu, 27 Mar 2025 19:20:30 +0000 Subject: [PATCH 1/9] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 302cc2b..f2f6536 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ if __name__ == "__main__": setup( name="XtendR", - version="0.2.1", + version="0.3.0", packages=find_packages(), install_requires=[], author="Jan Lerking", From b6efe1b1df007219bdcaa08cdf1a25252f0e46ef Mon Sep 17 00:00:00 2001 From: Lerking Date: Thu, 27 Mar 2025 19:23:59 +0000 Subject: [PATCH 2/9] Update xtendr/xtendrbase.py #31 Added pre_load() method --- xtendr/xtendrbase.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xtendr/xtendrbase.py b/xtendr/xtendrbase.py index d5c9234..21ee84d 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): + pass + \ No newline at end of file From 63f649af25e70a9d3c9e84eee91e4a8a360a2d11 Mon Sep 17 00:00:00 2001 From: Lerking Date: Thu, 27 Mar 2025 19:30:41 +0000 Subject: [PATCH 3/9] #31 Added **self.use_pre_load:bool = False** and pre_load() method. --- plugins/example_plugin/example_plugin.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/example_plugin/example_plugin.py b/plugins/example_plugin/example_plugin.py index 0dbef91..9f630c9 100644 --- a/plugins/example_plugin/example_plugin.py +++ b/plugins/example_plugin/example_plugin.py @@ -13,6 +13,8 @@ class ExamplePlugin(XtendRBase): >>> plugin.stop() ExamplePlugin has stopped! """ + self.use_pre_load:bool = False #Indicate that pre-loading isn't neccessary + def run(self, *args, **kwargs): arglen = len(args) keylen = len(kwargs) @@ -31,3 +33,6 @@ class ExamplePlugin(XtendRBase): def stop(self): print("ExamplePlugin has stopped!") + + def pre_load(self): + pass From 3e38cabf81070ff39d12f2130a05d00c2522e818 Mon Sep 17 00:00:00 2001 From: Lerking Date: Thu, 27 Mar 2025 20:25:12 +0000 Subject: [PATCH 4/9] Update xtendr/xtendrsystem.py --- xtendr/xtendrsystem.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xtendr/xtendrsystem.py b/xtendr/xtendrsystem.py index b6de8ef..5d4273f 100644 --- a/xtendr/xtendrsystem.py +++ b/xtendr/xtendrsystem.py @@ -70,6 +70,12 @@ class XtendRSystem: 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? + self.plugins[name].pre_load() + def run(self, name: str, *args, **kwargs): """Run the plugin's 'run' method if available.""" if name in self.plugins: From 1dc0c81d84c2098572ee2765208b9a4b51bc43ac Mon Sep 17 00:00:00 2001 From: Lerking Date: Thu, 27 Mar 2025 20:30:23 +0000 Subject: [PATCH 5/9] Update plugins/example_plugin/example_plugin.py --- plugins/example_plugin/example_plugin.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/example_plugin/example_plugin.py b/plugins/example_plugin/example_plugin.py index 9f630c9..90046e6 100644 --- a/plugins/example_plugin/example_plugin.py +++ b/plugins/example_plugin/example_plugin.py @@ -1,3 +1,4 @@ +import threading from xtendr.xtendrbase import XtendRBase class ExamplePlugin(XtendRBase): @@ -13,6 +14,7 @@ class ExamplePlugin(XtendRBase): >>> plugin.stop() ExamplePlugin has stopped! """ + self.pre_load_done = threading. self.use_pre_load:bool = False #Indicate that pre-loading isn't neccessary def run(self, *args, **kwargs): From a093b3f56cf16666ec5784651636ff5a742e4eea Mon Sep 17 00:00:00 2001 From: Lerking Date: Thu, 27 Mar 2025 20:31:12 +0000 Subject: [PATCH 6/9] Update plugins/example_plugin/example_plugin.py --- plugins/example_plugin/example_plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/example_plugin/example_plugin.py b/plugins/example_plugin/example_plugin.py index 90046e6..27fb2a4 100644 --- a/plugins/example_plugin/example_plugin.py +++ b/plugins/example_plugin/example_plugin.py @@ -14,7 +14,7 @@ class ExamplePlugin(XtendRBase): >>> plugin.stop() ExamplePlugin has stopped! """ - self.pre_load_done = threading. + self.pre_load_done = threading.Event() self.use_pre_load:bool = False #Indicate that pre-loading isn't neccessary def run(self, *args, **kwargs): From 1be429c5cdb76edd99f98b63f3d84469ec38e702 Mon Sep 17 00:00:00 2001 From: Lerking Date: Thu, 27 Mar 2025 20:33:19 +0000 Subject: [PATCH 7/9] Update xtendr/xtendrsystem.py --- xtendr/xtendrsystem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xtendr/xtendrsystem.py b/xtendr/xtendrsystem.py index 5d4273f..6effe80 100644 --- a/xtendr/xtendrsystem.py +++ b/xtendr/xtendrsystem.py @@ -2,6 +2,7 @@ import importlib import sys import os import json +import threading from xtendr.xtendrbase import XtendRBase __version__ = "0.1.3" @@ -74,7 +75,7 @@ class XtendRSystem: """Pre-load data if needed""" if name in plugins: if self.plugins[name].use_pre_load: # Is pre-loading neccessary? - self.plugins[name].pre_load() + threading.Thread(target=self.plugins[name].pre_load()).start() def run(self, name: str, *args, **kwargs): """Run the plugin's 'run' method if available.""" From 406c1b77edb54f464c8e052c7de78e89535c0946 Mon Sep 17 00:00:00 2001 From: Jan Lerking Date: Fri, 28 Mar 2025 17:26:58 +0100 Subject: [PATCH 8/9] #31 - Creating thread with callback, on pre_load(). /JL --- example.py | 7 ++++++- plugins/example_plugin/example_plugin.py | 9 ++++----- xtendr/xtendrbase.py | 2 +- xtendr/xtendrsystem.py | 13 +++++-------- 4 files changed, 16 insertions(+), 15 deletions(-) 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: From ebf31756b5d7d53c8929abc00f024d19c82442f6 Mon Sep 17 00:00:00 2001 From: Jan Lerking Date: Fri, 28 Mar 2025 18:22:16 +0100 Subject: [PATCH 9/9] #31 Done. /JL --- example.py | 4 +++- setup.py | 2 +- xtendr/xtendrsystem.py | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/example.py b/example.py index abee367..ec70d95 100644 --- a/example.py +++ b/example.py @@ -20,7 +20,9 @@ if __name__ == "__main__": """ system = XtendRSystem() system.attach("example_plugin", my_callback) # Assuming 'example_plugin/plugin_info.json' exists - time.sleep(6) + 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/setup.py b/setup.py index f2f6536..a07cced 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ if __name__ == "__main__": setup( name="XtendR", - version="0.3.0", + version="0.3.2", packages=find_packages(), install_requires=[], author="Jan Lerking", diff --git a/xtendr/xtendrsystem.py b/xtendr/xtendrsystem.py index 9232dc7..e01cef4 100644 --- a/xtendr/xtendrsystem.py +++ b/xtendr/xtendrsystem.py @@ -5,7 +5,7 @@ import json import threading from xtendr.xtendrbase import XtendRBase -__version__ = "0.3.0" +__version__ = "0.3.2" class XtendRSystem: """Plugin system to manage plugins. @@ -69,7 +69,7 @@ class XtendRSystem: } print(f"Attached plugin '{name}'.") print(f"Running pre-load on '{name}'.") - thread = threading.Thread(target=self.plugins[name].pre_load(), args=(callback,)) + 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}")