pluginmanager¶
python plugin management, simplified.
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(plugin_directory_path)
plugin_interface.collect_plugins() # doctest: +SKIP
plugins = plugin_interface.get_instances()
print(plugins)
Custom Plugins¶
The quickstart will only work if you subclass IPlugin for your custom plugins.
import pluginmanager
class MyCustomPlugin(pluginmanager.IPlugin):
def __init__(self):
self.name = 'custom_name'
super().__init__()
Or register your class as subclass of IPlugin.
import pluginmanager
pluginmanager.IPlugin.register(YourClassHere)
Add Plugins Manually¶
Add classes.
import pluginmanager
class CustomClass(pluginmanager.IPlugin):
pass
plugin_interface = pluginmanager.PluginInterface()
plugin_interface.add_plugins(CustomClass)
plugins = plugin_interface.get_instances()
print(plugins)
Alternatively, add instances.
import pluginmanager
class CustomClass(pluginmanager.IPlugin):
pass
custom_class_instance = CustomClass()
plugin_interface = pluginmanager.PluginInterface()
plugin_interface.add_plugins(custom_class_instance)
plugins = plugin_interface.get_instances()
print(plugins)
pluginmanager is defaulted to automatically instantiate unique instances. Disable automatic instantiation.
import pluginmanager
plugin_interface = pluginmanager.PluginInterface()
plugin_manager = plugin_interface.plugin_manager
plugin_manager.instantiate_classes = False
Disable uniqueness (Only one instance of class per pluginmanager)
import pluginmanager
plugin_interface = pluginmanager.PluginInterface()
plugin_manager = plugin_interface.plugin_manager
plugin_manager.unique_instances = False
Filter Instances¶
Pass in a class to get back just the instances of a class
import pluginmanager
class MyPluginClass(pluginmanager.IPlugin):
pass
plugin_interface = pluginmanager.PluginInterface()
plugin_interface.add_plugins(MyPluginClass)
all_instances_of_class = plugin_interface.get_instances(MyPluginClass)
print(all_instances_of_class)
Alternatively, create and pass in your own custom filters. Either make a class based filter
# create a custom plugin class
class Plugin(pluginmanager.IPlugin):
def __init__(self, name):
self.name = name
# create a custom filter
class NameFilter(object):
def __init__(self, name):
self.stored_name = name
def __call__(self, plugins):
result = []
for plugin in plugins:
if plugin.name == self.stored_name:
result.append(plugin)
return result
# create an instance of our custom filter
mypluginclass_name_filter = NameFilter('good plugin')
plugin_interface = pluginmanager.PluginInterface()
plugin_interface.add_plugins([Plugin('good plugin'),
Plugin('bad plugin')])
filtered_plugins = plugin_interface.get_instances(mypluginclass_name_filter)
print(filtered_plugins[0].name)
Or make a function based filter
# create a custom plugin class
class Plugin(pluginmanager.IPlugin):
def __init__(self, name):
self.name = name
# create a function based filter
def custom_filter(plugins):
result = []
for plugin in plugins:
if plugin.name == 'good plugin':
result.append(plugin)
return result
plugin_interface = pluginmanager.PluginInterface()
plugin_interface.add_plugins([Plugin('good plugin'),
Plugin('bad plugin')])
filtered_plugins = plugin_interface.get_instances(mypluginclass_name_filter)
print(filtered_plugins[0].name)
Class Overview¶
DirectoryManager ([plugin_directories, ...]) |
DirectoryManager manages the recursive search state and can |
FileManager ([file_filters, ...]) |
FileManager manages the file filter state and is responible for |
ModuleManager ([module_plugin_filters]) |
ModuleManager manages the module plugin filter state and is responsible |
PluginManager ([unique_instances, ...]) |
PluginManager manages the plugin state. |
PluginInterface (**kwargs) |