{"library":"napari-plugin-engine","title":"napari Plugin Engine","description":"napari-plugin-engine is a Python library providing a generic plugin management system, forked from the widely used pluggy project. It enables applications like napari to discover, load, and execute plugins by defining clear hook specifications and allowing multiple plugin implementations. As of version 0.2.1, it provides a stable API for extending applications. Its release cadence is tied to its development within the napari ecosystem.","language":"python","status":"active","last_verified":"Fri Apr 17","install":{"commands":["pip install napari-plugin-engine"],"cli":null},"imports":["from napari_plugin_engine import PluginManager","from napari_plugin_engine import HookspecMarker","from napari_plugin_engine import HookimplMarker"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"from napari_plugin_engine import PluginManager, HookspecMarker, HookimplMarker\n\n# 1. Define unique markers for your project\nproject_name = \"my_app_plugins\"\nhookspec = HookspecMarker(project_name)\nhookimpl = HookimplMarker(project_name)\n\n# 2. Define your hook specifications\nclass MyAppHooks:\n    @hookspec(firstresult=True)\n    def get_data_source(self, name: str) -> str:\n        \"\"\"Get data from a named source.\"\"\"\n        pass\n\n    @hookspec\n    def process_data(self, data: str) -> str:\n        \"\"\"Process input data and return modified data.\"\"\"\n        pass\n\n# 3. Implement a plugin\nclass MyFileSystemPlugin:\n    @hookimpl\n    def get_data_source(self, name: str) -> str:\n        if name == \"filesystem\":\n            return \"Data from filesystem\"\n        return None # Crucial for firstresult hooks to allow other plugins\n\n    @hookimpl\n    def process_data(self, data: str) -> str:\n        return f\"Processed: {data.upper()}\"\n\nclass MyNetworkPlugin:\n    @hookimpl\n    def get_data_source(self, name: str) -> str:\n        if name == \"network\":\n            return \"Data from network\"\n        return None\n\n# 4. Initialize the PluginManager\npm = PluginManager(project_name)\n# Add hook specifications. Optional prefix can differentiate similar hook names.\npm.add_hookspecs(MyAppHooks, specname_prefix=f'{project_name}_')\n\n# 5. Register plugins\npm.register(MyFileSystemPlugin())\npm.register(MyNetworkPlugin())\n\n# 6. Call hooks\nprint(f\"--- Hook Calls ---\")\n\ndata_fs = pm.hook.get_data_source(name=\"filesystem\")\nprint(f\"get_data_source('filesystem'): {data_fs}\")\n\ndata_net = pm.hook.get_data_source(name=\"network\")\nprint(f\"get_data_source('network'): {data_net}\")\n\nprocessed_data_fs = pm.hook.process_data(data=data_fs)\nprint(f\"process_data(data_fs): {processed_data_fs}\")\n\nprocessed_data_net = pm.hook.process_data(data=data_net)\nprint(f\"process_data(data_net): {processed_data_net}\")","lang":"python","description":"This quickstart demonstrates how to define hook specifications, implement plugins with hook implementations, register them with a PluginManager, and then call the hooks. It showcases a 'firstresult' hook and a multi-result hook.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":null}