json-ld 3.1.1 → 3.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
3
  $:.unshift(File.expand_path("../ld", __FILE__))
4
- require 'rdf' # @see http://rubygems.org/gems/rdf
4
+ require 'rdf' # @see https://rubygems.org/gems/rdf
5
5
  require 'multi_json'
6
6
  require 'set'
7
7
 
@@ -19,7 +19,7 @@ module JSON
19
19
  # end
20
20
  # end
21
21
  #
22
- # @see http://rubygems.org/gems/rdf
22
+ # @see https://rubygems.org/gems/rdf
23
23
  # @see http://www.w3.org/TR/REC-rdf-syntax/
24
24
  #
25
25
  # @author [Gregg Kellogg](http://greggkellogg.net/)
@@ -34,6 +34,8 @@ module JSON
34
34
  autoload :Normalize, 'json/ld/normalize'
35
35
  autoload :Reader, 'json/ld/reader'
36
36
  autoload :Resource, 'json/ld/resource'
37
+ autoload :StreamingReader, 'json/ld/streaming_reader'
38
+ autoload :StreamingWriter, 'json/ld/streaming_writer'
37
39
  autoload :VERSION, 'json/ld/version'
38
40
  autoload :Writer, 'json/ld/writer'
39
41
 
@@ -52,13 +54,13 @@ module JSON
52
54
  @direction
53
55
  @embed
54
56
  @explicit
55
- @json
56
- @id
57
- @included
58
- @index
59
57
  @first
60
58
  @graph
59
+ @id
61
60
  @import
61
+ @included
62
+ @index
63
+ @json
62
64
  @language
63
65
  @list
64
66
  @nest
@@ -66,6 +68,7 @@ module JSON
66
68
  @omitDefault
67
69
  @propagate
68
70
  @protected
71
+ @preserve
69
72
  @requireAll
70
73
  @reverse
71
74
  @set
@@ -134,6 +137,7 @@ module JSON
134
137
  class InvalidNestValue < JsonLdError; @code = "invalid @nest value"; end
135
138
  class InvalidPrefixValue < JsonLdError; @code = "invalid @prefix value"; end
136
139
  class InvalidPropagateValue < JsonLdError; @code = "invalid @propagate value"; end
140
+ class InvalidEmbeddedNode < JsonLdError; @code = "invalid reified node"; end
137
141
  class InvalidRemoteContext < JsonLdError; @code = "invalid remote context"; end
138
142
  class InvalidReverseProperty < JsonLdError; @code = "invalid reverse property"; end
139
143
  class InvalidReversePropertyMap < JsonLdError; @code = "invalid reverse property map"; end
@@ -142,6 +146,7 @@ module JSON
142
146
  class InvalidScopedContext < JsonLdError; @code = "invalid scoped context"; end
143
147
  class InvalidScriptElement < JsonLdError; @code = "invalid script element"; end
144
148
  class InvalidSetOrListObject < JsonLdError; @code = "invalid set or list object"; end
149
+ class InvalidStreamingKeyOrder < JsonLdError; @code = 'invalid streaming key order' end
145
150
  class InvalidTermDefinition < JsonLdError; @code = "invalid term definition"; end
146
151
  class InvalidBaseDirection < JsonLdError; @code = "invalid base direction"; end
147
152
  class InvalidTypedValue < JsonLdError; @code = "invalid typed value"; end
@@ -154,7 +159,7 @@ module JSON
154
159
  class KeywordRedefinition < JsonLdError; @code = "keyword redefinition"; end
155
160
  class LoadingDocumentFailed < JsonLdError; @code = "loading document failed"; end
156
161
  class LoadingRemoteContextFailed < JsonLdError; @code = "loading remote context failed"; end
157
- class ContextOverflow < JsonLdError; @code = "maximum number of @context URLs exceeded"; end
162
+ class ContextOverflow < JsonLdError; @code = "context overflow"; end
158
163
  class MissingIncludedReferent < JsonLdError; @code = "missing @included referent"; end
159
164
  class MultipleContextLinkHeaders < JsonLdError; @code = "multiple context link headers"; end
