rdf-spec 1.1.13 → 1.99.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.
@@ -17,17 +17,17 @@ RSpec.shared_examples 'an RDF::Format' do
17
17
  end
18
18
 
19
19
  it "detects #{formats.first} using file_name foo.#{ext}" do
20
- expect(RDF::Format.for(:file_name => "foo.#{ext}")).to eq formats.first
20
+ expect(RDF::Format.for(file_name: "foo.#{ext}")).to eq formats.first
21
21
  end
22
22
 
23
23
  it "detects #{formats.first} using file_extension #{ext}" do
24
- expect(RDF::Format.for(:file_extension => ext)).to eq formats.first
24
+ expect(RDF::Format.for(file_extension: ext)).to eq formats.first
25
25
  end
26
26
  end
27
27
 
28
28
  RDF::Format.content_types.each do |content_type, formats|
29
29
  it "detects #{formats.first} using content_type #{content_type}" do
30
- expect(RDF::Format.for(:content_type => content_type)).to eq formats.first
30
+ expect(RDF::Format.for(content_type: content_type)).to eq formats.first
31
31
  end
32
32
  end
33
33
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  require 'rdf/spec'
2
3
  require 'webmock/rspec'
3
4
 
@@ -64,19 +65,28 @@ RSpec.shared_examples 'an RDF::HttpAdapter' do
64
65
  WebMock.stub_request(:get, uri).to_return(body: "foo", headers: {"Content-Type" => "text/turtle"})
65
66
  RDF::Util::File.open_file(uri) do |f|
66
67
  expect(f.content_type).to eq "text/turtle"
67
- expect(f.charset).to eq Encoding::UTF_8
68
- expect(f.content_encoding).to eq "utf-8"
68
+ expect(f.charset).to eq "utf-8"
69
69
  expect(f.external_encoding.to_s.downcase).to eq "utf-8"
70
70
  opened.opened
71
71
  end
72
72
  end
73
73
 
74
- it "sets content_type and encoding if provided" do
75
- WebMock.stub_request(:get, uri).to_return(body: "foo", headers: {"Content-Type" => "text/turtle ; charset=ISO-8859-4"})
74
+ it "sets content_type and encoding if provided and UTF" do
75
+ WebMock.stub_request(:get, uri).to_return(body: "foo".force_encoding("UTF-16"), headers: {"Content-Type" => "text/turtle ; charset=UTF-16"})
76
76
  RDF::Util::File.open_file(uri) do |f|
77
77
  expect(f.content_type).to eq "text/turtle"
78
- expect(f.charset).to eq "ISO-8859-4"
79
- expect(f.external_encoding.to_s.downcase).to eq "iso-8859-4"
78
+ expect(f.charset).to eq "utf-16"
79
+ expect(f.external_encoding.to_s.downcase).to eq "utf-16"
80
+ opened.opened
81
+ end
82
+ end
83
+
84
+ it "sets content_type and encoding to UTF-8 if provided and not UTF" do
85
+ WebMock.stub_request(:get, uri).to_return(body: "foo".force_encoding("ISO-8859-4"), headers: {"Content-Type" => "text/turtle ; charset=ISO-8859-4"})
86
+ RDF::Util::File.open_file(uri) do |f|
87
+ expect(f.content_type).to eq "text/turtle"
88
+ expect(f.charset).to eq "iso-8859-4"
89
+ expect(f.external_encoding.to_s.downcase).to eq "utf-8"
80
90
  opened.opened
81
91
  end
82
92
  end
@@ -162,6 +172,18 @@ RSpec.shared_examples 'an RDF::HttpAdapter' do
162
172
  end
163
173
  end
164
174
 
175
+ it "follows 302 to a relative location" do
176
+ rel = "../etc/doap.ttl"
177
+
178
+ WebMock.stub_request(:get, uri).to_return({status: 302, headers: {"Location" => rel}})
179
+ WebMock.stub_request(:get, RDF::URI(uri).join(rel).to_s).to_return({body: "foo"})
180
+ RDF::Util::File.open_file(uri) do |f|
181
+ expect(f.base_uri).to eq RDF::URI(uri).join(rel).to_s
182
+ expect(f.read).to eq "foo"
183
+ opened.opened
184
+ end
185
+ end
186
+
165
187
  it "raises an IOError for HTTP 4xx status codes" do
