34 Commits

Author SHA1 Message Date
Lerking 96bb0f0f3d Merge pull request '0.0.7' (#20) from 0.0.7 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/20
2025-02-25 06:28:11 +00:00
Lerking 993617976f Add Makefile 2025-02-25 06:27:47 +00:00
Lerking 828213912e Update setup.py 2025-02-25 06:26:29 +00:00
Lerking 44136c33b8 Merge pull request 'Update setup.py' (#17) from lerking-patch-1 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/17
2025-02-25 06:22:07 +00:00
Lerking 490423e94a Update setup.py 2025-02-25 06:21:51 +00:00
Lerking fa2c25d6c5 Merge pull request 'Update setup.py' (#15) from lerking-patch-1 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/15
2025-02-24 16:08:07 +00:00
Lerking 0db2e1dfca Update setup.py 2025-02-24 16:07:16 +00:00
Lerking 7200cb0bf8 Merge pull request 'Updated. /JL' (#14) from 0.0.6 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/14
2025-02-24 11:19:02 +00:00
Jan Lerking da3d09d3b1 Updated. /JL 2025-02-24 12:17:07 +01:00
Lerking 00173e73ae Merge pull request '0.0.5' (#12) from 0.0.5 into main
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/12
2025-02-24 08:23:28 +00:00
Jan Lerking c849d32f73 0.0.5 #8 Cleaned up unused imports. /JL 2025-02-24 09:20:08 +01:00
Lerking ffc7baa394 Update README.md 2025-02-24 08:16:07 +00:00
Lerking ea1ba5d5ab Update README.md 2025-02-24 08:15:18 +00:00
Lerking b01a9cca3e Update README.md 2025-02-24 07:29:42 +00:00
Lerking 485d7a28d8 Merge pull request 'main' (#11) from main into 0.0.5
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/11
2025-02-24 07:28:21 +00:00
Lerking f711cdcf06 Update README.md 2025-02-24 07:26:47 +00:00
Lerking 2199d18c79 Update README.md 2025-02-24 07:26:27 +00:00
Lerking d22861622b Merge pull request 'main' (#10) from main into 0.0.5
Reviewed-on: https://gitea.com/Lerking/XtendR/pulls/10
2025-02-24 07:24:30 +00:00
Lerking 13858e433f Update README.md 2025-02-24 07:23:58 +00:00
Lerking 37cad62835 Update README.md 2025-02-24 07:19:43 +00:00
Lerking b4ad8fee0c Update README.md 2025-02-24 07:19:01 +00:00
Lerking 4e51fd06f0 Update README.md 2025-02-24 07:17:57 +00:00
Lerking dd780864a6 Update README.md 2025-02-24 07:03:53 +00:00
Lerking 83db451e1b Update README.md 2025-02-24 07:03:28 +00:00
Lerking b58be97d1f Update setup.py 2025-02-24 06:53:16 +00:00
Lerking eb03302323 Update xtendr/xtendrsystem.py 2025-02-24 06:16:04 +00:00
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
9 changed files with 77 additions and 38 deletions
+8
View File
@@ -0,0 +1,8 @@
dist:
python -m build
test:
twine upload --repository testpypi /dist
publish:
twine upload --repository pypi /dist
+28 -1
View File
@@ -1,3 +1,30 @@
# XtendR
A python 3 extension system to ease the use of plugins.
A very basic Python 3.12 plugin system based on the K.I.S.S principle.
I was in need of a new plugin system, which should meet these requirements:
:heavy_plus_sign: Simple to use
:heavy_plus_sign: Work well with Python 3.12
:heavy_plus_sign: Maintainable - Don't expect to see new releases every month. __If it ain't broken, don't fix it!!!__
I previously used yapsy, but it doesn't meet the requirements anymore.
:x: No longer simple, and simple to use (Simplicity in use has been sacrificed for more complexity. It has become bloated)
:x: Not workink with Python 3.12
:x: No longer maintained (Hasn't been maintained for a few years)
I didn't find anything that suited my needs, so I decided to make my own plugin system.
It simply contains 2 classes, one for the plugin system and one abstraction base class for the plugins themselves.
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 plugins/example_plugin/example_plugin.py and plugins/example_plugin/example_plugin.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.
+4 -4
View File
@@ -3,17 +3,17 @@ if __name__ == "__main__":
setup(
name="XtendR",
version="0.0.1",
version="0.0.7",
packages=find_packages(),
install_requires=[],
author="Jan Lerking",
author_email="",
description="A modular plugin system for Python.",
url="",
url="https://www.gitea.com/Lerking/XtendR",
classifiers=[
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.11",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.12',
python_requires='>=3.11',
)
+2 -1
View File
@@ -1 +1,2 @@
import xtendr
from . import xtendrbase
from . import xtendrsystem
+25
View File
@@ -0,0 +1,25 @@
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
+6 -29
View File
@@ -2,38 +2,14 @@ import importlib
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:
>>> system = XtendRSystem()
>>> system.attach("example_plugin") # Assuming 'example_plugin/plugin_info.json' exists
>>> system.attach("example_plugin") # Assuming 'example_plugin/example_plugin.json' exists
>>> system.run("example_plugin")
ExamplePlugin is running!
>>> system.stop("example_plugin")
@@ -50,8 +26,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.")