diff --git a/src/ga4gh/va_spec/base/core.py b/src/ga4gh/va_spec/base/core.py index 03d20e5..79e9f1a 100644 --- a/src/ga4gh/va_spec/base/core.py +++ b/src/ga4gh/va_spec/base/core.py @@ -404,6 +404,12 @@ class ClinicalVariantProposition(_SubjectVariantPropositionBase): """A proposition for use in describing the effect of variants in human subjects.""" _maturity: ClassVar[Maturity] = Maturity.TRIAL_USE + condition_field_name: ClassVar[str] + + @property + def condition(self) -> Condition | iriReference: + """Return the condition associated with the proposition.""" + return getattr(self, self.condition_field_name) geneContextQualifier: MappableConcept | iriReference | None = Field( default=None, @@ -450,6 +456,7 @@ class VariantClinicalSignificanceProposition( """ _maturity: ClassVar[Maturity] = Maturity.DRAFT + condition_field_name: ClassVar[str] = "objectCondition" model_config = ConfigDict(use_enum_values=True) @@ -474,6 +481,7 @@ class VariantDiagnosticProposition(ClinicalVariantProposition, BaseModelForbidEx model_config = ConfigDict(use_enum_values=True) _maturity: ClassVar[Maturity] = Maturity.TRIAL_USE + condition_field_name: ClassVar[str] = "objectCondition" type: Literal["VariantDiagnosticProposition"] = Field( default="VariantDiagnosticProposition", @@ -492,6 +500,7 @@ class VariantOncogenicityProposition(ClinicalVariantProposition, BaseModelForbid """A proposition describing the role of a variant in causing a tumor type.""" _maturity: ClassVar[Maturity] = Maturity.TRIAL_USE + condition_field_name: ClassVar[str] = "objectTumorType" type: Literal["VariantOncogenicityProposition"] = Field( default="VariantOncogenicityProposition", @@ -510,6 +519,7 @@ class VariantPathogenicityProposition(ClinicalVariantProposition, BaseModelForbi """A proposition describing the role of a variant in causing a heritable condition.""" _maturity: ClassVar[Maturity] = Maturity.TRIAL_USE + condition_field_name: ClassVar[str] = "objectCondition" type: Literal["VariantPathogenicityProposition"] = Field( default="VariantPathogenicityProposition", @@ -538,6 +548,7 @@ class VariantPrognosticProposition(ClinicalVariantProposition, BaseModelForbidEx model_config = ConfigDict(use_enum_values=True) _maturity: ClassVar[Maturity] = Maturity.TRIAL_USE + condition_field_name: ClassVar[str] = "objectCondition" type: Literal["VariantPrognosticProposition"] = Field( default="VariantPrognosticProposition", @@ -562,6 +573,7 @@ class VariantTherapeuticResponseProposition( model_config = ConfigDict(use_enum_values=True) _maturity: ClassVar[Maturity] = Maturity.TRIAL_USE + condition_field_name: ClassVar[str] = "conditionQualifier" type: Literal["VariantTherapeuticResponseProposition"] = Field( default="VariantTherapeuticResponseProposition", diff --git a/tests/validation/test_va_spec_models.py b/tests/validation/test_va_spec_models.py index aca24af..0e7e59a 100644 --- a/tests/validation/test_va_spec_models.py +++ b/tests/validation/test_va_spec_models.py @@ -27,6 +27,12 @@ Statement, StudyGroup, StudyResult, + VariantClinicalSignificanceProposition, + VariantDiagnosticProposition, + VariantOncogenicityProposition, + VariantPathogenicityProposition, + VariantPrognosticProposition, + VariantTherapeuticResponseProposition, ) from ga4gh.va_spec.base.domain_entities import ConditionSet from ga4gh.va_spec.ccv_2022.models import ( @@ -57,6 +63,54 @@ def caf(): ) +@pytest.mark.parametrize( + ("proposition_class", "condition_field_name", "predicate"), + [ + ( + VariantClinicalSignificanceProposition, + "objectCondition", + "hasClinicalSignificanceFor", + ), + ( + VariantDiagnosticProposition, + "objectCondition", + "isDiagnosticInclusionCriterionFor", + ), + (VariantOncogenicityProposition, "objectTumorType", "isOncogenicFor"), + (VariantPathogenicityProposition, "objectCondition", "isCausalFor"), + ( + VariantPrognosticProposition, + "objectCondition", + "associatedWithBetterOutcomeFor", + ), + ( + VariantTherapeuticResponseProposition, + "conditionQualifier", + "predictsSensitivityTo", + ), + ], +) +def test_proposition_condition_helpers( + proposition_class, condition_field_name, predicate +): + """Test condition access without knowing the proposition field name.""" + initial_condition = iriReference(root="conditions.json#/1") + proposition_data = { + "subjectVariant": "alleles.json#/1", + "predicate": predicate, + condition_field_name: initial_condition, + } + if proposition_class is VariantTherapeuticResponseProposition: + proposition_data["objectTherapeutic"] = "therapeutics.json#/1" + + proposition = proposition_class(**proposition_data) + + assert proposition.condition == initial_condition + assert proposition.condition == getattr(proposition, condition_field_name) + assert "condition" not in proposition.model_dump() + assert "condition" not in proposition_class.model_json_schema()["properties"] + + def test_condition_set(): """Ensure ConditionSet model works as expected""" condition_set_dict = {