json-ld 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ === 0.1.3
2
+ * Progress release syncing with the spec. Most expansion and compaction tests pass. RDF is okay, framing has many issues.
3
+
1
4
  === 0.1.1
2
5
  * Changed @literal to @value.
3
6
  * Change expanded double format to %1.6e
@@ -4,8 +4,7 @@
4
4
 
5
5
  ## Features
6
6
 
7
- JSON::LD parses and serializes [JSON-LD][] into [RDF][] and implements
8
- JSON::LD expansion, compaction and framing API interfaces.
7
+ JSON::LD parses and serializes [JSON-LD][] into [RDF][] and implements expansion, compaction and framing API interfaces.
9
8
 
10
9
  Install with `gem install json-ld`
11
10
 
@@ -232,7 +231,7 @@ To install the latest official release of the `JSON-LD` gem, do:
232
231
  ## Download
233
232
  To get a local working copy of the development repository, do:
234
233
 
235
- % git clone git://github.com/gkellogg/json-ld.git
234
+ % git clone git://github.com/ruby-rdf/json-ld.git
236
235
 
237
236
  ## Mailing List
238
237
  * <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
@@ -264,6 +263,6 @@ see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
264
263
  [YARD]: http://yardoc.org/
265
264
  [YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
266
265
  [PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
267
- [RDF.rb]: http://rdf.rubyforge.org/
266
+ [RDF.rb]: http://rubygems.org/gems/rdf
268
267
  [Backports]: http://rubygems.org/gems/backports
269
268
  [JSON-LD]: http://json-ld.org/spec/latest/
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
@@ -16,7 +16,7 @@ module JSON
16
16
  # end
17
17
  # end
18
18
  #
19
- # @see http://rdf.rubyforge.org/
19
+ # @see http://rubygems.org/gems/rdf
20
20
  # @see http://www.w3.org/TR/REC-rdf-syntax/
21
21
  #
22
22
  # @author [Gregg Kellogg](http://greggkellogg.net/)
@@ -117,7 +117,6 @@ module JSON::LD
117
117
  # @option options [Boolean] :optimize (false)
118
118
  # Perform further optimmization of the compacted output.
119
119
  # (Presently, this is a noop).
120
- # @param [Hash{Symbol => Object}] options
121
120
  # @yield jsonld
122
121
  # @yieldparam [Hash] jsonld
123
122
  # The compacted JSON-LD document
@@ -130,15 +129,10 @@ module JSON::LD
130
129
 
131
130
  # 1) Perform the Expansion Algorithm on the JSON-LD input.
132
131
  # This removes any existing context to allow the given context to be cleanly applied.
133
- API.new(input, nil, options) do
134
- expanded = expand(value, nil, self.context)
135
- debug(".compact") {"expanded input: #{value.to_json(JSON_STATE)}"}
136
-
137
- # x) If no context provided, use context from input document
138
- context ||= value.fetch('@context', nil)
139
- end
132
+ expanded = API.expand(input, nil, nil, options)
140
133
 
141
134
  API.new(expanded, context, options) do
135
+ debug(".compact") {"expanded input: #{expanded.to_json(JSON_STATE)}"}
142
136
  result = compact(value, nil)
143
137
 
144
138
  # xxx) Add the given context to the output
@@ -265,7 +259,6 @@ module JSON::LD
265
259
  # Alternative to using block, with same parameteres.
266
260
  # @param [{Symbol,String => Object}] options
267
261
  # Options passed to {#expand}
268
- # @param [Hash{Symbol => Object}] options
269
262
  # @raise [InvalidContext]
270
263
  # @yield statement
271
264
  # @yieldparam [RDF::Statement] statement
@@ -295,6 +288,7 @@ module JSON::LD
295
288
  # @param [Proc] callback (&block)
296
289
  # Alternative to using block, with same parameteres.
297
290
  # @param [Hash{Symbol => Object}] options
291
+ # @option options [Boolean] :notType don't use @type for rdf:type
298
292
  # @yield jsonld
299
293
  # @yieldparam [Hash] jsonld
300
294
  # The JSON-LD document in expanded form
@@ -304,7 +298,7 @@ module JSON::LD
304
298
  result = nil
305
299
 
306
300
  API.new(nil, nil, options) do |api|
307
- result = api.from_statements(input, BlankNodeNamer.new("t"))
301
+ result = api.from_statements(input)
308
302
  end
309
303
 
310
304
  callback.call(result) if callback
@@ -7,7 +7,6 @@ module JSON::LD
7
7
  #
8
8
  # @param [Array, Hash] element
9
9
  # @param [String] property (nil)
10
- # @param [EvaluationContext] context
11
10
  # @return [Array, Hash]
12
11
  def compact(element, property = nil)
13
12
  if property.nil?
@@ -68,6 +67,7 @@ module JSON::LD
68
67
 
69
68
  if %(@id @type).include?(key)
70
69
  compacted_key = context.compact_iri(key, :position => :predicate, :depth => @depth)
70
+
71
71
  result[compacted_key] = case value
72
72
  when String
73
73
  # If value is a string, the compacted value is the result of performing IRI Compaction on value.
@@ -84,6 +84,7 @@ module JSON::LD
84
84
  if value.empty?
85
85
  # Make sure that an empty array is preserved
86
86
  compacted_key = context.compact_iri(key, :position => :predicate, :depth => @depth)
87
+ next if compacted_key.nil?
87
88
  result[compacted_key] = value
88
89
  end
89
90
 
@@ -92,6 +93,7 @@ module JSON::LD
92
93
  value.each do |item|
93
94
  compacted_key = context.compact_iri(key, :position => :predicate, :value => item, :depth => @depth)
94
95
  debug {" => compacted key: #{compacted_key.inspect} for #{item.inspect}"}
96
+ next if compacted_key.nil?
95
97
 
96
98
  compacted_item = depth {self.compact(item, compacted_key)}
97
99
  debug {" => compacted value: #{compacted_value.inspect}"}
@@ -103,8 +103,7 @@ module JSON::LD
103
103
 
104
104
  # Create an Evaluation Context using an existing context as a start by parsing the input.
105
105
  #
106
- # @param [String, #read, Array, Hash, EvaluatoinContext] input
107
- # @return [EvaluationContext] context
106
+ # @param [String, #read, Array, Hash, EvaluatoinContext] context
108
107
  # @raise [InvalidContext]
109
108
  # on a remote context load error, syntax error, or a reference to a term which is not defined.
110
109
  def parse(context)
@@ -119,8 +118,7 @@ module JSON::LD
119
118
  # Load context document, if it is a string
120
119
  begin
121
120
  ctx = JSON.load(context)
122
- raise JSON::LD::InvalidContext::Syntax, "missing @context" unless ctx.is_a?(Hash) && ctx["@context"]
123
- parse(ctx["@context"])
121
+ parse(ctx["@context"] || {})
124
122
  rescue JSON::ParserError => e
125
123
  debug("parse") {"Failed to parse @context from remote document at #{context}: #{e.message}"}
126
124
  raise JSON::LD::InvalidContext::Syntax, "Failed to parse remote context at #{context}: #{e.message}" if @options[:validate]
@@ -161,7 +159,7 @@ module JSON::LD
161
159
  context.each do |key, value|
162
160
  # Expand a string value, unless it matches a keyword
163
161
  debug("parse") {"Hash[#{key}] = #{value.inspect}"}
164
- if key == '@language'
162
+ if key == '@language' && (value.nil? || value.is_a?(String))
165
163
  new_ec.default_language = value
166
164
  elsif term_valid?(key)
167
165
  # Remove all coercion information for the property
@@ -174,7 +172,9 @@ module JSON::LD
174
172
  raise InvalidContext::Syntax, "unknown mapping for #{key.inspect} to #{value.class}" unless value.is_a?(String) || value.nil?
175
173
 
176
174
  iri = new_ec.expand_iri(value, :position => :predicate) if value.is_a?(String)
177
- if iri && new_ec.mappings.fetch(key, nil) != iri
175
+ if iri && KEYWORDS.include?(key)
176
+ raise InvalidContext::Syntax, "key #{key.inspect} must not be a keyword"
177
+ elsif iri && new_ec.mappings.fetch(key, nil) != iri
178
178
  # Record term definition
179
179
  new_ec.set_mapping(key, iri)
180
180
  num_updates += 1
@@ -325,23 +325,20 @@ module JSON::LD
325
325
  ##
326
326
  # Set term mapping
327
327
  #
328
- # @param [String] term
328
+ # @param [#to_s] term
329
329
  # @param [RDF::URI, String] value
330
330
  #
331
331
  # @return [RDF::URI, String]
332
332
  def set_mapping(term, value)
333
+ term = term.to_s
334
+ term_sym = term.empty? ? "" : term.to_sym
333
335
  # raise InvalidContext::Syntax, "mapping term #{term.inspect} must be a string" unless term.is_a?(String)
334
336
  # raise InvalidContext::Syntax, "mapping value #{value.inspect} must be an RDF::URI" unless value.nil? || value.to_s[0,1] == '@' || value.is_a?(RDF::URI)
335
- debug {"map #{term.inspect} to #{value}"} unless @mappings[term] == value
337
+ debug {"map #{term.inspect} to #{value.inspect}"}
336
338
  iri_to_term.delete(@mappings[term].to_s) if @mappings[term]
337
- if value
338
- @mappings[term] = value
339
- @options[:prefixes][term] = value if @options.has_key?(:prefixes)
340
- iri_to_term[value.to_s] = term
341
- else
342
- @mappings.delete(term)
343
- nil
344
- end
339
+ @mappings[term] = value
340
+ @options[:prefixes][term_sym] = value if @options.has_key?(:prefixes)
341
+ iri_to_term[value.to_s] = term
345
342
  end
346
343
 
347
344
  ##
@@ -366,7 +363,8 @@ module JSON::LD
366
363
  # @return [RDF::URI, '@id']
367
364
  def coerce(property)
368
365
  # Map property, if it's not an RDF::Value
369
- return '@id' if [RDF.type, '@type'].include?(property) # '@type' always is an IRI
366
+ # @type and @graph always is an IRI
367
+ return '@id' if [RDF.type, '@type', '@graph'].include?(property)
370
368
  @coercions.fetch(property, nil)
371
369
  end
372
370
 
@@ -459,15 +457,14 @@ module JSON::LD
459
457
  base = self.base unless [:predicate, :datatype].include?(options[:position])
460
458
  prefix = prefix.to_s
461
459
  case
462
- when prefix == '_' && suffix then debug("=> bnode"); bnode(suffix)
463
- when iri.to_s[0,1] == "@" then debug("=> keyword"); iri
464
- when suffix.to_s[0,2] == '//' then debug("=> iri"); uri(iri)
465
- when mappings.has_key?(prefix) then debug("=> curie"); uri(mappings[prefix] + suffix.to_s)
466
- when base then debug("=> base"); base.join(iri)
460
+ when prefix == '_' && suffix then bnode(suffix)
461
+ when iri.to_s[0,1] == "@" then iri
462
+ when suffix.to_s[0,2] == '//' then uri(iri)
463
+ when mappings.has_key?(prefix) then uri(mappings[prefix] + suffix.to_s)
464
+ when base then base.join(iri)
467
465
  else
468
466
  # Otherwise, it must be an absolute IRI
469
467
  u = uri(iri)
470
- debug("=> absolute") {"#{u.inspect} abs? #{u.absolute?.inspect}"}
471
468
  u if u.absolute? || [:subject, :object].include?(options[:position])
472
469
  end
473
470
  end
@@ -487,10 +484,6 @@ module JSON::LD
487
484
  # @return [String] compacted form of IRI
488
485
  # @see http://json-ld.org/spec/latest/json-ld-api/#iri-compaction
489
486
  def compact_iri(iri, options = {})
490
- # Don't cause these to be compacted
491
- return iri.to_s if [RDF.first, RDF.rest, RDF.nil].include?(iri)
492
- return self.alias('@type') if options[:position] == :predicate && iri == RDF.type
493
-
494
487
  depth(options) do
495
488
  debug {"compact_iri(#{iri.inspect}, #{options.inspect})"}
496
489
 
@@ -547,9 +540,15 @@ module JSON::LD
547
540
  # @type coercion, @container coercion or @language coercion rules
548
541
  # along with the iri itself.
549
542
  if terms.empty?
550
- curies = mappings.keys.map {|k| iri.to_s.sub(mapping(k).to_s, "#{k}:") if
551
- iri.to_s.index(mapping(k).to_s) == 0 &&
552
- iri.to_s != mapping(k).to_s}.compact
543
+ debug("curies") {"mappings: #{mappings.inspect}"}
544
+ curies = mappings.keys.map do |k|
545
+ debug("curies[#{k}]") {"#{mapping(k).inspect}"}
546
+ #debug("curies[#{k}]") {"#{(mapping(k).to_s.length > 0).inspect}, #{iri.to_s.index(mapping(k).to_s)}"}
547
+ iri.to_s.sub(mapping(k).to_s, "#{k}:") if
548
+ mapping(k).to_s.length > 0 &&
549
+ iri.to_s.index(mapping(k).to_s) == 0 &&
550
+ iri.to_s != mapping(k).to_s
551
+ end.compact
553
552
 
554
553
  debug("curies") do
555
554
  curies.map do |c|
@@ -581,17 +580,24 @@ module JSON::LD
581
580
  debug("curies") {"using standard prefies: #{terms.inspect}"}
582
581
  end
583
582
 
584
- terms << iri.to_s
583
+ # If there is a mapping from the complete IRI to null, return null,
584
+ # otherwise, return the complete IRI.
585
+ if mappings.has_key?(iri.to_s) && !mapping(iri)
586
+ debug("iri") {"use nil IRI mapping"}
587
+ terms << nil
588
+ else
589
+ terms << iri.to_s
590
+ end
585
591
  end
586
592
 
587
593
  # Get the first term based on distance and lexecographical order
588
594
  # Prefer terms that don't have @container @set over other terms, unless as set is true
589
595
  terms = terms.sort do |a, b|
590
596
  debug("term sort") {"c(a): #{container(a).inspect}, c(b): #{container(b)}"}
591
- if a.length == b.length
592
- a <=> b
597
+ if a.to_s.length == b.to_s.length
598
+ a.to_s <=> b.to_s
593
599
  else
594
- a.length <=> b.length
600
+ a.to_s.length <=> b.to_s.length
595
601
  end
596
602
  end
597
603
  debug("sorted terms") {terms.inspect}
@@ -613,11 +619,13 @@ module JSON::LD
613
619
  # @param [Hash, String] value
614
620
  # Value (literal or IRI) to be expanded
615
621
  # @param [Hash{Symbol => Object}] options
622
+ # @option options [Boolean] :native (true) use native representations
616
623
  #
617
624
  # @return [Hash] Object representation of value
618
625
  # @raise [RDF::ReaderError] if the iri cannot be expanded
619
626
  # @see http://json-ld.org/spec/latest/json-ld-api/#value-expansion
620
627
  def expand_value(property, value, options = {})
628
+ options = {:native => true}.merge(options)
621
629
  depth(options) do
622
630
  debug("expand_value") {"property: #{property.inspect}, value: #{value.inspect}, coerce: #{coerce(property).inspect}"}
623
631
  result = case value
@@ -626,8 +634,12 @@ module JSON::LD
626
634
  when RDF::XSD.double.to_s
627
635
  {"@value" => value.to_s, "@type" => RDF::XSD.double.to_s}
628
636
  else
629
- # Unless there's coercion, to not modify representation
630
- value.is_a?(RDF::Literal::Boolean) ? value.object : value
637
+ if options[:native]
638
+ # Unless there's coercion, to not modify representation
639
+ {"@value" => (value.is_a?(RDF::Literal::Boolean) ? value.object : value)}
640
+ else
641
+ {"@value" => value.to_s, "@type" => RDF::XSD.boolean.to_s}
642
+ end
631
643
  end
632
644
  when Integer, RDF::Literal::Integer
633
645
  case coerce(property)
@@ -635,7 +647,11 @@ module JSON::LD
635
647
  {"@value" => RDF::Literal::Double.new(value, :canonicalize => true).to_s, "@type" => RDF::XSD.double.to_s}
636
648
  when RDF::XSD.integer.to_s, nil
637
649
  # Unless there's coercion, to not modify representation
638
- value.is_a?(RDF::Literal::Integer) ? value.object : value
650
+ if options[:native]
651
+ {"@value" => value.is_a?(RDF::Literal::Integer) ? value.object : value}
652
+ else
653
+ {"@value" => value.to_s, "@type" => RDF::XSD.integer.to_s}
654
+ end
639
655
  else
640
656
  res = Hash.ordered
641
657
  res['@value'] = value.to_s
@@ -649,8 +665,12 @@ module JSON::LD
649
665
  when RDF::XSD.double.to_s
650
666
  {"@value" => RDF::Literal::Double.new(value, :canonicalize => true).to_s, "@type" => RDF::XSD.double.to_s}
651
667
  when nil
652
- # Unless there's coercion, to not modify representation
653
- value.is_a?(RDF::Literal::Double) ? value.object : value
668
+ if options[:native]
669
+ # Unless there's coercion, to not modify representation
670
+ {"@value" => value.is_a?(RDF::Literal::Double) ? value.object : value}
671
+ else
672
+ {"@value" => RDF::Literal::Double.new(value, :canonicalize => true).to_s, "@type" => RDF::XSD.double.to_s}
673
+ end
654
674
  else
655
675
  res = Hash.ordered
656
676
  res['@value'] = value.to_s
@@ -676,7 +696,7 @@ module JSON::LD
676
696
  {'@id' => expand_iri(value, :position => :object).to_s}
677
697
  when nil
678
698
  debug("expand value") {"lang(prop): #{language(property).inspect}, def: #{default_language.inspect}"}
679
- language(property) ? {"@value" => value.to_s, "@language" => language(property)} : value.to_s
699
+ language(property) ? {"@value" => value.to_s, "@language" => language(property)} : {"@value" => value.to_s}
680
700
  else
681
701
  res = Hash.ordered
682
702
  res['@value'] = value.to_s
@@ -702,6 +722,7 @@ module JSON::LD
702
722
  # @return [Hash] Object representation of value
703
723
  # @raise [ProcessingError] if the iri cannot be expanded
704
724
  # @see http://json-ld.org/spec/latest/json-ld-api/#value-compaction
725
+ # FIXME: revisit the specification version of this.
705
726
  def compact_value(property, value, options = {})
706
727
  raise ProcessingError::Lossy, "attempt to compact a non-object value: #{value.inspect}" unless value.is_a?(Hash)
707
728
 
@@ -709,11 +730,11 @@ module JSON::LD
709
730
  debug("compact_value") {"property: #{property.inspect}, value: #{value.inspect}, coerce: #{coerce(property).inspect}"}
710
731
 
711
732
  result = case
712
- when %w(boolean integer double).any? {|t| expand_iri(value['@type'], :position => :datatype) == RDF::XSD[t]}
713
- # Compact native type
714
- debug {" (native)"}
715
- l = RDF::Literal(value['@value'], :datatype => expand_iri(value['@type'], :position => :datatype))
716
- l.canonicalize.object
733
+ #when %w(boolean integer double).any? {|t| expand_iri(value['@type'], :position => :datatype) == RDF::XSD[t]}
734
+ # # Compact native type
735
+ # debug {" (native)"}
736
+ # l = RDF::Literal(value['@value'], :datatype => expand_iri(value['@type'], :position => :datatype))
737
+ # l.canonicalize.object
717
738
  when coerce(property) == '@id' && value.has_key?('@id')
718
739
  # Compact an @id coercion
719
740
  debug {" (@id & coerce)"}
@@ -731,10 +752,18 @@ module JSON::LD
731
752
  # Compact language
732
753
  debug {" (@language) == #{language(property).inspect}"}
733
754
  value['@value']
755
+ when value['@value'] && !value['@value'].is_a?(String)
756
+ # Compact simple literal to string
757
+ debug {" (@value not string)"}
758
+ value['@value']
734
759
  when value['@value'] && !value['@language'] && !value['@type'] && !coerce(property) && !default_language
735
760
  # Compact simple literal to string
736
761
  debug {" (@value && !@language && !@type && !coerce && !language)"}
737
762
  value['@value']
763
+ when value['@value'] && !value['@language'] && !value['@type'] && !coerce(property) && !language(property)
764
+ # Compact simple literal to string
765
+ debug {" (@value && !@language && !@type && !coerce && language(property).false)"}
766
+ value['@value']
738
767
  when value['@type']
739
768
  # Compact datatype
740
769
  debug {" (@type)"}
@@ -814,51 +843,47 @@ module JSON::LD
814
843
  # @param [Object] value
815
844
  # @return [Integer]
816
845
  def term_rank(term, value)
817
- debug("term rank") { "term: #{term.inspect}, value: #{value.inspect}"}
818
- debug("term rank") { "coerce: #{coerce(term).inspect}, lang: #{languages.fetch(term, nil).inspect}"}
819
-
820
- # A term without @language or @type can be used with rank 1 for any value
821
846
  default_term = !coerce(term) && !languages.has_key?(term)
822
- debug("term rank") { "default_term: #{default_term.inspect}"}
823
-
824
- rank = case value
825
- when TrueClass, FalseClass
826
- coerce(term) == RDF::XSD.boolean.to_s ? 3 : (default_term ? 2 : 1)
827
- when Integer
828
- coerce(term) == RDF::XSD.integer.to_s ? 3 : (default_term ? 2 : 1)
829
- when Float
830
- coerce(term) == RDF::XSD.double.to_s ? 3 : (default_term ? 2 : 1)
831
- when nil
832
- # A value of null probably means it's an @id
847
+ debug("term rank") {
848
+ "term: #{term.inspect}, " +
849
+ "value: #{value.inspect}, " +
850
+ "coerce: #{coerce(term).inspect}, " +
851
+ "lang: #{languages.fetch(term, nil).inspect}/#{language(term).inspect} " +
852
+ "default_term: #{default_term.inspect}"
853
+ }
854
+
855
+ # value is null
856
+ rank = if value.nil?
857
+ debug("term rank") { "null value: 3"}
833
858
  3
834
- when String
835
- # When compacting a string, the string has no language, so the term can be used if the term has @language null or it is a default term and there is no default language
836
- debug("term rank") {"string: lang: #{languages.fetch(term, false).inspect}, def: #{default_language.inspect}"}
837
- !languages.fetch(term, true) || (default_term && !default_language) ? 3 : 0
838
- when Hash
839
- if list?(value)
840
- if value['@list'].empty?
841
- # If the @list property is an empty array, if term has @container set to @list, term rank is 1, otherwise 0.
842
- container(term) == '@list' ? 1 : 0
843
- else
844
- # Otherwise, return the sum of the term ranks for every entry in the list.
845
- depth {value['@list'].inject(0) {|memo, v| memo + term_rank(term, v)}}
846
- end
847
- elsif subject?(value) || subject_reference?(value)
848
- coerce(term) == '@id' ? 3 : (default_term ? 1 : 0)
849
- elsif val_type = value.fetch('@type', nil)
859
+ elsif list?(value)
860
+ if value['@list'].empty?
861
+ # If the @list property is an empty array, if term has @container set to @list, term rank is 1, otherwise 0.
862
+ container(term) == '@list' ? 1 : 0
863
+ else
864
+ # Otherwise, return the sum of the term ranks for every entry in the list.
865
+ depth {value['@list'].inject(0) {|memo, v| memo + term_rank(term, v)}}
866
+ end
867
+ elsif value?(value)
868
+ val_type = value.fetch('@type', nil)
869
+ val_lang = value.fetch('@language', nil)
870
+ debug("term rank") {"@val_type: #{val_type.inspect}, val_lang: #{val_lang.inspect}"}
871
+ if val_type
850
872
  coerce(term) == val_type ? 3 : (default_term ? 1 : 0)
851
- elsif val_lang = value.fetch('@language', nil)
852
- val_lang == language(term) ? 3 : (default_term ? 1 : 0)
873
+ elsif !value['@value'].is_a?(String)
874
+ default_term ? 2 : 1
875
+ elsif val_lang.nil?
876
+ debug("val_lang.nil") {"#{language(term).inspect} && #{coerce(term).inspect}"}
877
+ !language(term) && !coerce(term) ? 3 : 0
853
878
  else
854
- default_term ? 3 : 0
879
+ val_lang == language(term) ? 3 : (default_term ? 1 : 0)
855
880
  end
856
- else
857
- raise ProcessingError, "Unexpected value for term_rank: #{value.inspect}"
881
+ else # subject definition/reference
882
+ coerce(term) == '@id' ? 3 : (default_term ? 1 : 0)
858
883
  end
859
884
 
860
- # If term has @container @set, and rank is not 0, increase rank by 1.
861
- rank > 0 && container(term) == '@set' ? rank + 1 : rank
885
+ debug(" =>") {rank.inspect}
886
+ rank
862
887
  end
863
888
  end
864
- end
889
+ end
@@ -53,7 +53,7 @@ module JSON::LD
53
53
 
54
54
  # Set active property to the original un-expanded property if property if not a keyword
55
55
  active_property = key unless key[0,1] == '@'
56
- debug("expand property") {"#{active_property}, expanded: #{property}, value: #{value.inspect}"}
56
+ debug("expand property") {"#{active_property.inspect}, expanded: #{property}, value: #{value.inspect}"}
57
57
 
58
58
  # If property does not expand to a keyword or absolute IRI, remove property from element
59
59
  # and continue to the next property from element
@@ -71,17 +71,25 @@ module JSON::LD
71
71
  # Otherwise, if the property is @type the value must be a string, an array of strings
72
72
  # or an empty JSON Object.
73
73
  # Expand value or each of it's entries according to IRI Expansion
74
+ debug("@type") {"value: #{value.inspect}"}
74
75
  case value
75
76
  when Array
76
77
  depth do
77
78
  [value].flatten.map do |v|
79
+ v = v['@id'] if subject_reference?(v)
80
+ raise ProcessingError, "Object value must be a string or a subject reference: #{v.inspect}" unless v.is_a?(String)
78
81
  context.expand_iri(v, options.merge(:position => :property, :quiet => true)).to_s
79
82
  end
80
83
  end
81
84
  when Hash
82
- # Empty object used for @type wildcard
83
- raise ProcessingError, "Object value of @type must be empty: #{value.inspect}" unless value.empty?
84
- value
85
+ # Empty object used for @type wildcard or subject reference
86
+ if subject_reference?(value)
87
+ context.expand_iri(value['@id'], options.merge(:position => :property, :quiet => true)).to_s
88
+ elsif !value.empty?
89
+ raise ProcessingError, "Object value of @type must be empty or a subject reference: #{value.inspect}"
90
+ else
91
+ value
92
+ end
85
93
  else
86
94
  context.expand_iri(value, options.merge(:position => :property, :quiet => true)).to_s
87
95
  end
@@ -152,10 +160,8 @@ module JSON::LD
152
160
  raise ProcessingError, "element must not have more than one other property, which can either be @language or @type with a string value." unless value.is_a?(String)
153
161
  end
154
162
 
155
- # if @value is the only property or the value of @value equals null, replace element with the value of @value.
156
- if output_object['@value'].nil? || output_object.keys.length == 1
157
- return output_object['@value']
158
- end
163
+ # if the value of @value equals null, replace element with the value of null.
164
+ return nil if output_object['@value'].nil?
159
165
  elsif !output_object.fetch('@type', []).is_a?(Array)
160
166
  # Otherwise, if element has an @type property and it's value is not in the form of an array,
161
167
  # convert it to an array.
@@ -244,7 +244,7 @@ module JSON::LD
244
244
  debug("flatten") {"statements: #{statements.map(&:to_nquads).join("\n")}"}
245
245
 
246
246
  # Transform back to JSON-LD, not flattened
247
- depth {self.from_statements(statements, BlankNodeNamer.new("t"))}
247
+ depth {self.from_statements(statements)}
248
248
  end
249
249
 
250
250
  ##
@@ -9,14 +9,10 @@ module JSON::LD
9
9
  # Representation is in expanded form
10
10
  #
11
11
  # @param [Array<RDF::Statement>] input
12
- # @param [BlankNodeNamer] namer
13
12
  # @return [Array<Hash>] the JSON-LD document in normalized form
14
- def from_statements(input, namer)
15
- array = []
16
- listMap = {}
17
- restMap = {}
18
- subjectMap = {}
19
- bnode_map = {}
13
+ def from_statements(input)
14
+ defaultGraph = {:subjects => {}, :listMap => {}, :name => ''}
15
+ graphs = {'' => defaultGraph}
20
16
 
21
17
  value = nil
22
18
  ec = EvaluationContext.new
@@ -28,20 +24,21 @@ module JSON::LD
28
24
  debug("statement") { statement.to_nquads.chomp}
29
25
 
30
26
  subject = ec.expand_iri(statement.subject).to_s
31
- name = ec.expand_iri(statement.context).to_s if statement.context
32
- subject = namer.get_name(subject) if subject[0,2] == "_:"
33
- name = namer.get_name(name) if name.to_s[0,2] == "_:"
34
-
27
+ name = statement.context ? ec.expand_iri(statement.context).to_s : ''
28
+
29
+ # Create a graph entry as needed
30
+ graph = graphs[name] ||= {:subjects => {}, :listMap => {}, :name => name}
31
+
35
32
  case statement.predicate
36
33
  when RDF.first
37
34
  # If property is rdf:first,
38
35
  # create a new entry in _listMap_ for _name_ and _subject_ and an array value
39
36
  # containing the object representation and continue to the next statement.
37
+ listMap = graph[:listMap]
38
+ entry = listMap[subject] ||= {}
40
39
  object_rep = ec.expand_value(nil, statement.object)
41
- object_rep['@id'] = namer.get_name(object_rep['@id']) if blank_node?(object_rep)
42
- debug("rdf:first") { "save object #{[object_rep].inspect}"}
43
- listMap[name] ||= {}
44
- listMap[name][subject] = [object_rep]
40
+ entry[:first] = object_rep
41
+ debug("rdf:first") { "save entry for #{subject.inspect} #{entry.inspect}"}
45
42
  next
46
43
  when RDF.rest
47
44
  # If property is rdf:rest,
@@ -49,64 +46,26 @@ module JSON::LD
49
46
  # create a new entry in _restMap_ for _name_ and _subject_ and a value being the
50
47
  # result of IRI expansion on the object and continue to the next statement.
51
48
  next unless statement.object.is_a?(RDF::Node)
49
+
50
+ listMap = graph[:listMap]
51
+ entry = listMap[subject] ||= {}
52
+
52
53
  object_rep = ec.expand_iri(statement.object).to_s
53
- object_rep = namer.get_name(object_rep) if object_rep[0,2] == '_:'
54
- debug("rdf:rest") { "save object #{object_rep.inspect}"}
55
- restMap[name] ||= {}
56
- restMap[name][subject] = object_rep
54
+ entry[:rest] = object_rep
55
+ debug("rdf:rest") { "save entry for #{subject.inspect} #{entry.inspect}"}
57
56
  next
58
57
  end
59
58
 
60
- # If name is not null
61
- if name
62
- # If _subjectMap_ does not have an entry for null as name and _name_ as subject
63
- subjectMap[nil] ||= {}
64
- value = subjectMap[nil][name]
65
- unless value
66
- # Create a new JSON Object with key/value pair of @id and a string representation
67
- # of name and append to array.
68
- debug("@id") { "new subject: #{name} for graph"}
69
- value = Hash.ordered
70
- value['@id'] = name
71
- array << (subjectMap[nil][name] = value)
72
- else
73
- # Otherwise, use that entry as value
74
- end
75
-
76
- # If value does not have an entry for @graph, initialize it as a new array
77
- a = value['@graph'] ||= []
78
-
79
- # If subjectMap does not have an entry for name and subject
80
- subjectMap[name] ||= {}
81
- value = subjectMap[name][subject]
82
- unless value
83
- # Create a new JSON Object with key/value pair of @id and a string representation
84
- # of name and append to the the graph array for name and use as value.
85
- debug("@id") { "new subject: #{subject} for graph: #{name}"}
86
- value = Hash.ordered
87
- value['@id'] = subject
88
- a << (subjectMap[name][subject] = value)
89
- else
90
- # Otherwise, use that entry as value
91
- end
92
- else
93
- # Otherwise, if subjectMap does not have an entry for _name_ and _subject_
94
- subjectMap[name] ||= {}
95
- value = subjectMap[nil][subject]
96
- unless value
97
- # Create a new JSON Object with key/value pair of @id and a string representation
98
- # of subject and append to array.
99
- debug("@id") { "new subject: #{subject}"}
100
- value = Hash.ordered
101
- value['@id'] = subject
102
- array << (subjectMap[nil][subject] = value)
103
- else
104
- # Otherwise, use that entry as value
105
- end
106
- end
59
+ # Add entry to default graph for name unless it is empty
60
+ defaultGraph[:subjects][name] ||= {'@id' => name} unless name.empty?
107
61
 
108
- # If property is http://www.w3.org/1999/02/22-rdf-syntax-ns#type:
109
- if statement.predicate == RDF.type
62
+ # Get value from graph subjects for subject, initializing it to a new subject declaration for subject if it does not exist
63
+ debug("@id") { "new subject: #{subject}"} unless graph[:subjects].has_key?(subject)
64
+ value = graph[:subjects][subject] ||= {'@id' => subject}
65
+
66
+ # If property is http://www.w3.org/1999/02/22-rdf-syntax-ns#type
67
+ # and the notType option is not true
68
+ if statement.predicate == RDF.type && !@options[:notType]
110
69
  object = ec.expand_iri(statement.object).to_s
111
70
  debug("@type") { object.inspect}
112
71
  # append the string representation of object to the array value for the key @type, creating
@@ -117,45 +76,65 @@ module JSON::LD
117
76
  # key be the string representation of predicate. Set the value
118
77
  # for key to an empty @list representation {"@list": []}
119
78
  key = ec.expand_iri(statement.predicate).to_s
120
- value[key] = {"@list" => []}
79
+ (value[key] ||= []) << {"@list" => []}
121
80
  else
122
81
  # Otherwise, let key be the string representation of predicate and let object representation
123
82
  # be object represented in expanded form as described in Value Expansion.
124
83
  key = ec.expand_iri(statement.predicate).to_s
125
- object = ec.expand_value(key, statement.object)
126
- debug("object") {"detected that #{object.inspect} is a blank node"}
127
- object['@id'] = object_iri = namer.get_name(object['@id']) if blank_node?(object)
84
+ object = ec.expand_value(key, statement.object, :native => false)
85
+ if blank_node?(object)
86
+ # if object is an Unnamed Node, set as the head element in the listMap
87
+ # entry for object
88
+ listMap = graph[:listMap]
89
+ entry = listMap[object['@id']] ||= {}
90
+ entry[:head] = object
91
+ debug("bnode") { "save entry #{entry.inspect}"}
92
+ end
128
93
 
129
94
  debug("key/value") { "key: #{key}, :value #{object.inspect}"}
130
95
 
131
- # Non-normative, save a reference for the bnode to allow for easier list expansion
132
- bnode_map[object_iri] = {:obj => value, :key => key} if statement.object.is_a?(RDF::Node)
133
-
134
96
  # append the object object representation to the array value for key, creating
135
97
  # an entry if necessary
136
98
  (value[key] ||= []) << object
137
99
  end
138
100
  end
139
101
 
140
- # For each key/value _prev_, _rest_ entry in _restMap_, append to the _listMap_ value identified
141
- # by _prev_ the _listMap_ value identified by _rest_
142
- debug("restMap") {restMap.inspect}
143
- restMap.each do |gname, map|
144
- map.each do |prev, rest|
145
- debug("@list") { "Fold #{rest} into #{prev}"}
146
- listMap[gname][prev] += listMap[gname][rest]
102
+ # Build lists for each graph
103
+ graphs.each do |name, graph|
104
+ graph[:listMap].each do |subject, entry|
105
+ debug("listMap(#{name}, #{subject})") { entry.inspect}
106
+ if entry.has_key?(:head) && entry.has_key?(:first)
107
+ debug("@list") { "List head for #{subject.inspect} in #{name.inspect}: #{entry.inspect}"}
108
+ value = entry[:head]
109
+ value.delete('@id')
110
+ list = value['@list'] = [entry[:first]].compact
111
+
112
+ while rest = entry.fetch(:rest, nil)
113
+ entry = graph[:listMap][rest]
114
+ debug(" => ") { "add #{entry.inspect}"}
115
+ raise JSON::LD::ProcessingError, "list entry missing rdf:first" unless entry.has_key?(:first)
116
+ list << entry[:first]
117
+ end
118
+ end
147
119
  end
148
120
  end
149
121
 
150
- # For each key/value _node_, _list_, in _listMap_ where _list_ exists as a value of an object in _array_,
151
- # replace the object value with _list_
152
- debug("listMap") {listMap.inspect}
153
- listMap.each do |gname, map|
154
- map.each do |node, list|
155
- next unless bnode_map.has_key?(node)
156
- debug("@list") { "Replace #{bnode_map[node][:obj][bnode_map[node][:key]]} with #{listMap[node]}"}
157
- bnode_map[node][:obj][bnode_map[node][:key]] = {"@list" => listMap[gname][node]}
122
+ # Build graphs in @id order
123
+ debug("graphs") {graphs.to_json(JSON_STATE)}
124
+ array = defaultGraph[:subjects].keys.sort.map do |subject|
125
+ entry = defaultGraph[:subjects][subject]
126
+ debug("=> default") {entry.to_json(JSON_STATE)}
127
+
128
+ # If subject is a named graph, add serialized subject defintions
129
+ if graphs.has_key?(subject) && !subject.empty?
130
+ entry['@graph'] = graphs[subject][:subjects].keys.sort.map do |s|
131
+ debug("=> #{s.inspect}")
132
+ graphs[subject][:subjects][s]
133
+ end
158
134
  end
135
+
136
+ debug("default graph") {entry.inspect}
137
+ entry
159
138
  end
160
139
 
161
140
  # Return array as the graph representation.
@@ -21,7 +21,7 @@ module JSON::LD
21
21
  # @yieldparam [RDF::Statement] :statement
22
22
  def statements(path, element, subject, property, name, &block)
23
23
  debug(path) {"statements: e=#{element.inspect}, s=#{subject.inspect}, p=#{property.inspect}, n=#{name.inspect}"}
24
- @node_seq = "jld_t0000" unless subject || property
24
+ @node_seq = "t0" unless subject || property
25
25
 
26
26
  traverse_result = depth do
27
27
  case element
@@ -55,7 +55,8 @@ module JSON::LD
55
55
 
56
56
  # 1.7) For each key in the JSON object that has not already been processed,
57
57
  # perform the following steps:
58
- element.each do |key, value|
58
+ element.keys.sort.each do |key|
59
+ value = element[key]
59
60
  active_property = case key
60
61
  when '@type'
61
62
  # If the key is @type, set the active property to rdf:type.
@@ -125,8 +126,6 @@ module JSON::LD
125
126
  # Inherited property
126
127
  # @param [RDF::Resource] name
127
128
  # Inherited named graph context
128
- # @param [EvaluationContext] ec
129
- # The active context
130
129
  # @return [RDF::Resource] BNode or nil for head of list
131
130
  # @yield :statement
132
131
  # @yieldparam [RDF::Statement] :statement
@@ -39,12 +39,21 @@ module JSON::LD
39
39
  value.is_a?(Hash) && value.keys == %w(@list)
40
40
  end
41
41
 
42
+ ##
43
+ # Is value literal?
44
+ #
45
+ # @param [Object] value
46
+ # @return [Boolean]
47
+ def value?(value)
48
+ value.is_a?(Hash) && value.has_key?('@value')
49
+ end
50
+
42
51
  private
43
52
 
44
53
  # Add debug event to debug array, if specified
45
54
  #
46
- # @param [String] message
47
- # @yieldreturn [String] appended to message, to allow for lazy-evaulation of message
55
+ # param [String] message
56
+ # yieldreturn [String] appended to message, to allow for lazy-evaulation of message
48
57
  def debug(*args)
49
58
  return unless ::JSON::LD.debug? || @options[:debug]
50
59
  list = args
@@ -92,7 +92,7 @@ module JSON::LD
92
92
  options[:base_uri] ||= options[:base] if options.has_key?(:base)
93
93
  options[:base] ||= options[:base_uri] if options.has_key?(:base_uri)
94
94
  super do
95
- @graph = RDF::Graph.new
95
+ @repo = RDF::Graph.new
96
96
 
97
97
  if block_given?
98
98
  case block.arity
@@ -110,7 +110,7 @@ module JSON::LD
110
110
  # @return [void]
111
111
  def write_graph(graph)
112
112
  debug {"Add graph #{graph.inspect}"}
113
- @graph = graph
113
+ @repo = graph
114
114
  end
115
115
 
116
116
  ##
@@ -118,7 +118,7 @@ module JSON::LD
118
118
  # @param [RDF::Statement] statement
119
119
  # @return [void]
120
120
  def write_statement(statement)
121
- @graph.insert(statement)
121
+ @repo.insert(statement)
122
122
  end
123
123
 
124
124
  ##
@@ -130,7 +130,7 @@ module JSON::LD
130
130
  # @raise [NotImplementedError] unless implemented in subclass
131
131
  # @abstract
132
132
  def write_triple(subject, predicate, object)
133
- @graph.insert(Statement.new(subject, predicate, object))
133
+ @repo.insert(Statement.new(subject, predicate, object))
134
134
  end
135
135
 
136
136
  ##
@@ -145,7 +145,7 @@ module JSON::LD
145
145
  @debug = @options[:debug]
146
146
 
147
147
  # Turn graph into a triple array
148
- statements = @graph.each_statement.to_a
148
+ statements = @repo.each_statement.to_a
149
149
  debug("writer") { "serialize #{statements.length} statements, #{@options.inspect}"}
150
150
  result = API.fromRDF(statements, nil, @options)
151
151
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-ld
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-20 00:00:00.000000000Z
12
+ date: 2012-06-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdf
16
- requirement: &70185823761420 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 0.3.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70185823761420
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.3.5
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: json
27
- requirement: &70185823760820 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 1.6.5
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70185823760820
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.6.5
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: equivalent-xml
38
- requirement: &70185823760180 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 0.2.8
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70185823760180
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.8
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: open-uri-cached
49
- requirement: &70185823759520 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: 0.0.5
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70185823759520
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.0.5
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: yard
60
- requirement: &70185823758900 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: 0.7.4
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70185823758900
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 0.7.4
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: spira
71
- requirement: &70185823758300 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: 0.0.12
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70185823758300
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 0.0.12
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: rspec
82
- requirement: &70185823757580 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: 2.8.0
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70185823757580
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: 2.8.0
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: rdf-spec
93
- requirement: &70185823756980 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,10 +133,15 @@ dependencies:
98
133
  version: 0.3.5
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70185823756980
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: 0.3.5
102
142
  - !ruby/object:Gem::Dependency
103
143
  name: rdf-turtle
104
- requirement: &70185823756340 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
105
145
  none: false
106
146
  requirements:
107
147
  - - ! '>='
@@ -109,10 +149,15 @@ dependencies:
109
149
  version: 0.1.1
110
150
  type: :development
111
151
  prerelease: false
112
- version_requirements: *70185823756340
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: 0.1.1
113
158
  - !ruby/object:Gem::Dependency
114
159
  name: rdf-trig
115
- requirement: &70185823755720 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
116
161
  none: false
117
162
  requirements:
118
163
  - - ! '>='
@@ -120,10 +165,15 @@ dependencies:
120
165
  version: 0.1.1
121
166
  type: :development
122
167
  prerelease: false
123
- version_requirements: *70185823755720
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.1.1
124
174
  - !ruby/object:Gem::Dependency
125
175
  name: rdf-isomorphic
126
- requirement: &70185823755100 !ruby/object:Gem::Requirement
176
+ requirement: !ruby/object:Gem::Requirement
127
177
  none: false
128
178
  requirements:
129
179
  - - ! '>='
@@ -131,10 +181,15 @@ dependencies:
131
181
  version: 0.3.4
132
182
  type: :development
133
183
  prerelease: false
134
- version_requirements: *70185823755100
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: 0.3.4
135
190
  - !ruby/object:Gem::Dependency
136
191
  name: sparql
137
- requirement: &70185823754420 !ruby/object:Gem::Requirement
192
+ requirement: !ruby/object:Gem::Requirement
138
193
  none: false
139
194
  requirements:
140
195
  - - ! '>='
@@ -142,7 +197,28 @@ dependencies:
142
197
  version: 0.0.2
143
198
  type: :development
144
199
  prerelease: false
145
- version_requirements: *70185823754420
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: 0.0.2
206
+ - !ruby/object:Gem::Dependency
207
+ name: backports
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
146
222
  description: JSON::LD parses and serializes JSON-LD into RDF and implements expansion,
147
223
  compaction and framing API interfaces.
148
224
  email: public-rdf-ruby@w3.org
@@ -190,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
266
  version: '0'
191
267
  requirements: []
192
268
  rubyforge_project: json-ld
193
- rubygems_version: 1.8.17
269
+ rubygems_version: 1.8.24
194
270
  signing_key:
195
271
  specification_version: 3
196
272
  summary: JSON-LD reader/writer for Ruby.