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): ...
registry =
<ComponentRegistry object>