json-ld 3.2.2 → 3.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/json/ld/api.rb +26 -17
- data/lib/json/ld/compact.rb +16 -16
- data/lib/json/ld/context.rb +52 -84
- data/lib/json/ld/expand.rb +23 -23
- data/lib/json/ld/format.rb +81 -115
- data/lib/json/ld/from_rdf.rb +56 -17
- data/lib/json/ld/streaming_writer.rb +6 -6
- data/lib/json/ld/to_rdf.rb +10 -8
- data/lib/json/ld/writer.rb +3 -3
- data/spec/context_spec.rb +31 -11
- data/spec/frame_spec.rb +43 -0
- data/spec/from_rdf_spec.rb +67 -0
- data/spec/to_rdf_spec.rb +133 -0
- metadata +33 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7df92f96bef30d3af100b145f427533e3fa5bc2a91369e1edc86fd41dc2946bb
|
4
|
+
data.tar.gz: fcd7f3972ea390ace60be529f3106bd04823c8cddbb5efd050d0c9d134586028
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c1df99a21da6ae271caeedc44e0f66fffe77dbae771297153b45286d70a96044dcc97ea62a3aaffe74ac11a847ae52bf641410ba74e43cfed51c5f773c69c9a
|
7
|
+
data.tar.gz: ed0e35ecdaf9118b0ee81a34bb72f92e9344678a8c3e4311f4bed4a35d58bb217b2f4810e1f8cc5c59c97312399e716a237b5c1e841fd538c730d4e8e9e151c7
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.
|
1
|
+
3.2.4
|
data/lib/json/ld/api.rb
CHANGED
@@ -66,6 +66,7 @@ module JSON::LD
|
|
66
66
|
# @param [String, #read, Hash, Array, JSON::LD::Context] context
|
67
67
|
# An external context to use additionally to the context embedded in input when expanding the input.
|
68
68
|
# @param [Hash{Symbol => Object}] options
|
69
|
+
# @option options [Symbol] :adapter used with MultiJson
|
69
70
|
# @option options [RDF::URI, String, #to_s] :base
|
70
71
|
# The Base IRI to use when expanding the document. This overrides the value of `input` if it is a _IRI_. If not specified and `input` is not an _IRI_, the base IRI defaults to the current document IRI if in a browser context, or the empty string if there is no document context. If not specified, and a base IRI is found from `input`, options[:base] will be modified with this value.
|
71
72
|
# @option options [Boolean] :compactArrays (true)
|
@@ -74,10 +75,10 @@ module JSON::LD
|
|
74
75
|
# Creates document relative IRIs when compacting, if `true`, otherwise leaves expanded.
|
75
76
|
# @option options [Proc] :documentLoader
|
76
77
|
# The callback of the loader to be used to retrieve remote documents and contexts. If specified, it must be used to retrieve remote documents and contexts; otherwise, if not specified, the processor's built-in loader must be used. See {documentLoader} for the method signature.
|
77
|
-
# @option options [Boolean] :lowercaseLanguage
|
78
|
-
# By default, language tags are left as is. To normalize to lowercase, set this option to `true`.
|
79
78
|
# @option options [String, #read, Hash, Array, JSON::LD::Context] :expandContext
|
80
79
|
# A context that is used to initialize the active context when expanding a document.
|
80
|
+
# @option options [Boolean] :extendedRepresentation (false)
|
81
|
+
# Use the extended internal representation.
|
81
82
|
# @option options [Boolean] :extractAllScripts
|
82
83
|
# If set, when given an HTML input without a fragment identifier, extracts all `script` elements with type `application/ld+json` into an array during expansion.
|
83
84
|
# @option options [Boolean, String, RDF::URI] :flatten
|
@@ -86,19 +87,19 @@ module JSON::LD
|
|
86
87
|
# When set, this has the effect of inserting a context definition with `@language` set to the associated value, creating a default language for interpreting string values.
|
87
88
|
# @option options [Symbol] :library
|
88
89
|
# One of :nokogiri or :rexml. If nil/unspecified uses :nokogiri if available, :rexml otherwise.
|
90
|
+
# @option options [Boolean] :lowercaseLanguage
|
91
|
+
# By default, language tags are left as is. To normalize to lowercase, set this option to `true`.
|
92
|
+
# @option options [Boolean] :ordered (true)
|
93
|
+
# Order traversal of dictionary members by key when performing algorithms.
|
89
94
|
# @option options [String] :processingMode
|
90
95
|
# Processing mode, json-ld-1.0 or json-ld-1.1.
|
91
|
-
#
|
92
|
-
# @option options [Boolean] rdfstar (false)
|
96
|
+
# @option options [Boolean] :rdfstar (false)
|
93
97
|
# support parsing JSON-LD-star statement resources.
|
94
98
|
# @option options [Boolean] :rename_bnodes (true)
|
95
99
|
# Rename bnodes as part of expansion, or keep them the same.
|
96
100
|
# @option options [Boolean] :unique_bnodes (false)
|
97
101
|
# Use unique bnode identifiers, defaults to using the identifier which the node was originally initialized with (if any).
|
98
|
-
# @option options [Symbol] :adapter used with MultiJson
|
99
102
|
# @option options [Boolean] :validate Validate input, if a string or readable object.
|
100
|
-
# @option options [Boolean] :ordered (true)
|
101
|
-
# Order traversal of dictionary members by key when performing algorithms.
|
102
103
|
# @yield [api]
|
103
104
|
# @yieldparam [API]
|
104
105
|
# @raise [JsonLdError]
|
@@ -235,7 +236,7 @@ module JSON::LD
|
|
235
236
|
end
|
236
237
|
|
237
238
|
API.new(expanded_input, context, no_default_base: true, **options) do
|
238
|
-
log_debug(".compact") {"expanded input: #{expanded_input.to_json(JSON_STATE) rescue 'malformed json'}"}
|
239
|
+
# log_debug(".compact") {"expanded input: #{expanded_input.to_json(JSON_STATE) rescue 'malformed json'}"}
|
239
240
|
result = compact(value)
|
240
241
|
|
241
242
|
# xxx) Add the given context to the output
|
@@ -289,7 +290,7 @@ module JSON::LD
|
|
289
290
|
|
290
291
|
# Initialize input using
|
291
292
|
API.new(expanded_input, context, no_default_base: true, **options) do
|
292
|
-
log_debug(".flatten") {"expanded input: #{value.to_json(JSON_STATE) rescue 'malformed json'}"}
|
293
|
+
# log_debug(".flatten") {"expanded input: #{value.to_json(JSON_STATE) rescue 'malformed json'}"}
|
293
294
|
|
294
295
|
# Rename blank nodes recusively. Note that this does not create new blank node identifiers where none exist, which is performed in the node map generation algorithm.
|
295
296
|
@value = rename_bnodes(@value) if @options[:rename_bnodes]
|
@@ -410,8 +411,8 @@ module JSON::LD
|
|
410
411
|
|
411
412
|
# Initialize input using frame as context
|
412
413
|
API.new(expanded_input, frame['@context'], no_default_base: true, **options) do
|
413
|
-
log_debug(".frame") {"expanded input: #{expanded_input.to_json(JSON_STATE) rescue 'malformed json'}"}
|
414
|
-
log_debug(".frame") {"expanded frame: #{expanded_frame.to_json(JSON_STATE) rescue 'malformed json'}"}
|
414
|
+
# log_debug(".frame") {"expanded input: #{expanded_input.to_json(JSON_STATE) rescue 'malformed json'}"}
|
415
|
+
# log_debug(".frame") {"expanded frame: #{expanded_frame.to_json(JSON_STATE) rescue 'malformed json'}"}
|
415
416
|
|
416
417
|
if %w(@first @last).include?(options[:embed]) && context.processingMode('json-ld-1.1')
|
417
418
|
raise JSON::LD::JsonLdError::InvalidEmbedValue, "#{options[:embed]} is not a valid value of @embed in 1.1 mode" if @options[:validate]
|
@@ -458,7 +459,7 @@ module JSON::LD
|
|
458
459
|
|
459
460
|
# Replace values with `@preserve` with the content of its entry.
|
460
461
|
result = cleanup_preserve(result)
|
461
|
-
log_debug(".frame") {"expanded result: #{result.to_json(JSON_STATE) rescue 'malformed json'}"}
|
462
|
+
# log_debug(".frame") {"expanded result: #{result.to_json(JSON_STATE) rescue 'malformed json'}"}
|
462
463
|
|
463
464
|
# Compact result
|
464
465
|
compacted = compact(result)
|
@@ -477,7 +478,7 @@ module JSON::LD
|
|
477
478
|
# Only add context if one was provided
|
478
479
|
result = context.serialize(provided_context: frame).merge(result) if frame['@context']
|
479
480
|
|
480
|
-
log_debug(".frame") {"after compact: #{result.to_json(JSON_STATE) rescue 'malformed json'}"}
|
481
|
+
# log_debug(".frame") {"after compact: #{result.to_json(JSON_STATE) rescue 'malformed json'}"}
|
481
482
|
result
|
482
483
|
end
|
483
484
|
|
@@ -518,7 +519,7 @@ module JSON::LD
|
|
518
519
|
API.new(flattened_input, nil, **options) do
|
519
520
|
# 1) Perform the Expansion Algorithm on the JSON-LD input.
|
520
521
|
# This removes any existing context to allow the given context to be cleanly applied.
|
521
|
-
log_debug(".toRdf") {"flattened input: #{flattened_input.to_json(JSON_STATE) rescue 'malformed json'}"}
|
522
|
+
# log_debug(".toRdf") {"flattened input: #{flattened_input.to_json(JSON_STATE) rescue 'malformed json'}"}
|
522
523
|
|
523
524
|
# Recurse through input
|
524
525
|
flattened_input.each do |node|
|
@@ -527,7 +528,7 @@ module JSON::LD
|
|
527
528
|
|
528
529
|
# Drop invalid statements (other than IRIs)
|
529
530
|
unless statement.valid_extended?
|
530
|
-
log_debug(".toRdf") {"drop invalid statement: #{statement.to_nquads}"}
|
531
|
+
# log_debug(".toRdf") {"drop invalid statement: #{statement.to_nquads}"}
|
531
532
|
next
|
532
533
|
end
|
533
534
|
|
@@ -562,6 +563,7 @@ module JSON::LD
|
|
562
563
|
|
563
564
|
API.new(nil, nil, **options) do
|
564
565
|
result = from_statements(input,
|
566
|
+
extendedRepresentation: options[:extendedRepresentation],
|
565
567
|
useRdfType: useRdfType,
|
566
568
|
useNativeTypes: useNativeTypes)
|
567
569
|
end
|
@@ -574,6 +576,9 @@ module JSON::LD
|
|
574
576
|
# Uses built-in or provided documentLoader to retrieve a parsed document.
|
575
577
|
#
|
576
578
|
# @param [RDF::URI, String] url
|
579
|
+
# @param [Regexp] allowed_content_types
|
580
|
+
# A regular expression matching other content types allowed
|
581
|
+
# beyond types for JSON and HTML.
|
577
582
|
# @param [String, RDF::URI] base
|
578
583
|
# Location to use as documentUrl instead of `url`.
|
579
584
|
# @option options [Proc] :documentLoader
|
@@ -594,6 +599,7 @@ module JSON::LD
|
|
594
599
|
# If a block is given, the result of evaluating the block is returned, otherwise, the retrieved remote document and context information unless block given
|
595
600
|
# @raise [JsonLdError]
|
596
601
|
def self.loadRemoteDocument(url,
|
602
|
+
allowed_content_types: nil,
|
597
603
|
base: nil,
|
598
604
|
documentLoader: nil,
|
599
605
|
extractAllScripts: false,
|
@@ -674,7 +680,8 @@ module JSON::LD
|
|
674
680
|
|
675
681
|
if remote_doc.contentType && validate
|
676
682
|
raise IOError, "url: #{url}, contentType: #{remote_doc.contentType}" unless
|
677
|
-
remote_doc.contentType.match?(/application\/(.+\+)?json|text\/html|application\/xhtml\+xml/)
|
683
|
+
remote_doc.contentType.match?(/application\/(.+\+)?json|text\/html|application\/xhtml\+xml/) ||
|
684
|
+
(allowed_content_types && remote_doc.contentType.match?(allowed_content_types))
|
678
685
|
end
|
679
686
|
block_given? ? yield(remote_doc) : remote_doc
|
680
687
|
end
|
@@ -827,8 +834,10 @@ module JSON::LD
|
|
827
834
|
# other arguments that may be passed for some specific implementation.
|
828
835
|
# @param [Hash<Symbol, Object>] options
|
829
836
|
# options passed from the invoking context.
|
837
|
+
# @option options [Object] :serializer_opts (JSON_STATE)
|
830
838
|
def self.serializer(object, *args, **options)
|
831
|
-
|
839
|
+
serializer_opts = options.fetch(:serializer_opts, JSON_STATE)
|
840
|
+
MultiJson.dump(object, serializer_opts)
|
832
841
|
end
|
833
842
|
|
834
843
|
##
|
data/lib/json/ld/compact.rb
CHANGED
@@ -21,14 +21,14 @@ module JSON::LD
|
|
21
21
|
base: nil,
|
22
22
|
property: nil,
|
23
23
|
log_depth: nil)
|
24
|
-
log_debug("compact", depth: log_depth.to_i) {"element: #{element.inspect}, ec: #{context.inspect}"}
|
24
|
+
# log_debug("compact", depth: log_depth.to_i) {"element: #{element.inspect}, ec: #{context.inspect}"}
|
25
25
|
|
26
26
|
# If the term definition for active property itself contains a context, use that for compacting values.
|
27
27
|
input_context = self.context
|
28
28
|
|
29
29
|
case element
|
30
30
|
when Array
|
31
|
-
#log_debug("") {"Array #{element.inspect}"}
|
31
|
+
# log_debug("") {"Array #{element.inspect}"}
|
32
32
|
result = element.map do |item|
|
33
33
|
compact(item, base: base, property: property, log_depth: log_depth.to_i + 1)
|
34
34
|
end.compact
|
@@ -38,10 +38,10 @@ module JSON::LD
|
|
38
38
|
# member; otherwise the compacted value is element
|
39
39
|
if result.length == 1 &&
|
40
40
|
!context.as_array?(property) && @options[:compactArrays]
|
41
|
-
log_debug("=> extract single element", depth: log_depth.to_i) {result.first.inspect}
|
41
|
+
# log_debug("=> extract single element", depth: log_depth.to_i) {result.first.inspect}
|
42
42
|
result.first
|
43
43
|
else
|
44
|
-
log_debug("=> array result", depth: log_depth.to_i) {result.inspect}
|
44
|
+
# log_debug("=> array result", depth: log_depth.to_i) {result.inspect}
|
45
45
|
result
|
46
46
|
end
|
47
47
|
when Hash
|
@@ -52,7 +52,7 @@ module JSON::LD
|
|
52
52
|
|
53
53
|
# Revert any previously type-scoped (non-preserved) context
|
54
54
|
if context.previous_context && !element.key?('@value') && element.keys != %w(@id)
|
55
|
-
log_debug("revert ec", depth: log_depth.to_i) {"previous context: #{context.previous_context.inspect}"}
|
55
|
+
# log_debug("revert ec", depth: log_depth.to_i) {"previous context: #{context.previous_context.inspect}"}
|
56
56
|
self.context = context.previous_context
|
57
57
|
end
|
58
58
|
|
@@ -61,13 +61,13 @@ module JSON::LD
|
|
61
61
|
if td && !td.context.nil?
|
62
62
|
self.context = context.parse(td.context,
|
63
63
|
override_protected: true)
|
64
|
-
log_debug("prop-scoped", depth: log_depth.to_i) {"context: #{self.context.inspect}"}
|
64
|
+
# log_debug("prop-scoped", depth: log_depth.to_i) {"context: #{self.context.inspect}"}
|
65
65
|
end
|
66
66
|
|
67
67
|
if (element.key?('@id') || element.key?('@value')) && !element.key?('@annotation')
|
68
68
|
result = context.compact_value(property, element, base: @options[:base])
|
69
69
|
if !result.is_a?(Hash) || context.coerce(property) == '@json'
|
70
|
-
log_debug("", depth: log_depth.to_i) {"=> scalar result: #{result.inspect}"}
|
70
|
+
# log_debug("", depth: log_depth.to_i) {"=> scalar result: #{result.inspect}"}
|
71
71
|
return result
|
72
72
|
end
|
73
73
|
end
|
@@ -90,12 +90,12 @@ module JSON::LD
|
|
90
90
|
each do |term|
|
91
91
|
term_context = input_context.term_definitions[term].context if input_context.term_definitions[term]
|
92
92
|
self.context = context.parse(term_context, propagate: false) unless term_context.nil?
|
93
|
-
log_debug("type-scoped", depth: log_depth.to_i) {"context: #{self.context.inspect}"}
|
93
|
+
# log_debug("type-scoped", depth: log_depth.to_i) {"context: #{self.context.inspect}"}
|
94
94
|
end
|
95
95
|
|
96
96
|
element.keys.opt_sort(ordered: @options[:ordered]).each do |expanded_property|
|
97
97
|
expanded_value = element[expanded_property]
|
98
|
-
log_debug("", depth: log_depth.to_i) {"#{expanded_property}: #{expanded_value.inspect}"}
|
98
|
+
# log_debug("", depth: log_depth.to_i) {"#{expanded_property}: #{expanded_value.inspect}"}
|
99
99
|
|
100
100
|
if expanded_property == '@id'
|
101
101
|
compacted_value = as_array(expanded_value).map do |expanded_id|
|
@@ -134,7 +134,7 @@ module JSON::LD
|
|
134
134
|
compacted_value = compact(expanded_value, base: base,
|
135
135
|
property: '@reverse',
|
136
136
|
log_depth: log_depth.to_i + 1)
|
137
|
-
log_debug("@reverse", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
|
137
|
+
# log_debug("@reverse", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
|
138
138
|
# handle double-reversed properties
|
139
139
|
compacted_value.each do |prop, value|
|
140
140
|
if context.reverse?(prop)
|
@@ -146,7 +146,7 @@ module JSON::LD
|
|
146
146
|
|
147
147
|
unless compacted_value.empty?
|
148
148
|
al = context.compact_iri('@reverse', vocab: true)
|
149
|
-
log_debug("", depth: log_depth.to_i) {"remainder: #{al} => #{compacted_value.inspect}"}
|
149
|
+
# log_debug("", depth: log_depth.to_i) {"remainder: #{al} => #{compacted_value.inspect}"}
|
150
150
|
result[al] = compacted_value
|
151
151
|
end
|
152
152
|
next
|
@@ -157,7 +157,7 @@ module JSON::LD
|
|
157
157
|
compacted_value = compact(expanded_value, base: base,
|
158
158
|
property: property,
|
159
159
|
log_depth: log_depth.to_i + 1)
|
160
|
-
log_debug("@preserve", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
|
160
|
+
# log_debug("@preserve", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
|
161
161
|
|
162
162
|
unless compacted_value.is_a?(Array) && compacted_value.empty?
|
163
163
|
result['@preserve'] = compacted_value
|
@@ -166,14 +166,14 @@ module JSON::LD
|
|
166
166
|
end
|
167
167
|
|
168
168
|
if expanded_property == '@index' && context.container(property).include?('@index')
|
169
|
-
log_debug("@index", depth: log_depth.to_i) {"drop @index"}
|
169
|
+
# log_debug("@index", depth: log_depth.to_i) {"drop @index"}
|
170
170
|
next
|
171
171
|
end
|
172
172
|
|
173
173
|
# Otherwise, if expanded property is @direction, @index, @value, or @language:
|
174
174
|
if EXPANDED_PROPERTY_DIRECTION_INDEX_LANGUAGE_VALUE.include?(expanded_property)
|
175
175
|
al = context.compact_iri(expanded_property, vocab: true)
|
176
|
-
log_debug(expanded_property, depth: log_depth.to_i) {"#{al} => #{expanded_value.inspect}"}
|
176
|
+
# log_debug(expanded_property, depth: log_depth.to_i) {"#{al} => #{expanded_value.inspect}"}
|
177
177
|
result[al] = expanded_value
|
178
178
|
next
|
179
179
|
end
|
@@ -223,7 +223,7 @@ module JSON::LD
|
|
223
223
|
compacted_item = compact(value, base: base,
|
224
224
|
property: item_active_property,
|
225
225
|
log_depth: log_depth.to_i + 1)
|
226
|
-
log_debug("", depth: log_depth.to_i) {" => compacted key: #{item_active_property.inspect} for #{compacted_item.inspect}"}
|
226
|
+
# log_debug("", depth: log_depth.to_i) {" => compacted key: #{item_active_property.inspect} for #{compacted_item.inspect}"}
|
227
227
|
|
228
228
|
# handle @list
|
229
229
|
if list?(expanded_item)
|
@@ -345,7 +345,7 @@ module JSON::LD
|
|
345
345
|
result
|
346
346
|
else
|
347
347
|
# For other types, the compacted value is the element value
|
348
|
-
log_debug("compact", depth: log_depth.to_i) {element.class.to_s}
|
348
|
+
# log_debug("compact", depth: log_depth.to_i) {element.class.to_s}
|
349
349
|
element
|
350
350
|
end
|
351
351
|
|