160
165
  class ProtectedTermRedefinition < JsonLdError; @code = "protected term redefinition"; end
@@ -66,7 +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 [String, #to_s] :base
69
+ # @option options [RDF::URI, String, #to_s] :base
70
70
  # 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
71
  # @option options [Boolean] :compactArrays (true)
72
72
  # If set to `true`, the JSON-LD processor replaces arrays with just one element with that element during compaction. If set to `false`, all arrays will remain arrays even if they have just one element.
@@ -89,6 +89,8 @@ module JSON::LD
89
89
  # @option options [String] :processingMode
90
90
  # Processing mode, json-ld-1.0 or json-ld-1.1.
91
91
  # If `processingMode` is not specified, a mode of `json-ld-1.0` or `json-ld-1.1` is set, the context used for `expansion` or `compaction`.
92
+ # @option options [Boolean] rdfstar (false)
93
+ # support parsing JSON-LD* statement resources.
92
94
  # @option options [Boolean] :rename_bnodes (true)
93
95
  # Rename bnodes as part of expansion, or keep them the same.
94
96
  # @option options [Boolean] :unique_bnodes (false)
@@ -108,6 +110,7 @@ module JSON::LD
108
110
  }.merge(options)
109
111
  @namer = unique_bnodes ? BlankNodeUniqer.new : (rename_bnodes ? BlankNodeNamer.new("b") : BlankNodeMapper.new)
110
112
 
113
+ @options[:base] = RDF::URI(@options[:base]) if @options[:base] && !@options[:base].is_a?(RDF::URI)
111
114
  # For context via Link header
112
115
  _, context_ref = nil, nil
113
116
 
@@ -117,7 +120,7 @@ module JSON::LD
117
120
  remote_doc = self.class.loadRemoteDocument(input, **@options)
118
121
 
119
122
  context_ref = remote_doc.contextUrl
120
- @options[:base] = remote_doc.documentUrl if remote_doc.documentUrl && !@options[:no_default_base]
123
+ @options[:base] = RDF::URI(remote_doc.documentUrl) if remote_doc.documentUrl && !@options[:no_default_base]
121
124
 
122
125
  case remote_doc.document
123
126
  when String
@@ -130,7 +133,7 @@ module JSON::LD
130
133
 
131
134
  # If not provided, first use context from document, or from a Link header
132
135
  context ||= context_ref || {}
133
- @context = Context.parse(context || {}, **@options)
136
+ @context = Context.parse(context, **@options)
134
137
 
135
138
  if block_given?
136
139
  case block.arity
@@ -163,10 +166,9 @@ module JSON::LD
163
166
  # If a block is given, the result of evaluating the block is returned, otherwise, the expanded JSON-LD document
164
167
  # @see https://www.w3.org/TR/json-ld11-api/#expansion-algorithm
165
168
  def self.expand(input, framing: false, **options, &block)
166
- result, doc_base = nil
169
+ result = doc_base = nil
167
170
  API.new(input, options[:expandContext], **options) do
168
171
  result = self.expand(self.value, nil, self.context,
169
- ordered: @options[:ordered],
170
172
  framing: framing)
171
173
  doc_base = @options[:base]
172
174
  end
@@ -218,21 +220,21 @@ module JSON::LD
218
220
  # 1) Perform the Expansion Algorithm on the JSON-LD input.
219
221
  # This removes any existing context to allow the given context to be cleanly applied.
220
222
  expanded_input = expanded ? input : API.expand(input, ordered: false, **options) do |res, base_iri|
221
- options[:base] ||= base_iri if options[:compactToRelative]
223
+ options[:base] ||= RDF::URI(base_iri) if base_iri && options[:compactToRelative]
222
224
  res
223
225
  end
224
226
 
225
227
  API.new(expanded_input, context, no_default_base: true, **options) do
226
228
  log_debug(".compact") {"expanded input: #{expanded_input.to_json(JSON_STATE) rescue 'malformed json'}"}
227
- result = compact(value, ordered: @options[:ordered])
229
+ result = compact(value)
228
230
 
229
231
  # xxx) Add the given context to the output
