8 Commits
Author SHA1 Message Date
Lerking dec115c596 Merge pull request 'v0.0.4' (#6) from v0.0.4 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/6
2025-02-24 05:57:57 +00:00
Lerking 591cc49933 Update README.md 2025-02-24 05:56:26 +00:00
Lerking 36807b7aa6 Update README.md 2025-02-24 05:55:53 +00:00
Lerking afc38c32b3 Update README.md 2025-02-24 05:41:13 +00:00
Lerking 798165c501 Update README.md 2025-02-24 05:40:54 +00:00
Lerking fc247d4888 Update README.md 2025-02-24 05:39:10 +00:00
Lerking 394f72d383 Update setup.py 2025-02-24 05:19:45 +00:00
Lerking f21433417d 0.0.3 2025-02-21 21:34:10 +01:00
8 changed files with 57 additions and 34 deletions
+15 -1
View File
@@ -1,3 +1,17 @@
# XtendR # XtendR
A python 3 extension system to ease the use of plugins. A very basic python 3 extension system to ease the use of plugins.
At the moment only 4 functions are available:
- Attach
- Run
- Stop
- Detach
Attach and Detach are used for registrering/unregistrering a module on the system.
The Run and Stop functions are mandatory in the plugin modules.
The system expects a folder called 'plugins', placed at the root, along side your main python file.
Each plugin should be placed in subfolders, named as the plugin, inside the 'plugins' folder.
The example.py along with the example_plugin.py/json shows the workings of this plugin system.
+2 -2
View File
@@ -1,4 +1,4 @@
from xtendr.xtendr import XtendR from xtendr.xtendrsystem import XtendRSystem
if __name__ == "__main__": if __name__ == "__main__":
"""Example usage of the PluginSystem. """Example usage of the PluginSystem.
@@ -14,7 +14,7 @@ if __name__ == "__main__":
>>> system.detach("example_plugin") >>> system.detach("example_plugin")
Detached plugin 'example_plugin'. Detached plugin 'example_plugin'.
""" """
system = XtendR() system = XtendRSystem()
system.attach("example_plugin") # Assuming 'example_plugin/plugin_info.json' exists system.attach("example_plugin") # Assuming 'example_plugin/plugin_info.json' exists
system.run("example_plugin") system.run("example_plugin")
system.stop("example_plugin") system.stop("example_plugin")
@@ -2,5 +2,6 @@
"name": "Example Plugin", "name": "Example Plugin",
"version": "1.0", "version": "1.0",
"module": "example_plugin", "module": "example_plugin",
"class": "ExamplePlugin",
"description": "An example plugin that prints a message." "description": "An example plugin that prints a message."
} }
@@ -1,4 +1,4 @@
from xtendr import XtendRBase from xtendr.xtendrbase import XtendRBase
class ExamplePlugin(XtendRBase): class ExamplePlugin(XtendRBase):
"""Example plugin implementation. """Example plugin implementation.
+2 -2
View File
@@ -3,13 +3,13 @@ if __name__ == "__main__":
setup( setup(
name="XtendR", name="XtendR",
version="0.0.1", version="0.0.4",
packages=find_packages(), packages=find_packages(),
install_requires=[], install_requires=[],
author="Jan Lerking", author="Jan Lerking",
author_email="", author_email="",
description="A modular plugin system for Python.", description="A modular plugin system for Python.",
url="", url="www.gitea.com/Lerking/XtendR",
classifiers=[ classifiers=[
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"License :: OSI Approved :: MIT License", "License :: OSI Approved :: MIT License",
+2 -1
View File
@@ -1 +1,2 @@
import xtendr from . import xtendrbase
from . import xtendrsystem
+29
View File
@@ -0,0 +1,29 @@
import importlib
import sys
import os
import json
from abc import ABC, abstractmethod
class XtendRBase(ABC):
"""Abstract base class for all plugins.
Example:
>>> class TestPlugin(XtendRBase):
... def run(self):
... print("Running TestPlugin")
... def stop(self):
... print("Stopping TestPlugin")
>>> plugin = TestPlugin()
>>> plugin.run()
Running TestPlugin
>>> plugin.stop()
Stopping TestPlugin
"""
@abstractmethod
def run(self):
pass
@abstractmethod
def stop(self):
pass
+5 -27
View File
@@ -3,32 +3,9 @@ import sys
import os import os
import json import json
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from xtendr.xtendrbase import XtendRBase
class XtendRBase(ABC): class XtendRSystem:
"""Abstract base class for all plugins.
Example:
>>> class TestPlugin(XtendRBase):
... def run(self):
... print("Running TestPlugin")
... def stop(self):
... print("Stopping TestPlugin")
>>> plugin = TestPlugin()
>>> plugin.run()
Running TestPlugin
>>> plugin.stop()
Stopping TestPlugin
"""
@abstractmethod
def run(self):
pass
@abstractmethod
def stop(self):
pass
class XtendR:
"""Plugin system to manage plugins. """Plugin system to manage plugins.
Example: Example:
@@ -50,8 +27,9 @@ class XtendR:
print(f"Plugin '{name}' is already attached.") print(f"Plugin '{name}' is already attached.")
return return
plugin_path = os.path.join(os.getcwd(), name) plugin_path = os.path.join(os.getcwd(), "plugins", name)
info_path = os.path.join(plugin_path, "plugin_info.json") info_path = os.path.join(plugin_path, name + ".json")
print(plugin_path + "\n" + info_path)
if not os.path.isdir(plugin_path) or not os.path.isfile(info_path): if not os.path.isdir(plugin_path) or not os.path.isfile(info_path):
print(f"Failed to attach plugin '{name}', folder or info file not found.") print(f"Failed to attach plugin '{name}', folder or info file not found.")