json-ld 3.0.0 → 3.0.1
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 +4 -4
- data/VERSION +1 -1
- data/lib/json/ld/api.rb +28 -16
- data/lib/json/ld/compact.rb +10 -9
- data/lib/json/ld/context.rb +3 -3
- data/lib/json/ld/expand.rb +1 -1
- data/lib/json/ld/extensions.rb +6 -6
- data/lib/json/ld/flatten.rb +3 -1
- data/lib/json/ld/frame.rb +10 -8
- data/lib/json/ld/from_rdf.rb +5 -3
- data/lib/json/ld/reader.rb +1 -1
- data/lib/json/ld/writer.rb +25 -15
- data/spec/api_spec.rb +3 -3
- data/spec/compact_spec.rb +7 -2
- data/spec/expand_spec.rb +30 -4
- data/spec/flatten_spec.rb +1 -1
- data/spec/frame_spec.rb +73 -86
- data/spec/from_rdf_spec.rb +88 -77
- data/spec/matchers.rb +20 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/streaming_writer_spec.rb +1 -1
- data/spec/suite_compact_spec.rb +7 -1
- data/spec/suite_expand_spec.rb +7 -1
- data/spec/suite_flatten_spec.rb +7 -2
- data/spec/suite_frame_spec.rb +8 -2
- data/spec/suite_from_rdf_spec.rb +7 -1
- data/spec/suite_helper.rb +42 -12
- data/spec/suite_remote_doc_spec.rb +7 -1
- data/spec/support/extensions.rb +31 -1
- data/spec/writer_spec.rb +8 -8
- metadata +4 -2
data/spec/matchers.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rspec/matchers' # @see http://rubygems.org/gems/rspec
|
2
|
+
require_relative 'support/extensions'
|
3
|
+
|
4
|
+
RSpec::Matchers.define :produce_jsonld do |expected, logger|
|
5
|
+
match do |actual|
|
6
|
+
expect(actual).to be_equivalent_jsonld expected
|
7
|
+
end
|
8
|
+
|
9
|
+
failure_message do |actual|
|
10
|
+
"Expected: #{expected.is_a?(String) ? expected : expected.to_json(JSON_STATE) rescue 'malformed json'}\n" +
|
11
|
+
"Actual : #{actual.is_a?(String) ? actual : actual.to_json(JSON_STATE) rescue 'malformed json'}\n" +
|
12
|
+
"\nDebug:\n#{logger}"
|
13
|
+
end
|
14
|
+
|
15
|
+
failure_message_when_negated do |actual|
|
16
|
+
"Expected not to produce the following:\n" +
|
17
|
+
"Actual : #{actual.is_a?(String) ? actual : actual.to_json(JSON_STATE) rescue 'malformed json'}\n" +
|
18
|
+
"\nDebug:\n#{logger}"
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -17,7 +17,7 @@ describe JSON::LD::StreamingWriter do
|
|
17
17
|
input = %(<http://a/b> <http://a/c> <http://a/d> .)
|
18
18
|
obj = serialize(input)
|
19
19
|
expect(parse(obj.to_json, format: :jsonld)).to be_equivalent_graph(parse(input), logger: logger)
|
20
|
-
expect(obj).to
|
20
|
+
expect(obj).to produce_jsonld([{
|
21
21
|
'@id' => "http://a/b",
|
22
22
|
"http://a/c" => [{"@id" => "http://a/d"}]
|
23
23
|
}], logger)
|
data/spec/suite_compact_spec.rb
CHANGED
@@ -7,7 +7,13 @@ describe JSON::LD do
|
|
7
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('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
10
|
+
specify "#{t.property('@id')}: #{t.name} unordered#{' (negative test)' unless t.positiveTest?}" do
|
11
|
+
t.options[:ordered] = false
|
12
|
+
t.run self
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "#{t.property('@id')}: #{t.name} ordered#{' (negative test)' unless t.positiveTest?}" do
|
16
|
+
t.options[:ordered] = true
|
11
17
|
t.run self
|
12
18
|
end
|
13
19
|
end
|
data/spec/suite_expand_spec.rb
CHANGED
@@ -7,7 +7,13 @@ describe JSON::LD do
|
|
7
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('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
10
|
+
specify "#{t.property('@id')}: #{t.name} unordered#{' (negative test)' unless t.positiveTest?}" do
|
11
|
+
t.options[:ordered] = false
|
12
|
+
t.run self
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "#{t.property('@id')}: #{t.name} ordered#{' (negative test)' unless t.positiveTest?}" do
|
16
|
+
t.options[:ordered] = true
|
11
17
|
t.run self
|
12
18
|
end
|
13
19
|
end
|
data/spec/suite_flatten_spec.rb
CHANGED
@@ -7,8 +7,13 @@ describe JSON::LD do
|
|
7
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('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
11
|
-
|
10
|
+
specify "#{t.property('@id')}: #{t.name} unordered#{' (negative test)' unless t.positiveTest?}" do
|
11
|
+
t.options[:ordered] = false
|
12
|
+
t.run self
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "#{t.property('@id')}: #{t.name} ordered#{' (negative test)' unless t.positiveTest?}" do
|
16
|
+
t.options[:ordered] = true
|
12
17
|
t.run self
|
13
18
|
end
|
14
19
|
end
|
data/spec/suite_frame_spec.rb
CHANGED
@@ -7,10 +7,16 @@ describe JSON::LD do
|
|
7
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
|
-
specify "#{t.property('
|
10
|
+
specify "#{t.property('@id')}: #{t.name} unordered#{' (negative test)' unless t.positiveTest?}" do
|
11
|
+
t.options[:ordered] = false
|
12
|
+
t.run self
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "#{t.property('@id')}: #{t.name} ordered#{' (negative test)' unless t.positiveTest?}" do
|
16
|
+
t.options[:ordered] = true
|
11
17
|
t.run self
|
12
18
|
end
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
16
|
-
end unless ENV['CI']
|
22
|
+
end unless ENV['CI']
|
data/spec/suite_from_rdf_spec.rb
CHANGED
@@ -7,7 +7,13 @@ describe JSON::LD do
|
|
7
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('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
10
|
+
specify "#{t.property('@id')}: #{t.name} unordered#{' (negative test)' unless t.positiveTest?}" do
|
11
|
+
t.options[:ordered] = false
|
12
|
+
t.run self
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "#{t.property('@id')}: #{t.name} ordered#{' (negative test)' unless t.positiveTest?}" do
|
16
|
+
t.options[:ordered] = true
|
11
17
|
t.run self
|
12
18
|
end
|
13
19
|
end
|
data/spec/suite_helper.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'json/ld'
|
2
|
-
require_relative 'support/extensions'
|
3
2
|
|
4
3
|
# For now, override RDF::Utils::File.open_file to look for the file locally before attempting to retrieve it
|
5
4
|
module RDF::Util
|
@@ -72,37 +71,50 @@ module Fixtures
|
|
72
71
|
FRAME_SUITE = RDF::URI("https://w3c.github.io/json-ld-framing/tests/")
|
73
72
|
|
74
73
|
class Manifest < JSON::LD::Resource
|
74
|
+
attr_accessor :manifest_url
|
75
|
+
|
75
76
|
def self.open(file)
|
76
77
|
RDF::Util::File.open_file(file) do |remote|
|
77
78
|
json = JSON.parse(remote.read)
|
78
79
|
if block_given?
|
79
|
-
yield self.from_jsonld(json)
|
80
|
+
yield self.from_jsonld(json, manifest_url: RDF::URI(file))
|
80
81
|
else
|
81
|
-
self.from_jsonld(json)
|
82
|
+
self.from_jsonld(json, manifest_url: RDF::URI(file))
|
82
83
|
end
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
87
|
+
def initialize(json, manifest_url:)
|
88
|
+
@manifest_url = manifest_url
|
89
|
+
super
|
90
|
+
end
|
91
|
+
|
86
92
|
# @param [Hash] json framed JSON-LD
|
87
93
|
# @return [Array<Manifest>]
|
88
|
-
def self.from_jsonld(json)
|
89
|
-
Manifest.new(json)
|
94
|
+
def self.from_jsonld(json, manifest_url: )
|
95
|
+
Manifest.new(json, manifest_url: manifest_url)
|
90
96
|
end
|
91
97
|
|
92
98
|
def entries
|
93
99
|
# Map entries to resources
|
94
100
|
attributes['sequence'].map do |e|
|
95
|
-
e.is_a?(String) ? Manifest.open(
|
101
|
+
e.is_a?(String) ? Manifest.open(manifest_url.join(e).to_s) : Entry.new(e, manifest_url: manifest_url)
|
96
102
|
end
|
97
103
|
end
|
98
104
|
end
|
99
105
|
|
100
106
|
class Entry < JSON::LD::Resource
|
101
107
|
attr_accessor :logger
|
108
|
+
attr_accessor :manifest_url
|
109
|
+
|
110
|
+
def initialize(json, manifest_url:)
|
111
|
+
@manifest_url = manifest_url
|
112
|
+
super
|
113
|
+
end
|
102
114
|
|
103
115
|
# Base is expanded input file
|
104
116
|
def base
|
105
|
-
options.fetch('base',
|
117
|
+
options.fetch('base', manifest_url.join(property('input')).to_s)
|
106
118
|
end
|
107
119
|
|
108
120
|
def options
|
@@ -138,7 +150,7 @@ module Fixtures
|
|
138
150
|
file = options[:redirectTo]
|
139
151
|
end
|
140
152
|
|
141
|
-
property(m) &&
|
153
|
+
property(m) && manifest_url.join(file).to_s
|
142
154
|
end
|
143
155
|
|
144
156
|
define_method("#{m}_json".to_sym) do
|
@@ -155,7 +167,7 @@ module Fixtures
|
|
155
167
|
end
|
156
168
|
|
157
169
|
def positiveTest?
|
158
|
-
property('@type').include?('
|
170
|
+
property('@type').to_s.include?('Positive')
|
159
171
|
end
|
160
172
|
|
161
173
|
|
@@ -214,9 +226,27 @@ module Fixtures
|
|
214
226
|
}
|
215
227
|
else
|
216
228
|
expected = JSON.load(expect)
|
217
|
-
|
218
|
-
|
219
|
-
|
229
|
+
if options[:ordered]
|
230
|
+
# Compare without transformation
|
231
|
+
rspec_example.instance_eval {
|
232
|
+
expect(result).to produce(expected, logger)
|
233
|
+
}
|
234
|
+
else
|
235
|
+
# Without key ordering, reorder result and expected embedded array values and compare
|
236
|
+
# If results are compacted, expand both, reorder and re-compare
|
237
|
+
rspec_example.instance_eval {
|
238
|
+
expect(result).to produce_jsonld(expected, logger)
|
239
|
+
}
|
240
|
+
|
241
|
+
# If results are compacted, expand both, reorder and re-compare
|
242
|
+
if result.to_s.include?('@context')
|
243
|
+
exp_expected = JSON::LD::API.expand(expected, **options)
|
244
|
+
exp_result = JSON::LD::API.expand(result, **options)
|
245
|
+
rspec_example.instance_eval {
|
246
|
+
expect(exp_result).to produce_jsonld(exp_expected, logger)
|
247
|
+
}
|
248
|
+
end
|
249
|
+
end
|
220
250
|
end
|
221
251
|
else
|
222
252
|
rspec_example.instance_eval {
|
@@ -7,7 +7,13 @@ describe JSON::LD do
|
|
7
7
|
m = Fixtures::SuiteTest::Manifest.open("#{Fixtures::SuiteTest::SUITE}remote-doc-manifest.jsonld")
|
8
8
|
describe m.name do
|
9
9
|
m.entries.each do |t|
|
10
|
-
specify "#{t.property('@id')}: #{t.name}#{' (negative test)' unless t.positiveTest?}" do
|
10
|
+
specify "#{t.property('@id')}: #{t.name} unordered#{' (negative test)' unless t.positiveTest?}" do
|
11
|
+
t.options[:ordered] = false
|
12
|
+
t.run self
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "#{t.property('@id')}: #{t.name} ordered#{' (negative test)' unless t.positiveTest?}" do
|
16
|
+
t.options[:ordered] = true
|
11
17
|
t.run self
|
12
18
|
end
|
13
19
|
end
|
data/spec/support/extensions.rb
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
+
class Object
|
2
|
+
def equivalent_jsonld?(other, ordered: false)
|
3
|
+
self == other
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
1
7
|
class Hash
|
8
|
+
def equivalent_jsonld?(other, ordered: false)
|
9
|
+
return false unless other.is_a?(Hash) && other.length == length
|
10
|
+
all? do |key, value|
|
11
|
+
# List values are still ordered
|
12
|
+
value.equivalent_jsonld?(other[key], ordered: key == '@list')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
2
16
|
def diff(other)
|
3
17
|
self.keys.inject({}) do |memo, key|
|
4
18
|
unless self[key] == other[key]
|
@@ -7,4 +21,20 @@ class Hash
|
|
7
21
|
memo
|
8
22
|
end
|
9
23
|
end
|
10
|
-
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Array
|
27
|
+
def equivalent_jsonld?(other, ordered: false)
|
28
|
+
return false unless other.is_a?(Array) && other.length == length
|
29
|
+
if ordered
|
30
|
+
b = other.dup
|
31
|
+
# All elements must match in order
|
32
|
+
all? {|av| av.equivalent_jsonld?(b.shift)}
|
33
|
+
else
|
34
|
+
# Look for any element which matches
|
35
|
+
all? do |av|
|
36
|
+
other.any? {|bv| av.equivalent_jsonld?(bv)}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/spec/writer_spec.rb
CHANGED
@@ -29,7 +29,7 @@ describe JSON::LD::Writer do
|
|
29
29
|
context "simple tests" do
|
30
30
|
it "should use full URIs without base" do
|
31
31
|
input = %(<http://a/b> <http://a/c> <http://a/d> .)
|
32
|
-
expect(serialize(input)).to
|
32
|
+
expect(serialize(input)).to produce_jsonld([{
|
33
33
|
'@id' => "http://a/b",
|
34
34
|
"http://a/c" => [{"@id" => "http://a/d"}]
|
35
35
|
}], logger)
|
@@ -37,7 +37,7 @@ describe JSON::LD::Writer do
|
|
37
37
|
|
38
38
|
it "should use qname URIs with standard prefix" do
|
39
39
|
input = %(<http://xmlns.com/foaf/0.1/b> <http://xmlns.com/foaf/0.1/c> <http://xmlns.com/foaf/0.1/d> .)
|
40
|
-
expect(serialize(input, standard_prefixes: true)).to
|
40
|
+
expect(serialize(input, standard_prefixes: true)).to produce_jsonld({
|
41
41
|
'@context' => {
|
42
42
|
"foaf" => "http://xmlns.com/foaf/0.1/",
|
43
43
|
},
|
@@ -57,7 +57,7 @@ describe JSON::LD::Writer do
|
|
57
57
|
dc: "http://purl.org/dc/terms/",
|
58
58
|
frbr: "http://vocab.org/frbr/core#",
|
59
59
|
senet: "https://senet.org/ns#",
|
60
|
-
})).to
|
60
|
+
})).to produce_jsonld({
|
61
61
|
'@context' => {
|
62
62
|
"dc" => "http://purl.org/dc/terms/",
|
63
63
|
"frbr" => "http://vocab.org/frbr/core#",
|
@@ -75,7 +75,7 @@ describe JSON::LD::Writer do
|
|
75
75
|
input = %(<http://xmlns.com/foaf/0.1/b> <http://xmlns.com/foaf/0.1/c> <http://xmlns.com/foaf/0.1/d> .)
|
76
76
|
begin
|
77
77
|
expect(serialize(input, prefixes: { "" => RDF::Vocab::FOAF})).
|
78
|
-
to
|
78
|
+
to produce_jsonld({
|
79
79
|
"@context" => {
|
80
80
|
"" => "http://xmlns.com/foaf/0.1/"
|
81
81
|
},
|
@@ -92,7 +92,7 @@ describe JSON::LD::Writer do
|
|
92
92
|
it "should not use terms if no suffix" do
|
93
93
|
input = %(<http://xmlns.com/foaf/0.1/> <http://xmlns.com/foaf/0.1/> <http://xmlns.com/foaf/0.1/> .)
|
94
94
|
expect(serialize(input, standard_prefixes: true)).
|
95
|
-
not_to
|
95
|
+
not_to produce_jsonld({
|
96
96
|
"@context" => {"foaf" => "http://xmlns.com/foaf/0.1/"},
|
97
97
|
'@id' => "foaf",
|
98
98
|
"foaf" => {"@id" => "foaf"}
|
@@ -109,7 +109,7 @@ describe JSON::LD::Writer do
|
|
109
109
|
expect(serialize(input, prefixes: {
|
110
110
|
"db" => RDF::URI("http://dbpedia.org/resource/"),
|
111
111
|
"dbo" => RDF::URI("http://dbpedia.org/ontology/")})).
|
112
|
-
to
|
112
|
+
to produce_jsonld({
|
113
113
|
"@context" => {
|
114
114
|
"db" => "http://dbpedia.org/resource/",
|
115
115
|
"dbo" => "http://dbpedia.org/ontology/"
|
@@ -133,7 +133,7 @@ describe JSON::LD::Writer do
|
|
133
133
|
<http://example.com/test-cases/0002> a :TestCase .
|
134
134
|
)
|
135
135
|
expect(serialize(input, prefixes: {"" => "http://www.w3.org/2006/03/test-description#"})).
|
136
|
-
to
|
136
|
+
to produce_jsonld({
|
137
137
|
'@context' => {
|
138
138
|
"" => "http://www.w3.org/2006/03/test-description#",
|
139
139
|
"dc" => RDF::Vocab::DC.to_s
|
@@ -164,7 +164,7 @@ describe JSON::LD::Writer do
|
|
164
164
|
rdfs: "http://www.w3.org/2000/01/rdf-schema#",
|
165
165
|
xsd: "http://www.w3.org/2001/XMLSchema#"
|
166
166
|
})).
|
167
|
-
to
|
167
|
+
to produce_jsonld({
|
168
168
|
'@context' => {
|
169
169
|
"owl" => "http://www.w3.org/2002/07/owl#",
|
170
170
|
"rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-ld
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregg Kellogg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdf
|
@@ -286,6 +286,7 @@ files:
|
|
286
286
|
- spec/format_spec.rb
|
287
287
|
- spec/frame_spec.rb
|
288
288
|
- spec/from_rdf_spec.rb
|
289
|
+
- spec/matchers.rb
|
289
290
|
- spec/reader_spec.rb
|
290
291
|
- spec/resource_spec.rb
|
291
292
|
- spec/spec_helper.rb
|
@@ -376,6 +377,7 @@ specification_version: 4
|
|
376
377
|
summary: JSON-LD reader/writer for Ruby.
|
377
378
|
test_files:
|
378
379
|
- spec/spec_helper.rb
|
380
|
+
- spec/matchers.rb
|
379
381
|
- spec/api_spec.rb
|
380
382
|
- spec/suite_from_rdf_spec.rb
|
381
383
|
- spec/context_spec.rb
|