Skip to content

Commit 67eb996

Browse files
committed
ensure that the "include_empty_properties" and "embed_linked_nodes" arguments to to_jsonld() are respected in nested structures
1 parent 8b2219f commit 67eb996

File tree

1 file changed

+45
-29
lines changed

1 file changed

+45
-29
lines changed

pipeline/src/base.py

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,35 @@
1717
from .registry import Registry
1818

1919

20+
def value_to_jsonld(value, include_empty_properties=True, embed_linked_nodes=True):
21+
if isinstance(value, LinkedMetadata):
22+
if embed_linked_nodes:
23+
item = value.to_jsonld(
24+
with_context=False,
25+
include_empty_properties=include_empty_properties,
26+
embed_linked_nodes=embed_linked_nodes,
27+
)
28+
else:
29+
if hasattr(value, "id") and value.id is None:
30+
raise ValueError(
31+
"Exporting as a stand-alone JSON-LD document requires @id to be defined."
32+
)
33+
item = {"@id": value.id}
34+
elif isinstance(value, EmbeddedMetadata):
35+
item = value.to_jsonld(
36+
with_context=False,
37+
include_empty_properties=include_empty_properties,
38+
embed_linked_nodes=embed_linked_nodes,
39+
)
40+
elif hasattr(value, "to_jsonld"): # e.g. IRI
41+
item = value.to_jsonld()
42+
elif isinstance(value, (date, datetime)):
43+
item = value.isoformat()
44+
else:
45+
item = value
46+
return item
47+
48+
2049
class Node(metaclass=Registry):
2150
"""
2251
Base class for a metadata node
@@ -35,37 +64,13 @@ def has_property(self, name):
3564
return True
3665
return False
3766

38-
def to_jsonld(self, include_empty_properties=True, embed_linked_nodes=True, with_context=True):
67+
def to_jsonld(
68+
self, include_empty_properties=True, embed_linked_nodes=True, with_context=True
69+
):
3970
"""
4071
Return a represention of this metadata node as a dictionary that can be directly serialized to JSON-LD.
4172
"""
4273

43-
def value_to_jsonld(value):
44-
if isinstance(value, LinkedMetadata):
45-
if embed_linked_nodes:
46-
item = value.to_jsonld(
47-
with_context=False,
48-
include_empty_properties=include_empty_properties,
49-
embed_linked_nodes=embed_linked_nodes,
50-
)
51-
else:
52-
if hasattr(value, "id") and value.id is None:
53-
raise ValueError("Exporting as a stand-alone JSON-LD document requires @id to be defined.")
54-
item = {"@id": value.id}
55-
elif isinstance(value, EmbeddedMetadata):
56-
item = value.to_jsonld(
57-
with_context=False,
58-
include_empty_properties=include_empty_properties,
59-
embed_linked_nodes=embed_linked_nodes,
60-
)
61-
elif hasattr(value, "to_jsonld"): # e.g. IRI
62-
item = value.to_jsonld()
63-
elif isinstance(value, (date, datetime)):
64-
item = value.isoformat()
65-
else:
66-
item = value
67-
return item
68-
6974
data = {"@type": self.type_}
7075
if with_context:
7176
data["@context"] = {"@vocab": "https://openminds.ebrains.eu/vocab/"}
@@ -80,9 +85,20 @@ def value_to_jsonld(value):
8085
else:
8186
if not isinstance(value, (tuple, list)):
8287
value = [value]
83-
data[property.path] = [value_to_jsonld(item) for item in value]
88+
data[property.path] = [
89+
value_to_jsonld(
90+
item,
91+
include_empty_properties=include_empty_properties,
92+
embed_linked_nodes=embed_linked_nodes,
93+
)
94+
for item in value
95+
]
8496
else:
85-
data[property.path] = value_to_jsonld(value)
97+
data[property.path] = value_to_jsonld(
98+
value,
99+
include_empty_properties=include_empty_properties,
100+
embed_linked_nodes=embed_linked_nodes,
101+
)
86102
return {key: data[key] for key in sorted(data)}
87103

88104
@classmethod

0 commit comments

Comments
 (0)