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

@@ -20,6 +20,7 @@ from .metadata import (
MetadataFieldDefinition,
MetadataRecord,
MetadataSchema,
MetadataSchemaAssignment,
MetadataValidationIssue,
MetadataValueType,
Sensitivity,
@@ -64,6 +65,7 @@ __all__ = [
"MetadataFieldDefinition",
"MetadataRecord",
"MetadataSchema",
"MetadataSchemaAssignment",
"MetadataValidationIssue",
"MetadataValueType",
"NormalizedDocument",

View File

@@ -290,6 +290,63 @@ class MetadataSchema:
)
@dataclass(frozen=True)
class MetadataSchemaAssignment:
schema_id: str
asset_types: tuple[str, ...] = ()
sensitivities: tuple[Sensitivity | str, ...] = ()
lifecycle_states: tuple[LifecycleState | str, ...] = ()
policy_ref: str | None = None
priority: int = 100
metadata: dict[str, Any] = field(default_factory=dict)
assignment_id: str = field(default_factory=lambda: new_id("metadata_schema_assignment"))
def __post_init__(self) -> None:
object.__setattr__(self, "asset_types", tuple(self.asset_types))
object.__setattr__(self, "sensitivities", tuple(Sensitivity(item) for item in self.sensitivities))
object.__setattr__(
self,
"lifecycle_states",
tuple(LifecycleState(item) for item in self.lifecycle_states),
)
def applies_to(self, classification: "Classification") -> bool:
if self.asset_types and classification.asset_type not in self.asset_types:
return False
if self.sensitivities and classification.sensitivity not in self.sensitivities:
return False
if self.lifecycle_states and classification.lifecycle not in self.lifecycle_states:
return False
return True
def to_dict(self) -> dict[str, Any]:
return compact_dict(
{
"assignment_id": self.assignment_id,
"schema_id": self.schema_id,
"asset_types": list(self.asset_types),
"sensitivities": [item.value for item in self.sensitivities],
"lifecycle_states": [item.value for item in self.lifecycle_states],
"policy_ref": self.policy_ref,
"priority": self.priority,
"metadata": dict(self.metadata),
}
)
@classmethod
def from_dict(cls, data: dict[str, Any]) -> "MetadataSchemaAssignment":
return cls(
assignment_id=data["assignment_id"],
schema_id=data["schema_id"],
asset_types=tuple(data.get("asset_types", [])),
sensitivities=tuple(Sensitivity(item) for item in data.get("sensitivities", [])),
lifecycle_states=tuple(LifecycleState(item) for item in data.get("lifecycle_states", [])),
policy_ref=data.get("policy_ref"),
priority=int(data.get("priority", 100)),
metadata=dict(data.get("metadata", {})),
)
@dataclass(frozen=True)
class Classification:
asset_type: str