Source code for aeat.domain.calculations.registry._checker_oracle_flow
"""Shared verdict-flow helpers for read-only checker oracles.Provides the :class:`_CheckerBaseModel` base, shared flow helpers, andthe :func:`decode_replay_observation` convenience used by every:class:`~aeat.domain.calculations.registry._live_parity.BaseCheckerOracle`subclass (GROI, NIF-IVA, and future sibling checkers)."""from__future__importannotationsfromcollections.abcimportMappingfrompydanticimportBaseModelfrom....coreimportSTRICT_FROZEN_CONFIGfrom._errorsimportRegistryValidationErrorfrom._live_parityimportParityFieldComparison,decode_replay_json_payloadfrom._remote_state_guardimportRemoteOperationclass_CheckerBaseModel(BaseModel):"""Strict frozen base for checker-oracle parity records. Every :class:`~aeat.domain.calculations.registry._live_parity.BaseCheckerOracle` observation and aggregate result type inherits this base to guarantee a consistent strict-frozen-forbid Pydantic config across all checker surfaces. """model_config=STRICT_FROZEN_CONFIG
[docs]defnormalize_verdict_mapping(values:Mapping[str,str],*,blank_message:str)->dict[str,str]:"""Normalize identifier/verdict mappings and reject blank entries."""cleaned:dict[str,str]={}foridentifier,verdictinvalues.items():normalized_identifier=identifier.strip().upper()normalized_verdict=verdict.strip().lower()ifnotnormalized_identifierornotnormalized_verdict:raiseRegistryValidationError(blank_message)cleaned[normalized_identifier]=normalized_verdictreturncleaned
[docs]defnormalize_expected_verdicts(expected:Mapping[str,object],*,blank_message:str)->dict[str,str]:"""Normalize expected identifier/verdict mappings and reject blank entries."""values:dict[str,str]={}foridentifier,verdictinexpected.items():normalized_identifier=str(identifier).strip().upper()normalized_verdict=str(verdict).strip().lower()ifnotnormalized_identifierornotnormalized_verdict:raiseRegistryValidationError(blank_message)values[normalized_identifier]=normalized_verdictreturnvalues
[docs]defreplay_parse_operation(action:str)->tuple[RemoteOperation,...]:"""Return the single local replay-parse :class:`RemoteOperation` tuple."""return(RemoteOperation(kind="local_workbook",action=action),)
[docs]defdecode_replay_observation[ObservationT:_CheckerBaseModel](payload:bytes,*,surface_label:str,observation_type:type[ObservationT],)->ObservationT:"""Decode replay JSON into the requested observation model."""document=decode_replay_json_payload(payload,surface_label=surface_label)returnobservation_type.model_validate({"values":dict(document.observed),"raw_evidence_locator":document.raw_evidence_locator},)
[docs]defobserved_verdict(values:Mapping[str,str],key:str)->str|None:"""Return the observed verdict for ``key`` after identifier normalization."""returnvalues.get(key.upper())
[docs]defcompare_verdict_field(key:str,expected:str,*,observed:str|None)->ParityFieldComparison:"""Compare one expected verdict against one observed verdict and return a :class:`ParityFieldComparison`."""ifobservedisNone:returnParityFieldComparison(name=key,expected=expected,observed="<missing>",verdict="mismatch")normalized_observed=observed.strip().lower()returnParityFieldComparison(name=key,expected=expected,observed=normalized_observed,verdict="match"ifnormalized_observed==expectedelse"mismatch",)