Source code for camacq.plugins

"""Handle plugins."""

from __future__ import annotations

import asyncio
from importlib.metadata import entry_points
from types import ModuleType
from typing import TYPE_CHECKING, Any

from camacq.helper import setup_one_module

if TYPE_CHECKING:
    from camacq.control import Center

CORE_MODULES = ["api", "sample"]


[docs] async def setup_module(center: Center, config: dict[str, Any]) -> None: """Set up the plugins package. Parameters ---------- center : Center instance The Center instance. config : dict The config dict. """ plugins = await center.add_executor_job(get_plugins) # Add core modules. tasks: list[asyncio.Task[None]] = [] for module_name in CORE_MODULES: if module_name not in config: config[module_name] = {} module = plugins.pop(module_name, None) if not module: continue tasks.append(center.create_task(setup_one_module(center, config, module))) if tasks: await asyncio.wait(tasks) tasks = [] for name, module in plugins.items(): if name not in config: continue tasks.append(center.create_task(setup_one_module(center, config, module))) if tasks: await asyncio.wait(tasks)
[docs] def get_plugins() -> dict[str, ModuleType]: """Return a dict of plugin modules.""" plugins = { entry_point.name: entry_point.load() for entry_point in entry_points(group="camacq.plugins") } return plugins