230
- ctx = self.context.serialize
232
+ ctx = self.context.serialize(provided_context: context)
231
233
  if result.is_a?(Array)
232
234
  kwgraph = self.context.compact_iri('@graph', vocab: true)
233
235
  result = result.empty? ? {} : {kwgraph => result}
234
236
  end
235
- result = ctx.merge(result) unless ctx.empty?
237
+ result = ctx.merge(result) unless ctx.fetch('@context', {}).empty?
236
238
  end
237
239
  block_given? ? yield(result) : result
238
240
  end
@@ -265,7 +267,7 @@ module JSON::LD
265
267
 
266
268
  # Expand input to simplify processing
267
269
  expanded_input = expanded ? input : API.expand(input, **options) do |result, base_iri|
268
- options[:base] ||= base_iri if options[:compactToRelative]
270
+ options[:base] ||= RDF::URI(base_iri) if base_iri && options[:compactToRelative]
269
271
  result
270
272
  end
271
273
 
@@ -294,9 +296,11 @@ module JSON::LD
294
296
 
295
297
  if context && !flattened.empty?
296
298
  # Otherwise, return the result of compacting flattened according the Compaction algorithm passing context ensuring that the compaction result uses the @graph keyword (or its alias) at the top-level, even if the context is empty or if there is only one element to put in the @graph array. This ensures that the returned document has a deterministic structure.
297
- compacted = as_array(compact(flattened, ordered: @options[:ordered]))
299
+ compacted = as_array(compact(flattened))
298
300
  kwgraph = self.context.compact_iri('@graph')
299
- flattened = self.context.serialize.merge(kwgraph => compacted)
301
+ flattened = self.context.
302
+ serialize(provided_context: context).
303
+ merge(kwgraph => compacted)
300
304
  end
301
305
  end
302
306
 
@@ -335,7 +339,7 @@ module JSON::LD
335
339
  def self.frame(input, frame, expanded: false, **options)
336
340
  result = nil
337
341
  options = {
338
- base: (input if input.is_a?(String)),
342
+ base: (RDF::URI(input) if input.is_a?(String)),
339
343
  compactArrays: true,
340
344
  compactToRelative: true,
341
345
  embed: '@once',
@@ -369,7 +373,7 @@ module JSON::LD
369
373
 
370
374
  # Expand input to simplify processing
371
375
  expanded_input = expanded ? input : API.expand(input, ordered: false, **options) do |res, base_iri|
372
- options[:base] ||= base_iri if options[:compactToRelative]
376
+ options[:base] ||= RDF::URI(base_iri) if base_iri && options[:compactToRelative]
373
377
  res
374
378
  end
375
379
 
@@ -426,7 +430,7 @@ module JSON::LD
426
430
  log_debug(".frame") {"expanded result: #{result.to_json(JSON_STATE) rescue 'malformed json'}"}
427
431
 
428
432
  # Compact result
429
- compacted = compact(result, ordered: @options[:ordered])
433
+ compacted = compact(result)
430
434
 
431
435
  # @replace `@null` with nil, compacting arrays
432
436
  compacted = cleanup_null(compacted)
@@ -434,11 +438,14 @@ module JSON::LD
434
438
 
435
439
  # Add the given context to the output
436
440
  result = if !compacted.is_a?(Array)
437
- context.serialize.merge(compacted)
441
+ compacted
438
442
  else
439
443
  kwgraph = context.compact_iri('@graph')
440
- context.serialize.merge({kwgraph => compacted})
444
+ {kwgraph => compacted}
441
445
  end
446
+ # Only add context if one was provided
447
+ result = context.serialize(provided_context: frame).merge(result) if frame['@context']
448
+
442
449
  log_debug(".frame") {"after compact: #{result.to_json(JSON_STATE) rescue 'malformed json'}"}
443
450
  result
444
451
  end
@@ -521,8 +528,7 @@ module JSON::LD
521
528
  API.new(nil, nil, **options) do
522
529
  result = from_statements(input,
523
530
  useRdfType: useRdfType,
524
- useNativeTypes: useNativeTypes,
525
- ordered: @options[:ordered])
531
+ useNativeTypes: useNativeTypes)
526
532
  end
