component_framework.core.registry

Component registry for registration and lookup.

 1"""Component registry for registration and lookup."""
 2
 3from .component import Component
 4
 5
 6class ComponentRegistry:
 7    """Registry for component classes."""
 8
 9    def __init__(self):
10        self._registry: dict[str, type[Component]] = {}
11
12    def register(self, name: str):
13        """
14        Decorator to register a component class.
15
16        Usage:
17            @registry.register("counter")
18            class Counter(Component):
19                ...
20        """
21
22        def decorator(cls: type[Component]):
23            if name in self._registry:
24                if self._registry[name] is cls:
25                    return cls  # idempotent: same class re-imported, no-op
26                raise ValueError(
27                    f"Component '{name}' already registered by a different class "
28                    f"({self._registry[name].__qualname__!r})"
29                )
30            self._registry[name] = cls
31            return cls
32
33        return decorator
34
35    def get(self, name: str) -> type[Component] | None:
36        """Get component class by name."""
37        return self._registry.get(name)
38
39    def __getitem__(self, name: str) -> type[Component]:
40        """Get component class by name, raises KeyError if not found."""
41        return self._registry[name]
42
43    def list(self) -> list[str]:
44        """List all registered component names."""
45        return list(self._registry.keys())
46
47
48# Global registry instance
49registry = ComponentRegistry()
class ComponentRegistry:
 7class ComponentRegistry:
 8    """Registry for component classes."""
 9
10    def __init__(self):
11        self._registry: dict[str, type[Component]] = {}
12
13    def register(self, name: str):
14        """
15        Decorator to register a component class.
16
17        Usage:
18            @registry.register("counter")
19            class Counter(Component):
20                ...
21        """
22
23        def decorator(cls: type[Component]):
24            if name in self._registry:
25                if self._registry[name] is cls:
26                    return cls  # idempotent: same class re-imported, no-op
27                raise ValueError(
28                    f"Component '{name}' already registered by a different class "
29                    f"({self._registry[name].__qualname__!r})"
30                )
31            self._registry[name] = cls
32            return cls
33
34        return decorator
35
36    def get(self, name: str) -> type[Component] | None:
37        """Get component class by name."""
38        return self._registry.get(name)
39
40    def __getitem__(self, name: str) -> type[Component]:
41        """Get component class by name, raises KeyError if not found."""
42        return self._registry[name]
43
44    def list(self) -> list[str]:
45        """List all registered component names."""
46        return list(self._registry.keys())

Registry for component classes.

def register(self, name: str):
13    def register(self, name: str):
14        """
15        Decorator to register a component class.
16
17        Usage:
18            @registry.register("counter")
19            class Counter(Component):
20                ...
21        """
22
23        def decorator(cls: type[Component]):
24            if name in self._registry:
25                if self._registry[name] is cls:
26                    return cls  # idempotent: same class re-imported, no-op
27                raise ValueError(
28                    f"Component '{name}' already registered by a different class "
29                    f"({self._registry[name].__qualname__!r})"
30                )
31            self._registry[name] = cls
32            return cls
33
34        return decorator

Decorator to register a component class.

Usage:

@registry.register("counter") class Counter(Component): ...

def get( self, name: str) -> type[component_framework.core.Component] | None:
36    def get(self, name: str) -> type[Component] | None:
37        """Get component class by name."""
38        return self._registry.get(name)

Get component class by name.

def list(self) -> list[str]:
44    def list(self) -> list[str]:
45        """List all registered component names."""
46        return list(self._registry.keys())

List all registered component names.

registry = <ComponentRegistry object>