Skip to content

Commit

Permalink
Merge pull request #87 from BIH-CEI/79-define-value-set-in-keyword-an…
Browse files Browse the repository at this point in the history
…d-use-for-validation-of-datafieldinstance-and-datamodelinstance

validating values
  • Loading branch information
frehburg authored Sep 18, 2024
2 parents f84ceec + 45c805b commit de40b9e
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/phenopacket_mapper/data_standards/data_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,12 @@ def validate(self) -> bool:
:return: True if the instance is valid, False otherwise
"""
# TODO: Implement this method
raise NotImplementedError
if self.field.required and self.value is None:
return False
if self.value is not None and self.field.value_set:
if self.value in self.field.value_set:
return True
return False


@dataclass(slots=True, frozen=True)
Expand Down
19 changes: 19 additions & 0 deletions src/phenopacket_mapper/data_standards/value_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,25 @@ def parse_value_set(
compliance=compliance,
)

def __contains__(self, item):
from phenopacket_mapper.data_standards import DataFieldValue
if isinstance(item, bool):
for element in self.elements:
if isinstance(element, bool) and element == item:
return True
elif type(item) in [Coding, CodeableConcept, CodeSystem, str, int, float, Date, type]:
for element in self.elements:
if element == item:
return True
elif isinstance(item, DataFieldValue):
for element in self.elements:
if element == item.value:
return True
return False

def __iter__(self):
yield from self.elements


TRUE_FALSE_VALUE_SET = ValueSet(name="TrueFalseValueSet",
elements=[True, False],
Expand Down
40 changes: 40 additions & 0 deletions tests/data_standards/test_value_set.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import pytest

from phenopacket_mapper.data_standards import Coding, code_system, Date
from phenopacket_mapper.data_standards.value_set import ValueSet


@pytest.mark.parametrize("value, is_in, value_set", [
('a', False, ValueSet(elements=[])),
('a', False, ValueSet(elements=['A', 'b', 'c'])),
(Date, False, ValueSet(elements=['date', 'Date'])),
('a', True, ValueSet(elements=['a', 'b', 'c'])),
('test test 123', True, ValueSet(elements=['test test 123', 'b', 'c'])),
(3, True, ValueSet(elements=[3, 19, 7])),
(
Coding(system=code_system.SNOMED_CT, code='404684003'),
True,
ValueSet(elements=[Coding(system=code_system.SNOMED_CT, code='404684003'), 1, 'a'])
),
(
code_system.HPO,
True,
ValueSet(elements=[
code_system.HPO, Coding(system=code_system.HPO, code="1"),
Coding(system=code_system.SNOMED_CT, code='404684003')
])
),
(False, False, ValueSet(elements=[0, 1])),
(True, False, ValueSet(elements=[0, 1])),
(True, True, ValueSet(elements=[True, False])),
(False, True, ValueSet(elements=[True, False])),
(0.117, True, ValueSet(elements=[0.117, 1.0])),
(str, True, ValueSet(elements=[str, int])),
(Date, True, ValueSet(elements=[Date, int])),
(Date(year=2024, month=9, day=18), True, ValueSet(elements=[Date(year=2024, month=9, day=18), 'date'])),
])
def test_in_valueset(value, is_in, value_set):
if is_in:
assert value in value_set
else:
assert value not in value_set

0 comments on commit de40b9e

Please sign in to comment.