Source code for cadrumo.domain.modelos.calculation_revision_amendment
"""Immutable calculation-revision amendment identity and M303 motive authority."""from__future__importannotationsfromcollections.abcimportMappingfromenumimportStrEnumfrompydanticimportBaseModel,model_validatorfrom...core.identity.hex_idsimportFilingRecordIdfrom...core.modelsimportSTRICT_FROZEN_CONFIGfrom...core.time.clockimporttoday_madridfrom..calculations.registry.authorityimportPinnedAuthorityOperation,bundled_indexed_authorityfrom..calculations.registry.facts.resolutionimportMappingFactQuery,ResolvedMappingFactfrom..calculations.registry.idsimportRevisionIdfrom..calculations.registry.schemaimportRegistrySnapshotfrom..calculations.registry.schema_baseimportDateAxisfrom..calculations.registry.schema_referencesimportSourceReferencefrom.errorsimportModeloValidationError
[docs]classCalculationRevisionAmendmentKind(StrEnum):"""Closed catalogue of amendment kinds a calculation revision may carry. Each member names the instrument it files, so the article travels with the kind rather than only with the regime that admits it: * ``COMPLEMENTARIA`` -- an additional declaration correcting an already-presented one upward. * ``SUSTITUTIVA`` -- a material restatement that replaces an already-presented filing in full. * ``RECTIFICATIVA`` -- the ordinary-correction mechanism selected by the applicable modelo revision. """COMPLEMENTARIA="complementaria"SUSTITUTIVA="sustitutiva"RECTIFICATIVA="rectificativa"
[docs]classM303RectificativaMotive(StrEnum):"""The two mutually-exclusive motives admitted by the M303 record design."""RECTIFICACIONES="rectificaciones"DISCREPANCIA_CRITERIO_ADMINISTRATIVO="discrepancia_criterio_administrativo"
[docs]classCalculationRevisionAmendmentIdentity(BaseModel):"""The sole content-addressed amendment identity carried by a revision."""model_config=STRICT_FROZEN_CONFIGkind:CalculationRevisionAmendmentKindamends_filing_record_id:FilingRecordIdm303_rectificativa_motive:M303RectificativaMotive|None@model_validator(mode="after")def_motive_requires_rectificativa_kind(self)->CalculationRevisionAmendmentIdentity:if(self.m303_rectificativa_motiveisnotNoneandself.kindisnotCalculationRevisionAmendmentKind.RECTIFICATIVA):raiseModeloValidationError("an M303 rectificativa motive is valid only for amendment kind rectificativa")returnself
def_registry_m303_rectificativa_declarations(*,operation:PinnedAuthorityOperation,)->Mapping[str,str]:"""Resolve M303 amendment declarations from the dated registry mapping."""ifnotany(metadata.contains_date(today_madrid())formetadatainoperation.modelo_directory("303").revisions):raiseModeloValidationError("M303 has no registry revision for today's date")resolved=operation.resolve_governed_fact(MappingFactQuery(fact_id="modelo-303-rectificativa-record-design-mapping",date_axis=DateAxis.FILING_PERIOD,effective_date=today_madrid(),),)ifnotisinstance(resolved,ResolvedMappingFact):raiseModeloValidationError("M303 rectificativa declarations must resolve as a mapping fact")return{str(entry.key):str(entry.value)forentryinresolved.payload.entries}def_required_registry_declaration(declarations:Mapping[str,str],key:str)->str:try:returndeclarations[key]exceptKeyErrorasexc:raiseModeloValidationError(f"M303 rectificativa registry declaration is missing: {key}")fromexc
[docs]defm303_rectificativa_motive_is_applicable(*,registry_revision_id:RevisionId,record_design:SourceReference,operation:PinnedAuthorityOperation|None=None,)->bool:"""Return whether the exact reviewed revision/source coordinate admits a motive."""ifoperationisNone:withbundled_indexed_authority().operation()asindexed_operation:returnm303_rectificativa_motive_is_applicable(registry_revision_id=registry_revision_id,record_design=record_design,operation=indexed_operation,)declarations=_registry_m303_rectificativa_declarations(operation=operation)prefix=f"record_design.{registry_revision_id}"# The mapping enumerates every revision whose record design carries the# rectificativa motive; an unlisted revision's design has no such field.iff"{prefix}.source_ref"notindeclarations:returnFalsereturn(registry_revision_id,record_design.id,record_design.sha256,record_design.record_design_epochor"",)==(registry_revision_id,_required_registry_declaration(declarations,f"{prefix}.source_ref"),_required_registry_declaration(declarations,f"{prefix}.content_digest"),_required_registry_declaration(declarations,f"{prefix}.epoch"),)
[docs]defm303_rectificativa_record_design_from_snapshot(snapshot:RegistrySnapshot,*,operation:PinnedAuthorityOperation|None=None,)->SourceReference|None:"""Resolve the sole admitted record-design source owned by a snapshot. Core types: :class:`~cadrumo.domain.calculations.registry.schema.RegistrySnapshot`. """ifoperationisNone:withbundled_indexed_authority().operation()asindexed_operation:returnm303_rectificativa_record_design_from_snapshot(snapshot,operation=indexed_operation)candidates=tuple(sourceforsourceinsnapshot.sources.values()ifsource.idinsnapshot.revision.source_refsandm303_rectificativa_motive_is_applicable(registry_revision_id=snapshot.revision.id,record_design=source,operation=operation,))iflen(candidates)>1:raiseModeloValidationError("M303 revision owns more than one admitted rectificativa record design")returncandidates[0]ifcandidateselseNone