Skip to content

Commit

Permalink
Merge pull request #221 from linkml/998_enum_slot_links
Browse files Browse the repository at this point in the history
Add function to get all slots using named enum as range
  • Loading branch information
amc-corey-cox authored Nov 1, 2022
2 parents 171c2fa + 410fb54 commit c5730ce
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
9 changes: 9 additions & 0 deletions linkml_runtime/utils/schemaview.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]]:
"""
Expand Down
43 changes: 43 additions & 0 deletions tests/test_issues/input/linkml_issue_998.yaml
Original file line number Diff line number Diff line change
@@ -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:
36 changes: 36 additions & 0 deletions tests/test_issues/test_linkml_issue_998.py
Original file line number Diff line number Diff line change
@@ -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()

0 comments on commit c5730ce

Please sign in to comment.