json-ld 3.2.3 → 3.2.5

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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/json/ld/api.rb +807 -764
  4. data/lib/json/ld/compact.rb +304 -304
  5. data/lib/json/ld/conneg.rb +179 -161
  6. data/lib/json/ld/context.rb +2080 -1945
  7. data/lib/json/ld/expand.rb +745 -666
  8. data/lib/json/ld/extensions.rb +14 -13
  9. data/lib/json/ld/flatten.rb +257 -247
  10. data/lib/json/ld/format.rb +202 -194
  11. data/lib/json/ld/frame.rb +525 -502
  12. data/lib/json/ld/from_rdf.rb +224 -166
  13. data/lib/json/ld/html/nokogiri.rb +123 -121
  14. data/lib/json/ld/html/rexml.rb +151 -147
  15. data/lib/json/ld/reader.rb +107 -100
  16. data/lib/json/ld/resource.rb +224 -205
  17. data/lib/json/ld/streaming_reader.rb +574 -507
  18. data/lib/json/ld/streaming_writer.rb +93 -92
  19. data/lib/json/ld/to_rdf.rb +171 -167
  20. data/lib/json/ld/utils.rb +270 -264
  21. data/lib/json/ld/version.rb +24 -14
  22. data/lib/json/ld/writer.rb +334 -311
  23. data/lib/json/ld.rb +103 -96
  24. metadata +78 -209
  25. data/spec/api_spec.rb +0 -132
  26. data/spec/compact_spec.rb +0 -3482
  27. data/spec/conneg_spec.rb +0 -373
  28. data/spec/context_spec.rb +0 -2036
  29. data/spec/expand_spec.rb +0 -4496
  30. data/spec/flatten_spec.rb +0 -1203
  31. data/spec/format_spec.rb +0 -115
  32. data/spec/frame_spec.rb +0 -2498
  33. data/spec/from_rdf_spec.rb +0 -1005
  34. data/spec/matchers.rb +0 -20
  35. data/spec/rdfstar_spec.rb +0 -25
  36. data/spec/reader_spec.rb +0 -883
  37. data/spec/resource_spec.rb +0 -76
  38. data/spec/spec_helper.rb +0 -281
  39. data/spec/streaming_reader_spec.rb +0 -237
  40. data/spec/streaming_writer_spec.rb +0 -145
  41. data/spec/suite_compact_spec.rb +0 -22
  42. data/spec/suite_expand_spec.rb +0 -36
  43. data/spec/suite_flatten_spec.rb +0 -34
  44. data/spec/suite_frame_spec.rb +0 -29
  45. data/spec/suite_from_rdf_spec.rb +0 -22
  46. data/spec/suite_helper.rb +0 -411
  47. data/spec/suite_html_spec.rb +0 -22
  48. data/spec/suite_http_spec.rb +0 -35
  49. data/spec/suite_remote_doc_spec.rb +0 -22
  50. data/spec/suite_to_rdf_spec.rb +0 -30
  51. data/spec/support/extensions.rb +0 -44
  52. data/spec/test-files/test-1-compacted.jsonld +0 -10
  53. data/spec/test-files/test-1-context.jsonld +0 -7
  54. data/spec/test-files/test-1-expanded.jsonld +0 -5
  55. data/spec/test-files/test-1-input.jsonld +0 -10
  56. data/spec/test-files/test-1-rdf.ttl +0 -8
  57. data/spec/test-files/test-2-compacted.jsonld +0 -20
  58. data/spec/test-files/test-2-context.jsonld +0 -7
  59. data/spec/test-files/test-2-expanded.jsonld +0 -16
  60. data/spec/test-files/test-2-input.jsonld +0 -20
  61. data/spec/test-files/test-2-rdf.ttl +0 -14
  62. data/spec/test-files/test-3-compacted.jsonld +0 -11
  63. data/spec/test-files/test-3-context.jsonld +0 -8
  64. data/spec/test-files/test-3-expanded.jsonld +0 -10
  65. data/spec/test-files/test-3-input.jsonld +0 -11
  66. data/spec/test-files/test-3-rdf.ttl +0 -8
  67. data/spec/test-files/test-4-compacted.jsonld +0 -10
  68. data/spec/test-files/test-4-context.jsonld +0 -7
  69. data/spec/test-files/test-4-expanded.jsonld +0 -6
  70. data/spec/test-files/test-4-input.jsonld +0 -10
  71. data/spec/test-files/test-4-rdf.ttl +0 -5
  72. data/spec/test-files/test-5-compacted.jsonld +0 -13
  73. data/spec/test-files/test-5-context.jsonld +0 -7
  74. data/spec/test-files/test-5-expanded.jsonld +0 -9
  75. data/spec/test-files/test-5-input.jsonld +0 -13
  76. data/spec/test-files/test-5-rdf.ttl +0 -7
  77. data/spec/test-files/test-6-compacted.jsonld +0 -10
  78. data/spec/test-files/test-6-context.jsonld +0 -7
  79. data/spec/test-files/test-6-expanded.jsonld +0 -10
  80. data/spec/test-files/test-6-input.jsonld +0 -10
  81. data/spec/test-files/test-6-rdf.ttl +0 -6
  82. data/spec/test-files/test-7-compacted.jsonld +0 -23
  83. data/spec/test-files/test-7-context.jsonld +0 -4
  84. data/spec/test-files/test-7-expanded.jsonld +0 -20
  85. data/spec/test-files/test-7-input.jsonld +0 -23
  86. data/spec/test-files/test-7-rdf.ttl +0 -14
  87. data/spec/test-files/test-8-compacted.jsonld +0 -34
  88. data/spec/test-files/test-8-context.jsonld +0 -11
  89. data/spec/test-files/test-8-expanded.jsonld +0 -24
  90. data/spec/test-files/test-8-frame.jsonld +0 -18
  91. data/spec/test-files/test-8-framed.jsonld +0 -25
  92. data/spec/test-files/test-8-input.jsonld +0 -30
  93. data/spec/test-files/test-8-rdf.ttl +0 -15
  94. data/spec/test-files/test-9-compacted.jsonld +0 -20
  95. data/spec/test-files/test-9-context.jsonld +0 -13
  96. data/spec/test-files/test-9-expanded.jsonld +0 -14
  97. data/spec/test-files/test-9-input.jsonld +0 -12
  98. data/spec/to_rdf_spec.rb +0 -1551
  99. data/spec/writer_spec.rb +0 -427