166
188
  opened.opened
167
189
 
@@ -10,18 +10,16 @@ RSpec.shared_examples 'an RDF::Indexable' do
10
10
 
11
11
  subject { indexable }
12
12
 
13
- it {should respond_to(:indexed?)}
14
- its(:indexed?) {should == subject.indexed?}
15
- it {should respond_to(:index!)}
13
+ it {is_expected.to respond_to(:indexed?)}
14
+ it {is_expected.to respond_to(:index!)}
16
15
 
17
- it "does not raise error on #index! if #indexed?" do
18
- expect {subject.index!}.not_to raise_error if subject.indexed?
16
+ it "returns boolean for #indexed?" do
17
+ expect(subject.indexed?).to satisfy {|x| x.is_a?(TrueClass) || x.is_a?(FalseClass)}
19
18
  end
20
19
 
21
- it "raises error on #index! if not #indexed?" do
22
- expect {subject.index!}.to raise_error unless subject.indexed?
20
+ it "returns self on #index!" do
21
+ expect(subject.index!).to be
23
22
  end
24
-
25
23
  end
26
24
 
27
25
  ##
@@ -3,7 +3,7 @@ require 'rdf/spec'
3
3
  RSpec.shared_examples 'an RDF::Inferable' do
4
4
  include RDF::Spec::Matchers
5
5
 
6
- it "should implement specs" #TODO
6
+ it "is_expected.to implement specs" #TODO
7
7
  end
8
8
 
9
9
  ##
@@ -0,0 +1,71 @@
1
+ require 'rdf'
2
+ require 'rdf/ntriples'
3
+ # override several inspect functions to improve output for what we're doing
4
+
5
+ class RDF::Literal
6
+ def inspect
7
+ RDF::NTriples::Writer.serialize(self) + " R:L:(#{self.class.to_s.match(/([^:]*)$/)})"
8
+ end
9
+ end
10
+
11
+ class RDF::URI
12
+ def inspect
13
+ RDF::NTriples::Writer.serialize(self)
14
+ end
15
+ end
16
+
17
+ class RDF::Node
18
+ def inspect
19
+ RDF::NTriples::Writer.serialize(self) + "(#{object_id})"
20
+ end
21
+ end
22
+
23
+ class RDF::Graph
24
+ def inspect
25
+ "\n" + dump(RDF.const_defined?(:Turtle) ? :ttl : :ntriples, standard_prefixes: true) + "\n"
26
+ end
27
+ end
28
+
29
+ class RDF::Query
30
+ def inspect
31
+ "RDF::Query(#{graph_name ? graph_name.to_sxp : 'nil'})#{patterns.inspect}"
32
+ end
33
+ end
34
+
35
+ class Array
36
+ alias_method :inspect_without_formatting, :inspect
37
+ def inspect_with_formatting
38
+ if all? { |item| item.is_a?(Hash) }
39
+ string = "[\n"
40
+ each do |item|
41
+ string += " {\n"
42
+ item.keys.map(&:to_s).sort.each do |key|
43
+ string += " #{key}: #{item[key.to_sym].inspect}\n"
44
+ end
45
+ string += " },\n"
46
+ end
47
+ string += "]"
48
+ string
49
+ elsif all? { |item| item.is_a?(RDF::Query::Solution)}
50
+ string = "[\n"
51
+ each do |item|
52
+ string += " {\n"
53
+ item.bindings.keys.map(&:to_s).sort.each do |key|
54
+ string += " #{key}: #{item.bindings[key.to_sym].inspect}\n"
55
+ end
56
+ string += " },\n"
57
+ end
58
+ string += "]"
59
+ string
60
+ else
61
+ inspect_without_formatting
62
+ end
63
+ end
64
+ alias_method :inspect, :inspect_with_formatting
65
+ end
66
+
67
+ class RDF::Query::Solutions
68
+ def inspect
69
+ string = "vars: #{variable_names.join(",")}\n#{to_a.inspect}"
70
+ end
71
+ end
@@ -7,7 +7,7 @@
7
7
 
8
8
  shared_examples 'RDF::Literal' do |value, datatype_uri|
9
9
  include_examples 'RDF::Literal with datatype and grammar', value, datatype_uri