527
533
 
528
534
  block_given? ? yield(result) : result
@@ -532,16 +538,18 @@ module JSON::LD
532
538
  # Uses built-in or provided documentLoader to retrieve a parsed document.
533
539
  #
534
540
  # @param [RDF::URI, String] url
541
+ # @param [String, RDF::URI] base
542
+ # Location to use as documentUrl instead of `url`.
543
+ # @option options [Proc] :documentLoader
544
+ # The callback of the loader to be used to retrieve remote documents and contexts.
535
545
  # @param [Boolean] extractAllScripts
536
546
  # If set to `true`, when extracting JSON-LD script elements from HTML, unless a specific fragment identifier is targeted, extracts all encountered JSON-LD script elements using an array form, if necessary.
537
547
  # @param [String] profile
538
548
  # When the resulting `contentType` is `text/html` or `application/xhtml+xml`, this option determines the profile to use for selecting a JSON-LD script elements.
539
549
  # @param [String] requestProfile
540
550
  # One or more IRIs to use in the request as a profile parameter.
541
- # @param [Boolean] validate
551
+ # @param [Boolean] validate (false)
542
552
  # Allow only appropriate content types
543
- # @param [String, RDF::URI] base
544
- # Location to use as documentUrl instead of `url`.
545
553
  # @param [Hash<Symbol => Object>] options
546
554
  # @yield remote_document
547
555
  # @yieldparam [RemoteDocumentRemoteDocument, RDF::Util::File::RemoteDocument] remote_document
@@ -550,13 +558,14 @@ module JSON::LD
550
558
  # If a block is given, the result of evaluating the block is returned, otherwise, the retrieved remote document and context information unless block given
551
559
  # @raise [JsonLdError]
552
560
  def self.loadRemoteDocument(url,
561
+ base: nil,
562
+ documentLoader: nil,
553
563
  extractAllScripts: false,
554
564
  profile: nil,
555
565
  requestProfile: nil,
556
566
  validate: false,
557
- base: nil,
558
567
  **options)
559
- documentLoader = options.fetch(:documentLoader, self.method(:documentLoader))
568
+ documentLoader ||= self.method(:documentLoader)
560
569
  options = OPEN_OPTS.merge(options)
561
570
  if requestProfile
562
571
  # Add any request profile
@@ -703,14 +712,14 @@ module JSON::LD
703
712
  require "json/ld/html/#{library}"
704
713
 
705
714
  # Parse HTML using the appropriate library
706
- @implementation = case library
715
+ implementation = case library
707
716
  when :nokogiri then Nokogiri
708
717
  when :rexml then REXML
709
718
  end
710
- self.extend(@implementation)
719
+ self.extend(implementation)
711
720
 
712
721
  input = begin
713
- initialize_html(input, **options)
722
+ self.send("initialize_html_#{library}".to_sym, input, **options)
714
723
  rescue
715
724
  raise JSON::LD::JsonLdError::LoadingDocumentFailed, "Malformed HTML document: #{$!.message}"
716
725
  end
@@ -729,8 +738,8 @@ module JSON::LD
729
738
  id = CGI.unescape(url.fragment)
730
739
  # Find script with an ID based on that fragment.
731
740
  element = input.at_xpath("//script[@id='#{id}']")
732
- raise JSON::LD::JsonLdError::InvalidScriptElement, "No script tag found with id=#{id}" unless element
733
- raise JSON::LD::JsonLdError::InvalidScriptElement, "Script tag has type=#{element.attributes['type']}" unless element.attributes['type'].to_s.start_with?('application/ld+json')
741
+ raise JSON::LD::JsonLdError::LoadingDocumentFailed, "No script tag found with id=#{id}" unless element
742
+ raise JSON::LD::JsonLdError::LoadingDocumentFailed, "Script tag has type=#{element.attributes['type']}" unless element.attributes['type'].to_s.start_with?('application/ld+json')
734
743
  content = element.inner_html
735
744
  validate_input(content, url: url) if options[:validate]
736
745
  MultiJson.load(content, **options)
@@ -759,11 +768,12 @@ module JSON::LD
759
768
  # Find the first script with type application/ld+json.