@@ -1,116 +1,123 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- module JSON::LD
4
- ##
5
- # A JSON-LD parser in Ruby.
6
- #
7
- # @see https://www.w3.org/TR/json-ld11-api
8
- # @author [Gregg Kellogg](http://greggkellogg.net/)
9
- class Reader < RDF::Reader
10
- include StreamingReader
11
- format Format
1
+ # frozen_string_literal: true
12
2
 
3
+ module JSON
4
+ module LD
13
5
  ##
14
- # JSON-LD Reader options
15
- # @see https://ruby-rdf.github.io/rdf/RDF/Reader#options-class_method
16
- def self.options
17
- super + [
18
- RDF::CLI::Option.new(
19
- symbol: :expandContext,
20
- control: :url2,
21
- datatype: RDF::URI,
22
- on: ["--expand-context CONTEXT"],
23
- description: "Context to use when expanding.") {|arg| RDF::URI(arg).absolute? ? RDF::URI(arg) : StringIO.new(File.read(arg))},
24
- RDF::CLI::Option.new(
25
- symbol: :extractAllScripts,
26
- datatype: TrueClass,
27
- default: false,
28
- control: :checkbox,
29
- on: ["--[no-]extract-all-scripts"],
30
- description: "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.") {|arg| RDF::URI(arg)},
31
- RDF::CLI::Option.new(
32
- symbol: :lowercaseLanguage,
33
- datatype: TrueClass,
34
- control: :checkbox,
35
- on: ["--[no-]lowercase-language"],
36
- description: "By default, language tags are left as is. To normalize to lowercase, set this option to `true`."),
37
- RDF::CLI::Option.new(
38
- symbol: :processingMode,
39
- datatype: %w(json-ld-1.0 json-ld-1.1),
40
- control: :radio,
41
- on: ["--processingMode MODE", %w(json-ld-1.0 json-ld-1.1)],
42
- description: "Set Processing Mode (json-ld-1.0 or json-ld-1.1)"),
43
- RDF::CLI::Option.new(
44
- symbol: :rdfDirection,
45
- datatype: %w(i18n-datatype compound-literal),
46
- default: 'null',
47
- control: :select,
48
- on: ["--rdf-direction DIR", %w(i18n-datatype compound-literal)],
49
- description: "How to serialize literal direction (i18n-datatype compound-literal)") {|arg| RDF::URI(arg)},
50
- RDF::CLI::Option.new(
51
- symbol: :stream,
52
- datatype: TrueClass,
53
- control: :checkbox,
54
- on: ["--[no-]stream"],
55
- description: "Optimize for streaming JSON-LD to RDF.") {|arg| arg},
56
- ]
57
- end
58
-
59
- ##
60
- # Initializes the JSON-LD reader instance.
6
+ # A JSON-LD parser in Ruby.
61
7
  #
