json-ld 2.2.1 → 3.0.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.
- checksums.yaml +5 -5
- data/README.md +55 -55
- data/VERSION +1 -1
- data/lib/json/ld.rb +4 -2
- data/lib/json/ld/api.rb +49 -59
- data/lib/json/ld/compact.rb +60 -56
- data/lib/json/ld/context.rb +52 -40
- data/lib/json/ld/expand.rb +53 -61
- data/lib/json/ld/extensions.rb +31 -16
- data/lib/json/ld/flatten.rb +99 -90
- data/lib/json/ld/format.rb +2 -2
- data/lib/json/ld/frame.rb +47 -30
- data/lib/json/ld/from_rdf.rb +31 -23
- data/lib/json/ld/resource.rb +1 -1
- data/lib/json/ld/to_rdf.rb +4 -2
- data/lib/json/ld/utils.rb +25 -35
- data/lib/json/ld/writer.rb +25 -1
- data/spec/api_spec.rb +1 -0
- data/spec/compact_spec.rb +536 -31
- data/spec/context_spec.rb +109 -43
- data/spec/expand_spec.rb +413 -18
- data/spec/flatten_spec.rb +107 -27
- data/spec/frame_spec.rb +255 -34
- data/spec/from_rdf_spec.rb +102 -3
- data/spec/streaming_writer_spec.rb +8 -9
- data/spec/suite_compact_spec.rb +2 -2
- data/spec/suite_expand_spec.rb +2 -2
- data/spec/suite_flatten_spec.rb +2 -2
- data/spec/suite_frame_spec.rb +2 -2
- data/spec/suite_from_rdf_spec.rb +2 -3
- data/spec/suite_helper.rb +57 -61
- data/spec/suite_remote_doc_spec.rb +2 -2
- data/spec/suite_to_rdf_spec.rb +4 -4
- data/spec/to_rdf_spec.rb +88 -1
- data/spec/writer_spec.rb +5 -6
- metadata +5 -7
- data/spec/suite_error_spec.rb +0 -16
data/spec/from_rdf_spec.rb
CHANGED
@@ -272,6 +272,105 @@ describe JSON::LD::API do
|
|
272
272
|
}],
|
273
273
|
RDF::NQuads::Reader
|
274
274
|
],
|
275
|
+
"multiple graphs with shared BNode (at head)" => [
|
276
|
+
%q(
|
277
|
+
<http://www.example.com/z> <http://www.example.com/q> _:z0 <http://www.example.com/G> .
|
278
|
+
_:z0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "cell-A" <http://www.example.com/G> .
|
279
|
+
_:z0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:z1 <http://www.example.com/G> .
|
280
|
+
_:z1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "cell-B" <http://www.example.com/G> .
|
281
|
+
_:z1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://www.example.com/G> .
|
282
|
+
<http://www.example.com/z> <http://www.example.com/q> _:z0 <http://www.example.com/G1> .
|
283
|
+
),
|
284
|
+
[{
|
285
|
+
"@id" => "http://www.example.com/G",
|
286
|
+
"@graph" => [{
|
287
|
+
"@id" => "_:z0",
|
288
|
+
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first" => [{"@value" => "cell-A"}],
|
289
|
+
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest" => [{"@list" => [{ "@value" => "cell-B" }]}]
|
290
|
+
}, {
|
291
|
+
"@id" => "http://www.example.com/z",
|
292
|
+
"http://www.example.com/q" => [{"@id" => "_:z0"}]
|
293
|
+
}]
|
294
|
+
},
|
295
|
+
{
|
296
|
+
"@id" => "http://www.example.com/G1",
|
297
|
+
"@graph" => [{
|
298
|
+
"@id" => "http://www.example.com/z",
|
299
|
+
"http://www.example.com/q" => [{"@id" => "_:z0"}]
|
300
|
+
}]
|
301
|
+
}],
|
302
|
+
RDF::NQuads::Reader
|
303
|
+
],
|
304
|
+
"@list containing empty @list" => [
|
305
|
+
%(
|
306
|
+
<http://example.com/a> <http://example.com/property> (()) .
|
307
|
+
),
|
308
|
+
JSON.parse(%([{
|
309
|
+
"@id": "http://example.com/a",
|
310
|
+
"http://example.com/property": [{"@list": [{"@list": []}]}]
|
311
|
+
}])),
|
312
|
+
RDF::Turtle::Reader
|
313
|
+
],
|
314
|
+
"@list containing multiple lists" => [
|
315
|
+
%(
|
316
|
+
<http://example.com/a> <http://example.com/property> (("a") ("b")) .
|
317
|
+
),
|
318
|
+
JSON.parse(%([{
|
319
|
+
"@id": "http://example.com/a",
|
320
|
+
"http://example.com/property": [{"@list": [
|
321
|
+
{"@list": [{"@value": "a"}]},
|
322
|
+
{"@list": [{"@value": "b"}]}
|
323
|
+
]}]
|
324
|
+
}])),
|
325
|
+
RDF::Turtle::Reader
|
326
|
+
],
|
327
|
+
"0008a" => [
|
328
|
+
%(
|
329
|
+
<http://example.com> <http://example.com/property> _:outerlist .
|
330
|
+
_:outerlist <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:lista .
|
331
|
+
_:outerlist <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b0 .
|
332
|
+
|
333
|
+
_:lista <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a1" .
|
334
|
+
_:lista <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:a2 .
|
335
|
+
_:a2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a2" .
|
336
|
+
_:a2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:a3 .
|
337
|
+
_:a3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a3" .
|
338
|
+
_:a3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
339
|
+
|
340
|
+
_:c0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:c1 .
|
341
|
+
_:c0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
342
|
+
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c1" .
|
343
|
+
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c2 .
|
344
|
+
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c2" .
|
345
|
+
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c3 .
|
346
|
+
_:c3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c3" .
|
347
|
+
_:c3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
348
|
+
|
349
|
+
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b1 .
|
350
|
+
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c0 .
|
351
|
+
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b1" .
|
352
|
+
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 .
|
353
|
+
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b2" .
|
354
|
+
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 .
|
355
|
+
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b3" .
|
356
|
+
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
357
|
+
),
|
358
|
+
JSON.parse(%([
|
359
|
+
{
|
360
|
+
"@id": "http://example.com",
|
361
|
+
"http://example.com/property": [
|
362
|
+
{
|
363
|
+
"@list": [
|
364
|
+
{"@list": [{"@value": "a1"}, {"@value": "a2"}, {"@value": "a3"}]},
|
365
|
+
{"@list": [{"@value": "b1"}, {"@value": "b2"}, {"@value": "b3"}]},
|
366
|
+
{"@list": [{"@value": "c1"}, {"@value": "c2"}, {"@value": "c3"}]}
|
367
|
+
]
|
368
|
+
}
|
369
|
+
]
|
370
|
+
}
|
371
|
+
])),
|
372
|
+
RDF::NQuads::Reader
|
373
|
+
]
|
275
374
|
}.each do |name, (input, output, reader)|
|
276
375
|
it name do
|
277
376
|
r = serialize(input, reader: reader)
|
@@ -398,17 +497,17 @@ describe JSON::LD::API do
|
|
398
497
|
end
|
399
498
|
end
|
400
499
|
|
401
|
-
def parse(input, options
|
500
|
+
def parse(input, **options)
|
402
501
|
reader = options[:reader] || RDF::TriG::Reader
|
403
502
|
reader.new(input, options, &:each_statement).to_a.extend(RDF::Enumerable)
|
404
503
|
end
|
405
504
|
|
406
505
|
# Serialize ntstr to a string and compare against regexps
|
407
|
-
def serialize(ntstr, options
|
506
|
+
def serialize(ntstr, **options)
|
408
507
|
logger.info ntstr if ntstr.is_a?(String)
|
409
508
|
g = ntstr.is_a?(String) ? parse(ntstr, options) : ntstr
|
410
509
|
logger.info g.dump(:trig)
|
411
510
|
statements = g.each_statement.to_a
|
412
|
-
JSON::LD::API.fromRdf(statements,
|
511
|
+
JSON::LD::API.fromRdf(statements, logger: logger, **options)
|
413
512
|
end
|
414
513
|
end
|
@@ -50,10 +50,10 @@ describe JSON::LD::StreamingWriter do
|
|
50
50
|
)
|
51
51
|
obj = serialize(input)
|
52
52
|
expect(parse(obj.to_json, format: :jsonld)).to be_equivalent_graph(parse(input), logger: logger)
|
53
|
-
expect(obj).to contain_exactly
|
53
|
+
expect(obj).to contain_exactly(*JSON.parse(%{[
|
54
54
|
{"@id": "http://example.com/test-cases/0001", "@type": ["http://www.w3.org/2006/03/test-description#TestCase"]},
|
55
55
|
{"@id": "http://example.com/test-cases/0002", "@type": ["http://www.w3.org/2006/03/test-description#TestCase"]}
|
56
|
-
]})
|
56
|
+
]}))
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -91,7 +91,7 @@ describe JSON::LD::StreamingWriter do
|
|
91
91
|
context title do
|
92
92
|
subject {serialize(input)}
|
93
93
|
it "matches expected json" do
|
94
|
-
expect(subject).to contain_exactly
|
94
|
+
expect(subject).to contain_exactly(*JSON.parse(matches))
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
@@ -100,7 +100,7 @@ describe JSON::LD::StreamingWriter do
|
|
100
100
|
|
101
101
|
context "Writes fromRdf tests to isomorphic graph" do
|
102
102
|
require 'suite_helper'
|
103
|
-
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}
|
103
|
+
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}fromRdf-manifest.jsonld")
|
104
104
|
[nil, {}].each do |ctx|
|
105
105
|
context "with context #{ctx.inspect}" do
|
106
106
|
describe m.name do
|
@@ -109,7 +109,7 @@ describe JSON::LD::StreamingWriter do
|
|
109
109
|
t.logger = RDF::Spec.logger
|
110
110
|
t.logger.info "test: #{t.inspect}"
|
111
111
|
t.logger.info "source: #{t.input}"
|
112
|
-
specify "#{t.property('
|
112
|
+
specify "#{t.property('@id')}: #{t.name}" do
|
113
113
|
repo = RDF::Repository.load(t.input_loc, format: :nquads)
|
114
114
|
jsonld = JSON::LD::Writer.buffer(stream: true, context: ctx, logger: t.logger) do |writer|
|
115
115
|
writer << repo
|
@@ -125,18 +125,17 @@ describe JSON::LD::StreamingWriter do
|
|
125
125
|
end
|
126
126
|
end unless ENV['CI']
|
127
127
|
|
128
|
-
def parse(input,
|
129
|
-
format = options.fetch(:format, :trig)
|
128
|
+
def parse(input, format: :trig, **options)
|
130
129
|
reader = RDF::Reader.for(format)
|
131
130
|
RDF::Repository.new << reader.new(input, options)
|
132
131
|
end
|
133
132
|
|
134
133
|
# Serialize ntstr to a string and compare against regexps
|
135
|
-
def serialize(ntstr, options
|
134
|
+
def serialize(ntstr, **options)
|
136
135
|
g = ntstr.is_a?(String) ? parse(ntstr, options) : ntstr
|
137
136
|
logger = RDF::Spec.logger
|
138
137
|
logger.info(g.dump(:ttl))
|
139
|
-
result = JSON::LD::Writer.buffer(
|
138
|
+
result = JSON::LD::Writer.buffer(logger: logger, stream: true, **options) do |writer|
|
140
139
|
writer << g
|
141
140
|
end
|
142
141
|
puts result if $verbose
|
data/spec/suite_compact_spec.rb
CHANGED
@@ -4,10 +4,10 @@ require_relative 'spec_helper'
|
|
4
4
|
describe JSON::LD do
|
5
5
|
describe "test suite" do
|
6
6
|
require_relative 'suite_helper'
|
7
|
-
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}
|
7
|
+
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}compact-manifest.jsonld")
|
8
8
|
describe m.name do
|
9
9
|
m.entries.each do |t|
|
10
|
-
specify "#{t.property('
|
10
|
+
specify "#{t.property('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
11
11
|
t.run self
|
12
12
|
end
|
13
13
|
end
|
data/spec/suite_expand_spec.rb
CHANGED
@@ -4,10 +4,10 @@ require_relative 'spec_helper'
|
|
4
4
|
describe JSON::LD do
|
5
5
|
describe "test suite" do
|
6
6
|
require_relative 'suite_helper'
|
7
|
-
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}
|
7
|
+
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}expand-manifest.jsonld")
|
8
8
|
describe m.name do
|
9
9
|
m.entries.each do |t|
|
10
|
-
specify "#{t.property('
|
10
|
+
specify "#{t.property('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
11
11
|
t.run self
|
12
12
|
end
|
13
13
|
end
|
data/spec/suite_flatten_spec.rb
CHANGED
@@ -4,10 +4,10 @@ require_relative 'spec_helper'
|
|
4
4
|
describe JSON::LD do
|
5
5
|
describe "test suite" do
|
6
6
|
require_relative 'suite_helper'
|
7
|
-
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}
|
7
|
+
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}flatten-manifest.jsonld")
|
8
8
|
describe m.name do
|
9
9
|
m.entries.each do |t|
|
10
|
-
specify "#{t.property('
|
10
|
+
specify "#{t.property('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
11
11
|
pending "context corner-case" if t.input_loc.end_with?('flatten-0044-in.jsonld')
|
12
12
|
t.run self
|
13
13
|
end
|
data/spec/suite_frame_spec.rb
CHANGED
@@ -4,7 +4,7 @@ require_relative 'spec_helper'
|
|
4
4
|
describe JSON::LD do
|
5
5
|
describe "test suite" do
|
6
6
|
require_relative 'suite_helper'
|
7
|
-
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::
|
7
|
+
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::FRAME_SUITE}frame-manifest.jsonld")
|
8
8
|
describe m.name do
|
9
9
|
m.entries.each do |t|
|
10
10
|
specify "#{t.property('input')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
@@ -13,4 +13,4 @@ describe JSON::LD do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
|
-
end unless ENV['CI']
|
16
|
+
end unless ENV['CI'] || true
|
data/spec/suite_from_rdf_spec.rb
CHANGED
@@ -4,11 +4,10 @@ require_relative 'spec_helper'
|
|
4
4
|
describe JSON::LD do
|
5
5
|
describe "test suite" do
|
6
6
|
require_relative 'suite_helper'
|
7
|
-
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}
|
7
|
+
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}fromRdf-manifest.jsonld")
|
8
8
|
describe m.name do
|
9
9
|
m.entries.each do |t|
|
10
|
-
specify "#{t.property('
|
11
|
-
pending "Shared list BNode in different graphs" if t.property('input').include?("fromRdf-0021")
|
10
|
+
specify "#{t.property('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
12
11
|
t.run self
|
13
12
|
end
|
14
13
|
end
|
data/spec/suite_helper.rb
CHANGED
@@ -4,8 +4,11 @@ require_relative 'support/extensions'
|
|
4
4
|
# For now, override RDF::Utils::File.open_file to look for the file locally before attempting to retrieve it
|
5
5
|
module RDF::Util
|
6
6
|
module File
|
7
|
-
|
8
|
-
|
7
|
+
LOCAL_PATHS = {
|
8
|
+
"https://w3c.github.io/json-ld-api/tests/" => ::File.expand_path("../json-ld-api/tests", __FILE__) + '/',
|
9
|
+
"https://w3c.github.io/json-ld-framing/tests/" => ::File.expand_path("../json-ld-framing/tests", __FILE__) + '/',
|
10
|
+
"file:" => ""
|
11
|
+
}
|
9
12
|
|
10
13
|
class << self
|
11
14
|
alias_method :original_open_file, :open_file
|
@@ -20,32 +23,29 @@ module RDF::Util
|
|
20
23
|
# HTTP Request headers.
|
21
24
|
# @return [IO] File stream
|
22
25
|
# @yield [IO] File stream
|
23
|
-
def self.open_file(filename_or_url, options
|
24
|
-
|
25
|
-
|
26
|
-
path = filename_or_url[5..-1]
|
27
|
-
Kernel.open(path.to_s, options, &block)
|
28
|
-
when Dir.exist?(LOCAL_PATH) &&
|
29
|
-
!filename_or_url.to_s.include?('remote-doc') &&
|
30
|
-
filename_or_url.to_s =~ %r{^#{REMOTE_PATH}}
|
26
|
+
def self.open_file(filename_or_url, **options, &block)
|
27
|
+
LOCAL_PATHS.each do |r, l|
|
28
|
+
next unless Dir.exist?(l) && filename_or_url.start_with?(r)
|
31
29
|
#puts "attempt to open #{filename_or_url} locally"
|
32
|
-
localpath = filename_or_url.to_s.sub(
|
30
|
+
localpath = filename_or_url.to_s.sub(r, l)
|
33
31
|
response = begin
|
34
32
|
::File.open(localpath)
|
35
33
|
rescue Errno::ENOENT => e
|
36
34
|
raise IOError, e.message
|
37
35
|
end
|
36
|
+
|
38
37
|
document_options = {
|
39
38
|
base_uri: RDF::URI(filename_or_url),
|
40
39
|
charset: Encoding::UTF_8,
|
41
40
|
code: 200,
|
42
|
-
headers: {}
|
41
|
+
headers: options.fetch(:headers, {})
|
43
42
|
}
|
44
43
|
#puts "use #{filename_or_url} locally"
|
45
44
|
document_options[:headers][:content_type] = case filename_or_url.to_s
|
46
45
|
when /\.ttl$/ then 'text/turtle'
|
47
46
|
when /\.nt$/ then 'application/n-triples'
|
48
47
|
when /\.jsonld$/ then 'application/ld+json'
|
48
|
+
when /\.json$/ then 'application/json'
|
49
49
|
else 'unknown'
|
50
50
|
end
|
51
51
|
|
@@ -55,25 +55,26 @@ module RDF::Util
|
|
55
55
|
|
56
56
|
remote_document = RDF::Util::File::RemoteDocument.new(response.read, document_options)
|
57
57
|
if block_given?
|
58
|
-
yield remote_document
|
58
|
+
return yield remote_document
|
59
59
|
else
|
60
|
-
remote_document
|
60
|
+
return remote_document
|
61
61
|
end
|
62
|
-
else
|
63
|
-
original_open_file(filename_or_url, options, &block)
|
64
62
|
end
|
63
|
+
|
64
|
+
original_open_file(filename_or_url, options, &block)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
module Fixtures
|
70
70
|
module SuiteTest
|
71
|
-
SUITE = RDF::URI("https://json-ld
|
71
|
+
SUITE = RDF::URI("https://w3c.github.io/json-ld-api/tests/")
|
72
|
+
FRAME_SUITE = RDF::URI("https://w3c.github.io/json-ld-framing/tests/")
|
72
73
|
|
73
74
|
class Manifest < JSON::LD::Resource
|
74
75
|
def self.open(file)
|
75
|
-
|
76
|
-
json = JSON.parse(remote.
|
76
|
+
RDF::Util::File.open_file(file) do |remote|
|
77
|
+
json = JSON.parse(remote.read)
|
77
78
|
if block_given?
|
78
79
|
yield self.from_jsonld(json)
|
79
80
|
else
|
@@ -101,12 +102,13 @@ module Fixtures
|
|
101
102
|
|
102
103
|
# Base is expanded input file
|
103
104
|
def base
|
104
|
-
options.fetch('base', "#{SUITE}
|
105
|
+
options.fetch('base', "#{SUITE}#{property('input')}")
|
105
106
|
end
|
106
107
|
|
107
108
|
def options
|
108
109
|
@options ||= begin
|
109
110
|
opts = {documentLoader: Fixtures::SuiteTest.method(:documentLoader)}
|
111
|
+
opts = {}
|
110
112
|
{'specVersion' => "json-ld-1.1"}.merge(property('option') || {}).each do |k, v|
|
111
113
|
opts[k.to_sym] = v
|
112
114
|
end
|
@@ -119,13 +121,25 @@ module Fixtures
|
|
119
121
|
define_method(m.to_sym) do
|
120
122
|
return nil unless property(m)
|
121
123
|
res = nil
|
122
|
-
|
123
|
-
|
124
|
+
file = self.send("#{m}_loc".to_sym)
|
125
|
+
|
126
|
+
dl_opts = {safe: true}
|
127
|
+
RDF::Util::File.open_file(file, dl_opts) do |remote_doc|
|
128
|
+
res = remote_doc.read
|
124
129
|
end
|
125
130
|
res
|
126
131
|
end
|
127
132
|
|
128
|
-
define_method("#{m}_loc".to_sym)
|
133
|
+
define_method("#{m}_loc".to_sym) do
|
134
|
+
file = property(m)
|
135
|
+
|
136
|
+
# Handle redirection internally
|
137
|
+
if m == "input" && options[:redirectTo]
|
138
|
+
file = options[:redirectTo]
|
139
|
+
end
|
140
|
+
|
141
|
+
property(m) && "#{SUITE}#{file}"
|
142
|
+
end
|
129
143
|
|
130
144
|
define_method("#{m}_json".to_sym) do
|
131
145
|
JSON.parse(self.send(m)) if property(m)
|
@@ -149,16 +163,13 @@ module Fixtures
|
|
149
163
|
def run(rspec_example = nil)
|
150
164
|
logger = @logger = RDF::Spec.logger
|
151
165
|
logger.info "test: #{inspect}"
|
152
|
-
logger.info "
|
166
|
+
logger.info "purpose: #{purpose}"
|
167
|
+
logger.info "source: #{input rescue nil}"
|
153
168
|
logger.info "context: #{context}" if context_loc
|
154
169
|
logger.info "options: #{options.inspect}" unless options.empty?
|
155
170
|
logger.info "frame: #{frame}" if frame_loc
|
156
171
|
|
157
|
-
options =
|
158
|
-
self.options.merge(documentLoader: Fixtures::SuiteTest.method(:documentLoader))
|
159
|
-
else
|
160
|
-
self.options.dup
|
161
|
-
end
|
172
|
+
options = self.options.merge(documentLoader: Fixtures::SuiteTest.method(:documentLoader))
|
162
173
|
options = {validate: true}.merge(options)
|
163
174
|
|
164
175
|
unless options[:specVersion] == "json-ld-1.1"
|
@@ -171,25 +182,26 @@ module Fixtures
|
|
171
182
|
begin
|
172
183
|
result = case testType
|
173
184
|
when "jld:ExpandTest"
|
174
|
-
JSON::LD::API.expand(input_loc,
|
185
|
+
JSON::LD::API.expand(input_loc, logger: logger, **options)
|
175
186
|
when "jld:CompactTest"
|
176
|
-
JSON::LD::API.compact(input_loc, context_json['@context'],
|
187
|
+
JSON::LD::API.compact(input_loc, context_json['@context'], logger: logger, **options)
|
177
188
|
when "jld:FlattenTest"
|
178
|
-
JSON::LD::API.flatten(input_loc, context_loc,
|
189
|
+
JSON::LD::API.flatten(input_loc, (context_json['@context'] if context_loc), logger: logger, **options)
|
179
190
|
when "jld:FrameTest"
|
180
|
-
JSON::LD::API.frame(input_loc, frame_loc,
|
191
|
+
JSON::LD::API.frame(input_loc, frame_loc, logger: logger, **options)
|
181
192
|
when "jld:FromRDFTest"
|
182
193
|
# Use an array, to preserve input order
|
183
194
|
repo = RDF::NQuads::Reader.open(input_loc) do |reader|
|
184
195
|
reader.each_statement.to_a
|
185
|
-
end.extend(RDF::Enumerable)
|
196
|
+
end.uniq.extend(RDF::Enumerable)
|
186
197
|
logger.info "repo: #{repo.dump(id == '#t0012' ? :nquads : :trig)}"
|
187
|
-
JSON::LD::API.fromRdf(repo,
|
198
|
+
JSON::LD::API.fromRdf(repo, logger: logger, **options)
|
188
199
|
when "jld:ToRDFTest"
|
189
200
|
repo = RDF::Repository.new
|
190
|
-
JSON::LD::API.toRdf(input_loc,
|
201
|
+
JSON::LD::API.toRdf(input_loc, logger: logger, **options) do |statement|
|
191
202
|
repo << statement
|
192
203
|
end
|
204
|
+
logger.info "nq: #{repo.to_nquads}"
|
193
205
|
repo
|
194
206
|
else
|
195
207
|
fail("Unknown test type: #{testType}")
|
@@ -222,19 +234,19 @@ module Fixtures
|
|
222
234
|
expect do
|
223
235
|
case t.testType
|
224
236
|
when "jld:ExpandTest"
|
225
|
-
JSON::LD::API.expand(t.input_loc,
|
237
|
+
JSON::LD::API.expand(t.input_loc, logger: logger, **options)
|
226
238
|
when "jld:CompactTest"
|
227
|
-
JSON::LD::API.compact(t.input_loc, t.context_json['@context'],
|
239
|
+
JSON::LD::API.compact(t.input_loc, t.context_json['@context'], logger: logger, **options)
|
228
240
|
when "jld:FlattenTest"
|
229
|
-
JSON::LD::API.flatten(t.input_loc, t.context_loc,
|
241
|
+
JSON::LD::API.flatten(t.input_loc, t.context_loc, logger: logger, **options)
|
230
242
|
when "jld:FrameTest"
|
231
|
-
JSON::LD::API.frame(t.input_loc, t.frame_loc,
|
243
|
+
JSON::LD::API.frame(t.input_loc, t.frame_loc, logger: logger, **options)
|
232
244
|
when "jld:FromRDFTest"
|
233
245
|
repo = RDF::Repository.load(t.input_loc)
|
234
246
|
logger.info "repo: #{repo.dump(id == '#t0012' ? :nquads : :trig)}"
|
235
|
-
JSON::LD::API.fromRdf(repo,
|
247
|
+
JSON::LD::API.fromRdf(repo, logger: logger, **options)
|
236
248
|
when "jld:ToRDFTest"
|
237
|
-
JSON::LD::API.toRdf(t.input_loc,
|
249
|
+
JSON::LD::API.toRdf(t.input_loc, logger: logger, **options) {}
|
238
250
|
else
|
239
251
|
success("Unknown test type: #{testType}")
|
240
252
|
end
|
@@ -286,8 +298,6 @@ module Fixtures
|
|
286
298
|
end
|
287
299
|
end
|
288
300
|
|
289
|
-
REMOTE_PATH = "https://json-ld.org/test-suite/"
|
290
|
-
LOCAL_PATH = ::File.expand_path("../json-ld.org/test-suite", __FILE__) + '/'
|
291
301
|
##
|
292
302
|
# Document loader to use for tests having `useDocumentLoader` option
|
293
303
|
#
|
@@ -299,25 +309,11 @@ module Fixtures
|
|
299
309
|
# @yield remote_document
|
300
310
|
# @yieldparam [RemoteDocument] remote_document
|
301
311
|
# @raise [JsonLdError]
|
302
|
-
def documentLoader(url, options
|
303
|
-
remote_document = nil
|
312
|
+
def documentLoader(url, **options, &block)
|
304
313
|
options[:headers] ||= JSON::LD::API::OPEN_OPTS[:headers]
|
305
|
-
|
314
|
+
options[:headers][:link] = Array(options[:httpLink]).join(',') if options[:httpLink]
|
315
|
+
|
306
316
|
url = url.to_s[5..-1] if url.to_s.start_with?("file:")
|
307
|
-
|
308
|
-
if url.to_s.start_with?(REMOTE_PATH) && ::File.exist?(LOCAL_PATH) && url.to_s !~ /remote-doc/
|
309
|
-
#puts "attempt to open #{filename_or_url} locally"
|
310
|
-
local_filename = url.to_s.sub(REMOTE_PATH, LOCAL_PATH)
|
311
|
-
if ::File.exist?(local_filename)
|
312
|
-
remote_document = JSON::LD::API::RemoteDocument.new(url.to_s, ::File.read(local_filename))
|
313
|
-
return block_given? ? yield(remote_document) : remote_document
|
314
|
-
else
|
315
|
-
raise JSON::LD::JsonLdError::LoadingDocumentFailed, "no such file #{local_filename}"
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
# don't cache for these specs
|
320
|
-
options = options.merge(use_net_http: true) if url.to_s =~ /remote-doc/
|
321
317
|
JSON::LD::API.documentLoader(url, options, &block)
|
322
318
|
rescue JSON::LD::JsonLdError::LoadingDocumentFailed, JSON::LD::JsonLdError::MultipleContextLinkHeaders
|
323
319
|
raise unless options[:safe]
|