Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/ga4gh/va_spec/base/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -450,6 +456,7 @@ class VariantClinicalSignificanceProposition(
"""

_maturity: ClassVar[Maturity] = Maturity.DRAFT
condition_field_name: ClassVar[str] = "objectCondition"

model_config = ConfigDict(use_enum_values=True)

Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down
54 changes: 54 additions & 0 deletions tests/validation/test_va_spec_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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 = {
Expand Down
Loading