62
- # @param [IO, File, String] input
63
- # @param [Hash{Symbol => Object}] options
64
- # any additional options (see `RDF::Reader#initialize` and {JSON::LD::API.initialize})
65
- # @yield [reader] `self`
66
- # @yieldparam [RDF::Reader] reader
67
- # @yieldreturn [void] ignored
68
- # @raise [RDF::ReaderError] if the JSON document cannot be loaded
69
- def initialize(input = $stdin, **options, &block)
70
- options[:base_uri] ||= options[:base]
71
- options[:rename_bnodes] = false unless options.key?(:rename_bnodes)
72
- super do
73
- @options[:base] ||= base_uri.to_s if base_uri
74
- # Trim non-JSON stuff in script.
75
- @doc = if input.respond_to?(:read)
76
- input
77
- else
78
- StringIO.new(input.to_s.sub(%r(\A[^{\[]*)m, '').sub(%r([^}\]]*\Z)m, ''))
79
- end
8
+ # @see https://www.w3.org/TR/json-ld11-api
9
+ # @author [Gregg Kellogg](http://greggkellogg.net/)
10
+ class Reader < RDF::Reader
11
+ include StreamingReader
12
+ format Format
80
13
 
81
- if block_given?
82
- case block.arity
14
+ ##
15
+ # JSON-LD Reader options
16
+ # @see https://ruby-rdf.github.io/rdf/RDF/Reader#options-class_method
17
+ def self.options
18
+ super + [
19
+ RDF::CLI::Option.new(
20
+ symbol: :expandContext,
21
+ control: :url2,
22
+ datatype: RDF::URI,
23
+ on: ["--expand-context CONTEXT"],
24
+ description: "Context to use when expanding."
25
+ ) { |arg| RDF::URI(arg).absolute? ? RDF::URI(arg) : StringIO.new(File.read(arg)) },
26
+ RDF::CLI::Option.new(
27
+ symbol: :extractAllScripts,
28
+ datatype: TrueClass,
29
+ default: false,
30
+ control: :checkbox,
31
+ on: ["--[no-]extract-all-scripts"],
32
+ description: "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."
33
+ ) { |arg| RDF::URI(arg) },
34
+ RDF::CLI::Option.new(
35
+ symbol: :lowercaseLanguage,
36
+ datatype: TrueClass,
37
+ control: :checkbox,
38
+ on: ["--[no-]lowercase-language"],
39
+ description: "By default, language tags are left as is. To normalize to lowercase, set this option to `true`."
40
+ ),
41
+ RDF::CLI::Option.new(
42
+ symbol: :processingMode,
43
+ datatype: %w[json-ld-1.0 json-ld-1.1],
44
+ control: :radio,
45
+ on: ["--processingMode MODE", %w[json-ld-1.0 json-ld-1.1]],
46
+ description: "Set Processing Mode (json-ld-1.0 or json-ld-1.1)"
47
+ ),
48
+ RDF::CLI::Option.new(
49
+ symbol: :rdfDirection,
50
+ datatype: %w[i18n-datatype compound-literal],
51
+ default: 'null',
52
+ control: :select,
53
+ on: ["--rdf-direction DIR", %w[i18n-datatype compound-literal]],
54
+ description: "How to serialize literal direction (i18n-datatype compound-literal)"
55
+ ) { |arg| RDF::URI(arg) },
56
+ RDF::CLI::Option.new(
57
+ symbol: :stream,
58
+ datatype: TrueClass,
59
+ control: :checkbox,
60
+ on: ["--[no-]stream"],
61
+ description: "Optimize for streaming JSON-LD to RDF."
62
+ ) { |arg| arg }
63
+ ]
64
+ end
65
+
66
+ ##
67
+ # Initializes the JSON-LD reader instance.
68
+ #
69
+ # @param [IO, File, String] input
70
+ # @param [Hash{Symbol => Object}] options
71
+ # any additional options (see `RDF::Reader#initialize` and {JSON::LD::API.initialize})
72
+ # @yield [reader] `self`
73
+ # @yieldparam [RDF::Reader] reader
74
+ # @yieldreturn [void] ignored
75
+ # @raise [RDF::ReaderError] if the JSON document cannot be loaded
76
+ def initialize(input = $stdin, **options, &block)
77
+ options[:base_uri] ||= options[:base]
78
+ options[:rename_bnodes] = false unless options.key?(:rename_bnodes)
79
+ super do
80
+ @options[:base] ||= base_uri.to_s if base_uri
81
+ # Trim non-JSON stuff in script.
82
+ @doc = if input.respond_to?(:read)
83
+ input
84
+ else
85
+ StringIO.new(input.to_s.sub(/\A[^{\[]*/m, '').sub(/[^}\]]*\Z/m, ''))
86
+ end
87
+
88
+ if block
89
+ case block.arity
83
90
  when 0 then instance_eval(&block)