760
769
  element = input.at_xpath("//script[starts-with(@type, 'application/ld+json;profile=#{profile}')]") if profile
761
770
  element ||= input.at_xpath("//script[starts-with(@type, 'application/ld+json')]")
762
- content = element ? element.inner_html : "[]"
771
+ raise JSON::LD::JsonLdError::LoadingDocumentFailed, "No script tag found" unless element
772
+ content = element.inner_html
763
773
  validate_input(content, url: url) if options[:validate]
764
774
  MultiJson.load(content, **options)
765
775
  end
766
- rescue JSON::LD::JsonLdError::LoadingDocumentFailed, MultiJson::ParseError => e
776
+ rescue MultiJson::ParseError => e
767
777
  raise JSON::LD::JsonLdError::InvalidScriptElement, e.message
768
778
  end
769
779
 
@@ -12,16 +12,16 @@ module JSON::LD
12
12
  # This algorithm compacts a JSON-LD document, such that the given context is applied. This must result in shortening any applicable IRIs to terms or compact IRIs, any applicable keywords to keyword aliases, and any applicable JSON-LD values expressed in expanded form to simple values such as strings or numbers.
13
13
  #
14
14
  # @param [Array, Hash] element
15
- # @param [String] property (nil)
16
- # @param [Boolean] ordered (true)
15
+ # @param [String, RDF::URI] base (nil)
17
16
  # Ensure output objects have keys ordered properly
17
+ # @param [String] property (nil)
18
+ # Extra validatation
18
19
  # @return [Array, Hash]
19
- def compact(element, property: nil, ordered: false)
20
- #if property.nil?
21
- # log_debug("compact") {"element: #{element.inspect}, ec: #{context.inspect}"}
22
- #else
23
- # log_debug("compact") {"property: #{property.inspect}"}
24
- #end
20
+ def compact(element,
21
+ base: nil,
22
+ property: nil,
23
+ log_depth: nil)
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
@@ -29,17 +29,19 @@ module JSON::LD
29
29
  case element
30
30
  when Array
31
31
  #log_debug("") {"Array #{element.inspect}"}
32
- result = element.map {|item| compact(item, property: property, ordered: ordered)}.compact
32
+ result = element.map do |item|
33
+ compact(item, base: base, property: property, log_depth: log_depth.to_i + 1)
34
+ end.compact
33
35
 
34
36
  # If element has a single member and the active property has no
35
37
  # @container mapping to @list or @set, the compacted value is that
36
38
  # member; otherwise the compacted value is element
37
39
  if result.length == 1 &&
38
40
  !context.as_array?(property) && @options[:compactArrays]
39
- #log_debug("=> extract single element: #{result.first.inspect}")
41
+ log_debug("=> extract single element", depth: log_depth.to_i) {result.first.inspect}
40
42
  result.first
41
43
  else
42
- #log_debug("=> array result: #{result.inspect}")
44
+ log_debug("=> array result", depth: log_depth.to_i) {result.inspect}
43
45
  result
44
46
  end
45
47
  when Hash
@@ -50,24 +52,31 @@ module JSON::LD
50
52
 
51
53
  # Revert any previously type-scoped (non-preserved) context
52
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}"}
53
56
  self.context = context.previous_context
54
57
  end
55
58
 
56
59
  # Look up term definintions from property using the original type-scoped context, if it exists, but apply them to the now current previous context
57
60
  td = input_context.term_definitions[property] if property
58
- self.context = context.parse(td.context, override_protected: true) if td && td.context
61
+ if td && !td.context.nil?
62
+ self.context = context.parse(td.context,
63
+ override_protected: true)
64
+ log_debug("prop-scoped", depth: log_depth.to_i) {"context: #{self.context.inspect}"}
65
+ end
59
66
 
60
67
  if element.key?('@id') || element.key?('@value')
61
- result = context.compact_value(property, element, log_depth: @options[:log_depth])
68
+ result = context.compact_value(property, element, base: @options[:base])
62
69
  if !result.is_a?(Hash) || context.coerce(property) == '@json'
