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.
- data/History.markdown +3 -0
- data/README.markdown +3 -4
- data/VERSION +1 -1
- data/lib/json/ld.rb +1 -1
- data/lib/json/ld/api.rb +4 -10
- data/lib/json/ld/compact.rb +3 -1
- data/lib/json/ld/evaluation_context.rb +109 -84
- data/lib/json/ld/expand.rb +14 -8
- data/lib/json/ld/frame.rb +1 -1
- data/lib/json/ld/from_rdf.rb +69 -90
- data/lib/json/ld/to_rdf.rb +3 -4
- data/lib/json/ld/utils.rb +11 -2
- data/lib/json/ld/writer.rb +5 -5
- metadata +103 -27
data/History.markdown
CHANGED
data/README.markdown
CHANGED
@@ -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/
|
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://
|
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.
|
1
|
+
0.1.3
|
data/lib/json/ld.rb
CHANGED
data/lib/json/ld/api.rb
CHANGED
@@ -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.
|
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
|
301
|
+
result = api.from_statements(input)
|
308
302
|
end
|
309
303
|
|
310
304
|
callback.call(result) if callback
|
data/lib/json/ld/compact.rb
CHANGED
@@ -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]
|
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
|
-
|
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 &&
|
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 [
|
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}"}
|
337
|
+
debug {"map #{term.inspect} to #{value.inspect}"}
|
336
338
|
iri_to_term.delete(@mappings[term].to_s) if @mappings[term]
|
337
|
-
|
338
|
-
|
339
|
-
|
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
|
-
|
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
|
463
|
-
when iri.to_s[0,1] == "@" then
|
464
|
-
when suffix.to_s[0,2] == '//' then
|
465
|
-
when mappings.has_key?(prefix) then
|
466
|
-
when base then
|
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
|
551
|
-
|
552
|
-
|
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
|
-
|
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
|
-
|
630
|
-
|
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
|
-
|
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
|
-
|
653
|
-
|
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
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
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") {
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
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
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
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
|
852
|
-
|
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
|
-
|
879
|
+
val_lang == language(term) ? 3 : (default_term ? 1 : 0)
|
855
880
|
end
|
856
|
-
else
|
857
|
-
|
881
|
+
else # subject definition/reference
|
882
|
+
coerce(term) == '@id' ? 3 : (default_term ? 1 : 0)
|
858
883
|
end
|
859
884
|
|
860
|
-
|
861
|
-
rank
|
885
|
+
debug(" =>") {rank.inspect}
|
886
|
+
rank
|
862
887
|
end
|
863
888
|
end
|
864
|
-
end
|
889
|
+
end
|
data/lib/json/ld/expand.rb
CHANGED
@@ -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
|
-
|
84
|
-
|
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
|
156
|
-
if output_object['@value'].nil?
|
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.
|
data/lib/json/ld/frame.rb
CHANGED
@@ -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
|
247
|
+
depth {self.from_statements(statements)}
|
248
248
|
end
|
249
249
|
|
250
250
|
##
|
data/lib/json/ld/from_rdf.rb
CHANGED
@@ -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
|
15
|
-
|
16
|
-
|
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
|
32
|
-
|
33
|
-
|
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
|
-
|
42
|
-
debug("rdf:first") { "save
|
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
|
-
|
54
|
-
debug("rdf:rest") { "save
|
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
|
-
#
|
61
|
-
|
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
|
-
#
|
109
|
-
|
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]
|
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
|
-
|
127
|
-
|
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
|
-
#
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
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
|
-
#
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
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.
|
data/lib/json/ld/to_rdf.rb
CHANGED
@@ -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 = "
|
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
|
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
|
data/lib/json/ld/utils.rb
CHANGED
@@ -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
|
-
#
|
47
|
-
#
|
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
|
data/lib/json/ld/writer.rb
CHANGED
@@ -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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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 = @
|
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.
|
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-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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.
|
269
|
+
rubygems_version: 1.8.24
|
194
270
|
signing_key:
|
195
271
|
specification_version: 3
|
196
272
|
summary: JSON-LD reader/writer for Ruby.
|