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

81
reporting/bootstrap.py Normal file
View File

@@ -0,0 +1,81 @@
from __future__ import annotations
from dataclasses import dataclass
from core.base import BaseRenderer, BaseTransport
from core.plugin_types import PluginGroupConfig, PluginLoadError, discover_plugins
from core.schemas.config import PluginPackagesConfig
from reporting.registry import RendererRegistry
from reporting.transport_registry import TransportRegistry
@dataclass(frozen=True)
class ReportingBootstrapResult:
renderer_registry: RendererRegistry
transport_registry: TransportRegistry
errors: list[PluginLoadError]
def bootstrap_reporting(plugin_packages: PluginPackagesConfig) -> ReportingBootstrapResult:
renderer_descriptors, renderer_errors = discover_plugins(
PluginGroupConfig(
package_names=plugin_packages.renderers,
entry_point_group="hydrogen.renderers",
plugin_kind="renderer",
),
BaseRenderer,
)
transport_descriptors, transport_errors = discover_plugins(
PluginGroupConfig(
package_names=plugin_packages.transports,
entry_point_group="hydrogen.transports",
plugin_kind="transport",
),
BaseTransport,
)
errors = [*renderer_errors, *transport_errors]
renderer_registry = RendererRegistry()
for descriptor in renderer_descriptors:
try:
renderer_registry.register(descriptor.plugin)
except ValueError as exc:
errors.append(
PluginLoadError(
plugin_kind="renderer",
source=descriptor.source,
message=str(exc),
)
)
transport_registry = TransportRegistry()
for descriptor in transport_descriptors:
try:
transport_registry.register(descriptor.plugin)
except ValueError as exc:
errors.append(
PluginLoadError(
plugin_kind="transport",
source=descriptor.source,
message=str(exc),
)
)
return ReportingBootstrapResult(
renderer_registry=renderer_registry,
transport_registry=transport_registry,
errors=errors,
)
def build_renderer_registry(
plugin_packages: PluginPackagesConfig | None = None,
) -> RendererRegistry:
return bootstrap_reporting(plugin_packages or PluginPackagesConfig()).renderer_registry
def build_transport_registry(
plugin_packages: PluginPackagesConfig | None = None,
) -> TransportRegistry:
return bootstrap_reporting(plugin_packages or PluginPackagesConfig()).transport_registry