first commit
This commit is contained in:
32
reporting/registry.py
Normal file
32
reporting/registry.py
Normal file
@@ -0,0 +1,32 @@
|
||||
from collections.abc import Iterable
|
||||
|
||||
from core.base import BaseRenderer
|
||||
|
||||
|
||||
class RendererRegistry:
|
||||
def __init__(self, renderers: Iterable[BaseRenderer] | None = None) -> None:
|
||||
self._renderers: dict[str, BaseRenderer] = {}
|
||||
|
||||
for renderer in renderers or ():
|
||||
self.register(renderer)
|
||||
|
||||
def register(self, renderer: BaseRenderer) -> None:
|
||||
self._register_key(renderer.content_type, renderer)
|
||||
for alias in renderer.aliases:
|
||||
self._register_key(alias, renderer)
|
||||
|
||||
def _register_key(self, key: str, renderer: BaseRenderer) -> None:
|
||||
if key in self._renderers:
|
||||
registered = self._renderers[key]
|
||||
raise ValueError(
|
||||
f"Renderer key '{key}' is already registered by {type(registered).__name__}"
|
||||
)
|
||||
self._renderers[key] = renderer
|
||||
|
||||
def get(self, content_type: str) -> BaseRenderer:
|
||||
try:
|
||||
return self._renderers[content_type]
|
||||
except KeyError as exc:
|
||||
raise ValueError(
|
||||
f"Renderer for content type '{content_type}' is not registered"
|
||||
) from exc
|
||||
Reference in New Issue
Block a user