25 lines
696 B
Python
25 lines
696 B
Python
from __future__ import annotations
|
|
|
|
from typing import Dict, Generic, List, TypeVar
|
|
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
class PluginRegistry(Generic[T]):
|
|
def __init__(self) -> None:
|
|
self._factories: Dict[str, T] = {}
|
|
|
|
def register(self, name: str, factory: T) -> None:
|
|
if name in self._factories:
|
|
raise ValueError(f"Plugin '{name}' is already registered.")
|
|
self._factories[name] = factory
|
|
|
|
def get(self, name: str) -> T:
|
|
try:
|
|
return self._factories[name]
|
|
except KeyError as exc:
|
|
raise KeyError(f"Plugin '{name}' is not registered.") from exc
|
|
|
|
def names(self) -> List[str]:
|
|
return sorted(self._factories.keys())
|