84
- else block.call(self)
91
+ else yield(self)
92
+ end
85
93
  end
86
94
  end
87
95
  end
88
- end
89
96
 
90
- ##
91
- # @private
92
- # @see RDF::Reader#each_statement
93
- def each_statement(&block)
94
- if @options[:stream]
95
- stream_statement(&block)
96
- else
97
- API.toRdf(@doc, **@options, &block)
97
+ ##
98
+ # @private
99
+ # @see RDF::Reader#each_statement
100
+ def each_statement(&block)
101
+ if @options[:stream]
102
+ stream_statement(&block)
103
+ else
104
+ API.toRdf(@doc, **@options, &block)
105
+ end
106
+ rescue ::JSON::ParserError, ::JSON::LD::JsonLdError => e
107
+ log_fatal("Failed to parse input document: #{e.message}", exception: RDF::ReaderError)
98
108
  end
99
- rescue ::JSON::ParserError, ::JSON::LD::JsonLdError => e
100
- log_fatal("Failed to parse input document: #{e.message}", exception: RDF::ReaderError)
101
- end
102
109
 
103
- ##
104
- # @private
105
- # @see RDF::Reader#each_triple
106
- def each_triple(&block)
107
- if block_given?
108
- each_statement do |statement|
109
- yield(*statement.to_triple)
110
+ ##
111
+ # @private
112
+ # @see RDF::Reader#each_triple
113
+ def each_triple
114
+ if block_given?
115
+ each_statement do |statement|
116
+ yield(*statement.to_triple)
117
+ end
110
118
  end
119
+ enum_for(:each_triple)
111
120
  end
112
- enum_for(:each_triple)
113
121
  end
114
122
  end
115
123
  end
116
-
@@ -1,230 +1,249 @@
1
- # -*- encoding: utf-8 -*-
2
1
  # frozen_string_literal: true
3
- module JSON::LD
4
- # Simple Ruby reflector class to provide native
5
- # access to JSON-LD objects
6
- class Resource
7
- include RDF::Enumerable
8
-
9
- # @return [Hash<String => Object] Object representation of resource
10
- attr_reader :attributes
11
-
12
- # @return [String] ID of this resource
13
- attr_reader :id
14
-
15
- # @return [JSON::LD::Context] Context associated with this resource
16
- attr_reader :context
17
-
18
- ##
19
- # Is this resource clean (i.e., saved to mongo?)
20
- #
21
- # @return [Boolean]
22
- def clean?; @clean; end
23
-
24
- ##
25
- # Is this resource dirty (i.e., not yet saved to mongo?)
26
- #
27
- # @return [Boolean]
28
- def dirty?; !clean?; end
29
-
30
- ##
31
- # Has this resource been reconciled against a mongo ID?
32
- #
33
- # @return [Boolean]
34
- def reconciled?; @reconciled; end
35
-
36
- ##
37
- # Has this resource been resolved so that
38
- # all references are to other Resources?
39
- #
40
- # @return [Boolean]
41
- def resolved?; @resolved; end
42
-
43
- ##
44
- # Anonymous resources have BNode ids or no schema:url
45
- #
46
- # @return [Boolean]
47
- def anonymous?; @anon; end
48
-
49
- ##
50
- # Is this a stub resource, which has not yet been
51
- # synched or created within the DB?
52
- def stub?; !!@stub; end
53
-
54
- ##
55
- # Is this a new resource, which has not yet been
56
- # synched or created within the DB?
57
- def new?; !!@new; end
58
-
59
- ##
60
- # A new resource from the parsed graph
61
- # @param [Hash{String => Object}] node_definition
62
- # @param [Hash{Symbol => Object}] options
63
- # @option options [String] :context
64
- # Resource context, used for finding
65
- # appropriate collection and JSON-LD context.
66
- # @option options [Boolean] :clean (false)
67
- # @option options [Boolean] :compact (false)
68
- # Assume `node_definition` is in expanded form
69
- # and compact using `context`.
70
- # @option options [Boolean] :reconciled (!new)
71
- # node_definition is not based on Mongo IDs
72
- # and must be reconciled against Mongo, or merged
73
- # into another resource.
74
- # @option options [Boolean] :new (true)
75
- # This is a new resource, not yet saved to Mongo
76
- # @option options [Boolean] :stub (false)
77
- # This is a stand-in for another resource that has
78
- # not yet been retrieved (or created) from Mongo
79
- def initialize(node_definition, **options)
80
- @context = options[:context]
81
- @clean = options.fetch(:clean, false)
82
- @new = options.fetch(:new, true)
83
- @reconciled = options.fetch(:reconciled, !@new)
84
- @resolved = false
85
- @attributes = if options[:compact]
86
- JSON::LD::API.compact(node_definition, @context)
87
- else
88
- node_definition
89
- end
90
- @id = @attributes['@id']
91
- @anon = @id.nil? || @id.to_s.start_with?('_:')
92
- end
93
2
 
