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