rdf-spec 3.0.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -63,6 +63,24 @@ RSpec.shared_examples 'an RDF::HttpAdapter' do
63
63
  end
64
64
  end
65
65
 
66
+ it "adds User-Agent header using default" do
67
+ WebMock.stub_request(:get, uri).with do |request|
68
+ expect(request.headers['User-Agent']).to eq "Ruby RDF.rb/#{RDF::VERSION}"
69
+ end.to_return(body: "foo")
70
+ RDF::Util::File.open_file(uri) do |f|
71
+ opened.opened
72
+ end
73
+ end
74
+
75
+ it "used provided User-Agent header" do
76
+ WebMock.stub_request(:get, uri).with do |request|
77
+ expect(request.headers["User-Agent"]).to eq "Foo"
78
+ end.to_return(body: "foo")
79
+ RDF::Util::File.open_file(uri, headers: {"User-Agent" => "Foo"}) do |f|
80
+ opened.opened
81
+ end
82
+ end
83
+
66
84
  it "sets content_type and encoding to utf-8 if absent" do
67
85
  WebMock.stub_request(:get, uri).to_return(body: "foo", headers: {"Content-Type" => "text/turtle"})
68
86
  RDF::Util::File.open_file(uri) do |f|
@@ -3,7 +3,9 @@ require 'rdf'
3
3
 
4
4
  class RDF::Literal
5
5
  def inspect
6
- "\"#{escape(value)}\" R:L:(#{self.class.to_s.match(/([^:]*)$/)})"
6
+ klass = self.class.to_s.match(/([^:]*)$/).to_s
7
+ dt = self.datatype
8
+ "\"#{escape(value)}\"#{('@' + self.language.to_s) if self.language?} R:L:(#{klass == 'Literal' && dt ? dt : klass})"
7
9
  end
8
10
  end
9
11
 
@@ -31,38 +33,6 @@ class RDF::Query
31
33
  end
32
34
  end
33
35
 
34
- class Array
35
- alias_method :inspect_without_formatting, :inspect
36
- def inspect_with_formatting
37
- if all? { |item| item.is_a?(Hash) }
38
- string = "[\n"
39
- each do |item|
40
- string += " {\n"
41
- item.keys.sort_by(&:to_s).each do |key|
42
- string += " #{key.inspect}: #{item[key].inspect}\n"
43
- end
44
- string += " },\n"
45
- end
46
- string += "]"
47
- string
48
- elsif all? { |item| item.is_a?(RDF::Query::Solution)}
49
- string = "[\n"
50
- each do |item|
51
- string += " {\n"
52
- item.bindings.keys.sort_by(&:to_s).each do |key|
53
- string += " #{key.inspect}: #{item.bindings[key].inspect}\n"
54
- end
55
- string += " },\n"
56
- end
57
- string += "]"
58
- string
59
- else
60
- inspect_without_formatting
61
- end
62
- end
63
- alias_method :inspect, :inspect_with_formatting
64
- end
65
-
66
36
  class RDF::Query::Solutions
67
37
  def inspect
68
38
  string = "vars: #{variable_names.join(",")}\n#{to_a.inspect}"
@@ -5,6 +5,7 @@
5
5
  # include the examples for `RDF::Literal`, `RDF::Literal validation`,
6
6
  # `RDF::Literal canonicalization`, and `RDF::Literal lookup`.
7
7
 
8
+ # @private
8
9
  shared_examples 'RDF::Literal' do |value, datatype_uri|
9
10
  include_examples 'RDF::Literal with datatype and grammar', value, datatype_uri
10
11
  include_examples 'RDF::Literal equality', value, value
@@ -1,4 +1,5 @@
1
- require 'rspec/matchers' # @see http://rubygems.org/gems/rspec
1
+ require 'rspec/matchers' # @see https://rubygems.org/gems/rspec
2
+ require 'amazing_print'
2
3
 
3
4
  module RDF; module Spec
4
5
  ##
@@ -187,17 +188,17 @@ module RDF; module Spec
187
188
  RSpec::Matchers.define :write_each do |*messages|
188
189
  supports_block_expectations { true }
