Markitect schema-validation integration use case and fixture for Markdown proxy documents

This commit is contained in:
2026-05-06 04:03:50 +02:00
parent c271385e35
commit dbe93be1a9
16 changed files with 518 additions and 12 deletions

View File

@@ -18,6 +18,7 @@ from kontextual_engine.core import (
mapping_digest,
MetadataRecord,
MetadataSchema,
MetadataSchemaAssignment,
OperationContext,
PolicyDecision,
RelationshipTargetKind,
@@ -176,6 +177,57 @@ class AssetRegistryService:
)
return AssetChangeResult(asset, version, event, decision)
def register_metadata_schema(
self,
schema: MetadataSchema,
context: OperationContext,
) -> MetadataSchema:
decision = self._authorize(
context,
"metadata_schema.register",
f"metadata_schema:{schema.schema_id}",
resource_metadata={"schema_id": schema.schema_id, "version": schema.version},
)
saved = self.repository.save_metadata_schema(schema)
self._audit(
"metadata_schema.register",
f"metadata_schema:{schema.schema_id}",
AuditOutcome.SUCCESS,
context,
decision,
details={"schema_id": schema.schema_id, "version": schema.version},
)
return saved
def assign_metadata_schema(
self,
assignment: MetadataSchemaAssignment,
context: OperationContext,
) -> MetadataSchemaAssignment:
self.repository.get_metadata_schema(assignment.schema_id)
decision = self._authorize(
context,
"metadata_schema.assign",
f"metadata_schema_assignment:{assignment.assignment_id}",
resource_metadata={"schema_id": assignment.schema_id},
)
saved = self.repository.save_metadata_schema_assignment(assignment)
self._audit(
"metadata_schema.assign",
f"metadata_schema_assignment:{assignment.assignment_id}",
AuditOutcome.SUCCESS,
context,
decision,
details={"schema_id": assignment.schema_id, "assignment_id": assignment.assignment_id},
)
return saved
def list_metadata_schemas(self) -> list[MetadataSchema]:
return self.repository.list_metadata_schemas()
def list_metadata_schema_assignments(self) -> list[MetadataSchemaAssignment]:
return self.repository.list_metadata_schema_assignments()
def add_representation(
self,
asset_id: str,
@@ -417,9 +469,23 @@ class AssetRegistryService:
classification: Classification,
records: list[MetadataRecord],
) -> None:
for schema in self.metadata_schemas:
if schema.applies_to(classification):
schema.validate_or_raise(records)
for schema in self._metadata_schemas_for(classification):
schema.validate_or_raise(records)
def _metadata_schemas_for(self, classification: Classification) -> tuple[MetadataSchema, ...]:
selected: list[MetadataSchema] = [
schema for schema in self.metadata_schemas if schema.applies_to(classification)
]
seen = {schema.schema_id for schema in selected}
for assignment in self.repository.list_metadata_schema_assignments():
if not assignment.applies_to(classification):
continue
schema = self.repository.get_metadata_schema(assignment.schema_id)
if schema.schema_id in seen or not schema.applies_to(classification):
continue
selected.append(schema)
seen.add(schema.schema_id)
return tuple(selected)
def _idempotent_lookup(
self,