Skip to content

Commit 555ff37

Browse files
Merge branch 'main' into reorder_relationships
2 parents d6002a6 + 878d01e commit 555ff37

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
@@ -1105,41 +1105,37 @@ def enum_ancestors(
11051105
@lru_cache(None)
11061106
def permissible_value_parent(
11071107
self, permissible_value: str, enum_name: ENUM_NAME
1108-
) -> list[str | PermissibleValueText] | None:
1108+
) -> list[str | PermissibleValueText]:
11091109
""":param enum_name: child enum name
11101110
:param permissible_value: permissible value
11111111
:return: all direct parent enum names (is_a)
11121112
"""
11131113
enum = self.get_enum(enum_name, strict=True)
1114-
if enum:
1115-
if permissible_value in enum.permissible_values:
1116-
pv = enum.permissible_values[permissible_value]
1117-
if pv.is_a:
1118-
return [pv.is_a]
1119-
return None
1120-
return []
1114+
pv = enum.permissible_values.get(permissible_value)
1115+
if not pv:
1116+
err_msg = f'"{permissible_value}" is not a permissible value of the enum "{enum_name}".'
1117+
raise ValueError(err_msg)
1118+
return [pv.is_a] if pv.is_a else []
11211119

11221120
@lru_cache(None)
11231121
def permissible_value_children(
11241122
self, permissible_value: str, enum_name: ENUM_NAME
1125-
) -> list[str | PermissibleValueText] | None:
1123+
) -> list[str | PermissibleValueText]:
11261124
""":param enum_name: parent enum name
11271125
:param permissible_value: permissible value
11281126
:return: all direct child permissible values (is_a)
11291127
"""
11301128
enum = self.get_enum(enum_name, strict=True)
1131-
children = []
1132-
if enum:
1133-
if permissible_value in enum.permissible_values:
1134-
pv = enum.permissible_values[permissible_value]
1135-
for isapv in enum.permissible_values:
1136-
isapv_entity = enum.permissible_values[isapv]
1137-
if isapv_entity.is_a and pv.text == isapv_entity.is_a:
1138-
children.append(isapv)
1139-
return children
1140-
return None
1141-
msg = f'No such enum as "{enum_name}"'
1142-
raise ValueError(msg)
1129+
pv = enum.permissible_values.get(permissible_value)
1130+
if not pv:
1131+
err_msg = f'"{permissible_value}" is not a permissible value of the enum "{enum_name}".'
1132+
raise ValueError(err_msg)
1133+
1134+
return [
1135+
isa_pv
1136+
for isa_pv, isa_pv_entity in enum.permissible_values.items()
1137+
if isa_pv_entity.is_a and pv.text == isa_pv_entity.is_a
1138+
]
11431139

11441140
@lru_cache(None)
11451141
def permissible_value_ancestors(

tests/test_utils/test_schemaview.py

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

11081108

1109-
def test_enums_and_enum_relationships(schema_view_no_imports: SchemaView) -> None:
1110-
"""Test various aspects of Enum representation.
1109+
def test_permissible_value_relationships(schema_view_no_imports: SchemaView) -> None:
1110+
"""Test relationships between permissible values.
1111+
1112+
These tests use valid permissible_value / enum combinations.
1113+
1114+
See test_permissible_value_relationships_fail for invalid enum-PV pairings.
11111115
11121116
CAT:
11131117
LION:
@@ -1122,18 +1126,14 @@ def test_enums_and_enum_relationships(schema_view_no_imports: SchemaView) -> Non
11221126
"""
11231127
view = schema_view_no_imports
11241128

1125-
# Test for ValueError when passing incorrect parameters
1126-
with pytest.raises(ValueError, match='No such enum: "not_an_enum"'):
1127-
view.permissible_value_parent("not_a_pv", "not_an_enum")
1128-
11291129
animals = "Animals"
11301130
animal_enum = view.get_enum(animals)
11311131
assert animal_enum.name == animals
11321132

11331133
pv_cat = animal_enum.permissible_values["CAT"]
11341134
assert pv_cat.text == "CAT"
11351135
assert pv_cat.is_a is None
1136-
assert view.permissible_value_parent("CAT", animals) is None
1136+
assert view.permissible_value_parent("CAT", animals) == []
11371137
assert view.permissible_value_ancestors("CAT", animals) == ["CAT"]
11381138
assert set(view.permissible_value_children("CAT", animals)) == {"LION", "TABBY"}
11391139
assert set(view.permissible_value_descendants("CAT", animals)) == {"CAT", "LION", "ANGRY_LION", "TABBY"}
@@ -1160,6 +1160,19 @@ def test_enums_and_enum_relationships(schema_view_no_imports: SchemaView) -> Non
11601160
assert view.permissible_value_descendants("ANGRY_LION", animals) == ["ANGRY_LION"]
11611161

11621162

1163+
@pytest.mark.parametrize("fn", ["parent", "children", "ancestors", "descendants"])
1164+
def test_permissible_value_relationships_fail(schema_view_no_imports: SchemaView, fn: str) -> None:
1165+
"""Test permissible_value relationships with incorrect enum/PV pairs."""
1166+
method_name = f"permissible_value_{fn}"
1167+
# invalid enum
1168+
with pytest.raises(ValueError, match='No such enum: "invalid_enum"'):
1169+
getattr(schema_view_no_imports, method_name)("invalid_pv", "invalid_enum")
1170+
1171+
# invalid pv, valid enum
1172+
with pytest.raises(ValueError, match='"invalid_pv" is not a permissible value of the enum "Animals"'):
1173+
getattr(schema_view_no_imports, method_name)("invalid_pv", "Animals")
1174+
1175+
11631176
# FIXME: improve testing of dynamic enums
11641177
def test_dynamic_enum(schema_view_with_imports: SchemaView) -> None:
11651178
"""Rudimentary test of dynamic enum."""

0 commit comments

Comments
 (0)