Source code for cadrumo.application.modelo._workspace_model_validation
"""Private consistency validators for the public Modelo Workspace DTOs."""from__future__importannotationsfromtypingimportTYPE_CHECKINGifTYPE_CHECKING:from.workspace_modelsimport(ModeloWorkspaceBoundedFacetV1,ModeloWorkspaceCapabilityV1,ModeloWorkspaceContributorIdentityV1,ModeloWorkspaceMaterializationRecordV1,ModeloWorkspaceProjectionV1,ModeloWorkspaceProvenanceRecordV1,)
[docs]defrequire_unique_contributor_identities(value:tuple[ModeloWorkspaceContributorIdentityV1,...],)->tuple[ModeloWorkspaceContributorIdentityV1,...]:"""Keep each pinned contributor tuple deterministic without declaring its port contract."""identities=tuple((contributor.owner,contributor.producer)forcontributorinvalue)ifnotidentitiesorlen(set(identities))!=len(identities):raiseValueError("workspace contributors must be non-empty and unique")returntuple(sorted(value,key=lambdacontributor:(contributor.owner,contributor.producer)))
[docs]defcomplete_capability_denominator(value:tuple[ModeloWorkspaceCapabilityV1,...],)->tuple[ModeloWorkspaceCapabilityV1,...]:"""Keep both successful admission arms on the one closed capability inventory."""from.workspace_modelsimportModeloWorkspaceCapabilityNamecapability_set={capability.capabilityforcapabilityinvalue}ifcapability_set!=set(ModeloWorkspaceCapabilityName)orlen(value)!=len(capability_set):raiseValueError("workspace capability rows must cover each V1 capability exactly once")returntuple(sorted(value,key=lambdacapability:capability.capability.value))
[docs]defrequire_facet_baseline_coordinate[RecordT](facet:ModeloWorkspaceBoundedFacetV1[RecordT])->None:"""Keep a page's baseline fields aligned with its copied root coordinates."""iffacet.baseline.contract_version!=facet.contract_version:raiseValueError("workspace facet baseline must retain the V1 contract version")iffacet.baseline.selected_revision_id!=facet.selected_revision_id:raiseValueError("workspace facet baseline must retain the selected revision")iffacet.baseline.schema_identity!=facet.schema_identity:raiseValueError("workspace facet baseline must retain the schema identity and fingerprint")iffacet.baseline.contributor_epoch_digest!=facet.contributor_epoch_digest:raiseValueError("workspace facet baseline must retain the contributor epoch digest")
[docs]defrequire_facet_page_state[RecordT](facet:ModeloWorkspaceBoundedFacetV1[RecordT])->None:"""Keep page size and continuation state mutually consistent."""iflen(facet.records)>facet.page_size:raiseValueError("workspace facet cannot contain more records than its page_size")iffacet.has_more!=(facet.next_cursorisnotNone):raiseValueError("workspace facet has_more must agree with next_cursor")
[docs]defrequire_facet_cursor_coordinate[RecordT](facet:ModeloWorkspaceBoundedFacetV1[RecordT])->None:"""Keep a continuation cursor on the complete facet consistency coordinate."""iffacet.next_cursorisnotNoneand(facet.next_cursor.contract_version!=facet.contract_versionorfacet.next_cursor.baseline!=facet.baselineorfacet.next_cursor.selected_revision_id!=facet.selected_revision_idorfacet.next_cursor.schema_identity!=facet.schema_identityorfacet.next_cursor.facetisnotfacet.facetorfacet.next_cursor.contributor_epoch_digest!=facet.contributor_epoch_digest):raiseValueError("workspace cursor must retain the complete facet consistency coordinate")
[docs]defrequire_facet_availability_payload[RecordT](facet:ModeloWorkspaceBoundedFacetV1[RecordT])->None:"""Refuse data-bearing page state for a non-available facet disposition."""from.workspace_modelsimportModeloWorkspaceCapabilityDispositioniffacet.dispositionisnotModeloWorkspaceCapabilityDisposition.AVAILABLEand(facet.recordsorfacet.has_moreorfacet.next_cursorisnotNone):raiseValueError("unavailable workspace facets cannot carry records or cursors")
[docs]defrequire_projection_schema_facet_name(projection:ModeloWorkspaceProjectionV1)->None:"""Require the schema facet to occupy the schema slot in every projection."""from.workspace_modelsimportModeloWorkspaceFacetNameifprojection.schema_facet.facetisnotModeloWorkspaceFacetName.SCHEMA:raiseValueError("workspace projection schema_facet must declare the schema facet")
[docs]defrequire_projection_baseline_coordinate(projection:ModeloWorkspaceProjectionV1)->None:"""Keep the projection baseline pinned to its resolved target and schema."""ifprojection.baseline.target!=projection.target:raiseValueError("workspace baseline must pin the exact resolved target")ifprojection.baseline.selected_revision_id!=projection.target.law_selected_revision_id:raiseValueError("workspace baseline must pin the exact law-selected revision")ifprojection.baseline.schema_identity!=projection.schema_identity:raiseValueError("workspace baseline must pin the exact schema identity")
[docs]defrequire_projection_schema_facet_coordinate(projection:ModeloWorkspaceProjectionV1)->None:"""Keep schema-facet contract and revision coordinates at the projection root."""ifprojection.schema_facet.contract_version!=projection.contract_version:raiseValueError("workspace schema facet must retain the V1 contract version")ifprojection.schema_facet.selected_revision_id!=projection.target.law_selected_revision_id:raiseValueError("workspace schema facet must retain the law-selected revision")
[docs]defrequire_projection_schema_facet_identity(projection:ModeloWorkspaceProjectionV1)->None:"""Keep schema-facet identity and baseline aligned with the projection."""ifprojection.schema_facet.schema_identity!=projection.schema_identity:raiseValueError("workspace schema facet must retain the schema identity and fingerprint")ifprojection.schema_facet.baseline!=projection.baseline:raiseValueError("workspace schema facet must retain the projection baseline")
[docs]defrequire_projection_schema_facet_contributors(projection:ModeloWorkspaceProjectionV1)->None:"""Keep the schema facet on the projection's contributor epoch and tuple."""ifprojection.schema_facet.contributor_epoch_digest!=projection.baseline.contributor_epoch_digest:raiseValueError("workspace schema facet must retain the contributor epoch digest")ifprojection.schema_facet.contributors!=projection.contributors:raiseValueError("workspace schema facet must retain the contributor tuple")
[docs]defrequire_projection_capability_coordinates(projection:ModeloWorkspaceProjectionV1)->None:"""Keep every capability answer on the exact resolved target and revision."""forcapabilityinprojection.capabilities:if(capability.target!=projection.targetorcapability.selected_revision_id!=projection.target.law_selected_revision_id):raiseValueError("workspace capabilities must retain the exact target and revision coordinate")
[docs]defrequire_projection_readiness_coordinate(projection:ModeloWorkspaceProjectionV1)->None:"""Keep optional readiness on the exact resolved target and revision coordinate."""ifprojection.readinessisnotNoneand(projection.readiness.modelo!=projection.target.modeloorprojection.readiness.revision_id!=projection.target.law_selected_revision_idorprojection.readiness.filing_year!=projection.target.filing_yearorprojection.readiness.period!=projection.target.period):raiseValueError("workspace readiness must retain the exact target and revision coordinate")
[docs]defrequire_static_projection_scope(projection:ModeloWorkspaceProjectionV1)->None:"""Keep static inspection free of materialized facets and review output."""from.workspace_modelsimportModeloWorkspaceCapabilityDispositionifprojection.materialization_facetisnotNoneorprojection.provenance_facetisnotNone:raiseValueError("static inspection cannot carry materialization or provenance facets")ifprojection.work_review.dispositionisModeloWorkspaceCapabilityDisposition.AVAILABLE:raiseValueError("static inspection cannot carry a materialized work review")
[docs]defrequire_graded_projection_facets(projection:ModeloWorkspaceProjectionV1,)->tuple[ModeloWorkspaceBoundedFacetV1[ModeloWorkspaceMaterializationRecordV1],ModeloWorkspaceBoundedFacetV1[ModeloWorkspaceProvenanceRecordV1],]:"""Require both data-bearing facets before checking their canonical coordinates."""materialization_facet=projection.materialization_facetprovenance_facet=projection.provenance_facetifmaterialization_facetisNoneorprovenance_facetisNone:raiseValueError("graded snapshot requires materialization and provenance facets")returnmaterialization_facet,provenance_facet
[docs]defrequire_graded_projection_facet_names(materialization_facet:ModeloWorkspaceBoundedFacetV1[ModeloWorkspaceMaterializationRecordV1],provenance_facet:ModeloWorkspaceBoundedFacetV1[ModeloWorkspaceProvenanceRecordV1],)->None:"""Keep graded data-bearing facets in their canonical materialization/provenance slots."""from.workspace_modelsimportModeloWorkspaceFacetNameexpected=((materialization_facet,ModeloWorkspaceFacetName.MATERIALIZATION),(provenance_facet,ModeloWorkspaceFacetName.PROVENANCE),)ifany(facet.facetisnotexpected_nameforfacet,expected_nameinexpected):raiseValueError("graded snapshot facets must retain their canonical names")
[docs]defrequire_graded_projection_facet_coordinates(projection:ModeloWorkspaceProjectionV1,materialization_facet:ModeloWorkspaceBoundedFacetV1[ModeloWorkspaceMaterializationRecordV1],provenance_facet:ModeloWorkspaceBoundedFacetV1[ModeloWorkspaceProvenanceRecordV1],)->None:"""Keep each graded facet on the projection's complete root consistency coordinate."""forfacetin(materialization_facet,provenance_facet):if(facet.contract_version!=projection.contract_versionorfacet.selected_revision_id!=projection.target.law_selected_revision_idorfacet.schema_identity!=projection.schema_identityorfacet.baseline!=projection.baselineorfacet.contributor_epoch_digest!=projection.baseline.contributor_epoch_digestorfacet.contributors!=projection.contributors):raiseValueError("graded workspace facets must retain the root consistency coordinates")