12 Commits

Author SHA1 Message Date
Lerking 34c7927601 Merge pull request '0.3.0' (#33) from 0.3.0 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/33
2025-03-28 17:23:38 +00:00
Lerking ebf31756b5 #31 Done. /JL 2025-03-28 18:22:16 +01:00
Lerking 406c1b77ed #31 - Creating thread with callback, on pre_load(). /JL 2025-03-28 17:26:58 +01:00
Lerking 1be429c5cd Update xtendr/xtendrsystem.py 2025-03-27 20:33:19 +00:00
Lerking a093b3f56c Update plugins/example_plugin/example_plugin.py 2025-03-27 20:31:12 +00:00
Lerking 1dc0c81d84 Update plugins/example_plugin/example_plugin.py 2025-03-27 20:30:23 +00:00
Lerking 3e38cabf81 Update xtendr/xtendrsystem.py 2025-03-27 20:25:12 +00:00
Lerking 63f649af25 #31 Added **self.use_pre_load:bool = False** and pre_load() method. 2025-03-27 19:30:41 +00:00
Lerking b6efe1b1df Update xtendr/xtendrbase.py
#31 Added pre_load() method
2025-03-27 19:23:59 +00:00
Lerking c5ee073d65 Update setup.py 2025-03-27 19:20:30 +00:00
Lerking 3bcf01dc26 Merge pull request '0.2.1 Updated to include keyword arguments in run() method. /JL' (#30) from 0.2.1 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/30
2025-03-27 09:47:53 +00:00
Jan Lerking dd5904c273 0.2.1 Updated to include keyword arguments in run() method. /JL 2025-03-27 10:46:05 +01:00
5 changed files with 41 additions and 10 deletions
+9 -2
View File
@@ -1,5 +1,9 @@
import time
from xtendr.xtendrsystem import XtendRSystem from xtendr.xtendrsystem import XtendRSystem
def my_callback():
print("'example_plugin is finished pre-loading")
if __name__ == "__main__": if __name__ == "__main__":
"""Example usage of the PluginSystem. """Example usage of the PluginSystem.
@@ -15,8 +19,11 @@ if __name__ == "__main__":
Detached plugin 'example_plugin'. Detached plugin 'example_plugin'.
""" """
system = XtendRSystem() 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
system.run("example_plugin", "Hello!") 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.stop("example_plugin")
system.run("example_plugin", 25) system.run("example_plugin", 25)
system.stop("example_plugin") system.stop("example_plugin")
+19 -4
View File
@@ -1,3 +1,5 @@
import threading
import time
from xtendr.xtendrbase import XtendRBase from xtendr.xtendrbase import XtendRBase
class ExamplePlugin(XtendRBase): class ExamplePlugin(XtendRBase):
@@ -13,12 +15,25 @@ class ExamplePlugin(XtendRBase):
>>> plugin.stop() >>> plugin.stop()
ExamplePlugin has stopped! ExamplePlugin has stopped!
""" """
def run(self, *args): def run(self, *args, **kwargs):
print(f"Passed arguments {len(args)}:") arglen = len(args)
for idx, a in enumerate(args): keylen = len(kwargs)
print(f"Argument {idx}: {a}") if arglen > 0:
print(f"Passed arguments {arglen}:")
for idx, a in enumerate(args):
print(f"Argument {idx}: {a}")
if keylen > 0:
print(f"Keyword arguments passed {keylen}")
if not "test" in kwargs:
raise ValueError("Didn't get expected 'test' keyword!")
for kw in kwargs:
print(f"Argument {kw}: {kwargs[kw]}")
print("ExamplePlugin is running!") print("ExamplePlugin is running!")
def stop(self): def stop(self):
print("ExamplePlugin has stopped!") print("ExamplePlugin has stopped!")
def pre_load(self, callback):
time.sleep(5) # Indicate long running pre-load.
callback()
+1 -1
View File
@@ -3,7 +3,7 @@ if __name__ == "__main__":
setup( setup(
name="XtendR", name="XtendR",
version="0.2.0", version="0.3.2",
packages=find_packages(), packages=find_packages(),
install_requires=[], install_requires=[],
author="Jan Lerking", author="Jan Lerking",
+6 -1
View File
@@ -17,9 +17,14 @@ class XtendRBase(ABC):
Stopping TestPlugin Stopping TestPlugin
""" """
@abstractmethod @abstractmethod
def run(self, *args): def run(self, *args, **kwargs):
pass pass
@abstractmethod @abstractmethod
def stop(self): def stop(self):
pass pass
@abstractmethod
def pre_load(self, *args):
pass
+6 -2
View File
@@ -2,9 +2,10 @@ import importlib
import sys import sys
import os import os
import json import json
import threading
from xtendr.xtendrbase import XtendRBase from xtendr.xtendrbase import XtendRBase
__version__ = "0.1.3" __version__ = "0.3.2"
class XtendRSystem: class XtendRSystem:
"""Plugin system to manage plugins. """Plugin system to manage plugins.
@@ -28,7 +29,7 @@ class XtendRSystem:
def version(self) -> str: def version(self) -> str:
return "XtendR v" + __version__ return "XtendR v" + __version__
def attach(self, name: str) -> None: def attach(self, name: str, callback) -> None:
"""Dynamically load a plugin from its folder.""" """Dynamically load a plugin from its folder."""
if name in self.plugins: if name in self.plugins:
print(f"Plugin '{name}' is already attached.") print(f"Plugin '{name}' is already attached.")
@@ -67,6 +68,9 @@ class XtendRSystem:
'autorun': False 'autorun': False
} }
print(f"Attached plugin '{name}'.") 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: except (ModuleNotFoundError, json.JSONDecodeError, AttributeError) as e:
print(f"Failed to attach plugin '{name}': {e}") print(f"Failed to attach plugin '{name}': {e}")