63
- #log_debug("") {"=> scalar result: #{result.inspect}"}
70
+ log_debug("", depth: log_depth.to_i) {"=> scalar result: #{result.inspect}"}
64
71
  return result
65
72
  end
66
73
  end
67
74
 
68
75
  # If expanded property is @list and we're contained within a list container, recursively compact this item to an array
69
76
  if list?(element) && context.container(property).include?('@list')
70
- return compact(element['@list'], property: property, ordered: ordered)
77
+ return compact(element['@list'], base: base,
78
+ property: property,
79
+ log_depth: log_depth.to_i + 1)
71
80
  end
72
81
 
73
82
  inside_reverse = property == '@reverse'
@@ -80,15 +89,18 @@ module JSON::LD
80
89
  sort.
81
90
  each do |term|
82
91
  term_context = input_context.term_definitions[term].context if input_context.term_definitions[term]
83
- self.context = context.parse(term_context, propagate: false) if term_context
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}"}
84
94
  end
85
95
 
86
- element.keys.opt_sort(ordered: ordered).each do |expanded_property|
96
+ element.keys.opt_sort(ordered: @options[:ordered]).each do |expanded_property|
87
97
  expanded_value = element[expanded_property]
88
- #log_debug("") {"#{expanded_property}: #{expanded_value.inspect}"}
98
+ log_debug("", depth: log_depth.to_i) {"#{expanded_property}: #{expanded_value.inspect}"}
89
99
 
90
100
  if expanded_property == '@id'
91
- compacted_value = Array(expanded_value).map {|expanded_id| context.compact_iri(expanded_id)}
101
+ compacted_value = Array(expanded_value).map do |expanded_id|
102
+ context.compact_iri(expanded_id, base: @options[:base])
103
+ end
92
104
 
93
105
  kw_alias = context.compact_iri('@id', vocab: true)
94
106
  as_array = compacted_value.length > 1
@@ -98,7 +110,9 @@ module JSON::LD
98
110
  end
99
111
 
100
112
  if expanded_property == '@type'
101
- compacted_value = Array(expanded_value).map {|expanded_type| input_context.compact_iri(expanded_type, vocab: true)}
113
+ compacted_value = Array(expanded_value).map do |expanded_type|
114
+ input_context.compact_iri(expanded_type, vocab: true)
115
+ end
102
116
 
103
117
  kw_alias = context.compact_iri('@type', vocab: true)
104
118
  as_array = compacted_value.length > 1 ||
@@ -110,8 +124,10 @@ module JSON::LD
110
124
  end
111
125
 
112
126
  if expanded_property == '@reverse'
