json-ld 0.1.6.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|