.. testsetup:: quickstart import os from pluginmanager.tests.compat import tempfile tempdirectory = tempfile.TemporaryDirectory() plugin_directory_path = tempdirectory.name path = os.path.join(tempdirectory.name, 'test.py') with open(path, 'w+') as f: f.write('from pluginmanager import IPlugin\nclass Test(IPlugin):\n pass')
python plugin management, simplified.
Library under development. Contains rough edges/unfinished functionality. API subject to changes.
pip install pluginmanager
-or-
pip install git+https://github.com/benhoff/pluginmanager.git
from pluginmanager import PluginInterface plugin_interface = PluginInterface() plugin_interface.set_plugin_directories(plugin_directory_path) plugin_interface.collect_plugins() plugins = plugin_interface.get_instances()
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 classes.
import pluginmanager class CustomClass(pluginmanager.IPlugin): pass plugin_interface = pluginmanager.PluginInterface() plugin_interface.add_plugins(CustomClass) plugins = plugin_interface.get_instances()
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()
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
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)
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)
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)
.. currentmodule:: pluginmanager
.. autosummary:: :toctree: stubs DirectoryManager FileManager ModuleManager PluginManager PluginInterface
.. testcleanup:: tempdirectory.cleanup()