diff --git a/linkml_runtime/utils/schemaview.py b/linkml_runtime/utils/schemaview.py index 09cae8fb..e23ea4e3 100644 --- a/linkml_runtime/utils/schemaview.py +++ b/linkml_runtime/utils/schemaview.py @@ -1323,6 +1323,15 @@ def get_classes_by_slot(self, slot: SlotDefinition, include_induced: bool = Fals return list(dict.fromkeys(slots_list)) + @lru_cache() + def get_slots_by_enum(self, enum_name: ENUM_NAME = None) -> List[SlotDefinition]: + """Get all slots that use a given enum, either as schema defined or an attribute slot. + + :param enum_name: enum in consideration + :return: list of slots, either schem or both class attribute defined + """ + return [s for s in self.all_slots().values() if s.range == enum_name] + @lru_cache() def usage_index(self) -> Dict[ElementName, List[SchemaUsage]]: """ diff --git a/tests/test_issues/input/linkml_issue_998.yaml b/tests/test_issues/input/linkml_issue_998.yaml new file mode 100644 index 00000000..d1b28146 --- /dev/null +++ b/tests/test_issues/input/linkml_issue_998.yaml @@ -0,0 +1,43 @@ +id: https://w3id.org/linkml/examples/personinfo +name: personinfo +prefixes: + linkml: https://w3id.org/linkml/ + schema: http://schema.org/ + personinfo: https://w3id.org/linkml/examples/personinfo/ + ORCID: https://orcid.org/ +imports: + - linkml:types +default_range: string + +classes: + Person: + class_uri: schema:Person + attributes: + id: + identifier: true + employed: + range: EmploymentStatusEnum + past_relationship: + range: RelationshipStatusEnum + + +slots: + status: + range: PersonStatusEnum + relationship: + range: RelationshipStatusEnum + +enums: + PersonStatusEnum: + permissible_values: + ALIVE: + DEAD: + UNKNOWN: + EmployedStatusEnum: + permissible_values: + EMPLOYED: + UNEMPLOYED: + UNKNOWN: + RelationshipStatusEnum: + permissible_values: + UNKNOWN: diff --git a/tests/test_issues/test_linkml_issue_998.py b/tests/test_issues/test_linkml_issue_998.py new file mode 100644 index 00000000..a7a8248a --- /dev/null +++ b/tests/test_issues/test_linkml_issue_998.py @@ -0,0 +1,36 @@ +import logging +import unittest +from unittest import TestCase +from linkml_runtime.utils.schemaview import SchemaView + +from tests.test_issues.environment import env + + +class Issue998TestCase(TestCase): + """ + https://github.com/linkml/linkml/issues/998 + """ + env = env + + def test_issue_998_schema_slot(self): + view = SchemaView(env.input_path('linkml_issue_998.yaml')) + enum_slots = view.get_slots_by_enum("PersonStatusEnum") + # assert type(enum_slots) is List[SlotDefinition] + assert len(enum_slots) == 1 + assert enum_slots[0].name == "status" + + def test_issue_998_attribute_slot(self): + view = SchemaView(env.input_path('linkml_issue_998.yaml')) + enum_slots = view.get_slots_by_enum("EmploymentStatusEnum") + assert len(enum_slots) == 1 + assert enum_slots[0].name == "employed" + + def test_issue_998_schema_and_atribute_slots(self): + view = SchemaView(env.input_path('linkml_issue_998.yaml')) + enum_slots = view.get_slots_by_enum("RelationshipStatusEnum") + assert len(enum_slots) == 2 + assert enum_slots[0].name == "relationship" + assert enum_slots[1].name == "past_relationship" + +if __name__ == "__main__": + unittest.main()