rdf-spec 1.1.5 → 1.1.13
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/CREDITS +1 -0
- data/README +1 -0
- data/VERSION +1 -1
- data/lib/rdf/spec/countable.rb +34 -11
- data/lib/rdf/spec/durable.rb +38 -20
- data/lib/rdf/spec/enumerable.rb +365 -345
- data/lib/rdf/spec/format.rb +58 -37
- data/lib/rdf/spec/http_adapter.rb +293 -0
- data/lib/rdf/spec/indexable.rb +36 -14
- data/lib/rdf/spec/inferable.rb +15 -2
- data/lib/rdf/spec/literal.rb +143 -0
- data/lib/rdf/spec/mutable.rb +36 -19
- data/lib/rdf/spec/queryable.rb +68 -33
- data/lib/rdf/spec/readable.rb +29 -6
- data/lib/rdf/spec/reader.rb +183 -157
- data/lib/rdf/spec/repository.rb +59 -38
- data/lib/rdf/spec/transaction.rb +92 -90
- data/lib/rdf/spec/writable.rb +109 -97
- data/lib/rdf/spec/writer.rb +153 -131
- metadata +22 -6
data/lib/rdf/spec/readable.rb
CHANGED
@@ -1,16 +1,39 @@
|
|
1
1
|
require 'rdf/spec'
|
2
2
|
|
3
|
+
RSpec.shared_examples 'an RDF::Readable' do
|
4
|
+
include RDF::Spec::Matchers
|
5
|
+
|
6
|
+
before do
|
7
|
+
raise 'readable must be defined in with let(:readable)' unless
|
8
|
+
defined? readable
|
9
|
+
end
|
10
|
+
|
11
|
+
describe RDF::Readable do
|
12
|
+
subject { readable }
|
13
|
+
it { is_expected.to respond_to :readable? }
|
14
|
+
it { is_expected.to respond_to :readable? }
|
15
|
+
its(:readable?) { is_expected.to eq subject.readable? }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# @deprecated use `it_behaves_like "an RDF::Readable"` instead
|
3
21
|
module RDF_Readable
|
4
22
|
extend RSpec::SharedContext
|
5
23
|
include RDF::Spec::Matchers
|
6
24
|
|
7
|
-
|
8
|
-
|
25
|
+
def self.included(mod)
|
26
|
+
warn "[DEPRECATION] `RDF_Readable` is deprecated. "\
|
27
|
+
"Please use `it_behaves_like 'an RDF::Readable'`"
|
9
28
|
end
|
10
29
|
|
11
|
-
describe
|
12
|
-
|
13
|
-
|
14
|
-
|
30
|
+
describe 'examples for' do
|
31
|
+
include_examples 'an RDF::Readable' do
|
32
|
+
let(:readable) { @readable }
|
33
|
+
|
34
|
+
before do
|
35
|
+
raise '@readable must be defined' unless defined?(readable)
|
36
|
+
end
|
37
|
+
end
|
15
38
|
end
|
16
39
|
end
|
data/lib/rdf/spec/reader.rb
CHANGED
@@ -1,208 +1,234 @@
|
|
1
1
|
require 'rdf/spec'
|
2
2
|
|
3
|
-
|
3
|
+
RSpec.shared_examples 'an RDF::Reader' do
|
4
4
|
extend RSpec::SharedContext
|
5
|
-
include RDF::Spec::Matchers
|
6
5
|
|
7
6
|
before(:each) do
|
8
|
-
raise '
|
9
|
-
raise '
|
10
|
-
raise '
|
11
|
-
@reader_class = @reader.class
|
7
|
+
raise 'reader must be defined with let(:reader)' unless defined? reader
|
8
|
+
raise 'reader_input must be defined with let(:reader_input)' unless defined? reader_input
|
9
|
+
raise 'reader_count must be defined with let(:reader_count)' unless defined? reader_count
|
12
10
|
end
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
let(:reader_class) { reader.class }
|
13
|
+
|
14
|
+
describe ".each" do
|
15
|
+
it "yields each reader" do
|
16
|
+
reader_class.each do |r|
|
17
|
+
expect(r).not_to be_nil
|
20
18
|
end
|
21
19
|
end
|
20
|
+
end
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
describe ".open" do
|
23
|
+
before(:each) do
|
24
|
+
allow(RDF::Util::File).to receive(:open_file).and_yield(StringIO.new(reader_input))
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
27
|
+
it "yields reader given file_name" do
|
28
|
+
reader_class.format.each do |f|
|
29
|
+
f.file_extensions.each_pair do |sym, content_type|
|
30
|
+
reader_mock = double("reader")
|
31
|
+
expect(reader_mock).to receive(:got_here)
|
32
|
+
expect(reader_class).to receive(:for).with(:file_name => "foo.#{sym}").and_return(reader_class)
|
33
|
+
reader_class.open("foo.#{sym}") do |r|
|
34
|
+
expect(r).to be_a(RDF::Reader)
|
35
|
+
reader_mock.got_here
|
38
36
|
end
|
39
37
|
end
|
40
38
|
end
|
39
|
+
end
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
it "yields reader given symbol" do
|
42
|
+
reader_class.format.each do |f|
|
43
|
+
sym = f.to_sym # Like RDF::NTriples::Format => :ntriples
|
44
|
+
reader_mock = double("reader")
|
45
|
+
expect(reader_mock).to receive(:got_here)
|
46
|
+
expect(reader_class).to receive(:for).with(sym).and_return(reader_class)
|
47
|
+
reader_class.open("foo.#{sym}", :format => sym) do |r|
|
48
|
+
expect(r).to be_a(RDF::Reader)
|
49
|
+
reader_mock.got_here
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it "yields reader given {:file_name => file_name}" do
|
55
|
+
reader_class.format.each do |f|
|
56
|
+
f.file_extensions.each_pair do |sym, content_type|
|
45
57
|
reader_mock = double("reader")
|
46
58
|
expect(reader_mock).to receive(:got_here)
|
47
|
-
expect(
|
48
|
-
|
59
|
+
expect(reader_class).to receive(:for).with(:file_name => "foo.#{sym}").and_return(reader_class)
|
60
|
+
reader_class.open("foo.#{sym}", :file_name => "foo.#{sym}") do |r|
|
49
61
|
expect(r).to be_a(RDF::Reader)
|
50
62
|
reader_mock.got_here
|
51
63
|
end
|
52
64
|
end
|
53
65
|
end
|
66
|
+
end
|
54
67
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
68
|
+
it "yields reader given {:content_type => 'a/b'}" do
|
69
|
+
reader_class.format.each do |f|
|
70
|
+
f.content_types.each_pair do |content_type, formats|
|
71
|
+
reader_mock = double("reader")
|
72
|
+
expect(reader_mock).to receive(:got_here)
|
73
|
+
expect(reader_class).to receive(:for).with(:content_type => content_type, :file_name => "foo").and_return(reader_class)
|
74
|
+
reader_class.open("foo", :content_type => content_type) do |r|
|
75
|
+
expect(r).to be_a(RDF::Reader)
|
76
|
+
reader_mock.got_here
|
65
77
|
end
|
66
78
|
end
|
67
79
|
end
|
80
|
+
end
|
81
|
+
end
|
68
82
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
expect(reader_mock).to receive(:got_here)
|
74
|
-
expect(@reader_class).to receive(:for).with(:content_type => content_type, :file_name => "foo").and_return(@reader_class)
|
75
|
-
@reader_class.open("foo", :content_type => content_type) do |r|
|
76
|
-
expect(r).to be_a(RDF::Reader)
|
77
|
-
reader_mock.got_here
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
83
|
+
describe ".format" do
|
84
|
+
it "returns itself even if given explicit format" do
|
85
|
+
other_format = reader_class == RDF::NTriples::Reader ? :nquads : :ntriples
|
86
|
+
expect(reader_class.for(other_format)).to eq reader_class
|
82
87
|
end
|
88
|
+
end
|
83
89
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
90
|
+
describe ".new" do
|
91
|
+
it "sets @input to StringIO given a string" do
|
92
|
+
reader_mock = double("reader")
|
93
|
+
expect(reader_mock).to receive(:got_here)
|
94
|
+
reader_class.new(reader_input) do |r|
|
95
|
+
reader_mock.got_here
|
96
|
+
expect(r.instance_variable_get(:@input)).to be_a(StringIO)
|
88
97
|
end
|
89
98
|
end
|
90
99
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
100
|
+
it "sets @input to input given something other than a string" do
|
101
|
+
reader_mock = double("reader")
|
102
|
+
expect(reader_mock).to receive(:got_here)
|
103
|
+
file = StringIO.new(reader_input)
|
104
|
+
reader_class.new(file) do |r|
|
105
|
+
reader_mock.got_here
|
106
|
+
expect(r.instance_variable_get(:@input)).to eq file
|
99
107
|
end
|
108
|
+
end
|
100
109
|
|
101
|
-
|
102
|
-
|
103
|
-
expect(
|
104
|
-
file = StringIO.new(@reader_input)
|
105
|
-
@reader_class.new(file) do |r|
|
106
|
-
reader_mock.got_here
|
107
|
-
expect(r.instance_variable_get(:@input)).to eq file
|
108
|
-
end
|
110
|
+
it "sets validate given :validate => true" do
|
111
|
+
reader_class.new(reader_input, :validate => true) do |r|
|
112
|
+
expect(r).to be_valid
|
109
113
|
end
|
114
|
+
end
|
110
115
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
it "sets canonicalize given :canonicalize => true" do
|
118
|
-
reader_mock = double("reader")
|
119
|
-
expect(reader_mock).to receive(:got_here)
|
120
|
-
@reader_class.new(@reader_input, :canonicalize => true) do |r|
|
121
|
-
reader_mock.got_here
|
122
|
-
expect(r).to be_canonicalize
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
it "sets intern given :intern => true" do
|
127
|
-
reader_mock = double("reader")
|
128
|
-
expect(reader_mock).to receive(:got_here)
|
129
|
-
@reader_class.new(@reader_input, :intern => true) do |r|
|
130
|
-
reader_mock.got_here
|
131
|
-
expect(r).to be_intern
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
it "sets prefixes given :prefixes => {}" do
|
136
|
-
reader_mock = double("reader")
|
137
|
-
expect(reader_mock).to receive(:got_here)
|
138
|
-
@reader_class.new(@reader_input, :prefixes => {:a => "b"}) do |r|
|
139
|
-
reader_mock.got_here
|
140
|
-
expect(r.prefixes).to eq({:a => "b"})
|
141
|
-
end
|
116
|
+
it "sets canonicalize given :canonicalize => true" do
|
117
|
+
reader_mock = double("reader")
|
118
|
+
expect(reader_mock).to receive(:got_here)
|
119
|
+
reader_class.new(reader_input, :canonicalize => true) do |r|
|
120
|
+
reader_mock.got_here
|
121
|
+
expect(r).to be_canonicalize
|
142
122
|
end
|
143
123
|
end
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
124
|
+
|
125
|
+
it "sets intern given :intern => true" do
|
126
|
+
reader_mock = double("reader")
|
127
|
+
expect(reader_mock).to receive(:got_here)
|
128
|
+
reader_class.new(reader_input, :intern => true) do |r|
|
129
|
+
reader_mock.got_here
|
130
|
+
expect(r).to be_intern
|
149
131
|
end
|
150
132
|
end
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
it "sets prefix(#{pfx}) to #{uri}" do
|
159
|
-
expect(@reader.prefix(pfx, uri)).to eq uri
|
160
|
-
expect(@reader.prefix(pfx)).to eq uri
|
161
|
-
end
|
133
|
+
|
134
|
+
it "sets prefixes given :prefixes => {}" do
|
135
|
+
reader_mock = double("reader")
|
136
|
+
expect(reader_mock).to receive(:got_here)
|
137
|
+
reader_class.new(reader_input, :prefixes => {:a => "b"}) do |r|
|
138
|
+
reader_mock.got_here
|
139
|
+
expect(r.prefixes).to eq({:a => "b"})
|
162
140
|
end
|
163
141
|
end
|
142
|
+
end
|
164
143
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
end
|
144
|
+
describe "#prefixes=" do
|
145
|
+
it "sets prefixes from hash" do
|
146
|
+
reader.prefixes = {:a => "b"}
|
147
|
+
expect(reader.prefixes).to eq({:a => "b"})
|
148
|
+
end
|
149
|
+
end
|
172
150
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
it "#
|
180
|
-
|
181
|
-
|
182
|
-
it "#enum_statement" do
|
183
|
-
@reader_class.new(@reader_input) {|r| expect(r.enum_statement.count).to eq @reader_count}
|
151
|
+
describe "#prefix" do
|
152
|
+
{
|
153
|
+
nil => "nil",
|
154
|
+
:a => "b",
|
155
|
+
"foo" => "bar",
|
156
|
+
}.each_pair do |pfx, uri|
|
157
|
+
it "sets prefix(#{pfx}) to #{uri}" do
|
158
|
+
expect(reader.prefix(pfx, uri)).to eq uri
|
159
|
+
expect(reader.prefix(pfx)).to eq uri
|
184
160
|
end
|
161
|
+
end
|
162
|
+
end
|
185
163
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
@reader_class.new(@reader_input) {|r| expect(r.enum_triple.count).to eq @reader_count}
|
194
|
-
end
|
164
|
+
context RDF::Enumerable do
|
165
|
+
it "#count" do
|
166
|
+
reader_class.new(reader_input) {|r| expect(r.count).to eq reader_count}
|
167
|
+
end
|
168
|
+
it "#empty?" do
|
169
|
+
reader_class.new(reader_input) {|r| expect(r).not_to be_empty}
|
170
|
+
end
|
195
171
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
172
|
+
it "#statements" do
|
173
|
+
reader_class.new(reader_input) {|r| expect(r.statements.count).to eq reader_count}
|
174
|
+
end
|
175
|
+
it "#has_statement?" do
|
176
|
+
reader_class.new(reader_input) {|r| expect(r).to respond_to(:has_statement?)}
|
177
|
+
end
|
178
|
+
it "#each_statement" do
|
179
|
+
reader_class.new(reader_input) {|r| expect(r.each_statement.count).to eq reader_count}
|
180
|
+
end
|
181
|
+
it "#enum_statement" do
|
182
|
+
reader_class.new(reader_input) {|r| expect(r.enum_statement.count).to eq reader_count}
|
183
|
+
end
|
205
184
|
|
185
|
+
it "#triples" do
|
186
|
+
reader_class.new(reader_input) {|r| expect(r.triples.count).to eq reader_count}
|
187
|
+
end
|
188
|
+
it "#each_triple" do
|
189
|
+
reader_class.new(reader_input) {|r| expect(r.each_triple.count).to eq reader_count}
|
190
|
+
end
|
191
|
+
it "#enum_triple" do
|
192
|
+
reader_class.new(reader_input) {|r| expect(r.enum_triple.count).to eq reader_count}
|
193
|
+
end
|
194
|
+
|
195
|
+
it "#quads" do
|
196
|
+
reader_class.new(reader_input) {|r| expect(r.quads.count).to eq reader_count}
|
197
|
+
end
|
198
|
+
it "#each_quad" do
|
199
|
+
reader_class.new(reader_input) {|r| expect(r.each_quad.count).to eq reader_count}
|
200
|
+
end
|
201
|
+
it "#enum_quad" do
|
202
|
+
reader_class.new(reader_input) {|r| expect(r.enum_quad.count).to eq reader_count}
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
##
|
209
|
+
# @deprecated use `it_behaves_like "an RDF::Reader"` instead
|
210
|
+
module RDF_Reader
|
211
|
+
extend RSpec::SharedContext
|
212
|
+
include RDF::Spec::Matchers
|
213
|
+
|
214
|
+
def self.included(mod)
|
215
|
+
warn "[DEPRECATION] `RDF_Reader` is deprecated. "\
|
216
|
+
"Please use `it_behaves_like 'an RDF::Reader'`"
|
217
|
+
end
|
218
|
+
|
219
|
+
describe 'examples for' do
|
220
|
+
include_examples 'an RDF::Reader' do
|
221
|
+
let(:reader) { @reader }
|
222
|
+
let(:reader_input) { @reader_input }
|
223
|
+
let(:reader_count) { @reader_count }
|
224
|
+
let(:reader_class) { @reader_class }
|
225
|
+
|
226
|
+
before do
|
227
|
+
raise '@reader must be defined' unless defined?(reader)
|
228
|
+
raise '@reader_input must be defined' unless defined?(reader_input)
|
229
|
+
raise '@reader_count must be defined' unless defined?(reader_count)
|
230
|
+
raise '@reader_class must be defined' unless defined?(reader_class)
|
231
|
+
end
|
206
232
|
end
|
207
233
|
end
|
208
234
|
end
|
data/lib/rdf/spec/repository.rb
CHANGED
@@ -1,59 +1,80 @@
|
|
1
1
|
require 'rdf/spec'
|
2
2
|
|
3
|
-
|
4
|
-
extend RSpec::SharedContext
|
3
|
+
RSpec.shared_examples 'an RDF::Repository' do
|
5
4
|
include RDF::Spec::Matchers
|
6
5
|
|
7
6
|
before :each do
|
8
|
-
raise '
|
7
|
+
raise 'repository must be set with `let(:repository)' unless
|
8
|
+
defined? repository
|
9
|
+
|
9
10
|
@statements = RDF::Spec.quads
|
10
|
-
if
|
11
|
-
|
12
|
-
elsif
|
11
|
+
if repository.empty? && repository.writable?
|
12
|
+
repository.insert(*@statements)
|
13
|
+
elsif repository.empty?
|
13
14
|
raise "+@repository+ must respond to #<< or be pre-populated with the statements in #{RDF::Spec::TRIPLES_FILE} in a before(:each) block"
|
14
15
|
end
|
15
|
-
@countable = @repository
|
16
|
-
@enumerable = @repository
|
17
|
-
@queryable = @repository
|
18
|
-
@mutable = @repository
|
19
16
|
end
|
20
17
|
|
21
|
-
|
18
|
+
let(:countable) { repository }
|
19
|
+
let(:enumerable) { repository }
|
20
|
+
let(:queryable) { repository }
|
21
|
+
let(:mutable) { repository }
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
context "when counting statements" do
|
24
|
+
require 'rdf/spec/countable'
|
25
|
+
it_behaves_like 'an RDF::Countable'
|
26
|
+
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
context "when enumerating statements" do
|
29
|
+
require 'rdf/spec/enumerable'
|
30
|
+
it_behaves_like 'an RDF::Enumerable'
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
context "when querying statements" do
|
34
|
+
require 'rdf/spec/queryable'
|
35
|
+
it_behaves_like 'an RDF::Queryable'
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
38
|
+
# FIXME: This should be condition on the repository being mutable
|
39
|
+
context "when updating" do
|
40
|
+
require 'rdf/spec/mutable'
|
41
|
+
|
42
|
+
before { mutable.clear }
|
43
|
+
|
44
|
+
it_behaves_like 'an RDF::Mutable'
|
45
|
+
end
|
46
|
+
|
47
|
+
# FIXME: This should be condition on the repository being mutable
|
48
|
+
context "as a durable repository" do
|
49
|
+
require 'rdf/spec/durable'
|
50
|
+
|
51
|
+
before :each do
|
52
|
+
repository.clear
|
53
|
+
@load_durable ||= lambda { repository }
|
45
54
|
end
|
46
55
|
|
47
|
-
|
48
|
-
|
49
|
-
|
56
|
+
it_behaves_like 'an RDF::Durable'
|
57
|
+
end
|
58
|
+
end
|
50
59
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
60
|
+
##
|
61
|
+
# @deprecated use `it_behaves_like "an RDF::Repository"` instead
|
62
|
+
module RDF_Repository
|
63
|
+
extend RSpec::SharedContext
|
64
|
+
include RDF::Spec::Matchers
|
65
|
+
|
66
|
+
def self.included(mod)
|
67
|
+
warn "[DEPRECATION] `RDF_Repository` is deprecated. "\
|
68
|
+
"Please use `it_behaves_like 'an RDF::Repository'`"
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'examples for' do
|
72
|
+
include_examples 'an RDF::Repository' do
|
73
|
+
let(:repository) { @repository }
|
55
74
|
|
56
|
-
|
75
|
+
before do
|
76
|
+
raise '@repository must be defined' unless defined?(repository)
|
77
|
+
end
|
57
78
|
end
|
58
79
|
end
|
59
80
|
end
|