94
- ##
95
- # Return a hash of this object, suitable for use by for ETag
96
- # @return [Integer]
97
- def hash
98
- self.deresolve.hash
99
- end
3
+ module JSON
4
+ module LD
5
+ # Simple Ruby reflector class to provide native
6
+ # access to JSON-LD objects
7
+ class Resource
8
+ include RDF::Enumerable
9
+
10
+ # @return [Hash<String => Object] Object representation of resource
11
+ attr_reader :attributes
12
+
13
+ # @return [String] ID of this resource
14
+ attr_reader :id
15
+
16
+ # @return [JSON::LD::Context] Context associated with this resource
17
+ attr_reader :context
18
+
19
+ ##
20
+ # Is this resource clean (i.e., saved to mongo?)
21
+ #
22
+ # @return [Boolean]
23
+ def clean?
24
+ @clean
25
+ end
26
+
27
+ ##
28
+ # Is this resource dirty (i.e., not yet saved to mongo?)
29
+ #
30
+ # @return [Boolean]
31
+ def dirty?
32
+ !clean?
33
+ end
34
+
35
+ ##
36
+ # Has this resource been reconciled against a mongo ID?
37
+ #
38
+ # @return [Boolean]
39
+ def reconciled?
40
+ @reconciled
41
+ end
42
+
43
+ ##
44
+ # Has this resource been resolved so that
45
+ # all references are to other Resources?
46
+ #
47
+ # @return [Boolean]
48
+ def resolved?
49
+ @resolved
50
+ end
51
+
52
+ ##
53
+ # Anonymous resources have BNode ids or no schema:url
54
+ #
55
+ # @return [Boolean]
56
+ def anonymous?
57
+ @anon
58
+ end
59
+
60
+ ##
61
+ # Is this a stub resource, which has not yet been
62
+ # synched or created within the DB?
63
+ def stub?
64
+ !!@stub
65
+ end
66
+
67
+ ##
68
+ # Is this a new resource, which has not yet been
69
+ # synched or created within the DB?
70
+ def new?
71
+ !!@new
72
+ end
73
+
74
+ ##
75
+ # A new resource from the parsed graph
76
+ # @param [Hash{String => Object}] node_definition
77
+ # @param [Hash{Symbol => Object}] options
78
+ # @option options [String] :context
79
+ # Resource context, used for finding
80
+ # appropriate collection and JSON-LD context.
81
+ # @option options [Boolean] :clean (false)
82
+ # @option options [Boolean] :compact (false)
83
+ # Assume `node_definition` is in expanded form
84
+ # and compact using `context`.
85
+ # @option options [Boolean] :reconciled (!new)
86
+ # node_definition is not based on Mongo IDs
87
+ # and must be reconciled against Mongo, or merged
88
+ # into another resource.
89
+ # @option options [Boolean] :new (true)
90
+ # This is a new resource, not yet saved to Mongo
91
+ # @option options [Boolean] :stub (false)
92
+ # This is a stand-in for another resource that has
93
+ # not yet been retrieved (or created) from Mongo
94
+ def initialize(node_definition, **options)
95
+ @context = options[:context]
96
+ @clean = options.fetch(:clean, false)
97
+ @new = options.fetch(:new, true)
98
+ @reconciled = options.fetch(:reconciled, !@new)
99
+ @resolved = false
100
+ @attributes = if options[:compact]
101
+ JSON::LD::API.compact(node_definition, @context)
102
+ else
103
+ node_definition
104
+ end
105
+ @id = @attributes['@id']
106
+ @anon = @id.nil? || @id.to_s.start_with?('_:')
107
+ end
108
+
109
+ ##
110
+ # Return a hash of this object, suitable for use by for ETag
111
+ # @return [Integer]
112
+ def hash
113
+ deresolve.hash
114
+ end
100
115
 
