Source code for aeat.domain.calculations.registry._validate_revision_context

"""Lookup context for per-revision validation.

Builds the ``RevisionValidationContext`` lookup tables from a
:class:`ModeloRevision`, aggregating id sets and by-id mappings used
across every per-section validator.
"""

from __future__ import annotations

from collections.abc import Mapping
from dataclasses import dataclass

from ._casilla_membership import casillas_by_id, declared_casilla_ids
from ._ids import BindingId, CasillaId, RelationId
from ._schema import (
    AlgorithmBindingDefinition,
    AlgorithmProviderDefinition,
    ApplicationLinkDefinition,
    CasillaDefinition,
    ConstructDefinition,
    DataBindingDefinition,
    DeadlineWindowDefinition,
    DependencyClassificationDefinition,
    ExportLayoutDefinition,
    ExtractionProfileDefinition,
    FormulaDefinition,
    LiveCrossReferenceDecision,
    ModeloRevision,
    ModeloScheduleDefinition,
    ParameterDefinition,
    RelationDefinition,
    SupportRemovalDecisionDefinition,
    VerificationExpectationDefinition,
    WorkbookParityReference,
)
from ._validate_revision_identity import _collect_record_id_lists


[docs] @dataclass(frozen=True) class RevisionValidationContext: ids_by_kind: dict[str, list[str]] export_layout_ids: list[str] extraction_profile_ids: list[str] cross_reference_ids: list[str] workbook_parity_ids: list[str] verification_expectation_ids: list[str] application_link_ids: list[str] deadline_window_ids: list[str] filing_schedule_ids: list[str] casilla_by_id: dict[CasillaId, CasillaDefinition] formula_by_id: dict[str, FormulaDefinition] binding_by_id: dict[BindingId, DataBindingDefinition] relation_by_id: dict[RelationId, RelationDefinition] parameter_by_id: dict[str, ParameterDefinition] provider_by_id: dict[str, AlgorithmProviderDefinition] algorithm_binding_by_id: dict[str, AlgorithmBindingDefinition] export_layout_by_id: dict[str, ExportLayoutDefinition] extraction_profile_by_id: dict[str, ExtractionProfileDefinition] cross_reference_by_id: dict[str, LiveCrossReferenceDecision] workbook_parity_by_id: dict[str, WorkbookParityReference] verification_expectation_by_id: dict[str, VerificationExpectationDefinition] application_link_by_id: dict[str, ApplicationLinkDefinition] deadline_window_by_id: dict[str, DeadlineWindowDefinition] filing_schedule_by_id: dict[str, ModeloScheduleDefinition] support_removal_decision_by_id: dict[str, SupportRemovalDecisionDefinition] construct_by_id: dict[str, ConstructDefinition] dependency_classification_by_id: dict[str, DependencyClassificationDefinition] casillas: set[CasillaId] formulas: dict[str, FormulaDefinition] bindings: set[BindingId] relations: set[RelationId] parameters: set[str] providers: set[str] resolvable_values: set[BindingId | CasillaId | RelationId | str] export_field_ids: set[str] exported_casillas: set[CasillaId] @property def construct_member_objects( self, ) -> Mapping[ str, Mapping[ str, CasillaDefinition | FormulaDefinition | ParameterDefinition | DataBindingDefinition | AlgorithmProviderDefinition | AlgorithmBindingDefinition | RelationDefinition | ExportLayoutDefinition | ExtractionProfileDefinition | LiveCrossReferenceDecision | WorkbookParityReference | VerificationExpectationDefinition | ApplicationLinkDefinition | DeadlineWindowDefinition | ModeloScheduleDefinition | SupportRemovalDecisionDefinition | DependencyClassificationDefinition, ], ]: return { "casilla": self.casilla_by_id, "formula": self.formula_by_id, "parameter": self.parameter_by_id, "binding": self.binding_by_id, "algorithm provider": self.provider_by_id, "algorithm binding": self.algorithm_binding_by_id, "relation": self.relation_by_id, "export layout": self.export_layout_by_id, "extraction profile": self.extraction_profile_by_id, "cross-reference": self.cross_reference_by_id, "workbook parity reference": self.workbook_parity_by_id, "verification expectation": self.verification_expectation_by_id, "application link": self.application_link_by_id, "deadline window": self.deadline_window_by_id, "filing schedule": self.filing_schedule_by_id, "support removal decision": self.support_removal_decision_by_id, "dependency classification": self.dependency_classification_by_id, }
[docs] def build_revision_validation_context(revision: ModeloRevision) -> RevisionValidationContext: ids_by_kind = _collect_record_id_lists(revision) formula_by_id = {formula.id: formula for formula in revision.formulas} binding_by_id = {binding.id: binding for binding in revision.bindings} relation_by_id = {relation.id: relation for relation in revision.relations} parameter_by_id = {parameter.id: parameter for parameter in revision.parameters} provider_by_id = {provider.id: provider for provider in revision.algorithm_providers} casillas = set(declared_casilla_ids(revision)) bindings = set(binding_by_id) relations = set(relation_by_id) parameters = set(parameter_by_id) return RevisionValidationContext( ids_by_kind=ids_by_kind, export_layout_ids=ids_by_kind["export layout"], extraction_profile_ids=ids_by_kind["extraction profile"], cross_reference_ids=ids_by_kind["cross-reference"], workbook_parity_ids=ids_by_kind["workbook parity reference"], verification_expectation_ids=ids_by_kind["verification expectation"], application_link_ids=ids_by_kind["application link"], deadline_window_ids=ids_by_kind["deadline window"], filing_schedule_ids=ids_by_kind["filing schedule"], casilla_by_id=casillas_by_id(revision), formula_by_id=formula_by_id, binding_by_id=binding_by_id, relation_by_id=relation_by_id, parameter_by_id=parameter_by_id, provider_by_id=provider_by_id, algorithm_binding_by_id={binding.id: binding for binding in revision.algorithm_bindings}, export_layout_by_id={layout.id: layout for layout in revision.export_layouts}, extraction_profile_by_id={profile.id: profile for profile in revision.extraction_profiles}, cross_reference_by_id={ cross_reference.id: cross_reference for cross_reference in revision.live_cross_references }, workbook_parity_by_id={workbook.id: workbook for workbook in revision.workbook_parity_refs}, verification_expectation_by_id={ expectation.id: expectation for expectation in revision.verification_expectations }, application_link_by_id={link.id: link for link in revision.application_links}, deadline_window_by_id={window.id: window for window in revision.deadline_windows}, filing_schedule_by_id={schedule.id: schedule for schedule in revision.filing_schedules}, support_removal_decision_by_id={decision.id: decision for decision in revision.support_removal_decisions}, construct_by_id={construct.id: construct for construct in revision.constructs}, dependency_classification_by_id={ classification.id: classification for classification in revision.dependency_classifications }, casillas=casillas, formulas=formula_by_id, bindings=bindings, relations=relations, parameters=parameters, providers=set(provider_by_id), resolvable_values=casillas | bindings | relations | parameters, export_field_ids={ field.id for layout in revision.export_layouts for record in layout.records for field in record.fields }, exported_casillas={ field.casilla_id for layout in revision.export_layouts for record in layout.records for field in record.fields if field.casilla_id is not None }, )