Source code for glotaran.plugin_system.megacomplex_registration

"""Megacomplex registration convenience functions."""
from __future__ import annotations

from typing import TYPE_CHECKING

from tabulate import tabulate

from glotaran.plugin_system.base_registry import __PluginRegistry
from glotaran.plugin_system.base_registry import add_plugin_to_registry
from glotaran.plugin_system.base_registry import full_plugin_name
from glotaran.plugin_system.base_registry import get_plugin_from_registry
from glotaran.plugin_system.base_registry import is_registered_plugin
from glotaran.plugin_system.base_registry import registered_plugins
from glotaran.plugin_system.base_registry import set_plugin
from glotaran.utils.ipython import MarkdownStr

if TYPE_CHECKING:
    from glotaran.model import Megacomplex


[docs] def register_megacomplex(megacomplex_type: str, megacomplex: type[Megacomplex]) -> None: """Add a megacomplex to the megacomplex registry. Parameters ---------- megacomplex_type : str Name of the megacomplex under which it is registered. megacomplex : type[Megacomplex] megacomplex class to be registered. """ add_plugin_to_registry( plugin_register_key=megacomplex_type, plugin=megacomplex, plugin_registry=__PluginRegistry.megacomplex, plugin_set_func_name="set_megacomplex_plugin", )
[docs] def is_known_megacomplex(megacomplex_type: str) -> bool: """Check if a megacomplex is in the megacomplex registry. Parameters ---------- megacomplex_type : str Name of the megacomplex under which it is registered. Returns ------- bool Whether or not the megacomplex is registered. """ return is_registered_plugin( plugin_register_key=megacomplex_type, plugin_registry=__PluginRegistry.megacomplex )
[docs] def get_megacomplex(megacomplex_type: str) -> type[Megacomplex]: """Retrieve a megacomplex from the megacomplex registry. Parameters ---------- megacomplex_type : str Name of the megacomplex under which it is registered. Returns ------- type[Megacomplex] Megacomplex class """ return get_plugin_from_registry( plugin_register_key=megacomplex_type, plugin_registry=__PluginRegistry.megacomplex, not_found_error_message=( f"Unknown megacomplex type {megacomplex_type!r}. " f"Known megacomplex types are: {known_megacomplex_names(full_names=True)}" ), )
[docs] def known_megacomplex_names(full_names: bool = False) -> list[str]: """Names of the registered megacomplexs. Parameters ---------- full_names : bool Whether to display the full names the plugins are registered under as well. Returns ------- list[str] List of registered megacomplexs. """ return registered_plugins(__PluginRegistry.megacomplex, full_names=full_names)
[docs] def set_megacomplex_plugin(megacomplex_name: str, full_plugin_name: str) -> None: """Set the plugin used for a specific megacomplex name. This function is useful when you want to resolve conflicts of installed plugins or overwrite the plugin used for a specific megacomplex name. Effected functions: - :func:`optimize` Parameters ---------- megacomplex_name : str Name of the megacomplex to use the plugin for. full_plugin_name : str Full name (import path) of the registered plugin. """ set_plugin( plugin_register_key=megacomplex_name, full_plugin_name=full_plugin_name, plugin_registry=__PluginRegistry.megacomplex, plugin_register_key_name="megacomplex_name", )
[docs] def megacomplex_plugin_table( *, plugin_names: bool = False, full_names: bool = False ) -> MarkdownStr: """Return registered megacomplex plugins as markdown table. This is especially useful when you work with new plugins. Parameters ---------- plugin_names : bool Whether or not to add the names of the plugins to the table. full_names : bool Whether to display the full names the plugins are registered under as well. Returns ------- MarkdownStr Markdown table of megacomplexnames. """ table_data: list[list[str]] = [] megacomplex_names = known_megacomplex_names(full_names=full_names) header_values = ["Megacomplex name"] if plugin_names: header_values.append("Plugin name") table_data.extend( [ f"`{megacomplex_name}`", f"`{full_plugin_name(get_megacomplex(megacomplex_name))}`", ] for megacomplex_name in megacomplex_names ) else: table_data = [[f"`{megacomplex_name}`"] for megacomplex_name in megacomplex_names] headers = tuple(f"__{x}__" for x in header_values) return MarkdownStr(tabulate(table_data, tablefmt="github", headers=headers, stralign="center"))