From dad962851f26adb3d91f175a624fe84337bdd8f4 Mon Sep 17 00:00:00 2001 From: Andrew Davison Date: Mon, 27 Nov 2023 22:48:10 +0100 Subject: [PATCH 1/2] regression test for #26 --- pipeline/tests/test_regressions.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pipeline/tests/test_regressions.py b/pipeline/tests/test_regressions.py index 9610a2c6..68d4696e 100644 --- a/pipeline/tests/test_regressions.py +++ b/pipeline/tests/test_regressions.py @@ -186,3 +186,31 @@ def test_issue0008(): "givenName": "A", } assert actual == expected + + +def test_issue0026(): + # https://github.com/openMetadataInitiative/openMINDS_Python/issues/26 + # When reading a JSON-LD file, the attributes of LinkedMetadata nodes + # inside EmbeddedMetadata nodes are not set properly + + uni1 = omcore.Organization(full_name="University of This Place", id="_:uthisp") + person = omcore.Person( + given_name="A", + family_name="Professor", + affiliation = [omcore.Affiliation(member_of=uni1)], + id="_:ap" + ) + + c = Collection(person) + + # uni1 was not added explicitly, but should nevertheless be included in the JSON-LD export + + output_paths = c.save("issue0026.jsonld", individual_files=False, include_empty_properties=False) + + new_collection = Collection() + new_collection.load(*output_paths) + os.remove("issue0026.jsonld") + + person_again = [item for item in new_collection if isinstance(item, omcore.Person)][0] + assert len(person_again.affiliation) == 1 + assert person_again.affiliation[0].member_of.full_name == "University of This Place" From f21d790aa2e296e824f30d14c190ff393317a9db Mon Sep 17 00:00:00 2001 From: Andrew Davison Date: Mon, 27 Nov 2023 22:50:37 +0100 Subject: [PATCH 2/2] fixes #26 --- pipeline/src/base.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pipeline/src/base.py b/pipeline/src/base.py index 54c54f27..8b579caf 100644 --- a/pipeline/src/base.py +++ b/pipeline/src/base.py @@ -152,6 +152,18 @@ def _resolve_links(self, node_lookup): if isinstance(value, Link): resolved_value = node_lookup[value.identifier] setattr(self, property.name, resolved_value) + elif hasattr(value, "_resolve_links"): + value._resolve_links(node_lookup) + elif isinstance(value, (tuple, list)): + resolved_values = [] + for item in value: + if isinstance(item, Link): + resolved_values.append(node_lookup[item.identifier]) + else: + resolved_values.append(item) + if hasattr(item, "_resolve_links"): + item._resolve_links(node_lookup) + setattr(self, property.name, resolved_values) class LinkedMetadata(Node):