Source code for cadrumo.core.action_argument_resolution
"""Canonical invariant for materialised operator-action arguments."""from__future__importannotationsfromdecimalimportDecimalfromtypingimportSelffrompydanticimportBaseModel,ConfigDict,Field,model_validatorfrom..core.errors.hierarchyimportpydantic_validation_boundaryfrom.identifier_grammarimportFIELD_KEY_PATTERN,NAMESPACED_ID_PATTERNfrom.operator_action_enumsimportActionArgumentSource,ActionArgumentStatus_STRICT_FROZEN_CONFIG=ConfigDict(extra="forbid",frozen=True,strict=True,# Diverges from `core.models.STRICT_FROZEN_CONFIG` only to add# `validate_assignment`, which these models need and the canonical does not# carry. `validate_default` is restored because omitting it dropped a# guarantee nobody chose to drop: a local config that silently weakens the# canonical is a defect, one that widens it for a stated reason is a# decision.validate_assignment=True,validate_default=True,)def_validate_evidence_id_pairing(source:ActionArgumentSource|None,source_evidence_id:str|None,)->None:"""Carry ``source_evidence_id`` exactly when the source is condition evidence."""from_condition_evidence=sourceisActionArgumentSource.CONDITION_EVIDENCEiffrom_condition_evidenceandsource_evidence_idisNone:raiseValueError("condition-evidence action arguments require source_evidence_id")ifnotfrom_condition_evidenceandsource_evidence_idisnotNone:raiseValueError("only condition-evidence action arguments can carry source_evidence_id")
[docs]classActionArgumentResolution(BaseModel):"""One resolved or missing argument with its factual provenance."""model_config=_STRICT_FROZEN_CONFIGargument_name:str=Field(pattern=FIELD_KEY_PATTERN,min_length=1,max_length=120)status:ActionArgumentStatusvalue:str|int|bool|Decimal|None=Nonesource:ActionArgumentSource|None=Nonesource_key:str|None=Field(default=None,pattern=FIELD_KEY_PATTERN,min_length=1,max_length=160)source_evidence_id:str|None=Field(default=None,pattern=NAMESPACED_ID_PATTERN,min_length=3,max_length=160,)@model_validator(mode="after")@pydantic_validation_boundarydef_validate_resolution(self)->Self:"""Keep resolved and missing argument states mutually exclusive."""ifself.statusisnotActionArgumentStatus.RESOLVED:carried=(self.value,self.source,self.source_key,self.source_evidence_id)ifany(factisnotNoneforfactincarried):raiseValueError("missing action arguments cannot carry value or source")returnselfifany(factisNoneforfactin(self.value,self.source,self.source_key)):raiseValueError("resolved action arguments require value, source, and source_key")_validate_evidence_id_pairing(self.source,self.source_evidence_id)returnself