json-ld 0.1.6.1 → 0.3.0
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 +5 -2
- data/README.markdown +2 -1
- data/VERSION +1 -1
- data/lib/json/ld.rb +1 -0
- data/lib/json/ld/api.rb +23 -18
- data/lib/json/ld/compact.rb +12 -7
- data/lib/json/ld/evaluation_context.rb +42 -37
- data/lib/json/ld/expand.rb +1 -1
- data/lib/json/ld/from_rdf.rb +2 -1
- data/lib/json/ld/resource.rb +243 -0
- data/lib/json/ld/to_rdf.rb +3 -3
- data/spec/compact_spec.rb +128 -18
- data/spec/evaluation_context_spec.rb +65 -8
- data/spec/resource_spec.rb +7 -0
- data/spec/suite_compact_spec.rb +32 -0
- data/spec/suite_expand_spec.rb +37 -0
- data/spec/suite_frame_spec.rb +32 -0
- data/spec/suite_from_rdf_spec.rb +33 -0
- data/spec/suite_helper.rb +28 -109
- data/spec/suite_to_rdf_spec.rb +76 -0
- data/spec/to_rdf_spec.rb +6 -0
- metadata +15 -4
- data/spec/suite_spec.rb +0 -105
data/spec/suite_helper.rb
CHANGED
@@ -60,130 +60,49 @@ module RDF::Util
|
|
60
60
|
end
|
61
61
|
|
62
62
|
module Fixtures
|
63
|
-
module
|
63
|
+
module SuiteTest
|
64
64
|
SUITE = RDF::URI("http://json-ld.org/test-suite/")
|
65
|
-
class
|
66
|
-
|
65
|
+
class Manifest < JSON::LD::Resource
|
66
|
+
def self.open(file)
|
67
|
+
#puts "open: #{file}"
|
68
|
+
RDF::Util::File.open_file(file) do |f|
|
69
|
+
json = JSON.parse(f.read)
|
70
|
+
self.from_jsonld(json)
|
71
|
+
end
|
72
|
+
end
|
67
73
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
def entries
|
75
|
-
@entries ||= begin
|
76
|
-
repo = self.class.repository
|
77
|
-
RDF::List.new(sequence, repo).map do |entry|
|
78
|
-
results = repo.query(:subject => entry, :predicate => RDF.type)
|
79
|
-
entry_types = results.map(&:object)
|
74
|
+
# @param [Hash] json framed JSON-LD
|
75
|
+
# @return [Array<Manifest>]
|
76
|
+
def self.from_jsonld(json)
|
77
|
+
Manifest.new(json)
|
78
|
+
end
|
80
79
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
case
|
88
|
-
when entry_types.include?(Jld.Manifest) then entry.as(Manifest)
|
89
|
-
when entry_types.include?(Jld.CompactTest) then entry.as(CompactTest)
|
90
|
-
when entry_types.include?(Jld.ExpandTest) then entry.as(ExpandTest)
|
91
|
-
when entry_types.include?(Jld.FrameTest) then entry.as(FrameTest)
|
92
|
-
when entry_types.include?(Jld.NormalizeTest) then entry.as(NormalizeTest)
|
93
|
-
when entry_types.include?(Jld.ToRDFTest) then entry.as(ToRDFTest)
|
94
|
-
when entry_types.include?(Jld.FromRDFTest) then entry.as(FromRDFTest)
|
95
|
-
when entry_types.include?(Test.TestCase) then entry.as(Entry)
|
96
|
-
else raise "Unexpected entry type: #{entry_types.inspect}"
|
97
|
-
end
|
98
|
-
end
|
80
|
+
def entries
|
81
|
+
# Map entries to resources
|
82
|
+
attributes['sequence'].map do |e|
|
83
|
+
e.is_a?(String) ? Manifest.open("#{SUITE}#{e}") : Entry.new(e)
|
99
84
|
end
|
100
85
|
end
|
101
|
-
|
102
|
-
def inspect
|
103
|
-
"[#{self.class.to_s} " + %w(
|
104
|
-
subject
|
105
|
-
name
|
106
|
-
).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
|
107
|
-
", entries=#{entries.length}" +
|
108
|
-
"]"
|
109
|
-
end
|
110
86
|
end
|
111
87
|
|
112
|
-
class Entry
|
88
|
+
class Entry < JSON::LD::Resource
|
113
89
|
attr_accessor :debug
|
114
|
-
include Spira::Resource
|
115
|
-
type Test.TestCase
|
116
|
-
|
117
|
-
property :name, :predicate => RDF::DC.title, :type => XSD.string
|
118
|
-
property :purpose, :predicate => Test.purpose, :type => XSD.string
|
119
|
-
property :expected, :predicate => Test.expectedResults
|
120
|
-
property :inputDocument, :predicate => Test.informationResourceInput
|
121
|
-
property :resultDocument, :predicate => Test.informationResourceResults
|
122
|
-
property :extraDocument, :predicate => Test.input
|
123
|
-
|
124
|
-
def information; name; end
|
125
90
|
|
126
|
-
|
127
|
-
|
91
|
+
# Base is expanded input file
|
92
|
+
def base
|
93
|
+
"#{SUITE}tests/#{property('input')}"
|
128
94
|
end
|
129
95
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
def expect
|
135
|
-
RDF::Util::File.open_file(self.resultDocument)
|
96
|
+
# Alias input, context, expect and frame
|
97
|
+
%w(input context expect frame).each do |m|
|
98
|
+
define_method(m.to_sym) {RDF::Util::File.open_file "#{SUITE}tests/#{property(m)}"}
|
136
99
|
end
|
137
100
|
|
138
|
-
def
|
139
|
-
|
101
|
+
def positiveTest
|
102
|
+
property('positiveTest') == 'true'
|
140
103
|
end
|
141
104
|
|
142
|
-
def trace
|
143
|
-
@debug.to_a.join("\n")
|
144
|
-
end
|
145
|
-
|
146
|
-
def inspect
|
147
|
-
"[#{self.class.to_s} " + %w(
|
148
|
-
subject
|
149
|
-
name
|
150
|
-
inputDocument
|
151
|
-
resultDocument
|
152
|
-
extraDocument
|
153
|
-
).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
|
154
|
-
"]"
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
class CompactTest < Entry
|
159
|
-
type Jld.CompactTest
|
160
|
-
end
|
161
|
-
|
162
|
-
class ExpandTest < Entry
|
163
|
-
type Jld.ExpandTest
|
164
|
-
end
|
165
|
-
|
166
|
-
class FrameTest < Entry
|
167
|
-
type Jld.FameTest
|
168
|
-
end
|
169
|
-
|
170
|
-
class NormalizeTest < Entry
|
171
|
-
type Jld.NormalizeTest
|
172
|
-
end
|
173
|
-
|
174
|
-
class FromRDFTest < Entry
|
175
|
-
type Jld.FromRDFTest
|
176
|
-
end
|
177
|
-
|
178
|
-
class ToRDFTest < Entry
|
179
|
-
type Jld.ToRDFTest
|
180
|
-
|
181
|
-
def quads
|
182
|
-
RDF::Util::File.open_file(self.expected)
|
183
|
-
end
|
105
|
+
def trace; @debug.join("\n"); end
|
184
106
|
end
|
185
|
-
|
186
|
-
repo = RDF::Repository.load(SUITE.join("manifest.jsonld"), :format => :jsonld)
|
187
|
-
Spira.add_repository! :default, repo
|
188
107
|
end
|
189
108
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
$:.unshift "."
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe JSON::LD do
|
6
|
+
describe "test suite" do
|
7
|
+
require 'suite_helper'
|
8
|
+
m = Fixtures::SuiteTest::Manifest.open('http://json-ld.org/test-suite/tests/toRdf-manifest.jsonld')
|
9
|
+
describe m.name do
|
10
|
+
m.entries.each do |t|
|
11
|
+
specify "#{t.property('input')}: #{t.name}" do
|
12
|
+
begin
|
13
|
+
t.debug = ["test: #{t.inspect}", "source: #{t.input.read}"]
|
14
|
+
quads = []
|
15
|
+
JSON::LD::API.toRDF(t.input, nil, nil,
|
16
|
+
:base => t.base,
|
17
|
+
:debug => t.debug) do |statement|
|
18
|
+
quads << to_quad(statement)
|
19
|
+
end
|
20
|
+
|
21
|
+
sorted_expected = t.expect.readlines.sort.join("")
|
22
|
+
quads.sort.join("").should produce(sorted_expected, t.debug)
|
23
|
+
rescue JSON::LD::ProcessingError => e
|
24
|
+
fail("Processing error: #{e.message}")
|
25
|
+
rescue JSON::LD::InvalidContext => e
|
26
|
+
fail("Invalid Context: #{e.message}")
|
27
|
+
rescue JSON::LD::InvalidFrame => e
|
28
|
+
fail("Invalid Frame: #{e.message}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Don't use NQuads writer so that we don't escape Unicode
|
36
|
+
def to_quad(thing)
|
37
|
+
case thing
|
38
|
+
when RDF::URI
|
39
|
+
"<#{escaped(thing.to_s)}>"
|
40
|
+
when RDF::Node
|
41
|
+
escaped(thing.to_s)
|
42
|
+
when RDF::Literal::Double
|
43
|
+
case
|
44
|
+
when thing.object.nan?, thing.object.infinite?, thing.object.zero?
|
45
|
+
thing.canonicalize.to_ntriples
|
46
|
+
else
|
47
|
+
i, f, e = ('%.15E' % thing.object.to_f).split(/[\.E]/)
|
48
|
+
f.sub!(/0*$/, '') # remove any trailing zeroes
|
49
|
+
f = '0' if f.empty? # ...but there must be a digit to the right of the decimal point
|
50
|
+
e.sub!(/^\+?0+(\d)$/, '\1') # remove the optional leading '+' sign and any extra leading zeroes
|
51
|
+
%("#{i}.#{f}E#{e}"^^<http://www.w3.org/2001/XMLSchema#double>)
|
52
|
+
end
|
53
|
+
when RDF::Literal
|
54
|
+
quoted(escaped(thing.value)) +
|
55
|
+
(thing.datatype? ? "^^<#{thing.datatype}>" : "") +
|
56
|
+
(thing.language? ? "@#{thing.language}" : "")
|
57
|
+
when RDF::Statement
|
58
|
+
thing.to_quad.map {|r| to_quad(r)}.compact.join(" ") + " .\n"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# @param [String] string
|
64
|
+
# @return [String]
|
65
|
+
def quoted(string)
|
66
|
+
"\"#{string}\""
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# @param [String] string
|
71
|
+
# @return [String]
|
72
|
+
def escaped(string)
|
73
|
+
string.gsub('\\', '\\\\').gsub("\t", '\\t').
|
74
|
+
gsub("\n", '\\n').gsub("\r", '\\r').gsub('"', '\\"')
|
75
|
+
end
|
76
|
+
end unless ENV['CI']
|
data/spec/to_rdf_spec.rb
CHANGED
@@ -96,6 +96,12 @@ describe JSON::LD::API do
|
|
96
96
|
}),
|
97
97
|
%q([ a <http://example.com/foo>, <http://example.com/baz> ] .)
|
98
98
|
],
|
99
|
+
"blank node type" => [
|
100
|
+
%q({
|
101
|
+
"@type": "_:foo"
|
102
|
+
}),
|
103
|
+
%q([ a _:a ] .)
|
104
|
+
]
|
99
105
|
}.each do |title, (js, nt)|
|
100
106
|
it title do
|
101
107
|
parse(js).should be_equivalent_graph(nt, :trace => @debug, :inputDocument => js)
|
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.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdf
|
@@ -242,6 +242,7 @@ files:
|
|
242
242
|
- lib/json/ld/frame.rb
|
243
243
|
- lib/json/ld/from_rdf.rb
|
244
244
|
- lib/json/ld/reader.rb
|
245
|
+
- lib/json/ld/resource.rb
|
245
246
|
- lib/json/ld/to_rdf.rb
|
246
247
|
- lib/json/ld/utils.rb
|
247
248
|
- lib/json/ld/version.rb
|
@@ -257,9 +258,14 @@ files:
|
|
257
258
|
- spec/from_rdf_spec.rb
|
258
259
|
- spec/matchers.rb
|
259
260
|
- spec/reader_spec.rb
|
261
|
+
- spec/resource_spec.rb
|
260
262
|
- spec/spec_helper.rb
|
263
|
+
- spec/suite_compact_spec.rb
|
264
|
+
- spec/suite_expand_spec.rb
|
265
|
+
- spec/suite_frame_spec.rb
|
266
|
+
- spec/suite_from_rdf_spec.rb
|
261
267
|
- spec/suite_helper.rb
|
262
|
-
- spec/
|
268
|
+
- spec/suite_to_rdf_spec.rb
|
263
269
|
- spec/support/extensions.rb
|
264
270
|
- spec/to_rdf_spec.rb
|
265
271
|
- spec/writer_spec.rb
|
@@ -356,9 +362,14 @@ test_files:
|
|
356
362
|
- spec/from_rdf_spec.rb
|
357
363
|
- spec/matchers.rb
|
358
364
|
- spec/reader_spec.rb
|
365
|
+
- spec/resource_spec.rb
|
359
366
|
- spec/spec_helper.rb
|
367
|
+
- spec/suite_compact_spec.rb
|
368
|
+
- spec/suite_expand_spec.rb
|
369
|
+
- spec/suite_frame_spec.rb
|
370
|
+
- spec/suite_from_rdf_spec.rb
|
360
371
|
- spec/suite_helper.rb
|
361
|
-
- spec/
|
372
|
+
- spec/suite_to_rdf_spec.rb
|
362
373
|
- spec/support/extensions.rb
|
363
374
|
- spec/to_rdf_spec.rb
|
364
375
|
- spec/writer_spec.rb
|
data/spec/suite_spec.rb
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
$:.unshift "."
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe JSON::LD do
|
6
|
-
describe "test suite" do
|
7
|
-
require 'suite_helper'
|
8
|
-
|
9
|
-
if m = Fixtures::JSONLDTest::Manifest.each.to_a.first
|
10
|
-
describe m.name do
|
11
|
-
m.entries.each do |m2|
|
12
|
-
describe m2.name do
|
13
|
-
m2.entries.each do |t|
|
14
|
-
next if t.is_a?(Fixtures::JSONLDTest::NormalizeTest)
|
15
|
-
specify "#{File.basename(t.inputDocument.to_s)}: #{t.name}" do
|
16
|
-
begin
|
17
|
-
t.debug = ["test: #{t.inspect}", "source: #{t.input.read}"]
|
18
|
-
case t
|
19
|
-
when Fixtures::JSONLDTest::CompactTest
|
20
|
-
t.debug << "context: #{t.extra.read}" if t.extraDocument
|
21
|
-
result = JSON::LD::API.compact(t.input, t.extra, nil,
|
22
|
-
:base => t.base_uri,
|
23
|
-
:debug => t.debug)
|
24
|
-
expected = JSON.load(t.expect)
|
25
|
-
result.should produce(expected, t.debug)
|
26
|
-
when Fixtures::JSONLDTest::ExpandTest
|
27
|
-
t.debug << "context: #{t.extra.read}" if t.extraDocument
|
28
|
-
result = JSON::LD::API.expand(t.input, nil, nil,
|
29
|
-
:base => t.base_uri,
|
30
|
-
:debug => t.debug)
|
31
|
-
expected = JSON.load(t.expect)
|
32
|
-
result.should produce(expected, t.debug)
|
33
|
-
when Fixtures::JSONLDTest::FrameTest
|
34
|
-
t.debug << "frame: #{t.extra.read}" if t.extraDocument
|
35
|
-
result = JSON::LD::API.frame(t.input, t.extra, nil,
|
36
|
-
:base => t.inputDocument,
|
37
|
-
:debug => t.debug)
|
38
|
-
expected = JSON.load(t.expect)
|
39
|
-
result.should produce(expected, t.debug)
|
40
|
-
when Fixtures::JSONLDTest::FromRDFTest
|
41
|
-
repo = RDF::Repository.load(t.inputDocument)
|
42
|
-
result = JSON::LD::API.fromRDF(repo.each_statement.to_a, nil,
|
43
|
-
:debug => t.debug)
|
44
|
-
expected = JSON.load(t.expect)
|
45
|
-
result.should produce(expected, t.debug)
|
46
|
-
when Fixtures::JSONLDTest::ToRDFTest
|
47
|
-
quads = []
|
48
|
-
JSON::LD::API.toRDF(t.input, nil, nil,
|
49
|
-
:base => t.inputDocument,
|
50
|
-
:debug => t.debug) do |statement|
|
51
|
-
quads << to_quad(statement)
|
52
|
-
end
|
53
|
-
|
54
|
-
quads.sort.join("").should produce(t.expect.read, t.debug)
|
55
|
-
else
|
56
|
-
pending("unkown test type #{t.inspect}")
|
57
|
-
end
|
58
|
-
rescue JSON::LD::ProcessingError => e
|
59
|
-
fail("Processing error: #{e.message}")
|
60
|
-
rescue JSON::LD::InvalidContext => e
|
61
|
-
fail("Invalid Context: #{e.message}")
|
62
|
-
rescue JSON::LD::InvalidFrame => e
|
63
|
-
fail("Invalid Frame: #{e.message}")
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# Don't use NQuads writer so that we don't escape Unicode
|
74
|
-
def to_quad(thing)
|
75
|
-
case thing
|
76
|
-
when RDF::URI
|
77
|
-
"<#{escaped(thing.to_s)}>"
|
78
|
-
when RDF::Node
|
79
|
-
escaped(thing.to_s)
|
80
|
-
when RDF::Literal::Double
|
81
|
-
quoted("%1.15e" % thing.value) + "^^<#{RDF::XSD.double}>"
|
82
|
-
when RDF::Literal
|
83
|
-
quoted(escaped(thing.value)) +
|
84
|
-
(thing.datatype? ? "^^<#{thing.datatype}>" : "") +
|
85
|
-
(thing.language? ? "@#{thing.language}" : "")
|
86
|
-
when RDF::Statement
|
87
|
-
thing.to_quad.map {|r| to_quad(r)}.compact.join(" ") + " .\n"
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
##
|
92
|
-
# @param [String] string
|
93
|
-
# @return [String]
|
94
|
-
def quoted(string)
|
95
|
-
"\"#{string}\""
|
96
|
-
end
|
97
|
-
|
98
|
-
##
|
99
|
-
# @param [String] string
|
100
|
-
# @return [String]
|
101
|
-
def escaped(string)
|
102
|
-
string.gsub('\\', '\\\\').gsub("\t", '\\t').
|
103
|
-
gsub("\n", '\\n').gsub("\r", '\\r').gsub('"', '\\"')
|
104
|
-
end
|
105
|
-
end
|