Skip to content

Commit cfd5f90

Browse files
Merge branch 'main' into schemaview_relationship_tests
2 parents e04627c + 878d01e commit cfd5f90

File tree

2 files changed

+37
-28
lines changed

2 files changed

+37
-28
lines changed

linkml_runtime/utils/schemaview.py

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -820,41 +820,37 @@ def enum_parents(
820820
@lru_cache(None)
821821
def permissible_value_parent(
822822
self, permissible_value: str, enum_name: ENUM_NAME
823-
) -> list[str | PermissibleValueText] | None:
823+
) -> list[str | PermissibleValueText]:
824824
""":param enum_name: child enum name
825825
:param permissible_value: permissible value
826826
:return: all direct parent enum names (is_a)
827827
"""
828828
enum = self.get_enum(enum_name, strict=True)
829-
if enum:
830-
if permissible_value in enum.permissible_values:
831-
pv = enum.permissible_values[permissible_value]
832-
if pv.is_a:
833-
return [pv.is_a]
834-
return None
835-
return []
829+
pv = enum.permissible_values.get(permissible_value)
830+
if not pv:
831+
err_msg = f'"{permissible_value}" is not a permissible value of the enum "{enum_name}".'
832+
raise ValueError(err_msg)
833+
return [pv.is_a] if pv.is_a else []
836834

837835
@lru_cache(None)
838836
def permissible_value_children(
839837
self, permissible_value: str, enum_name: ENUM_NAME
840-
) -> list[str | PermissibleValueText] | None:
838+
) -> list[str | PermissibleValueText]:
841839
""":param enum_name: parent enum name
842840
:param permissible_value: permissible value
843841
:return: all direct child permissible values (is_a)
844842
"""
845843
enum = self.get_enum(enum_name, strict=True)
846-
children = []
847-
if enum:
848-
if permissible_value in enum.permissible_values:
849-
pv = enum.permissible_values[permissible_value]
850-
for isapv in enum.permissible_values:
851-
isapv_entity = enum.permissible_values[isapv]
852-
if isapv_entity.is_a and pv.text == isapv_entity.is_a:
853-
children.append(isapv)
854-
return children
855-
return None
856-
msg = f'No such enum as "{enum_name}"'
857-
raise ValueError(msg)
844+
pv = enum.permissible_values.get(permissible_value)
845+
if not pv:
846+
err_msg = f'"{permissible_value}" is not a permissible value of the enum "{enum_name}".'
847+
raise ValueError(err_msg)
848+
849+
return [
850+
isa_pv
851+
for isa_pv, isa_pv_entity in enum.permissible_values.items()
852+
if isa_pv_entity.is_a and pv.text == isa_pv_entity.is_a
853+
]
858854

859855
@lru_cache(None)
860856
def slot_parents(

tests/test_utils/test_schemaview.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,8 +1328,12 @@ def test_alias_slot(schema_view_no_imports: SchemaView) -> None:
13281328
assert postal_code_slot.alias == "zip" # Assert alias is 'zip'
13291329

13301330

1331-
def test_enums_and_enum_relationships(schema_view_no_imports: SchemaView) -> None:
1332-
"""Test various aspects of Enum representation.
1331+
def test_permissible_value_relationships(schema_view_no_imports: SchemaView) -> None:
1332+
"""Test relationships between permissible values.
1333+
1334+
These tests use valid permissible_value / enum combinations.
1335+
1336+
See test_permissible_value_relationships_fail for invalid enum-PV pairings.
13331337
13341338
CAT:
13351339
LION:
@@ -1344,18 +1348,14 @@ def test_enums_and_enum_relationships(schema_view_no_imports: SchemaView) -> Non
13441348
"""
13451349
view = schema_view_no_imports
13461350

1347-
# Test for ValueError when passing incorrect parameters
1348-
with pytest.raises(ValueError, match='No such enum: "not_an_enum"'):
1349-
view.permissible_value_parent("not_a_pv", "not_an_enum")
1350-
13511351
animals = "Animals"
13521352
animal_enum = view.get_enum(animals)
13531353
assert animal_enum.name == animals
13541354

13551355
pv_cat = animal_enum.permissible_values["CAT"]
13561356
assert pv_cat.text == "CAT"
13571357
assert pv_cat.is_a is None
1358-
assert view.permissible_value_parent("CAT", animals) is None
1358+
assert view.permissible_value_parent("CAT", animals) == []
13591359
assert view.permissible_value_ancestors("CAT", animals) == ["CAT"]
13601360
assert set(view.permissible_value_children("CAT", animals)) == {"LION", "TABBY"}
13611361
assert set(view.permissible_value_descendants("CAT", animals)) == {"CAT", "LION", "ANGRY_LION", "TABBY"}
@@ -1382,6 +1382,19 @@ def test_enums_and_enum_relationships(schema_view_no_imports: SchemaView) -> Non
13821382
assert view.permissible_value_descendants("ANGRY_LION", animals) == ["ANGRY_LION"]
13831383

13841384

1385+
@pytest.mark.parametrize("fn", ["parent", "children", "ancestors", "descendants"])
1386+
def test_permissible_value_relationships_fail(schema_view_no_imports: SchemaView, fn: str) -> None:
1387+
"""Test permissible_value relationships with incorrect enum/PV pairs."""
1388+
method_name = f"permissible_value_{fn}"
1389+
# invalid enum
1390+
with pytest.raises(ValueError, match='No such enum: "invalid_enum"'):
1391+
getattr(schema_view_no_imports, method_name)("invalid_pv", "invalid_enum")
1392+
1393+
# invalid pv, valid enum
1394+
with pytest.raises(ValueError, match='"invalid_pv" is not a permissible value of the enum "Animals"'):
1395+
getattr(schema_view_no_imports, method_name)("invalid_pv", "Animals")
1396+
1397+
13851398
# FIXME: improve testing of dynamic enums
13861399
def test_dynamic_enum(schema_view_with_imports: SchemaView) -> None:
13871400
"""Rudimentary test of dynamic enum."""

0 commit comments

Comments
 (0)