json-ld 0.1.2 → 0.1.3

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,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.