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
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__":
"""Example usage of the PluginSystem.
@@ -14,7 +14,7 @@ if __name__ == "__main__":
>>> system.detach("example_plugin")
Detached plugin 'example_plugin'.
"""
system = XtendR()
system = XtendRSystem()
system.attach("example_plugin") # Assuming 'example_plugin/plugin_info.json' exists
system.run("example_plugin")
system.stop("example_plugin")
@@ -2,5 +2,6 @@
"name": "Example Plugin",
"version": "1.0",
"module": "example_plugin",
"class": "ExamplePlugin",
"description": "An example plugin that prints a message."
}
@@ -1,4 +1,4 @@
from xtendr import XtendRBase
from xtendr.xtendrbase import XtendRBase
class ExamplePlugin(XtendRBase):
"""Example plugin implementation.
+2 -2
View File
@@ -3,13 +3,13 @@ if __name__ == "__main__":
setup(
name="XtendR",
version="0.0.1",
version="0.0.4",
packages=find_packages(),
install_requires=[],
author="Jan Lerking",
author_email="",
description="A modular plugin system for Python.",
url="",
url="www.gitea.com/Lerking/XtendR",
classifiers=[
"Programming Language :: Python :: 3.12",
"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 json
from abc import ABC, abstractmethod
from xtendr.xtendrbase import XtendRBase
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
class XtendR:
class XtendRSystem:
"""Plugin system to manage plugins.
Example:
@@ -50,8 +27,9 @@ class XtendR:
print(f"Plugin '{name}' is already attached.")
return
plugin_path = os.path.join(os.getcwd(), name)
info_path = os.path.join(plugin_path, "plugin_info.json")
plugin_path = os.path.join(os.getcwd(), "plugins", name)
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):
print(f"Failed to attach plugin '{name}', folder or info file not found.")