A simple Python plugin framework
Project description
stoepsel - a simple plug-in system for python
Stoepsel (pronounce ʃtœpsl̩) is an attempt to create a simple (as in minimalistic) but flexible and powerful plugin system for python.
Stoepsel gives you the ability to develop flexible and scalable applications. It doesn't matter if you want to build a UI or console program. You just need to deploy a plugin class to register your application part.
Plugins can use other plugins. Therefore, you can register objects or functions in a model tree where other plugins can find them. To make this as safe as possible, a simple dependency resolving algorithm is implemented. Plugins are registered by their name and a version. They also can define dependencies that have to be resolved. (more on that later)
using stoepsel
installing stoepsel
you can install stoepsel by using pip
python3 -m pip install stoepsel
Or just initialize a virtualenv and run setup.py
python3 -m venv env
source env/bin/activate
python3 setup.py install
running a stoepsel application
A simple stoepsel application can look like this:
import logging
from stoepsel import PluginManager
def main(args):
logging.basicConfig(level=logging.DEBUG)
# instanciate PluginManager
pm = PluginManager()
# find main and execute it
pm.get_item(PluginManager.PGM_MAIN)()
return 0
if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))
In this case, stoepsel will look for folder named 'plugins' and read any .py- file into its registry. One file has to register (see below) the term 'main' or simply PluginManager.PGM_MAIN. This is the entry point for our application.
stoepsel configuration
It's possible to configure stoepsel and stoepsel plugins. Therefore, you can give a dictionary to PluginManager constructor which at least consists of 'plugin_path', a string which tells a directory where stoepsel looks for plugins and 'plugin_config' where plugin configuration can be stored.
config = {}
config['plugin_path'] = 'simple_plugins'
config['plugin_config'] = {}
pm = PluginManager(config)
You could also put this into a json based (or other) config file
with open('config.json') as fp:
config = json.load(fp)
pm = PluginManager(config)
creating a plugin
a plugin is a class which derives from stoepsel.Plugin. It needs to deploy static information about it's name, version and dependencies.
from stoepsel import Plugin
class MyPlugin(Plugin):
name = 'simple_plugin'
version = '0.0.1'
dependencies = []
def setup(self):
self.register(self.PGM_MAIN,self.main)
def main(self):
print('Running around...')
It is basically possible to put several plugins into one python script. Any class which derives from Plugin will be loaded automatically.
registering objects
you can register objects by utilizing the Plugin method 'register'
def setup(self):
self.register('myapp/plugins/plg1/sayhi', self.sayhi)
def sayhi(self):
print('hello world')
using registered objects
to use registered objects you fave to find them via get_item method
def setup(self):
sayhi = self.get_item('myapp/plugins/plg1/sayhi')
if sayhi is not None:
sayhi()
configuration
The configuration of the PluginManager is also set into the model tree so you can get it by utilizing get_item
self.get_item('config:plugin_config/myplugin')
this can be useful to create configuration dialogues. To make it easier there is a property config set:
print(self.config['plugin_config/mypath'])
Also a list of plugins can be read by using 'plugins:' as path or just
print(self.plugins)
TODOs
- version control does not work yet :(
- pattern matching for dependency version control
- find plugins recursively in plugin dir
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stoepsel-0.2.1.tar.gz.
File metadata
- Download URL: stoepsel-0.2.1.tar.gz
- Upload date:
- Size: 9.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
039b281b1cfb2a1238fbe39564b7b4121ee3cc8c79fe058635c4eb312a8bfd1a
|
|
| MD5 |
ead2c98fa133d3409e459720e5cd7e8f
|
|
| BLAKE2b-256 |
a04893e8e4119a48c1aaf77c89216a2d7455123ccc4c8cf0a227dee047e6c112
|
File details
Details for the file stoepsel-0.2.1-py3-none-any.whl.
File metadata
- Download URL: stoepsel-0.2.1-py3-none-any.whl
- Upload date:
- Size: 9.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4293fd5fd6769c089e792befb3c9c7f6346c790147f8122e5bc693f755d3a4d8
|
|
| MD5 |
a648486fadefa5c07e9142b497541e75
|
|
| BLAKE2b-256 |
4d7cf9349c439af0de720e67196cf46c1b7b50473ddb7921f4f7957701642eb7
|