101
- ##
102
- # Reverse resolution of resource attributes.
103
- # Just returns `attributes` if
104
- # resource is unresolved. Otherwise, replaces `Resource`
105
- # values with node references.
106
- #
107
- # Result is expanded and re-compacted to get to normalized
108
- # representation.
109
- #
110
- # @return [Hash] deresolved attribute hash
111
- def deresolve
112
- node_definition = if resolved?
113
- deresolved = [].tap do |memo|
114
- attributes.each_pair do |prop, value|
115
- memo[prop] = case value
116
- when Resource
117
- {'id' => value.id}
118
- when Array
119
- value.map do |v|
120
- v.is_a?(Resource) ? {'id' => v.id} : v
116
+ ##
117
+ # Reverse resolution of resource attributes.
118
+ # Just returns `attributes` if
119
+ # resource is unresolved. Otherwise, replaces `Resource`
120
+ # values with node references.
121
+ #
122
+ # Result is expanded and re-compacted to get to normalized
123
+ # representation.
124
+ #
125
+ # @return [Hash] deresolved attribute hash
126
+ def deresolve
127
+ node_definition = if resolved?
128
+ deresolved = [].tap do |memo|
129
+ attributes.each_pair do |prop, value|
130
+ memo[prop] = case value
131
+ when Resource
132
+ { 'id' => value.id }
133
+ when Array
134
+ value.map do |v|
135
+ v.is_a?(Resource) ? { 'id' => v.id } : v
136
+ end
137
+ else
138
+ value
121
139
  end
122
- else
123
- value
124
140
  end
125
141
  end
142
+ deresolved
143
+ else
144
+ attributes
126
145
  end
127
- deresolved
128
- else
129
- attributes
130
- end
131
146
 
132
- compacted = nil
133
- JSON::LD::API.expand(node_definition, expandContext: @context) do |expanded|
134
- compacted = JSON::LD::API.compact(expanded, @context)
147
+ compacted = nil
148
+ JSON::LD::API.expand(node_definition, expandContext: @context) do |expanded|
149
+ compacted = JSON::LD::API.compact(expanded, @context)
150
+ end
151
+ compacted.delete_if { |k, _v| k == '@context' }
135
152
  end
136
- compacted.delete_if {|k, v| k == '@context'}
137
- end
138
153
 
139
- ##
140
- # Serialize to JSON-LD, minus `@context` using
141
- # a deresolved version of the attributes
142
- #
143
- # @param [Hash] options
144
- # @return [String] serizlied JSON representation of resource
145
- def to_json(**options)
146
- deresolve.to_json(**options)
147
- end
154
+ ##
155
+ # Serialize to JSON-LD, minus `@context` using
156
+ # a deresolved version of the attributes
157
+ #
158
+ # @param [Hash] options
159
+ # @return [String] serizlied JSON representation of resource
160
+ def to_json(**options)
161
+ deresolve.to_json(**options)
162
+ end
148
163
 
149
- ##
150
- # Enumerate over statements associated with this resource
151
- def each(&block)
152
- JSON::LD::API.toRdf(attributes, expandContext: context, &block)
153
- end
164
+ ##
165
+ # Enumerate over statements associated with this resource
166
+ def each(&block)
167
+ JSON::LD::API.toRdf(attributes, expandContext: context, &block)
168
+ end
154
169
 
