diff --git a/src/anonymizer/engine/schemas/__init__.py b/src/anonymizer/engine/schemas/__init__.py index 96607d66..bc99215d 100644 --- a/src/anonymizer/engine/schemas/__init__.py +++ b/src/anonymizer/engine/schemas/__init__.py @@ -34,7 +34,6 @@ EntityCategory, EntityDispositionSchema, EntitySource, - MeaningUnitAspect, MeaningUnitImportance, MeaningUnitSchema, MeaningUnitsSchema, @@ -90,7 +89,6 @@ "EntityCategory", "EntityDispositionSchema", "EntitySource", - "MeaningUnitAspect", "MeaningUnitImportance", "MeaningUnitSchema", "MeaningUnitsSchema", diff --git a/src/anonymizer/engine/schemas/rewrite.py b/src/anonymizer/engine/schemas/rewrite.py index 912281dd..770d0c93 100644 --- a/src/anonymizer/engine/schemas/rewrite.py +++ b/src/anonymizer/engine/schemas/rewrite.py @@ -33,7 +33,7 @@ Uses LLMJudgeColumnConfig with Score rubrics (no custom schema needed) Supporting enums: Domain, EntitySource, EntityCategory, SensitivityLevel, - ProtectionMethod, CombinedRiskLevel, MeaningUnitAspect, PrivacyAnswer + ProtectionMethod, CombinedRiskLevel, PrivacyAnswer """ from __future__ import annotations @@ -249,25 +249,6 @@ class StrictSensitivityDispositionSchema(SensitivityDispositionSchema): # --------------------------------------------------------------------------- -class MeaningUnitAspect(str, Enum): - ROLE = "role" - PROCESS = "process" - RELATIONSHIP = "relationship" - ENVIRONMENT = "environment" - ROUTINE = "routine" - CREATIVE_OUTPUT = "creative_output" - VALUE = "value" - MOTIVATION = "motivation" - INFLUENCE = "influence" - AUDIENCE = "audience" - LEGAL_BASIS = "legal_basis" - INSTITUTION = "institution" - JUSTIFICATION = "justification" - PROCEDURAL_STATUS = "procedural_status" - TEMPORAL_SEQUENCE = "temporal_sequence" - RIGHTS_IMPACT = "rights_impact" - - class MeaningUnitImportance(str, Enum): critical = "critical" important = "important" @@ -275,7 +256,7 @@ class MeaningUnitImportance(str, Enum): class MeaningUnitSchema(BaseModel): id: int = Field(ge=1) - aspect: MeaningUnitAspect + aspect: str = Field(min_length=1) unit: str = Field(min_length=1) importance: MeaningUnitImportance @@ -294,7 +275,7 @@ class MeaningUnitsSchema(BaseModel): class QualityQAItemSchema(BaseModel): id: int - aspect: str + aspect: str = Field(min_length=1) importance: MeaningUnitImportance question: str reference_answer: str diff --git a/tests/engine/test_qa_generation.py b/tests/engine/test_qa_generation.py index 74831f9d..c1dbc2e9 100644 --- a/tests/engine/test_qa_generation.py +++ b/tests/engine/test_qa_generation.py @@ -34,7 +34,6 @@ EntityCategory, EntityDispositionSchema, EntitySource, - MeaningUnitAspect, MeaningUnitImportance, MeaningUnitSchema, MeaningUnitsSchema, @@ -75,13 +74,13 @@ units=[ MeaningUnitSchema( id=1, - aspect=MeaningUnitAspect.ROLE, + aspect="role", unit="An individual works as a software engineer.", importance=MeaningUnitImportance.critical, ), MeaningUnitSchema( id=2, - aspect=MeaningUnitAspect.ENVIRONMENT, + aspect="environment", unit="The individual works remotely.", importance=MeaningUnitImportance.important, ), @@ -158,6 +157,16 @@ def test_serialize_meaning_units_accepts_dict_payload() -> None: assert serialized[1]["id"] == 2 +def test_meaning_unit_accepts_aspect_outside_former_enum() -> None: + """Regression: aspects like 'diagnosis' or 'goal' were rejected when aspect was an enum.""" + unit = MeaningUnitSchema( + id=1, aspect="diagnosis", unit="patient presents with type 2 diabetes", importance="critical" + ) + assert unit.aspect == "diagnosis" + unit2 = MeaningUnitSchema(id=2, aspect="goal", unit="aims to reduce HbA1c below 7%", importance="important") + assert unit2.aspect == "goal" + + def test_generate_privacy_qa_column_only_protected_entities() -> None: row = {COL_SENSITIVITY_DISPOSITION: _STUB_DISPOSITION} result = _generate_privacy_qa_column(row)