189
190
 
190
- match do |block|
191
+ match(notify_expectation_failures: true) do |block|
191
192
  messages.each { |message| expect(&block).to write(message) }
192
193
  end
193
194
  end
194
195
 
195
196
  RSpec::Matchers.define :write do |message|
196
- chain(:to) { |io| @io = io }
197
+ chain(:to) { |io| @rdf_matcher_iv_io = io }
197
198
 
198
199
  supports_block_expectations { true }
199
200
 
200
- match do |block|
201
+ match(notify_expectation_failures: true) do |block|
201
202
  @output =
202
203
  case io
203
204
  when :output then fake_stdout(&block)
@@ -256,7 +257,7 @@ module RDF; module Spec
256
257
 
257
258
  # default IO is standard output
258
259
  def io
259
- @io ||= :output
260
+ @rdf_matcher_iv_io ||= :output
260
261
  end
261
262
 
262
263
  # IO name is used for description message
@@ -265,30 +266,37 @@ module RDF; module Spec
265
266
  end
266
267
  end
267
268
 
268
- Info = Struct.new(:id, :logger, :action, :result)
269
+ Info = Struct.new(:id, :logger, :action, :result, :format, :base, :prefixes)
269
270
 
270
271
  RSpec::Matchers.define :be_equivalent_graph do |expected, info|
271
272
  match do |actual|
272
273
  @info = if (info.id rescue false)
273
274
  info
274
275
  elsif info.is_a?(Logger)
275
- Info.new("", info)
276
+ Info.new({logger: info})
276
277
  elsif info.is_a?(Hash)
277
- Info.new(info[:id], info[:logger], info[:action], info[:result])
278
+ Info.new(info[:id], info[:logger], info[:action], info[:result], info[:format], info[:base], info[:prefixes])
278
279
  else
279
280
  Info.new(info)
280
281
  end
282
+ @info.format ||= case
283
+ when RDF.const_defined?(:TriG) then :trig
284
+ when RDF.const_defined?(:Turtle) then :ttl
285
+ else :nquads
286
+ end
281
287
  @expected = normalize(expected)
282
288
  @actual = normalize(actual)
283
289
  @actual.isomorphic_with?(@expected) rescue false
284
290
  end
285
291
 
286
292
  failure_message do |actual|
287
- format = case
288
- when RDF.const_defined?(:TriG) then :trig
289
- when RDF.const_defined?(:Turtle) then :ttl
290
- else :nquads
291
- end
293
+ dump_opts = {
294
+ standard_prefixes: true,
295
+ literal_shorthand: false,
296
+ validate: false,
297
+ base_uri: @info.base,
298
+ prefixes: @info.prefixes
299
+ }
292
300
  info = @info.respond_to?(:information) ? @info.information : @info.inspect
293
301
  if @expected.is_a?(RDF::Enumerable) && @actual.size != @expected.size
294
302
  "Graph entry counts differ:\nexpected: #{@expected.size}\nactual: #{@actual.size}\n"
@@ -296,12 +304,19 @@ module RDF; module Spec
296
304
  "Graphs differ\n"
297
305
  end +
298
306
  "\n#{info + "\n" unless info.empty?}" +
299
- "Expected:\n#{@expected.dump(format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @expected.inspect}" +
300
- "Results:\n#{@actual.dump(format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @actual.inspect}" +
307
+ "Expected:\n#{@expected.dump(@info.format, **dump_opts) rescue @expected.inspect}" +
308
+ "Results:\n#{@actual.dump(@info.format, **dump_opts) rescue @actual.inspect}" +
301
309
  "\nDebug:\n#{@info.logger}"
302
310
  end
303
311
 
304
312
  failure_message_when_negated do |actual|
313
+ dump_opts = {
314
+ standard_prefixes: true,
315
+ literal_shorthand: false,
316
+ validate: false,
317
+ base: @info.base,
318
+ prefixes: @info.prefixes
319
+ }
305
320
  format = case
306
321
  when RDF.const_defined?(:TriG) then :trig
307
322
  when RDF.const_defined?(:Turtle) then :ttl
