Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dec115c596 | ||
|
|
591cc49933 | ||
|
|
36807b7aa6 | ||
|
|
afc38c32b3 | ||
|
|
798165c501 | ||
|
|
fc247d4888 | ||
|
|
394f72d383 | ||
|
|
f21433417d |
@@ -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
@@ -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.
|
||||||
@@ -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
@@ -1 +1,2 @@
|
|||||||
import xtendr
|
from . import xtendrbase
|
||||||
|
from . import xtendrsystem
|
||||||
@@ -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
|
||||||
@@ -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.")
|
||||||
Reference in New Issue
Block a user