Coverage for src / cufile_patcher / registry.py: 100%
37 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-11 15:06 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-11 15:06 +0000
1from __future__ import annotations
3from collections.abc import Callable
5from .plugins import CuFileBackend, SystemCuFileBackend
8class BackendRegistry:
9 def __init__(self) -> None:
10 self._factories: dict[str, Callable[[], CuFileBackend]] = {}
11 self._instances: dict[str, CuFileBackend] = {}
12 self._default_name = "system"
14 def register(self, name: str, factory: Callable[[], CuFileBackend]) -> None:
15 if not name:
16 raise ValueError("backend name must not be empty")
17 self._factories[name] = factory
18 self._instances.pop(name, None)
20 def set_default(self, name: str) -> None:
21 if name not in self._factories:
22 raise KeyError(f"backend '{name}' is not registered")
23 self._default_name = name
25 def get_default(self) -> CuFileBackend:
26 return self.get(self._default_name)
28 def get(self, name: str) -> CuFileBackend:
29 if name in self._instances:
30 return self._instances[name]
31 try:
32 factory = self._factories[name]
33 except KeyError as exc:
34 raise KeyError(f"backend '{name}' is not registered") from exc
35 backend = factory()
36 self._instances[name] = backend
37 return backend
40_registry = BackendRegistry()
41_registry.register("system", SystemCuFileBackend)
44def register_backend(name: str, factory: Callable[[], CuFileBackend]) -> None:
45 _registry.register(name, factory)
48def set_default_backend(name: str) -> None:
49 _registry.set_default(name)
52def get_default_backend() -> CuFileBackend:
53 return _registry.get_default()