first commit

This commit is contained in:
2026-07-11 23:54:36 +07:00
commit b07562921b
40 changed files with 3813 additions and 0 deletions

32
reporting/registry.py Normal file
View 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