@@ -310,7 +325,7 @@ module RDF; module Spec
310
325
  info = @info.respond_to?(:information) ? @info.information : @info.inspect
311
326
  "Graphs identical\n" +
312
327
  "\n#{info + "\n" unless info.empty?}" +
313
- "Results:\n#{actual.dump(format, standard_prefixes: true, literal_shorthand: false, validate: false) rescue @actual.inspect}" +
328
+ "Results:\n#{actual.dump(@info.format, **dump_opts) rescue @actual.inspect}" +
314
329
  "\nDebug:\n#{@info.logger}"
315
330
  end
316
331
 
@@ -329,15 +344,6 @@ module RDF; module Spec
329
344
  end
330
345
  end
331
346
 
332
- require 'json'
333
- JSON_STATE = ::JSON::State.new(
334
- indent: " ",
335
- space: " ",
336
- space_before: "",
337
- object_nl: "\n",
338
- array_nl: "\n"
339
- )
340
-
341
347
  RSpec::Matchers.define :produce do |expected, info|
342
348
  match do |actual|
343
349
  @info = if (info.id rescue false)
@@ -355,8 +361,8 @@ module RDF; module Spec
355
361
  failure_message do |actual|
356
362
  info = @info.respond_to?(:information) ? @info.information : @info.inspect
357
363
 
358
- "Expected: #{expected.is_a?(String) ? expected : expected.to_json(JSON_STATE) rescue 'malformed json'}\n" +
359
- "Actual : #{actual.is_a?(String) ? actual : actual.to_json(JSON_STATE) rescue 'malformed json'}\n" +
364
+ "Expected: #{expected.ai}\n" +
365
+ "Actual : #{actual.ai}\n" +
360
366
  "\n#{info + "\n" unless info.empty?}" +
361
367
  "\nDebug:\n#{@info.logger}"
362
368
  end
@@ -365,7 +371,7 @@ module RDF; module Spec
365
371
  info = @info.respond_to?(:information) ? @info.information : @info.inspect
366
372
 
367
373
  "Expected not to produce the following:\n" +
368
- "Actual : #{actual.is_a?(String) ? actual : actual.to_json(JSON_STATE) rescue 'malformed json'}\n" +
374
+ "Actual : #{actual.ai}\n" +
369
375
  "\n#{info + "\n" unless info.empty?}" +
370
376
  "\nDebug:\n#{@info.logger}"
371
377
  end
@@ -9,14 +9,14 @@ RSpec.shared_examples 'an RDF::Mutable' do
9
9
  defined? mutable
10
10
 
11
11
  skip "Immutable resource" unless mutable.mutable?
12
- @statements = RDF::Spec.triples
12
+ @rdf_mutable_iv_statements = RDF::Spec.triples
13
13
  @supports_named_graphs = mutable.respond_to?(:supports?) && mutable.supports?(:graph_name)
14
14
  @supports_literal_equality = mutable.respond_to?(:supports?) && mutable.supports?(:literal_equality)
15
15
  end
16
16
 
17
- let(:resource) { RDF::URI('http://rubygems.org/gems/rdf') }
17
+ let(:resource) { RDF::URI('https://rubygems.org/gems/rdf') }
18
18
  let(:graph_name) { RDF::URI('http://example.org/graph_name') }
19
- let(:non_bnode_statements) {@statements.reject(&:node?)}
19
+ let(:non_bnode_statements) {@rdf_mutable_iv_statements.reject(&:node?)}
20
20
 
21
21
  describe RDF::Mutable do
22
22
  subject { mutable }
@@ -56,7 +56,7 @@ RSpec.shared_examples 'an RDF::Mutable' do
56
56
  end
57
57
 
58
58
  it "should accept an optional hash argument" do
59
- expect { subject.load(RDF::Spec::TRIPLES_FILE, {}) }.not_to raise_error
59
+ expect { subject.load(RDF::Spec::TRIPLES_FILE, **{}) }.not_to raise_error
60
60
  end
61
61
 
62
62
  it "should load statements" do
@@ -69,7 +69,7 @@ RSpec.shared_examples 'an RDF::Mutable' do
69
69
  if @supports_named_graphs
