Source code for phenotypic.sdk_.register._analysis_plugin_registry
"""Registry for analysis plugin classes."""
from __future__ import annotations
from typing import TYPE_CHECKING, ClassVar
from ._base_registry import BaseRegistry
if TYPE_CHECKING:
from phenotypic._cli._dashboard._analysis._base_plugin import BaseAnalysisPlugin
[docs]
class AnalysisPluginRegistry(BaseRegistry["BaseAnalysisPlugin"]):
"""Registry for dashboard analysis plugins.
Plugins are registered by their ``call_name`` class attribute, which is
used as the HTML element ID prefix and sub-tab identifier.
"""
_REGISTRY: ClassVar[dict[str, type["BaseAnalysisPlugin"]]] = {}
_registry_name: ClassVar[str] = "analysis plugin"
[docs]
def register_analysis(cls: type["BaseAnalysisPlugin"]) -> type["BaseAnalysisPlugin"]:
"""Decorator to register an analysis plugin class.
The class must have a ``call_name`` class attribute used as the
registration key and HTML ID prefix.
Args:
cls: Analysis plugin class to register.
Returns:
The registered class (unchanged).
Examples:
>>> @register_analysis
... class MyPlugin(BaseAnalysisPlugin):
... call_name = "my_analysis"
... display_name = "My Analysis"
...
... def css(self): ...
... def html(self): ...
... def js(self): ...
"""
return AnalysisPluginRegistry.register(cls)
[docs]
def get_analysis_plugin(name: str) -> type["BaseAnalysisPlugin"]:
"""Look up registered analysis plugin by name.
Args:
name: The registered name of the plugin.
Returns:
The registered analysis plugin class.
Raises:
ValueError: If *name* is not registered.
"""
return AnalysisPluginRegistry.get(name)
[docs]
def available_analysis_plugins() -> tuple[str, ...]:
"""Return names of all registered analysis plugins.
Returns:
Tuple of registered plugin names, sorted alphabetically.
"""
return AnalysisPluginRegistry.available()