Python Plugin Management, simplified
Project description
python plugin management, simplified.
Repo: https://github.com/benhoff/pluginmanager
Library under development. Contains rough edges/unfinished functionality. API subject to changes.
Installation
pip install pluginmanager
-or-
pip install git+https://github.com/benhoff/pluginmanager.git
Quickstart
from pluginmanager import PluginInterface
plugin_interface = PluginInterface()
plugin_interface.set_plugin_directories('my/fancy/plugin/path')
plugin_interface.collect_plugins()
plugins = plugin_interface.get_instances()
Custom Plugins
The quickstart will only work if you subclass IPlugin for your custom plugins or register your custom class with IPlugin
import pluginmanager
class MyCustomPlugin(pluginmanager.IPlugin):
def __init__(self):
self.name = 'custom_name'
super().__init__()
Register your class as subclass of IPlugin.
import pluginmanager pluginmanager.IPlugin.register(YourClassHere)
Add Plugins Manually
import pluginmanager plugin_interface = pluginmanager.PluginInterface() plugin_interface.add_plugins(YourCustomClassHere) plugins = plugin_interface.get_instances()
pluginmanager is defaulted to automatically instantiate UNIQUE classes. The automatic instantiation and uniqueness constraint can be changed.
Alternatively, add instances. Note that the uniqueness behavior is still enforced for instances.
import pluginmanager plugin_interface = pluginmanager.PluginInterface() plugin_interface.add_plugins(your_instance_here) plugins = plugin_interface.get_instances()
Filter Instances
Not interested in getting every instance? You can pass in a class to get back just instances of a class
import pluginmanager
plugin_interface = pluginmanager.PluginInterface()
plugin_interface.set_plugin_directories('my/fancy/plugin/path')
plugin_interface.collect_plugins()
all_instances_of_class = plugin_interface.get_instances(MyPluginClass)
Alternatively, create and pass in your own custom filters.
def custom_filter(plugins):
result = []
for plugin in plugins:
if plugin.name == 'interesting name':
result.append(plugin)
return result
filtered_plugins = plugin_interface.get_instances(custom_filter)
Architecture
pluginmanager was designed to be as extensible as possible while also being easy to use. There are three layers of access.
- Interfaces:
public facing
- Managers:
extended or replaced
- Filters:
implementation specific
Interfaces
Interfaces were used to provide a simple programmer interface while maintaining the ability to separate out the concerns of the implementation. The main interface is the PluginInterface, which is designed to be as stateless as possible, and have interjectable options, where applicable.
PluginInterface provides the cability to instantiate two other interfaces, the BlacklistInterface and FilterInterface. These interfaces provide universal access to the blacklisting (selectively implemented) and filtering APIs respectively.
Managers
There are four managers which make up the core of the library.
- DirectoryManager:
Maintains directory state. Responsbile for recursively searching through directories
- FileManager:
Can maintain filepath state. Does maintain file filter state. Responsible for applying file filters to filepaths passed gotten from directories
- ModuleManager:
Loads modules from source code. Keeps track of loaded modules. Maintains module filter state. Responsible for applying module filters to modules to get out plugins.
- PluginManager:
Instantiates plugins. Maintains plugin state.
Filters
Filters are designed to offer implementation-level extensiblity. Want to only return only files start with “plugin”? Create a filter for it. Or use some of the provided filters to provide the desired implementation.
NOTE: Final implementation of filters and how they interact with the library is currently a WIP and should be considered unstable.
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 pluginmanager-0.1.4.tar.gz.
File metadata
- Download URL: pluginmanager-0.1.4.tar.gz
- Upload date:
- Size: 17.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34754ca39ba510ac78080d41eb8ab6296e8410bfe0d479c1879c7c4e1ed53643
|
|
| MD5 |
511886b75fc833f8de444552375e1026
|
|
| BLAKE2b-256 |
f610bcd3e8ee498e2f991f7f491306150ee6c4b1b9aa1cf46dbc2196356dcc74
|
File details
Details for the file pluginmanager-0.1.4-py2.py3-none-any.whl.
File metadata
- Download URL: pluginmanager-0.1.4-py2.py3-none-any.whl
- Upload date:
- Size: 38.3 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4940a499639b1bf25c8c19d9dd17e0200c239491b0fb875602f09334e7d8d3db
|
|
| MD5 |
8e761a8d8671e15ba83b04496e377625
|
|
| BLAKE2b-256 |
23f8971c68a275fbaa32568c09400ac3a0aa9bd2ac6d937681ebf2dc1a5d0fc9
|