10
- include_examples 'RDF::Literal equality', value
10
+ include_examples 'RDF::Literal equality', value, value
11
11
  include_examples 'RDF::Literal lexical values', value
12
12
  end
13
13
 
@@ -69,13 +69,14 @@ end
69
69
  shared_examples 'RDF::Literal lookup' do |uri_hash|
70
70
  uri_hash.each do |uri, klass|
71
71
  it "finds #{klass} for #{uri}" do
72
- expect(RDF::Literal("0", :datatype => uri).class).to eq klass
72
+ expect(RDF::Literal("0", datatype: uri).class).to eq klass
73
73
  end
74
74
  end
75
75
  end
76
76
 
77
77
  shared_examples 'RDF::Literal canonicalization' do |datatype, pairs|
78
- pairs.each do |value, str|
78
+ pairs.each do |value, str, human = nil|
79
+ human ||= value
79
80
  klass = RDF::Literal.datatyped_class(datatype.to_s)
80
81
 
81
82
  it "does not normalize '#{value}' by default" do
@@ -85,18 +86,18 @@ shared_examples 'RDF::Literal canonicalization' do |datatype, pairs|
85
86
  .to eq value
86
87
  end
87
88
 
88
- it "normalizes double '#{value}' to '#{str}'" do
89
+ it "normalizes '#{value}' to '#{str}'" do
89
90
  expect(RDF::Literal.new(value,
90
91
  datatype: datatype,
91
92
  canonicalize: true).to_s)
92
93
  .to eq str
93
94
  end
94
95
 
95
- it "humanizes double '#{value}' to '#{str}'" do
96
+ it "humanizes '#{value}' to '#{str}'" do
96
97
  expect(RDF::Literal.new(value,
97
98
  datatype: datatype,
98
99
  canonicalize: false).humanize)
99
- .to eq value
100
+ .to eq human
100
101
  end
101
102
 
102
103
  it "instantiates '#{value}' as #{klass}" do
@@ -34,6 +34,10 @@ module RDF; module Spec
34
34
  end
35
35
  end
36
36
 
37
+ RSpec::Matchers.define :match_triple_pattern do |*pattern|
38
+ match { |queryable| not queryable.first(pattern).nil? }
39
+ end
40
+
37
41
  RSpec::Matchers.define :be_mutable do
38
42
  match do |enumerable|
39
43
  expect(enumerable).to be_a_kind_of(RDF::Mutable)
@@ -256,3 +260,20 @@ module RDF; module Spec
256
260
  end
257
261
  end # Matchers
258
262
  end; end # RDF::Spec
263
+
264
+
265
+ module RSpec
266
+ module Matchers
267
+ class MatchArray
268
+ private
269
+ def safe_sort(array)
270
+ case
271
+ when array.all?{|item| item.respond_to?(:<=>) && !item.is_a?(Hash)}
272
+ array.sort
273
+ else
274
+ array
275
+ end
276
+ end
277
+ end
278
+ end
279
+ end
@@ -8,11 +8,11 @@ RSpec.shared_examples 'an RDF::Mutable' do
8
8
  raise 'mutable must be defined with let(:mutable)' unless
9
9
  defined? mutable
10
10
 
11
- @supports_context = mutable.respond_to?(:supports?) && mutable.supports?(:context)
11
+ @supports_named_graphs = mutable.respond_to?(:supports?) && mutable.supports?(:graph_name)
12
12
  end
13
13
 
14
14
  let(:resource) { RDF::URI('http://rubygems.org/gems/rdf') }
15
- let(:context) { RDF::URI('http://example.org/context') }
15
+ let(:graph_name) { RDF::URI('http://example.org/graph_name') }
16
16
 
17
17
  describe RDF::Mutable do
18
18
  subject { mutable }
@@ -31,51 +31,60 @@ RSpec.shared_examples 'an RDF::Mutable' do
31
31
  it_behaves_like 'an RDF::Writable'
32
32
  end
33
33
 
34
- it {should be_empty}
35
- it {should be_readable}
36
- it {should be_writable}
37
- it {should be_mutable}
38
- it {should_not be_immutable}
39
- it {should respond_to(:load)}
40
- it {should respond_to(:clear)}
41
- it {should respond_to(:delete)}
34
+ it {is_expected.to be_empty}
35
+ it {is_expected.to be_readable}
36
+ it {is_expected.to be_writable}
37
+ it {is_expected.to be_mutable}
38
+ it {is_expected.to_not be_immutable}
39
+ it {is_expected.to respond_to(:load)}
40
+ it {is_expected.to respond_to(:clear)}
41
+ it {is_expected.to respond_to(:delete)}
42
42
 