113
- compacted_value = compact(expanded_value, property: '@reverse', ordered: ordered)
114
- #log_debug("@reverse") {"compacted_value: #{compacted_value.inspect}"}
127
+ compacted_value = compact(expanded_value, base: base,
128
+ property: '@reverse',
129
+ log_depth: log_depth.to_i + 1)
130
+ log_debug("@reverse", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
115
131
  # handle double-reversed properties
116
132
  compacted_value.each do |prop, value|
117
133
  if context.reverse?(prop)
@@ -123,7 +139,7 @@ module JSON::LD
123
139
 
124
140
  unless compacted_value.empty?
125
141
  al = context.compact_iri('@reverse')
126
- #log_debug("") {"remainder: #{al} => #{compacted_value.inspect}"}
142
+ log_debug("", depth: log_depth.to_i) {"remainder: #{al} => #{compacted_value.inspect}"}
127
143
  result[al] = compacted_value
128
144
  end
129
145
  next
@@ -131,8 +147,10 @@ module JSON::LD
131
147
 
132
148
  if expanded_property == '@preserve'
133
149
  # Compact using `property`
134
- compacted_value = compact(expanded_value, property: property, ordered: ordered)
135
- #log_debug("@preserve") {"compacted_value: #{compacted_value.inspect}"}
150
+ compacted_value = compact(expanded_value, base: base,
151
+ property: property,
152
+ log_depth: log_depth.to_i + 1)
153
+ log_debug("@preserve", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
136
154
 
137
155
  unless compacted_value.is_a?(Array) && compacted_value.empty?
138
156
  result['@preserve'] = compacted_value
@@ -141,14 +159,14 @@ module JSON::LD
141
159
  end
142
160
 
143
161
  if expanded_property == '@index' && context.container(property).include?('@index')
144
- #log_debug("@index") {"drop @index"}
162
+ log_debug("@index", depth: log_depth.to_i) {"drop @index"}
145
163
  next
146
164
  end
147
165
 
148
166
  # Otherwise, if expanded property is @direction, @index, @value, or @language:
149
167
  if EXPANDED_PROPERTY_DIRECTION_INDEX_LANGUAGE_VALUE.include?(expanded_property)
150
168
  al = context.compact_iri(expanded_property, vocab: true)
151
- #log_debug(expanded_property) {"#{al} => #{expanded_value.inspect}"}
169
+ log_debug(expanded_property, depth: log_depth.to_i) {"#{al} => #{expanded_value.inspect}"}
152
170
  result[al] = expanded_value
153
171
  next
154
172
  end
@@ -158,8 +176,7 @@ module JSON::LD
158
176
  context.compact_iri(expanded_property,
159
177
  value: expanded_value,
160
178
  vocab: true,
161
- reverse: inside_reverse,
162
- log_depth: @options[:log_depth])
179
+ reverse: inside_reverse)
163
180
 
164
181
  if nest_prop = context.nest(item_active_property)
165
182
  result[nest_prop] ||= {}
@@ -177,8 +194,7 @@ module JSON::LD
177
194
  context.compact_iri(expanded_property,
178
195
  value: expanded_item,
179
196
  vocab: true,
180
- reverse: inside_reverse,
181
- log_depth: @options[:log_depth])
197
+ reverse: inside_reverse)
182
198
 
183
199
 
184
200
  nest_result = if nest_prop = context.nest(item_active_property)
@@ -197,8 +213,10 @@ module JSON::LD
197
213
  else expanded_item
198
214
  end
199
215
 
200
- compacted_item = compact(value, property: item_active_property, ordered: ordered)
201
- #log_debug("") {" => compacted key: #{item_active_property.inspect} for #{compacted_item.inspect}"}
216
+ compacted_item = compact(value, base: base,
217
+ property: item_active_property,
218
+ log_depth: log_depth.to_i + 1)
219
+ log_debug("", depth: log_depth.to_i) {" => compacted key: #{item_active_property.inspect} for #{compacted_item.inspect}"}
202
220
 
203
221
  # handle @list
204
222
  if list?(expanded_item)
@@ -225,9 +243,9 @@ module JSON::LD
225
243
  map_object = nest_result[item_active_property] ||= {}
226
244
  # If there is no @id, create a blank node identifier to use as an index
227
245
  map_key = if container.include?('@id') && expanded_item['@id']
228
- context.compact_iri(expanded_item['@id'])
246
+ context.compact_iri(expanded_item['@id'], base: @options[:base])
229
247
  elsif container.include?('@index') && expanded_item['@index']
230
- context.compact_iri(expanded_item['@index'])
248
+ context.compact_iri(expanded_item['@index'], vocab: true)
231
249
  else
232
250
  context.compact_iri('@none', vocab: true)
233
251
  end
@@ -299,7 +317,10 @@ module JSON::LD
299
317
 
300
318
  # if compacted_item contains a single entry who's key maps to @id, then recompact the item without @type
301
319
  if compacted_item.keys.length == 1 && expanded_item.keys.include?('@id')
302
- compacted_item = compact({'@id' => expanded_item['@id']}, property: item_active_property)
320
+ compacted_item = compact({'@id' => expanded_item['@id']},
321
+ base: base,
322
+ property: item_active_property,
323
+ log_depth: log_depth.to_i + 1)
303
324
  end
304
325
  compacted_item
305
326
  end
@@ -316,7 +337,7 @@ module JSON::LD
316
337
  result
317
338
  else
318
339
  # For other types, the compacted value is the element value
319
- #log_debug("compact") {element.class.to_s}
340
+ log_debug("compact", depth: log_depth.to_i) {element.class.to_s}
320
341
  element
321
342
  end
322
343