Source code for sqlrules.ir

from __future__ import annotations

from dataclasses import dataclass, field
from typing import Any, Literal

OnUnsupported = Literal["raise", "warn", "ignore"]
OnConflict = Literal["raise", "replace", "ignore"]
DiagnosticSeverity = Literal["warning", "info"]


[docs] @dataclass(frozen=True, slots=True) class PatternSpec: """Normalized ``pattern`` constraint value (preserves case-folding intent).""" pattern: str ignore_case: bool = False
[docs] @dataclass(frozen=True, slots=True) class TypeSpec: """Normalized ``type_check`` constraint value (Pydantic type + strictness).""" python_type: type strict: bool = False allow_none: bool = False
[docs] @dataclass(frozen=True, slots=True) class Constraint: field: str operator: str value: Any
[docs] @dataclass(frozen=True, slots=True) class FieldDescriptor: name: str alias: str | None annotation: Any metadata: tuple[Any, ...] = () aliases: tuple[str, ...] = ()
[docs] @dataclass(frozen=True, slots=True) class Diagnostic: severity: DiagnosticSeverity field: str operator: str value: Any = None message: str = "" code: str = ""
@dataclass(slots=True) class DiagnosticsCollector: """Mutable collector; snapshots are immutable tuples.""" _items: list[Diagnostic] = field(default_factory=list) def add(self, diagnostic: Diagnostic) -> None: self._items.append(diagnostic) def clear(self) -> None: self._items.clear() def snapshot(self) -> tuple[Diagnostic, ...]: return tuple(self._items)
[docs] @dataclass(frozen=True, slots=True) class CompilationContext: on_unsupported: OnUnsupported = "raise" collector: DiagnosticsCollector | None = None dialect: str | None = None def record( self, *, severity: DiagnosticSeverity, field: str, operator: str, value: Any = None, message: str = "", code: str = "", ) -> None: if self.collector is None: return self.collector.add( Diagnostic( severity=severity, field=field, operator=operator, value=value, message=message, code=code, ) )
[docs] @dataclass(frozen=True, slots=True) class FieldIR: descriptor: FieldDescriptor constraints: tuple[Constraint, ...]
[docs] @dataclass(frozen=True, slots=True) class ModelIR: model: type[Any] fields: tuple[FieldIR, ...]