70
70
  subject.load RDF::Spec::TRIPLES_FILE, graph_name: graph_name
71
71
  is_expected.to have_graph(graph_name)
72
- expect(subject.query(graph_name: graph_name).size).to eq subject.size
72
+ expect(subject.query({graph_name: graph_name}).size).to eq subject.size
73
73
  end
74
74
  end
75
75
  end
@@ -139,7 +139,7 @@ RSpec.shared_examples 'an RDF::Mutable' do
139
139
 
140
140
  context "when deleting statements" do
141
141
  before :each do
142
- subject.insert(*@statements)
142
+ subject.insert(*@rdf_mutable_iv_statements)
143
143
  end
144
144
 
145
145
  it "should not raise errors" do
@@ -152,7 +152,7 @@ RSpec.shared_examples 'an RDF::Mutable' do
152
152
  end
153
153
 
154
154
  it "should support deleting multiple statements at a time" do
155
- subject.delete(*@statements)
155
+ subject.delete(*@rdf_mutable_iv_statements)
156
156
  expect(subject.find { |s| subject.has_statement?(s) }).to be_nil
157
157
  end
158
158
 
@@ -234,13 +234,13 @@ RSpec.shared_examples 'an RDF::Mutable' do
234
234
  end
235
235
 
236
236
  it 'deletes and inserts' do
237
- subject.delete_insert(@statements, [statement])
237
+ subject.delete_insert(@rdf_mutable_iv_statements, [statement])
238
238
  is_expected.to contain_exactly statement
239
239
  end
240
240
 
241
241
  it 'deletes before inserting' do
242
- subject.delete_insert(@statements, [@statements.first])
243
- is_expected.to contain_exactly @statements.first
242
+ subject.delete_insert(@rdf_mutable_iv_statements, [@rdf_mutable_iv_statements.first])
243
+ is_expected.to contain_exactly @rdf_mutable_iv_statements.first
244
244
  end
245
245
 
246
246
  it 'deletes patterns' do
@@ -276,7 +276,7 @@ RSpec.shared_examples 'an RDF::Mutable' do
276
276
  if subject.mutable? && subject.supports?(:atomic_write)
277
277
  contents = subject.statements.to_a
278
278
 
279
- expect { subject.delete_insert(@statements, [nil]) }
279
+ expect { subject.delete_insert(@rdf_mutable_iv_statements, [nil]) }
280
280
  .to raise_error ArgumentError
281
281
  expect(subject.statements).to contain_exactly(*contents)
282
282
  end
@@ -7,23 +7,23 @@ RSpec.shared_examples 'an RDF::Queryable' do
7
7
  raise 'querable must be set with `let(:queryable)' unless
8
8
  defined? queryable
9
9
 
10
- @doap = RDF::Spec::QUADS_FILE
11
- @statements = RDF::Spec.quads
10
+ @rdf_queryable_iv_doap = RDF::Spec::QUADS_FILE
11
+ @rdf_queryable_iv_statements = RDF::Spec.quads
12
12
 
13
13
  if queryable.empty?
14
14
  if (queryable.writable? rescue false)
15
- queryable.insert(*@statements)
15
+ queryable.insert(*@rdf_queryable_iv_statements)
16
16
  elsif queryable.respond_to?(:<<)
17
- @statements.each { |statement| queryable << statement }
17
+ @rdf_queryable_iv_statements.each { |statement| queryable << statement }
18
18
  else
19
- raise "queryable must respond to #<< or be pre-populated with the statements in #{@doap} in a before(:each) block"
19
+ raise "queryable must respond to #<< or be pre-populated with the statements in #{@rdf_queryable_iv_doap} in a before(:each) block"
20
20
  end
21
21
  end
22
22
  end
23
23
 
24
24
  describe RDF::Queryable do
25
25
  subject {queryable}
26
- let(:resource) {RDF::URI('http://rubygems.org/gems/rdf')}
26
+ let(:resource) {RDF::URI('https://rubygems.org/gems/rdf')}
27
27
  let(:literal) {RDF::Literal.new('J. Random Hacker')}
