Source code for sim_panel.sources.registry
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Dict, Type
from sim_panel.sources.base import BaseSource
from sim_panel.sources.types import SourceConfig
[docs]
@dataclass
class SourceRegistry:
"""
Name-to-source registry.
"""
_registry: Dict[str, Type[BaseSource]] = field(default_factory=dict)
[docs]
def register(self, name: str, cls: Type[BaseSource]) -> None:
key = name.strip()
if not key:
raise ValueError("Source name must be a non-empty string.")
if key in self._registry:
raise ValueError(f"Source '{key}' is already registered.")
self._registry[key] = cls
[docs]
def get(self, name: str) -> Type[BaseSource]:
try:
return self._registry[name]
except KeyError as exc:
available = ", ".join(sorted(self._registry)) or "<none>"
raise KeyError(f"Unknown source '{name}'. Available sources: {available}") from exc
[docs]
def create(self, config: SourceConfig) -> BaseSource:
cls = self.get(config.name)
return cls(config)
[docs]
def names(self) -> list[str]:
return sorted(self._registry.keys())
_REGISTRY = SourceRegistry()
[docs]
def get_registry() -> SourceRegistry:
return _REGISTRY
[docs]
def register_source(name: str, cls: Type[BaseSource]) -> None:
_REGISTRY.register(name, cls)
[docs]
def build_source(config: SourceConfig) -> BaseSource:
return _REGISTRY.create(config)
[docs]
def list_sources() -> list[str]:
return _REGISTRY.names()