Skip to content

Custom Capability Examples

The snippets below illustrate how to build reusable capabilities outside of the core library.

Cache warm-up capability

from general_manager.interface.capabilities.builtin import BaseCapability
from general_manager.logging import get_logger


class CacheWarmupCapability(BaseCapability):
    """Warm a cache backend during startup."""

    name = "cache_warmup"

    def __init__(self, *, cache_backend: str) -> None:
        self.cache_backend = cache_backend
        self.logger = get_logger("interface.cache_warmup")

    def get_startup_hooks(self, interface_cls):
        def warm_cache() -> None:
            self.logger.info(
                "warming cache",
                context={
                    "interface": interface_cls.__name__,
                    "backend": self.cache_backend,
                },
            )
            # Real cache warm-up logic goes here.

        return [warm_cache]

Attach it via InterfaceCapabilityConfig:

from general_manager.interface.capabilities.configuration import InterfaceCapabilityConfig

class ExternalReportInterface(InterfaceBase):
    configured_capabilities = (
        InterfaceCapabilityConfig(
            CacheWarmupCapability,
            options={"cache_backend": "reports"},
        ),
    )

Audit notification capability

class AuditNotificationCapability(BaseCapability):
    """Emit audit events whenever mutations happen."""

    name = "audit_notification"

    def __init__(self, *, topic: str) -> None:
        self.topic = topic
        self.logger = get_logger("interface.audit_notification")

    def notify(self, action: str, payload: dict[str, Any]) -> None:
        self.logger.info(
            "audit event",
            context={"topic": self.topic, "action": action, "payload": payload},
        )

    def inject_mutation_hooks(self, interface_cls):
        def _notify(instance, action: str, payload: dict[str, Any]) -> None:
            self.notify(action, payload)

        setattr(interface_cls, "_audit_notify", _notify)