43
- its(:count) {should be_zero}
43
+ its(:count) {is_expected.to be_zero}
44
44
 
45
45
  context "#load" do
46
- it "should require an argument" do
46
+ it "is_expected.to require an argument" do
47
47
  expect { subject.load }.to raise_error(ArgumentError)
48
48
  end
49
49
 
50
- it "should accept a string filename argument" do
51
- skip("mutability") unless subject.mutable?
52
- expect { subject.load(RDF::Spec::TRIPLES_FILE) }.not_to raise_error
50
+ it "is_expected.to accept a string filename argument" do
51
+ expect { subject.load(RDF::Spec::TRIPLES_FILE) }.not_to raise_error if subject.mutable?
53
52
  end
54
53
 
55
- it "should accept an optional hash argument" do
56
- skip("mutability") unless subject.mutable?
57
- expect { subject.load(RDF::Spec::TRIPLES_FILE, {}) }.not_to raise_error
54
+ it "is_expected.to accept an optional hash argument" do
55
+ expect { subject.load(RDF::Spec::TRIPLES_FILE, {}) }.not_to raise_error if subject.mutable?
58
56
  end
59
57
 
60
- it "should load statements" do
61
- skip("mutability") unless subject.mutable?
62
- subject.load RDF::Spec::TRIPLES_FILE
63
- expect(subject.size).to eq File.readlines(RDF::Spec::TRIPLES_FILE).size
64
- expect(subject).to have_subject(resource)
58
+ it "is_expected.to load statements" do
59
+ if subject.mutable?
60
+ subject.load RDF::Spec::TRIPLES_FILE
61
+ expect(subject.size).to eq File.readlines(RDF::Spec::TRIPLES_FILE).size
62
+ is_expected.to have_subject(resource)
63
+ end
65
64
  end
66
65
 
67
- it "should load statements with a context override" do
68
- skip("mutability and contextuality") unless (subject.mutable? && @supports_context)
69
- subject.load RDF::Spec::TRIPLES_FILE, :context => context
70
- expect(subject).to have_context(context)
71
- expect(subject.query(:context => context).size).to eq subject.size
66
+ it "is_expected.to load statements with a context override", unless: RDF::VERSION.to_s >= "1.99" do
67
+ if subject.mutable? && @supports_named_graphs
68
+ subject.load RDF::Spec::TRIPLES_FILE, context: graph_name
69
+ is_expected.to have_context(graph_name)
70
+ expect(subject.query(context: graph_name).size).to eq subject.size
71
+ end
72
+ end
73
+
74
+ it "is_expected.to load statements with a graph_name override", if: RDF::VERSION.to_s >= "1.99" do
75
+ if subject.mutable? && @supports_named_graphs
76
+ subject.load RDF::Spec::TRIPLES_FILE, graph_name: graph_name
77
+ is_expected.to have_graph(graph_name)
78
+ expect(subject.query(graph_name: graph_name).size).to eq subject.size
79
+ end
72
80
  end
73
81
  end
74
82
 
75
83
  context "#from_{reader}" do
76
- it "should instantiate a reader" do
84
+ it "is_expected.to instantiate a reader" do
77
85
  reader = double("reader")
78
86
  expect(reader).to receive(:new).and_return(RDF::Spec.quads.first)
87
+ allow(RDF::Reader).to receive(:for).and_call_original
79
88
  expect(RDF::Reader).to receive(:for).with(:a_reader).and_return(reader)
80
89
  subject.send(:from_a_reader)
81
90
  end
@@ -87,58 +96,61 @@ RSpec.shared_examples 'an RDF::Mutable' do
87
96
  subject.insert(*@statements)
88
97
  end
89
98
 
90
- it "should not raise errors" do
91
- skip("mutability") unless subject.mutable?
92
- expect { subject.delete(@statements.first) }.not_to raise_error
99
+ it "is_expected.to not raise errors" do
100
+ expect { subject.delete(@statements.first) }.not_to raise_error if subject.mutable?
93
101
  end
94
102
 
