Skip to content

Commit 9b96db2

Browse files
authored
Merge pull request #173 from linkml/linkml-issue-784
Adding from_schema to types. Fixes linkml/linkml#784
2 parents 192a339 + f0a8758 commit 9b96db2

File tree

2 files changed

+68
-27
lines changed

2 files changed

+68
-27
lines changed

linkml_runtime/utils/schemaview.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def imports_closure(self, traverse=True, inject_metadata=True) -> List[SchemaDef
175175
todo.append(i)
176176
if inject_metadata:
177177
for s in self.schema_map.values():
178-
for x in {**s.classes, **s.enums, **s.slots, **s.subsets}.values():
178+
for x in {**s.classes, **s.enums, **s.slots, **s.subsets, **s.types}.values():
179179
x.from_schema = s.id
180180
for c in s.classes.values():
181181
for a in c.attributes.values():

tests/test_utils/test_schemaview.py

Lines changed: 67 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from copy import copy
55
from typing import List
66

7-
from linkml_runtime.linkml_model.meta import SchemaDefinition, ClassDefinition, SlotDefinitionName, SlotDefinition
7+
from linkml_runtime.linkml_model.meta import SchemaDefinition, ClassDefinition, SlotDefinitionName, SlotDefinition, \
8+
ClassDefinitionName
89
from linkml_runtime.loaders.yaml_loader import YAMLLoader
910
from linkml_runtime.utils.introspection import package_schemaview, object_class_definition
1011
from linkml_runtime.utils.schemaview import SchemaView, SchemaUsage, OrderedBy
@@ -61,26 +62,29 @@ def test_schemaview(self):
6162
category_mapping = view.get_element_by_mapping("GO:0005198")
6263
assert category_mapping == ['activity']
6364

64-
if True:
65-
for sn, s in view.all_slots().items():
66-
logging.info(f'SN = {sn} RANGE={s.range}')
67-
# this section is mostly for debugging
68-
for cn in all_cls.keys():
69-
logging.debug(f'{cn} FROM SCHEMA = {view.get_class(cn).from_schema}')
70-
logging.debug(f'{cn} PARENTS = {view.class_parents(cn)}')
71-
logging.debug(f'{cn} ANCS = {view.class_ancestors(cn)}')
72-
logging.debug(f'{cn} CHILDREN = {view.class_children(cn)}')
73-
logging.debug(f'{cn} DESCS = {view.class_descendants(cn)}')
74-
logging.debug(f'{cn} SCHEMA = {view.in_schema(cn)}')
75-
logging.debug(f' SLOTS = {view.class_slots(cn)}')
76-
for sn in view.class_slots(cn):
77-
slot = view.get_slot(sn)
78-
if slot is None:
79-
logging.debug(f'NO SLOT: {sn}')
80-
else:
81-
logging.debug(f' SLOT {sn} R: {slot.range} U: {view.get_uri(sn)} ANCS: {view.slot_ancestors(sn)}')
82-
induced_slot = view.induced_slot(sn, cn)
83-
logging.debug(f' INDUCED {sn}={induced_slot}')
65+
for tn, t in view.all_types().items():
66+
logging.info(f'TN = {tn}')
67+
print(f'{tn} {t.from_schema}')
68+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', t.from_schema)
69+
for sn, s in view.all_slots().items():
70+
logging.info(f'SN = {sn} RANGE={s.range}')
71+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', s.from_schema)
72+
# this section is mostly for debugging
73+
for cn in all_cls.keys():
74+
c = view.get_class(cn)
75+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', c.from_schema)
76+
logging.debug(f'{cn} PARENTS = {view.class_parents(cn)}')
77+
logging.debug(f'{cn} ANCS = {view.class_ancestors(cn)}')
78+
logging.debug(f'{cn} CHILDREN = {view.class_children(cn)}')
79+
logging.debug(f'{cn} DESCS = {view.class_descendants(cn)}')
80+
logging.debug(f'{cn} SCHEMA = {view.in_schema(cn)}')
81+
logging.debug(f' SLOTS = {view.class_slots(cn)}')
82+
for sn in view.class_slots(cn):
83+
slot = view.get_slot(sn)
84+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', slot.from_schema)
85+
logging.debug(f' SLOT {sn} R: {slot.range} U: {view.get_uri(sn)} ANCS: {view.slot_ancestors(sn)}')
86+
induced_slot = view.induced_slot(sn, cn)
87+
logging.debug(f' INDUCED {sn}={induced_slot}')
8488

8589
logging.debug(f'ALL = {view.all_elements().keys()}')
8690

@@ -305,13 +309,50 @@ def test_imports(self):
305309
self.assertCountEqual(['kitchen_sink', 'core', 'linkml:types'], view.imports_closure())
306310
for t in view.all_types().keys():
307311
logging.debug(f'T={t} in={view.in_schema(t)}')
308-
assert view.in_schema('Person') == 'kitchen_sink'
309-
assert view.in_schema('id') == 'core'
310-
assert view.in_schema('name') == 'core'
311-
assert view.in_schema('activity') == 'core'
312-
assert view.in_schema('string') == 'types'
312+
assert view.in_schema(ClassDefinitionName('Person')) == 'kitchen_sink'
313+
assert view.in_schema(SlotDefinitionName('id')) == 'core'
314+
assert view.in_schema(SlotDefinitionName('name')) == 'core'
315+
assert view.in_schema(SlotDefinitionName('activity')) == 'core'
316+
assert view.in_schema(SlotDefinitionName('string')) == 'types'
313317
assert 'activity' in view.all_classes()
314318
assert 'activity' not in view.all_classes(imports=False)
319+
assert 'string' in view.all_types()
320+
assert 'string' not in view.all_types(imports=False)
321+
322+
for tn, t in view.all_types().items():
323+
self.assertEqual(tn, t.name)
324+
if t in view.all_types(imports=False).values():
325+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', t.from_schema)
326+
else:
327+
self.assertIn(t.from_schema, ['https://w3id.org/linkml/tests/core', 'https://w3id.org/linkml/types'])
328+
for en, e in view.all_enums().items():
329+
self.assertEqual(en, e.name)
330+
print(f'{en}: {e.from_schema}')
331+
if e in view.all_enums(imports=False).values():
332+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', e.from_schema)
333+
else:
334+
self.assertEqual('https://w3id.org/linkml/tests/core', e.from_schema)
335+
for sn, s in view.all_slots().items():
336+
self.assertEqual(sn, s.name)
337+
#self.assertIsNotNone(s.slot_uri)
338+
if s in view.all_slots(imports=False).values():
339+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', s.from_schema)
340+
else:
341+
self.assertEqual('https://w3id.org/linkml/tests/core', s.from_schema)
342+
for cn, c in view.all_classes().items():
343+
self.assertEqual(cn, c.name)
344+
#self.assertIsNotNone(c.class_uri)
345+
if c in view.all_classes(imports=False).values():
346+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', c.from_schema)
347+
else:
348+
self.assertEqual('https://w3id.org/linkml/tests/core', c.from_schema)
349+
for s in view.class_induced_slots(cn):
350+
if s in view.all_classes(imports=False).values():
351+
self.assertIsNotNone(s.slot_uri)
352+
self.assertEqual('https://w3id.org/linkml/tests/kitchen_sink', s.from_schema)
353+
#else:
354+
# self.assertEqual('https://w3id.org/linkml/tests/core', s.from_schema)
355+
315356

316357
for c in ['Company', 'Person', 'Organization', 'Thing']:
317358
assert view.induced_slot('id', c).identifier is True

0 commit comments

Comments
 (0)