Source code for loom.etl.lineage._config

"""ETL lineage configuration extending the core observability config."""

from __future__ import annotations

from typing import Any

import msgspec

from loom.core.model import LoomFrozenStruct
from loom.core.observability.config import LogObservabilityConfig, ObservabilityConfig


[docs] class LineageConfig(LoomFrozenStruct, frozen=True, kw_only=True): """Persisted execution-lineage destination settings.""" enabled: bool = False root: str = "" database: str = "" storage_options: dict[str, str] = msgspec.field(default_factory=dict) writer: dict[str, Any] = msgspec.field(default_factory=dict) delta_config: dict[str, str | None] = msgspec.field(default_factory=dict) commit: dict[str, Any] = msgspec.field(default_factory=dict)
[docs] def validate(self) -> None: """Validate that exactly one destination mode is configured when enabled.""" if not self.enabled: return has_root = bool(self.root.strip()) has_database = bool(self.database.strip()) if has_root == has_database: raise ValueError("lineage requires exactly one destination: root or database")
class ETLObservabilityConfig(ObservabilityConfig, frozen=True, kw_only=True): """ETL observability config extending the core runtime config with lineage.""" log: LogObservabilityConfig = msgspec.field( default_factory=lambda: LogObservabilityConfig(enabled=False) ) lineage: LineageConfig = msgspec.field(default_factory=LineageConfig) __all__ = ["ETLObservabilityConfig", "LineageConfig"]