95
- it "should support deleting one statement at a time" do
96
- skip("mutability") unless subject.mutable?
97
- subject.delete(@statements.first)
98
- expect(subject).not_to have_statement(@statements.first)
103
+ it "is_expected.to support deleting one statement at a time" do
104
+ if subject.mutable?
105
+ subject.delete(@statements.first)
106
+ is_expected.not_to have_statement(@statements.first)
107
+ end
99
108
  end
100
109
 
101
- it "should support deleting multiple statements at a time" do
102
- skip("mutability") unless subject.mutable?
103
- subject.delete(*@statements)
104
- expect(subject.find { |s| subject.has_statement?(s) }).to be_nil
110
+ it "is_expected.to support deleting multiple statements at a time" do
111
+ if subject.mutable?
112
+ subject.delete(*@statements)
113
+ expect(subject.find { |s| subject.has_statement?(s) }).to be_nil
114
+ end
105
115
  end
106
116
 
107
- it "should support wildcard deletions" do
108
- skip("mutability") unless subject.mutable?
109
- # nothing deleted
110
- require 'digest/sha1'
111
- count = subject.count
112
- subject.delete([nil, nil, Digest::SHA1.hexdigest(File.read(__FILE__))])
113
- expect(subject).not_to be_empty
114
- expect(subject.count).to eq count
115
-
116
- # everything deleted
117
- subject.delete([nil, nil, nil])
118
- expect(subject).to be_empty
117
+ it "is_expected.to support wildcard deletions" do
118
+ if subject.mutable?
119
+ # nothing deleted
120
+ require 'digest/sha1'
121
+ count = subject.count
122
+ subject.delete([nil, nil, Digest::SHA1.hexdigest(File.read(__FILE__))])
123
+ is_expected.not_to be_empty
124
+ expect(subject.count).to eq count
125
+
126
+ # everything deleted
127
+ subject.delete([nil, nil, nil])
128
+ is_expected.to be_empty
129
+ end
119
130
  end
120
131
 
121
- it "should only delete statements when the context matches" do
122
- skip("mutability") unless subject.mutable?
123
- # Setup three statements identical except for context
124
- count = subject.count + (@supports_context ? 3 : 1)
125
- s1 = RDF::Statement.new(resource, RDF::URI.new("urn:predicate:1"), RDF::URI.new("urn:object:1"))
126
- s2 = s1.dup
127
- s2.context = RDF::URI.new("urn:context:1")
128
- s3 = s1.dup
129
- s3.context = RDF::URI.new("urn:context:2")
130
- subject.insert(s1)
131
- subject.insert(s2)
132
- subject.insert(s3)
133
- expect(subject.count).to eq count
134
-
135
- # Delete one by one
136
- subject.delete(s1)
137
- expect(subject.count).to eq count - (@supports_context ? 1 : 1)
138
- subject.delete(s2)
139
- expect(subject.count).to eq count - (@supports_context ? 2 : 1)
140
- subject.delete(s3)
141
- expect(subject.count).to eq count - (@supports_context ? 3 : 1)
132
+ it "is_expected.to only delete statements when the graph_name matches" do
133
+ if subject.mutable?
134
+ # Setup three statements identical except for graph_name
135
+ count = subject.count + (@supports_named_graphs ? 3 : 1)
136
+ s1 = RDF::Statement.new(resource, RDF::URI.new("urn:predicate:1"), RDF::URI.new("urn:object:1"))
137
+ s2 = s1.dup
138
+ s2.graph_name = RDF::URI.new("urn:graph_name:1")
139
+ s3 = s1.dup
140
+ s3.graph_name = RDF::URI.new("urn:graph_name:2")
141
+ subject.insert(s1)
142
+ subject.insert(s2)
143
+ subject.insert(s3)
144
+ expect(subject.count).to eq count
145
+
146
+ # Delete one by one
147
+ subject.delete(s1)
148
+ expect(subject.count).to eq count - (@supports_named_graphs ? 1 : 1)
149
+ subject.delete(s2)
150
+ expect(subject.count).to eq count - (@supports_named_graphs ? 2 : 1)
151
+ subject.delete(s3)
152
+ expect(subject.count).to eq count - (@supports_named_graphs ? 3 : 1)
153
+ end
142
154
  end
143
155
  end
144
156
  end