28
28
  let(:query) {RDF::Query.new {pattern [:s, :p, :o]}}
29
29
 
@@ -95,7 +95,7 @@ RSpec.shared_examples 'an RDF::Queryable' do
95
95
  pattern = RDF::Query::Pattern.new(nil, nil, nil, graph_name: nil)
96
96
  solutions = []
97
97
  subject.send(method, pattern) {|s| solutions << s}
98
- expect(solutions.size).to eq @statements.size
98
+ expect(solutions.size).to eq @rdf_queryable_iv_statements.size
99
99
  end
100
100
 
101
101
  it "returns statements from named graphs with variable graph_name" do
@@ -114,7 +114,7 @@ RSpec.shared_examples 'an RDF::Queryable' do
114
114
  pattern = RDF::Query::Pattern.new(nil, nil, nil, graph_name: RDF::URI("http://ar.to/#self"))
115
115
  solutions = []
116
116
  subject.send(method, pattern) {|s| solutions << s}
117
- expect(solutions.size).to eq File.readlines(@doap).grep(/^<http:\/\/ar.to\/\#self>/).size
117
+ expect(solutions.size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^<http:\/\/ar.to\/\#self>/).size
118
118
  end
119
119
  end
120
120
  end
@@ -233,22 +233,22 @@ RSpec.shared_examples 'an RDF::Queryable' do
233
233
  end
234
234
 
235
235
  it "returns the correct number of results for array queries" do
236
- expect(subject.query([nil, nil, nil]).size).to eq @statements.size
237
- expect(subject.query([resource, nil, nil]).size).to eq File.readlines(@doap).grep(/^<http:\/\/rubygems\.org\/gems\/rdf>/).size
238
- expect(subject.query([RDF::URI("http://ar.to/#self"), nil, nil]).size).to eq File.readlines(@doap).grep(/^<http:\/\/ar.to\/\#self>/).size
236
+ expect(subject.query([nil, nil, nil]).size).to eq @rdf_queryable_iv_statements.size
237
+ expect(subject.query([resource, nil, nil]).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^<https:\/\/rubygems\.org\/gems\/rdf>/).size
238
+ expect(subject.query([RDF::URI("http://ar.to/#self"), nil, nil]).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^<http:\/\/ar.to\/\#self>/).size
239
239
  expect(subject.query([resource, RDF::URI("http://usefulinc.com/ns/doap#name"), nil]).size).to eq 1
240
240
  expect(subject.query([nil, nil, RDF::URI("http://usefulinc.com/ns/doap#Project")]).size).to eq 1
241
241
  end
242
242
 
243
243
  it "returns the correct number of results for hash queries" do
244
- expect(subject.query({}).size).to eq @statements.size
245
- expect(subject.query(subject: resource).size).to eq File.readlines(@doap).grep(/^<http:\/\/rubygems\.org\/gems\/rdf>/).size
246
- expect(subject.query(subject: resource, predicate: RDF::URI("http://usefulinc.com/ns/doap#name")).size).to eq 1
247
- expect(subject.query(object: RDF::URI("http://usefulinc.com/ns/doap#Project")).size).to eq 1
244
+ expect(subject.query({}).size).to eq @rdf_queryable_iv_statements.size
245
+ expect(subject.query({subject: resource}).size).to eq File.readlines(@rdf_queryable_iv_doap).grep(/^<https:\/\/rubygems\.org\/gems\/rdf>/).size
246
+ expect(subject.query({subject: resource, predicate: RDF::URI("http://usefulinc.com/ns/doap#name")}).size).to eq 1
247
+ expect(subject.query({object: RDF::URI("http://usefulinc.com/ns/doap#Project")}).size).to eq 1
248
248
  end
249
249
 
250
250
  it "returns the correct number of results for query queries" do
251
- expect(subject.query(query).size).to eq @statements.size
251
+ expect(subject.query(query).size).to eq @rdf_queryable_iv_statements.size
252
252
  end
253
253
  end
254
254
  end
@@ -256,13 +256,13 @@ RSpec.shared_examples 'an RDF::Queryable' do
256
256
  context "with specific patterns from SPARQL" do
257
257
  context "triple pattern combinations" do
258
258
  it "?s p o" do
259
- expect(subject.query(predicate: RDF::URI("http://example.org/p"), object: RDF::Literal.new(1)).to_a).to(
259
+ expect(subject.query({predicate: RDF::URI("http://example.org/p"), object: RDF::Literal.new(1)}).to_a).to(
260
260
  include *[RDF::Statement.new(RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1), RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)]
261
261
  )
262
262
  end
263
263
 
264
264
  it "s ?p o" do
265
- expect(subject.query(subject: RDF::URI("http://example.org/xi2"), object: RDF::Literal.new(1)).to_a).to(
265
+ expect(subject.query({subject: RDF::URI("http://example.org/xi2"), object: RDF::Literal.new(1)}).to_a).to(
266
266
  include *[RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)]
267
267
  )
268
268
  end
@@ -272,8 +272,8 @@ RSpec.shared_examples 'an RDF::Queryable' do
272
272
  context "data/r2/expr-equals" do
273
273
  context "graph-1" do
274
274
  let(:result) do
275
- queryable.query(predicate: RDF::URI("http://example.org/p"),
276
- object: RDF::Literal::Integer.new(1)).to_a
275
+ queryable.query({predicate: RDF::URI("http://example.org/p"),
276
+ object: RDF::Literal::Integer.new(1)}).to_a
277
277
  end
278
278
 
279
279
  it 'has two solutions' do
@@ -293,8 +293,8 @@ RSpec.shared_examples 'an RDF::Queryable' do
293
293
 
294
294
  context "graph-2" do
295
295
  let(:result) do
296
- queryable.query(predicate: RDF::URI("http://example.org/p"),
297
- object: RDF::Literal::Double.new("1.0e0"))
296
+ queryable.query({predicate: RDF::URI("http://example.org/p"),
297
+ object: RDF::Literal::Double.new("1.0e0")})
298
298
  .to_a
299
299
  end
300
300
 
@@ -384,7 +384,7 @@ RSpec.shared_examples 'an RDF::Queryable' do
384
384
  end
385
385
 
386
386
  it "returns an appropriate value when the pattern matches" do
387
- matching_patterns = [[nil, nil, nil], [RDF::URI("http://rubygems.org/gems/rdf"), nil, nil]]
387
+ matching_patterns = [[nil, nil, nil], [RDF::URI("https://rubygems.org/gems/rdf"), nil, nil]]
388
388
  matching_patterns.each do |matching_pattern|
389
389
  matching_values = subject.query(matching_pattern).map(&:subject)
390
390
  expect(matching_values).to include subject.first_subject(matching_pattern)
@@ -207,7 +207,7 @@ RSpec.shared_examples 'an RDF::Reader' do
207
207
  expect(reader_mock).to receive(:got_here)
208
208
  reader_class.new(reader_input, prefixes: {a: "b"}) do |r|
209
209
  reader_mock.got_here
210
- expect(r.prefixes).to eq({a: "b"})
210
+ expect(r.prefixes).to include({a: "b"})
211
211
  end
212
212
  end
213
213
  end
@@ -7,9 +7,8 @@ RSpec.shared_examples 'an RDF::Repository' do
7
7
  raise 'repository must be set with `let(:repository)' unless
8
8
  defined? repository
9
9
 
10
- @statements = RDF::Spec.quads
11
10
  if repository.empty? && repository.writable?
12
- repository.insert(*@statements)
11
+ repository.insert(*RDF::Spec.quads)
13
12
  elsif repository.empty?
14
13
  raise "+@repository+ must respond to #<< or be pre-populated with the statements in #{RDF::Spec::TRIPLES_FILE} in a before(:each) block"
15
14
  end
@@ -3,7 +3,7 @@ require 'rdf/spec'
3
3
  RSpec.shared_examples 'an RDF::Transactable' do
4
4
  include RDF::Spec::Matchers
5
5
 
6
- let(:statements) { RDF::Spec.quads }
6
+ let(:statements) { @rdf_transactable_iv_statements = RDF::Spec.quads }
7
7
 
8
8
  before do
9
9
  raise '`transactable` must be set with `let(:transactable)`' unless
@@ -34,7 +34,7 @@ RSpec.shared_examples 'an RDF::Transactable' do
34
34
 
35
35
  expect do
36
36
  subject.transaction(mutable: true) do
37
- delete(*@statements)
37
+ delete(*statements)
38
38
  raise 'my error'
39
39
  end
40
40
  end.to raise_error RuntimeError
@@ -212,10 +212,10 @@ shared_examples "an RDF::Transaction" do |klass|
212
212
  with_name = st.dup
213
213
  with_name.graph_name = graph_uri
214
214
 
215
- expect do
215
+ expect do
216
216
  subject.insert(st)
217
217
  subject.execute
218
- end.to change { subject.repository }
218
+ end.to change { subject.repository.statements }
219
219
 
220
220
  expect(subject.repository).to have_statement(with_name)
221
221
  end
@@ -13,6 +13,27 @@ RSpec.shared_examples 'an RDF::Writer' do
13
13
  let(:reader_class) { writer_class.format.reader}
14
14
  let(:format_class) { writer_class.format }
15
15
 
16
+ let(:graph) do
17
+ @rdf_writer_iv_graph ||= begin
18
+ n1 = RDF::Node("a")
19
+ n2 = RDF::Node("a")
20
+ p = RDF::URI("http://example/pred")
21
+ s1 = RDF::Statement(n1, p, n1)
22
+ s2 = RDF::Statement(n2, p, n2)
23
+ s3 = RDF::Statement(n1, p, n2)
24
+ s4 = RDF::Statement(n2, p, n1)
25
+ RDF::Graph.new.insert(s1, s2, s3, s4)
26
+ end
27
+ end
28
+
29
+ let(:serialized) do
30
+ @rdf_writer_iv_serialized ||= begin
31
+ writer_class.buffer do |w|
32
+ w << graph
33
+ end
34
+ end
35
+ end
36
+
16
37
  describe ".each" do
17
38
  it "yields each writer" do
18
39
  writer_class.each do |r|
@@ -31,18 +52,6 @@ RSpec.shared_examples 'an RDF::Writer' do
31
52
 
32
53
  it "should serialize different BNodes sharing a common identifier to using different BNode ids" do
33
54
  if reader_class
34
- n1 = RDF::Node("a")
35
- n2 = RDF::Node("a")
36
- p = RDF::URI("http://example/pred")
37
- s1 = RDF::Statement(n1, p, n1)
38
- s2 = RDF::Statement(n2, p, n2)
39
- s3 = RDF::Statement(n1, p, n2)
40
- s4 = RDF::Statement(n2, p, n1)
41
- graph = RDF::Graph.new.insert(s1, s2, s3, s4)
42
- expect(graph.count).to eql 4
43
- serialized = writer_class.buffer do |w|
44
- w << graph
45
- end
46
55
  expect(serialized).not_to be_empty
47
56
  graph2 = RDF::Graph.new do |g|
48
57
  g << reader_class.new(serialized)
@@ -50,25 +59,43 @@ RSpec.shared_examples 'an RDF::Writer' do
50
59
  expect(graph2.count).to eql 4
51
60
  end
52
61
  end
62
+
63
+ it "returns a string" do
64
+ expect(serialized).to be_a(String)
65
+ end
66
+
67
+ it "should use encoding defined for format by default" do
68
+ writer_class.new do |w|
69
+ expect(serialized.encoding).to eql w.encoding
70
+ end
71
+ end
72
+
73
+ it "should use provided encoding if specified" do
74
+ str = writer_class.buffer(encoding: Encoding::ASCII_8BIT) do |w|
75
+ w << graph
76
+ end
77
+
78
+ expect(str.encoding).to eql Encoding::ASCII_8BIT
79
+ end
53
80
  end
54
81
 
55
82
  describe ".open" do
56
83
  before(:each) do
57
84
  allow(RDF::Util::File).to receive(:open_file).and_yield(StringIO.new("foo"))
58
- @dir = Dir.mktmpdir
59
- @basename = File.join(@dir, "foo")
85
+ @rdf_writer_iv_dir = Dir.mktmpdir
86
+ @rdf_writer_iv_basename = File.join(@rdf_writer_iv_dir, "foo")
60
87
  end
61
88
 
62
89
  after(:each) do
63
- FileUtils.rm_rf(@dir)
90
+ FileUtils.rm_rf(@rdf_writer_iv_dir)
64
91
  end
65
92
 
66
93
  it "yields writer given file_name" do
67
94
  format_class.file_extensions.each_pair do |sym, content_type|
68
95
  writer_mock = double("writer")
69
96
  expect(writer_mock).to receive(:got_here)
70
- expect(writer_class).to receive(:for).with(file_name: "#{@basename}.#{sym}").and_return(writer_class)
71
- writer_class.open("#{@basename}.#{sym}") do |r|
97
+ expect(writer_class).to receive(:for).with(file_name: "#{@rdf_writer_iv_basename}.#{sym}").and_return(writer_class)
98
+ writer_class.open("#{@rdf_writer_iv_basename}.#{sym}") do |r|
72
99
  expect(r).to be_a(RDF::Writer)
73
100
  writer_mock.got_here
74
101
  end
@@ -80,7 +107,7 @@ RSpec.shared_examples 'an RDF::Writer' do
80
107
  writer_mock = double("writer")
81
108
  expect(writer_mock).to receive(:got_here)
82
109
  expect(writer_class).to receive(:for).with(sym).and_return(writer_class)
83
- writer_class.open("#{@basename}.#{sym}", format: sym) do |r|
110
+ writer_class.open("#{@rdf_writer_iv_basename}.#{sym}", format: sym) do |r|
84
111
  expect(r).to be_a(RDF::Writer)
85
112
  writer_mock.got_here
86
113
  end
@@ -90,8 +117,8 @@ RSpec.shared_examples 'an RDF::Writer' do
90
117
  format_class.file_extensions.each_pair do |sym, content_type|
91
118
  writer_mock = double("writer")
92
119
  expect(writer_mock).to receive(:got_here)
93
- expect(writer_class).to receive(:for).with(file_name: "#{@basename}.#{sym}").and_return(writer_class)
94
- writer_class.open("#{@basename}.#{sym}", file_name: "#{@basename}.#{sym}") do |r|
120
+ expect(writer_class).to receive(:for).with(file_name: "#{@rdf_writer_iv_basename}.#{sym}").and_return(writer_class)
121
+ writer_class.open("#{@rdf_writer_iv_basename}.#{sym}", file_name: "#{@rdf_writer_iv_basename}.#{sym}") do |r|
95
122
  expect(r).to be_a(RDF::Writer)
96
123
  writer_mock.got_here
97
124
  end
@@ -102,8 +129,8 @@ RSpec.shared_examples 'an RDF::Writer' do
102
129
  format_class.content_types.each_pair do |content_type, formats|
103
130
  writer_mock = double("writer")
104
131
  expect(writer_mock).to receive(:got_here)
105
- expect(writer_class).to receive(:for).with(content_type: content_type, file_name: @basename).and_return(writer_class)
106
- writer_class.open(@basename, content_type: content_type) do |r|
132
+ expect(writer_class).to receive(:for).with(content_type: content_type, file_name: @rdf_writer_iv_basename).and_return(writer_class)
133
+ writer_class.open(@rdf_writer_iv_basename, content_type: content_type) do |r|
107
134
  expect(r).to be_a(RDF::Writer)
108
135
  writer_mock.got_here
109
136
  end
@@ -155,7 +182,7 @@ RSpec.shared_examples 'an RDF::Writer' do
155
182
  expect do
156
183
  writer_class.new(file, logger: false) do |w|
157
184
  w << RDF::Statement(
158
- RDF::URI("http://rubygems.org/gems/rdf"),
185
+ RDF::URI("https://rubygems.org/gems/rdf"),
159
186
  RDF::URI("http://purl.org/dc/terms/creator"),
160
187
  nil)
161
188
  end