155
- ##
156
- # Update node references using the provided map.
157
- # This replaces node references with Resources,
158
- # either stub or instantiated.
159
- #
160
- # Node references with ids not in the reference_map
161
- # will cause stub resources to be added to the map.
162
- #
163
- # @param [Hash{String => Resource}] reference_map
164
- # @return [Resource] self
165
- def resolve(reference_map)
166
- return if resolved?
167
- def update_obj(obj, reference_map)
168
- case obj
169
- when Array
170
- obj.map {|o| update_obj(o, reference_map)}
171
- when Hash
172
- if node_reference?(obj)
173
- reference_map[obj['id']] ||= Resource.new(obj,
174
- context: @context_name,
175
- clean: false,
176
- stub: true
177
- )
178
- else
179
- obj.each_key do |k|
180
- obj[k] = update_obj(obj[k], reference_map)
170
+ ##
171
+ # Update node references using the provided map.
172
+ # This replaces node references with Resources,
173
+ # either stub or instantiated.
174
+ #
175
+ # Node references with ids not in the reference_map
176
+ # will cause stub resources to be added to the map.
177
+ #
178
+ # @param [Hash{String => Resource}] reference_map
179
+ # @return [Resource] self
180
+ def resolve(reference_map)
181
+ return if resolved?
182
+
183
+ def update_obj(obj, reference_map)
184
+ case obj
185
+ when Array
186
+ obj.map { |o| update_obj(o, reference_map) }
187
+ when Hash
188
+ if node_reference?(obj)
189
+ reference_map[obj['id']] ||= Resource.new(obj,
190
+ context: @context_name,
191
+ clean: false,
192
+ stub: true)
193
+ else
194
+ obj.each_key do |k|
195
+ obj[k] = update_obj(obj[k], reference_map)
196
+ end
197
+ obj
181
198
  end
199
+ else
182
200
  obj
183
201
  end
184
- else
185
- obj
186
202
  end
187
- end
188
203
 
189
- #$logger.debug "resolve(0): #{attributes.inspect}"
190
- @attributes.each do |k, v|
191
- next if k == 'id' || k == 'type'
192
- @attributes[k] = update_obj(@attributes[k], reference_map)
204
+ # $logger.debug "resolve(0): #{attributes.inspect}"
205
+ @attributes.each do |k, _v|
206
+ next if %w[id type].include?(k)
207
+
208
+ @attributes[k] = update_obj(@attributes[k], reference_map)
209
+ end
210
+ # $logger.debug "resolve(1): #{attributes.inspect}"
211
+ @resolved = true
212
+ self
193
213
  end
194
- #$logger.debug "resolve(1): #{attributes.inspect}"
195
- @resolved = true
196
- self
197
- end
198
214
 
199
- ##
200
- # Override this method to implement save using
201
- # an appropriate storage mechanism.
202
- #
203
- # Save the object to the Mongo collection
204
- # use Upsert to create things that don't exist.
205
- # First makes sure that the resource is valid.
206
- #
207
- # @return [Boolean] true or false if resource not saved
208
- def save
209
- raise NotImplementedError
210
- end
215
+ ##
216
+ # Override this method to implement save using
217
+ # an appropriate storage mechanism.
218
+ #
219
+ # Save the object to the Mongo collection
220
+ # use Upsert to create things that don't exist.
221
+ # First makes sure that the resource is valid.
222
+ #
223
+ # @return [Boolean] true or false if resource not saved
224
+ def save
225
+ raise NotImplementedError
226
+ end
211
227
 
212
- ##
213
- # Access individual fields, from subject definition
214
- def property(prop_name); @attributes.fetch(prop_name, nil); end
228
+ ##
229
+ # Access individual fields, from subject definition
230
+ def property(prop_name)
231
+ @attributes.fetch(prop_name, nil)
232
+ end
215
233
 
216
- ##
217
- # Access individual fields, from subject definition
218
- def method_missing(method, *args)
219
- property(method.to_s)
220
- end
234
+ ##
235
+ # Access individual fields, from subject definition
236
+ def method_missing(method, *_args)
237
+ property(method.to_s)
238
+ end
221
239
 
222
- def inspect
223
- "<Resource" +
224
- attributes.map do |k, v|
225
- "\n #{k}: #{v.inspect}"
226
- end.join(" ") +
227
- ">"
240
+ def inspect
241
+ "<Resource" +
242
+ attributes.map do |k, v|
243
+ "\n #{k}: #{v.inspect}"
244
+ end.join(" ") +
245
+ ">"
246
+ end
228
247
  end
229
248
  end
230
249
  end