1717from .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+
2049class 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