rdf 0.0.7 → 0.0.8
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.
- data/AUTHORS +1 -0
- data/README +4 -1
- data/VERSION +1 -1
- data/etc/doap.nt +24 -0
- data/lib/rdf.rb +6 -1
- data/lib/rdf/mixin/durable.rb +29 -0
- data/lib/rdf/{enumerable.rb → mixin/enumerable.rb} +0 -0
- data/lib/rdf/mixin/mutable.rb +193 -0
- data/lib/rdf/mixin/queryable.rb +39 -0
- data/lib/rdf/mixin/readable.rb +13 -0
- data/lib/rdf/mixin/writable.rb +13 -0
- data/lib/rdf/model/graph.rb +11 -1
- data/lib/rdf/repository.rb +93 -228
- data/lib/rdf/spec.rb +138 -0
- data/lib/rdf/spec/enumerable.rb +248 -0
- data/lib/rdf/spec/repository.rb +77 -0
- data/lib/rdf/version.rb +1 -1
- metadata +13 -13
- data/bin/rdf-count +0 -11
- data/bin/rdf-lengths +0 -9
- data/bin/rdf-objects +0 -9
- data/bin/rdf-predicates +0 -9
- data/bin/rdf-subjects +0 -9
data/lib/rdf/spec.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
module RDF
|
4
|
+
##
|
5
|
+
# RDF extensions for RSpec.
|
6
|
+
#
|
7
|
+
# @see http://rspec.info/
|
8
|
+
module Spec
|
9
|
+
##
|
10
|
+
# RDF matchers for RSpec.
|
11
|
+
#
|
12
|
+
# @see http://rspec.rubyforge.org/rspec/1.2.9/classes/Spec/Matchers.html
|
13
|
+
module Matchers
|
14
|
+
##
|
15
|
+
# Defines a new RSpec matcher.
|
16
|
+
#
|
17
|
+
# @param [Symbol] name
|
18
|
+
# @return [void]
|
19
|
+
def self.define(name, &declarations)
|
20
|
+
define_method name do |*expected|
|
21
|
+
::Spec::Matchers::Matcher.new(name, *expected, &declarations)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
define :be_a_statement do
|
26
|
+
match do |statement|
|
27
|
+
statement.should be_instance_of(RDF::Statement)
|
28
|
+
statement.subject.should be_a_kind_of(RDF::Resource)
|
29
|
+
statement.predicate.should be_a_kind_of(RDF::URI)
|
30
|
+
statement.object.should be_a_kind_of(RDF::Value) unless statement.object.is_a?(String) # FIXME
|
31
|
+
true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
define :be_a_triple do
|
36
|
+
match do |triple|
|
37
|
+
triple.should be_instance_of(Array)
|
38
|
+
triple.size.should == 3
|
39
|
+
triple[0].should be_a_kind_of(RDF::Resource)
|
40
|
+
triple[1].should be_a_kind_of(RDF::URI)
|
41
|
+
triple[2].should be_a_kind_of(RDF::Value) unless triple[2].is_a?(String) # FIXME
|
42
|
+
true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
define :be_a_quad do
|
47
|
+
match do |quad|
|
48
|
+
quad.should be_instance_of(Array)
|
49
|
+
quad.size.should == 4
|
50
|
+
quad[0].should be_a_kind_of(RDF::Resource)
|
51
|
+
quad[1].should be_a_kind_of(RDF::URI)
|
52
|
+
quad[2].should be_a_kind_of(RDF::Value) unless quad[2].is_a?(String) # FIXME
|
53
|
+
quad[3].should be_a_kind_of(RDF::Resource) unless quad[3].nil?
|
54
|
+
true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
define :be_a_resource do
|
59
|
+
match do |value|
|
60
|
+
value.should be_a_kind_of(RDF::Resource)
|
61
|
+
true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
define :be_a_uri do
|
66
|
+
match do |value|
|
67
|
+
value.should be_a_kind_of(RDF::URI)
|
68
|
+
true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
define :be_a_value do
|
73
|
+
match do |value|
|
74
|
+
value.should be_a_kind_of(RDF::Value) unless value.is_a?(String) # FIXME
|
75
|
+
true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
define :be_a_vocabulary do |base_uri|
|
80
|
+
match do |vocabulary|
|
81
|
+
vocabulary.should be_a_kind_of(Module)
|
82
|
+
vocabulary.should respond_to(:to_uri)
|
83
|
+
vocabulary.to_uri.to_s.should == base_uri
|
84
|
+
vocabulary.should respond_to(:[])
|
85
|
+
true
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
define :have_properties do |base_uri, properties|
|
90
|
+
match do |vocabulary|
|
91
|
+
properties.map(&:to_sym).each do |property|
|
92
|
+
vocabulary[property].should be_a_uri
|
93
|
+
vocabulary[property].to_s.should == "#{base_uri}#{property}"
|
94
|
+
#vocabulary.should respond_to(property) # FIXME
|
95
|
+
lambda { vocabulary.send(property) }.should_not raise_error
|
96
|
+
vocabulary.send(property).should be_a_uri
|
97
|
+
vocabulary.send(property.to_s).should be_a_uri
|
98
|
+
vocabulary.send(property).to_s.should == "#{base_uri}#{property}"
|
99
|
+
end
|
100
|
+
true
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
define :have_subclasses do |base_uri, klasses|
|
105
|
+
match do |vocabulary|
|
106
|
+
klasses.map(&:to_sym).each do |klass|
|
107
|
+
# TODO
|
108
|
+
end
|
109
|
+
true
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
define :be_a_repository do
|
114
|
+
match do |repository|
|
115
|
+
repository.should be_a_kind_of(RDF::Repository)
|
116
|
+
true
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
define :be_a_repository_of_size do |size|
|
121
|
+
match do |repository|
|
122
|
+
repository.should be_a_repository
|
123
|
+
repository.size == size
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
define :have_predicate do |predicate, count|
|
128
|
+
match do |queryable|
|
129
|
+
if count.nil?
|
130
|
+
queryable.has_predicate?(predicate)
|
131
|
+
else
|
132
|
+
queryable.query([nil, predicate, nil]).size == count
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end # module Matchers
|
137
|
+
end # module Spec
|
138
|
+
end # module RDF
|
@@ -0,0 +1,248 @@
|
|
1
|
+
require 'rdf/spec'
|
2
|
+
|
3
|
+
share_as :RDF_Enumerable do
|
4
|
+
include RDF::Spec::Matchers
|
5
|
+
|
6
|
+
before :each do
|
7
|
+
raise '+@enumerable+ must be defined in a before(:each) block' unless instance_variable_get('@enumerable')
|
8
|
+
raise '+@statements+ must be defined in a before(:each) block' unless instance_variable_get('@statements')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should support #empty?" do
|
12
|
+
@enumerable.respond_to?(:empty?).should be_true
|
13
|
+
|
14
|
+
([].extend(RDF::Enumerable)).empty?.should be_true
|
15
|
+
@enumerable.empty?.should be_false
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should support #count and #size" do
|
19
|
+
[:count, :size, :length].each do |method|
|
20
|
+
@enumerable.respond_to?(method).should be_true
|
21
|
+
|
22
|
+
@enumerable.send(method).should == @statements.size
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "statements" do
|
27
|
+
it "should support #statements" do
|
28
|
+
@enumerable.respond_to?(:statements).should be_true
|
29
|
+
|
30
|
+
@enumerable.statements.should be_instance_of(Array)
|
31
|
+
@enumerable.statements.size.should == @statements.size
|
32
|
+
@enumerable.statements.each { |statement| statement.should be_a_statement }
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should support #has_statement?" do
|
36
|
+
@enumerable.respond_to?(:has_statement?).should be_true
|
37
|
+
|
38
|
+
@statements.each do |statement|
|
39
|
+
@enumerable.has_statement?(statement).should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
@enumerable.has_statement?([RDF::Node.new, RDF::URI.new("http://example.org/unknown"), RDF::Node.new]).should be_false
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should support #each_statement" do
|
46
|
+
@enumerable.respond_to?(:each_statement).should be_true
|
47
|
+
|
48
|
+
@enumerable.each_statement.should be_instance_of(Enumerable::Enumerator)
|
49
|
+
@enumerable.each_statement { |statement| statement.should be_a_statement }
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should support #enum_statement" do
|
53
|
+
@enumerable.respond_to?(:enum_statement).should be_true
|
54
|
+
|
55
|
+
@enumerable.enum_statement.should be_instance_of(Enumerable::Enumerator)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "triples" do
|
60
|
+
it "should support #triples" do
|
61
|
+
@enumerable.respond_to?(:triples).should be_true
|
62
|
+
|
63
|
+
@enumerable.triples.should be_instance_of(Array)
|
64
|
+
@enumerable.triples.size.should == @statements.size
|
65
|
+
@enumerable.triples.each { |triple| triple.should be_a_triple }
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should support #has_triple?" do
|
69
|
+
@enumerable.respond_to?(:has_triple?).should be_true
|
70
|
+
|
71
|
+
@statements.each do |statement|
|
72
|
+
@enumerable.has_triple?(statement.to_triple).should be_true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should support #each_triple" do
|
77
|
+
@enumerable.respond_to?(:each_triple).should be_true
|
78
|
+
|
79
|
+
@enumerable.each_triple.should be_instance_of(Enumerable::Enumerator)
|
80
|
+
@enumerable.each_triple { |*triple| triple.should be_a_triple }
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should support #enum_triple" do
|
84
|
+
@enumerable.respond_to?(:enum_triple).should be_true
|
85
|
+
|
86
|
+
@enumerable.enum_triple.should be_instance_of(Enumerable::Enumerator)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "quads" do
|
91
|
+
it "should support #quads" do
|
92
|
+
@enumerable.respond_to?(:quads).should be_true
|
93
|
+
|
94
|
+
@enumerable.quads.should be_instance_of(Array)
|
95
|
+
@enumerable.quads.size.should == @statements.size
|
96
|
+
@enumerable.quads.each { |quad| quad.should be_a_quad }
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should support #has_quad?" do
|
100
|
+
@enumerable.respond_to?(:has_quad?).should be_true
|
101
|
+
|
102
|
+
@statements.each do |statement|
|
103
|
+
@enumerable.has_quad?(statement.to_quad).should be_true
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should support #each_quad" do
|
108
|
+
@enumerable.respond_to?(:each_quad).should be_true
|
109
|
+
|
110
|
+
@enumerable.each_quad.should be_instance_of(Enumerable::Enumerator)
|
111
|
+
@enumerable.each_quad { |*quad| quad.should be_a_quad }
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should support #enum_quad" do
|
115
|
+
@enumerable.respond_to?(:enum_quad).should be_true
|
116
|
+
|
117
|
+
@enumerable.enum_quad.should be_instance_of(Enumerable::Enumerator)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "subjects" do
|
122
|
+
it "should support #subjects" do
|
123
|
+
@enumerable.respond_to?(:subjects).should be_true
|
124
|
+
|
125
|
+
@enumerable.subjects.should be_instance_of(Array)
|
126
|
+
@enumerable.subjects.each { |value| value.should be_a_resource }
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should support #has_subject?" do
|
130
|
+
@enumerable.respond_to?(:has_subject?).should be_true
|
131
|
+
|
132
|
+
@statements.each do |statement|
|
133
|
+
@enumerable.has_subject?(statement.subject).should be_true
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should support #each_subject" do
|
138
|
+
@enumerable.respond_to?(:each_subject).should be_true
|
139
|
+
|
140
|
+
@enumerable.each_subject.should be_instance_of(Enumerable::Enumerator)
|
141
|
+
@enumerable.each_subject { |value| value.should be_a_resource }
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should support #enum_subject" do
|
145
|
+
@enumerable.respond_to?(:enum_subject).should be_true
|
146
|
+
|
147
|
+
@enumerable.enum_subject.should be_instance_of(Enumerable::Enumerator)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "predicates" do
|
152
|
+
it "should support #predicates" do
|
153
|
+
@enumerable.respond_to?(:predicates).should be_true
|
154
|
+
|
155
|
+
@enumerable.predicates.should be_instance_of(Array)
|
156
|
+
@enumerable.predicates.each { |value| value.should be_a_uri }
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should support #has_predicate?" do
|
160
|
+
@enumerable.respond_to?(:has_predicate?).should be_true
|
161
|
+
|
162
|
+
@statements.each do |statement|
|
163
|
+
@enumerable.has_predicate?(statement.predicate).should be_true
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should support #each_predicate" do
|
168
|
+
@enumerable.respond_to?(:each_predicate).should be_true
|
169
|
+
|
170
|
+
@enumerable.each_predicate.should be_instance_of(Enumerable::Enumerator)
|
171
|
+
@enumerable.each_predicate { |value| value.should be_a_uri }
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should support #enum_predicate" do
|
175
|
+
@enumerable.respond_to?(:enum_predicate).should be_true
|
176
|
+
|
177
|
+
@enumerable.enum_predicate.should be_instance_of(Enumerable::Enumerator)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context "objects" do
|
182
|
+
it "should support #objects" do
|
183
|
+
@enumerable.respond_to?(:objects).should be_true
|
184
|
+
|
185
|
+
@enumerable.objects.should be_instance_of(Array)
|
186
|
+
@enumerable.objects.each { |value| value.should be_a_value }
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should support #has_object?" do
|
190
|
+
@enumerable.respond_to?(:has_object?).should be_true
|
191
|
+
|
192
|
+
@statements.each do |statement|
|
193
|
+
@enumerable.has_object?(statement.object).should be_true
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should support #each_object" do
|
198
|
+
@enumerable.respond_to?(:each_object).should be_true
|
199
|
+
|
200
|
+
@enumerable.each_object.should be_instance_of(Enumerable::Enumerator)
|
201
|
+
@enumerable.each_object { |value| value.should be_a_value }
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should support #enum_object" do
|
205
|
+
@enumerable.respond_to?(:enum_object).should be_true
|
206
|
+
|
207
|
+
@enumerable.enum_object.should be_instance_of(Enumerable::Enumerator)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context "contexts" do
|
212
|
+
it "should support #contexts" do
|
213
|
+
@enumerable.respond_to?(:contexts).should be_true
|
214
|
+
|
215
|
+
@enumerable.contexts.should be_instance_of(Array)
|
216
|
+
@enumerable.contexts.each { |value| value.should be_a_resource }
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should support #has_context?" do
|
220
|
+
@enumerable.respond_to?(:has_context?).should be_true
|
221
|
+
|
222
|
+
@statements.each do |statement|
|
223
|
+
if statement.has_context?
|
224
|
+
@enumerable.has_context?(statement.context).should be_true
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
it "should support #each_context" do
|
230
|
+
@enumerable.respond_to?(:each_context).should be_true
|
231
|
+
|
232
|
+
@enumerable.each_context.should be_instance_of(Enumerable::Enumerator)
|
233
|
+
@enumerable.each_context { |value| value.should be_a_resource }
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should support #enum_context" do
|
237
|
+
@enumerable.respond_to?(:enum_context).should be_true
|
238
|
+
|
239
|
+
@enumerable.enum_context.should be_instance_of(Enumerable::Enumerator)
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should support #to_hash" do
|
244
|
+
@enumerable.respond_to?(:to_hash).should be_true
|
245
|
+
|
246
|
+
# TODO
|
247
|
+
end
|
248
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rdf/spec'
|
2
|
+
|
3
|
+
share_as :RDF_Repository do
|
4
|
+
include RDF::Spec::Matchers
|
5
|
+
|
6
|
+
before :each do
|
7
|
+
raise '+@repository+ must be defined in a before(:each) block' unless instance_variable_get('@repository')
|
8
|
+
@filename = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'etc', 'doap.nt'))
|
9
|
+
@statements = RDF::NTriples::Reader.new(File.open(@filename)).to_a
|
10
|
+
@enumerable = @repository
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be empty initially" do
|
14
|
+
@repository.empty?.should be_true
|
15
|
+
@repository.count.should be_zero
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be readable" do
|
19
|
+
@repository.readable?.should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be mutable" do
|
23
|
+
@repository.immutable?.should be_false
|
24
|
+
@repository.mutable?.should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
context "when inserting statements" do
|
28
|
+
it "should support #insert" do
|
29
|
+
@repository.should respond_to(:insert)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not raise errors" do
|
33
|
+
lambda { @repository.insert(@statements.first) }.should_not raise_error
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should support inserting one statement at a time" do
|
37
|
+
@repository.insert(@statements.first)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should support inserting multiple statements at a time" do
|
41
|
+
@repository.insert(*@statements)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should insert statements successfully" do
|
45
|
+
@repository.insert(*@statements)
|
46
|
+
@repository.count.should == @statements.size
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when deleting statements" do
|
51
|
+
it "should support #delete" do
|
52
|
+
@repository.should respond_to(:delete)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should not raise errors"
|
56
|
+
it "should support deleting one statement at a time"
|
57
|
+
it "should support deleting multiple statements at a time"
|
58
|
+
it "should delete statements successfully"
|
59
|
+
end
|
60
|
+
|
61
|
+
context "when clearing all statements" do
|
62
|
+
it "should support #clear" do
|
63
|
+
@repository.should respond_to(:clear)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when enumerating statements" do
|
68
|
+
require 'rdf/spec/enumerable'
|
69
|
+
|
70
|
+
before :each do
|
71
|
+
@repository.insert(*@statements)
|
72
|
+
@enumerable = @repository
|
73
|
+
end
|
74
|
+
|
75
|
+
it_should_behave_like RDF_Enumerable
|
76
|
+
end
|
77
|
+
end
|