Source code for p2p.registry
"""Central registries for swappable P2P components."""
from __future__ import annotations
from collections.abc import Callable
from typing import Any, Generic, TypeVar
FactoryT = TypeVar("FactoryT", bound=Callable[..., Any])
[docs]
class Registry(Generic[FactoryT]):
"""Named collection of factories with duplicate protection."""
def __init__(self, registry_name: str) -> None:
if not isinstance(registry_name, str) or not registry_name.strip():
raise ValueError("registry_name must be a nonempty string")
self.registry_name = registry_name
self._entries: dict[str, FactoryT] = {}
[docs]
def register(self, name: str, factory: FactoryT) -> None:
"""Register one factory under an exact, nonempty name."""
if not isinstance(name, str) or not name.strip():
raise ValueError("registry entry name must be a nonempty string")
if not callable(factory):
raise TypeError("registry factory must be callable")
if name in self._entries:
raise ValueError(
f"{name!r} is already registered in {self.registry_name}"
)
self._entries[name] = factory
[docs]
def get(self, name: str) -> FactoryT:
"""Return a registered factory."""
try:
return self._entries[name]
except KeyError:
available = ", ".join(self.names()) or "<none>"
raise KeyError(
f"unknown {self.registry_name} entry {name!r}; "
f"available: {available}"
) from None
[docs]
def create(self, name: str, **kwargs: Any) -> Any:
"""Instantiate a registered factory using keyword arguments."""
return self.get(name)(**kwargs)
[docs]
def names(self) -> tuple[str, ...]:
"""Return registered names in deterministic order."""
return tuple(sorted(self._entries))
BACKENDS: Registry[Callable[..., Any]] = Registry("backends")
MODELS: Registry[Callable[..., Any]] = Registry("models")
STAGES: Registry[Callable[..., Any]] = Registry("stages")
COMMANDS: Registry[Callable[..., Any]] = Registry("commands")
METRICS: Registry[Callable[..., Any]] = Registry("metrics")
__all__ = [
"BACKENDS",
"COMMANDS",
"METRICS",
"MODELS",
"STAGES",
"Registry",
]