ModuleRegistry

ModuleRegistry is the central registry for all loaded ModuleDescriptor plugin instances. It maps module_id → ModuleDescriptor and is used by MainWindow to discover which modules to render.

Registration

from knowledge_platform.modules.registry import ModuleRegistry
from knowledge_platform.modules.outline.module import OutlineModule

registry = ModuleRegistry()
registry.register(OutlineModule())

# Lookup
module = registry.get("outline")
print(module.display_name)  # "Outline"

Duplicate Registration

Attempting to register two modules with the same module_id raises ValueError:

registry.register(OutlineModule())  # OK
registry.register(OutlineModule())  # ValueError: Module 'outline' is already registered.

Empty module_id

A module with an empty module_id raises ValueError on registration:

class BadModule:
    module_id = ""
    ...

registry.register(BadModule())  # ValueError: ModuleDescriptor.module_id must be a non-empty string.

Iterating All Modules

for module in registry.all_modules():
    print(f"{module.module_id}: {module.display_name}")

Modules are returned in registration order, which is the order they appear in tabs in the main window.

Checking Registration

if not registry.is_registered("kanban"):
    registry.register(kanban_module)

API Reference

knowledge_platform.modules.registry.ModuleRegistry

Central registry for all loaded module descriptors.

Source code in src/knowledge_platform/modules/registry.py
class ModuleRegistry:
    """Central registry for all loaded module descriptors."""

    def __init__(self) -> None:
        self._modules: dict[str, ModuleDescriptor] = {}

    def register(self, module: ModuleDescriptor) -> None:
        """Register a module.

        Args:
            module: Plugin instance implementing :class:`ModuleDescriptor`.

        Raises:
            ValueError: If a module with the same *module_id* is already registered.
        """
        mid = module.module_id
        if not mid:
            raise ValueError("ModuleDescriptor.module_id must be a non-empty string.")
        if mid in self._modules:
            raise ValueError(f"Module '{mid}' is already registered.")
        self._modules[mid] = module
        logger.info("module.registered", module_id=mid, display_name=module.display_name)

    def get(self, module_id: str) -> ModuleDescriptor:
        """Return the module for *module_id*.

        Args:
            module_id: Target identifier.

        Returns:
            The registered :class:`ModuleDescriptor`.

        Raises:
            KeyError: If *module_id* is not registered.
        """
        if module_id not in self._modules:
            raise KeyError(f"Module '{module_id}' is not registered.")
        return self._modules[module_id]

    def all_modules(self) -> list[ModuleDescriptor]:
        """Return all registered modules in registration order.

        Returns:
            List of :class:`ModuleDescriptor` instances.
        """
        return list(self._modules.values())

    def is_registered(self, module_id: str) -> bool:
        """Return ``True`` if *module_id* is currently registered.

        Args:
            module_id: Target identifier.
        """
        return module_id in self._modules

Functions

all_modules
all_modules() -> list[ModuleDescriptor]

Return all registered modules in registration order.

Returns:

Type Description
list[ModuleDescriptor]

List of :class:ModuleDescriptor instances.

Source code in src/knowledge_platform/modules/registry.py
def all_modules(self) -> list[ModuleDescriptor]:
    """Return all registered modules in registration order.

    Returns:
        List of :class:`ModuleDescriptor` instances.
    """
    return list(self._modules.values())
get
get(module_id: str) -> ModuleDescriptor

Return the module for module_id.

Parameters:

Name Type Description Default
module_id str

Target identifier.

required

Returns:

Type Description
ModuleDescriptor

The registered :class:ModuleDescriptor.

Raises:

Type Description
KeyError

If module_id is not registered.

Source code in src/knowledge_platform/modules/registry.py
def get(self, module_id: str) -> ModuleDescriptor:
    """Return the module for *module_id*.

    Args:
        module_id: Target identifier.

    Returns:
        The registered :class:`ModuleDescriptor`.

    Raises:
        KeyError: If *module_id* is not registered.
    """
    if module_id not in self._modules:
        raise KeyError(f"Module '{module_id}' is not registered.")
    return self._modules[module_id]
is_registered
is_registered(module_id: str) -> bool

Return True if module_id is currently registered.

Parameters:

Name Type Description Default
module_id str

Target identifier.

required
Source code in src/knowledge_platform/modules/registry.py
def is_registered(self, module_id: str) -> bool:
    """Return ``True`` if *module_id* is currently registered.

    Args:
        module_id: Target identifier.
    """
    return module_id in self._modules
register
register(module: ModuleDescriptor) -> None

Register a module.

Parameters:

Name Type Description Default
module ModuleDescriptor

Plugin instance implementing :class:ModuleDescriptor.

required

Raises:

Type Description
ValueError

If a module with the same module_id is already registered.

Source code in src/knowledge_platform/modules/registry.py
def register(self, module: ModuleDescriptor) -> None:
    """Register a module.

    Args:
        module: Plugin instance implementing :class:`ModuleDescriptor`.

    Raises:
        ValueError: If a module with the same *module_id* is already registered.
    """
    mid = module.module_id
    if not mid:
        raise ValueError("ModuleDescriptor.module_id must be a non-empty string.")
    if mid in self._modules:
        raise ValueError(f"Module '{mid}' is already registered.")
    self._modules[mid] = module
    logger.info("module.registered", module_id=mid, display_name=module.display_name)