riak-client 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +55 -12
- data/RELEASE_NOTES.md +20 -1
- data/lib/riak.rb +1 -0
- data/lib/riak/client.rb +2 -1
- data/lib/riak/client/beefcake/crdt/counter_loader.rb +18 -0
- data/lib/riak/client/beefcake/crdt/map_loader.rb +64 -0
- data/lib/riak/client/beefcake/crdt/set_loader.rb +18 -0
- data/lib/riak/client/beefcake/crdt_loader.rb +16 -59
- data/lib/riak/client/beefcake/crdt_operator.rb +2 -1
- data/lib/riak/client/instrumentation.rb +19 -0
- data/lib/riak/crdt/base.rb +16 -0
- data/lib/riak/errors/backend_creation.rb +9 -0
- data/lib/riak/instrumentation.rb +6 -0
- data/lib/riak/version.rb +1 -1
- data/riak-client.gemspec +3 -2
- data/spec/integration/riak/counters_spec.rb +1 -1
- data/spec/integration/riak/crdt_spec.rb +68 -23
- data/spec/integration/riak/protobuffs_backends_spec.rb +1 -1
- data/spec/integration/riak/threading_spec.rb +4 -4
- data/spec/integration/yokozuna/index_spec.rb +5 -5
- data/spec/integration/yokozuna/queries_spec.rb +15 -16
- data/spec/integration/yokozuna/schema_spec.rb +2 -2
- data/spec/riak/beefcake_protobuffs_backend/crdt_operator_spec.rb +8 -8
- data/spec/riak/beefcake_protobuffs_backend/object_methods_spec.rb +1 -1
- data/spec/riak/beefcake_protobuffs_backend_spec.rb +8 -8
- data/spec/riak/bucket_spec.rb +38 -38
- data/spec/riak/client_spec.rb +26 -27
- data/spec/riak/core_ext/to_param_spec.rb +2 -2
- data/spec/riak/counter_spec.rb +11 -11
- data/spec/riak/crdt/counter_spec.rb +4 -2
- data/spec/riak/crdt/inner_counter_spec.rb +1 -1
- data/spec/riak/crdt/inner_flag_spec.rb +4 -4
- data/spec/riak/crdt/inner_map_spec.rb +3 -3
- data/spec/riak/crdt/inner_register_spec.rb +5 -5
- data/spec/riak/crdt/inner_set_spec.rb +1 -1
- data/spec/riak/crdt/map_spec.rb +2 -2
- data/spec/riak/crdt/set_spec.rb +4 -2
- data/spec/riak/crdt/shared_examples.rb +15 -15
- data/spec/riak/crdt/typed_collection_spec.rb +16 -22
- data/spec/riak/escape_spec.rb +10 -10
- data/spec/riak/feature_detection_spec.rb +1 -1
- data/spec/riak/index_collection_spec.rb +7 -4
- data/spec/riak/instrumentation_spec.rb +124 -0
- data/spec/riak/link_spec.rb +12 -12
- data/spec/riak/list_buckets_spec.rb +2 -2
- data/spec/riak/map_reduce/filter_builder_spec.rb +5 -5
- data/spec/riak/map_reduce/phase_spec.rb +20 -20
- data/spec/riak/map_reduce_spec.rb +50 -50
- data/spec/riak/multiget_spec.rb +5 -5
- data/spec/riak/node_spec.rb +3 -3
- data/spec/riak/robject_spec.rb +46 -45
- data/spec/riak/search_spec.rb +11 -11
- data/spec/riak/secondary_index_spec.rb +9 -9
- data/spec/riak/stamp_spec.rb +5 -5
- data/spec/riak/walk_spec_spec.rb +30 -30
- data/spec/spec_helper.rb +6 -0
- data/spec/support/certs/ca.crt +19 -20
- data/spec/support/certs/client.crl +13 -0
- data/spec/support/certs/client.crt +68 -69
- data/spec/support/certs/client.csr +18 -0
- data/spec/support/certs/client.key +25 -25
- data/spec/support/certs/server.crl +11 -11
- data/spec/support/certs/server.crt +68 -69
- data/spec/support/certs/server.key +25 -25
- data/spec/support/unified_backend_examples.rb +33 -33
- metadata +31 -5
@@ -8,17 +8,17 @@ describe Riak::MapReduce do
|
|
8
8
|
@mr = Riak::MapReduce.new(@client)
|
9
9
|
end
|
10
10
|
|
11
|
-
it "
|
11
|
+
it "requires a client" do
|
12
12
|
expect { Riak::MapReduce.new }.to raise_error
|
13
13
|
expect { Riak::MapReduce.new(@client) }.not_to raise_error
|
14
14
|
end
|
15
15
|
|
16
|
-
it "
|
16
|
+
it "initializes the inputs and query to empty arrays" do
|
17
17
|
expect(@mr.inputs).to eq([])
|
18
18
|
expect(@mr.query).to eq([])
|
19
19
|
end
|
20
20
|
|
21
|
-
it "
|
21
|
+
it "yields itself when given a block on initializing" do
|
22
22
|
@mr2 = nil
|
23
23
|
@mr = Riak::MapReduce.new(@client) do |mr|
|
24
24
|
@mr2 = mr
|
@@ -27,45 +27,45 @@ describe Riak::MapReduce do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe "adding inputs" do
|
30
|
-
it "
|
30
|
+
it "returns self for chaining" do
|
31
31
|
expect(@mr.add("foo", "bar")).to eq(@mr)
|
32
32
|
end
|
33
33
|
|
34
|
-
it "
|
34
|
+
it "adds bucket/key pairs to the inputs" do
|
35
35
|
@mr.add("foo","bar")
|
36
36
|
expect(@mr.inputs).to eq([["foo","bar"]])
|
37
37
|
end
|
38
38
|
|
39
|
-
it "
|
39
|
+
it "adds an array containing a bucket/key pair to the inputs" do
|
40
40
|
@mr.add(["foo","bar"])
|
41
41
|
expect(@mr.inputs).to eq([["foo","bar"]])
|
42
42
|
end
|
43
43
|
|
44
|
-
it "
|
44
|
+
it "adds an object to the inputs by its bucket and key" do
|
45
45
|
bucket = Riak::Bucket.new(@client, "foo")
|
46
46
|
obj = Riak::RObject.new(bucket, "bar")
|
47
47
|
@mr.add(obj)
|
48
48
|
expect(@mr.inputs).to eq([["foo", "bar"]])
|
49
49
|
end
|
50
50
|
|
51
|
-
it "
|
51
|
+
it "adds an array containing a bucket/key/key-data triple to the inputs" do
|
52
52
|
@mr.add(["foo","bar",1000])
|
53
53
|
expect(@mr.inputs).to eq([["foo","bar",1000]])
|
54
54
|
end
|
55
55
|
|
56
|
-
it "
|
56
|
+
it "uses a bucket name as the single input" do
|
57
57
|
@mr.add(Riak::Bucket.new(@client, "foo"))
|
58
58
|
expect(@mr.inputs).to eq("foo")
|
59
59
|
@mr.add("docs")
|
60
60
|
expect(@mr.inputs).to eq("docs")
|
61
61
|
end
|
62
62
|
|
63
|
-
it "
|
63
|
+
it "accepts a list of key-filters along with a bucket" do
|
64
64
|
@mr.add("foo", [[:tokenize, "-", 3], [:string_to_int], [:between, 2009, 2010]])
|
65
65
|
expect(@mr.inputs).to eq({:bucket => "foo", :key_filters => [[:tokenize, "-", 3], [:string_to_int], [:between, 2009, 2010]]})
|
66
66
|
end
|
67
67
|
|
68
|
-
it "
|
68
|
+
it "adds a bucket and filter list via a builder block" do
|
69
69
|
@mr.filter("foo") do
|
70
70
|
tokenize "-", 3
|
71
71
|
string_to_int
|
@@ -75,17 +75,17 @@ describe Riak::MapReduce do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
context "using secondary indexes as inputs" do
|
78
|
-
it "
|
78
|
+
it "sets the inputs for equality" do
|
79
79
|
expect(@mr.index("foo", "email_bin", "sean@basho.com")).to eq(@mr)
|
80
80
|
expect(@mr.inputs).to eq({:bucket => "foo", :index => "email_bin", :key => "sean@basho.com"})
|
81
81
|
end
|
82
82
|
|
83
|
-
it "
|
83
|
+
it "sets the inputs for a range" do
|
84
84
|
expect(@mr.index("foo", "rank_int", 10..20)).to eq(@mr)
|
85
85
|
expect(@mr.inputs).to eq({:bucket => "foo", :index => "rank_int", :start => 10, :end => 20})
|
86
86
|
end
|
87
87
|
|
88
|
-
it "
|
88
|
+
it "raises an error when given an invalid query" do
|
89
89
|
expect { @mr.index("foo", "rank_int", 1.0348) }.to raise_error(ArgumentError)
|
90
90
|
expect { @mr.index("foo", "rank_int", Range.new(1.03, 1.05)) }.to raise_error(ArgumentError)
|
91
91
|
end
|
@@ -99,29 +99,29 @@ describe Riak::MapReduce do
|
|
99
99
|
before { @urldecode, Riak.url_decoding = Riak.url_decoding, false }
|
100
100
|
after { Riak.url_decoding = @urldecode }
|
101
101
|
|
102
|
-
it "
|
102
|
+
it "adds bucket/key pairs to the inputs with bucket and key escaped" do
|
103
103
|
@mr.add("[foo]","(bar)")
|
104
104
|
expect(@mr.inputs).to eq([["%5Bfoo%5D","%28bar%29"]])
|
105
105
|
end
|
106
106
|
|
107
|
-
it "
|
107
|
+
it "adds an escaped array containing a bucket/key pair to the inputs" do
|
108
108
|
@mr.add(["[foo]","(bar)"])
|
109
109
|
expect(@mr.inputs).to eq([["%5Bfoo%5D","%28bar%29"]])
|
110
110
|
end
|
111
111
|
|
112
|
-
it "
|
112
|
+
it "adds an object to the inputs by its escaped bucket and key" do
|
113
113
|
bucket = Riak::Bucket.new(@client, "[foo]")
|
114
114
|
obj = Riak::RObject.new(bucket, "(bar)")
|
115
115
|
@mr.add(obj)
|
116
116
|
expect(@mr.inputs).to eq([["%5Bfoo%5D", "%28bar%29"]])
|
117
117
|
end
|
118
118
|
|
119
|
-
it "
|
119
|
+
it "adds an escaped array containing a bucket/key/key-data triple to the inputs" do
|
120
120
|
@mr.add(["[foo]","(bar)","[]()"])
|
121
121
|
expect(@mr.inputs).to eq([["%5Bfoo%5D", "%28bar%29","[]()"]])
|
122
122
|
end
|
123
123
|
|
124
|
-
it "
|
124
|
+
it "uses an escaped bucket name as the single input" do
|
125
125
|
@mr.add(Riak::Bucket.new(@client, "[foo]"))
|
126
126
|
expect(@mr.inputs).to eq("%5Bfoo%5D")
|
127
127
|
@mr.add("docs")
|
@@ -133,29 +133,29 @@ describe Riak::MapReduce do
|
|
133
133
|
before { @urldecode, Riak.url_decoding = Riak.url_decoding, true }
|
134
134
|
after { Riak.url_decoding = @urldecode }
|
135
135
|
|
136
|
-
it "
|
136
|
+
it "adds bucket/key pairs to the inputs with bucket and key unescaped" do
|
137
137
|
@mr.add("[foo]","(bar)")
|
138
138
|
expect(@mr.inputs).to eq([["[foo]","(bar)"]])
|
139
139
|
end
|
140
140
|
|
141
|
-
it "
|
141
|
+
it "adds an unescaped array containing a bucket/key pair to the inputs" do
|
142
142
|
@mr.add(["[foo]","(bar)"])
|
143
143
|
expect(@mr.inputs).to eq([["[foo]","(bar)"]])
|
144
144
|
end
|
145
145
|
|
146
|
-
it "
|
146
|
+
it "adds an object to the inputs by its unescaped bucket and key" do
|
147
147
|
bucket = Riak::Bucket.new(@client, "[foo]")
|
148
148
|
obj = Riak::RObject.new(bucket, "(bar)")
|
149
149
|
@mr.add(obj)
|
150
150
|
expect(@mr.inputs).to eq([["[foo]","(bar)"]])
|
151
151
|
end
|
152
152
|
|
153
|
-
it "
|
153
|
+
it "adds an unescaped array containing a bucket/key/key-data triple to the inputs" do
|
154
154
|
@mr.add(["[foo]","(bar)","[]()"])
|
155
155
|
expect(@mr.inputs).to eq([["[foo]","(bar)","[]()"]])
|
156
156
|
end
|
157
157
|
|
158
|
-
it "
|
158
|
+
it "uses an unescaped bucket name as the single input" do
|
159
159
|
@mr.add(Riak::Bucket.new(@client, "[foo]"))
|
160
160
|
expect(@mr.inputs).to eq("[foo]")
|
161
161
|
@mr.add("docs")
|
@@ -168,29 +168,29 @@ describe Riak::MapReduce do
|
|
168
168
|
before { @oldesc, Riak.escaper = Riak.escaper, CGI }
|
169
169
|
after { Riak.escaper = @oldesc }
|
170
170
|
|
171
|
-
it "
|
171
|
+
it "adds bucket/key pairs to the inputs with bucket and key escaped" do
|
172
172
|
@mr.add("[foo]","(bar)")
|
173
173
|
expect(@mr.inputs).to eq([["%5Bfoo%5D","%28bar%29"]])
|
174
174
|
end
|
175
175
|
|
176
|
-
it "
|
176
|
+
it "adds an escaped array containing a bucket/key pair to the inputs" do
|
177
177
|
@mr.add(["[foo]","(bar)"])
|
178
178
|
expect(@mr.inputs).to eq([["%5Bfoo%5D","%28bar%29"]])
|
179
179
|
end
|
180
180
|
|
181
|
-
it "
|
181
|
+
it "adds an object to the inputs by its escaped bucket and key" do
|
182
182
|
bucket = Riak::Bucket.new(@client, "[foo]")
|
183
183
|
obj = Riak::RObject.new(bucket, "(bar)")
|
184
184
|
@mr.add(obj)
|
185
185
|
expect(@mr.inputs).to eq([["%5Bfoo%5D", "%28bar%29"]])
|
186
186
|
end
|
187
187
|
|
188
|
-
it "
|
188
|
+
it "adds an escaped array containing a bucket/key/key-data triple to the inputs" do
|
189
189
|
@mr.add(["[foo]","(bar)","[]()"])
|
190
190
|
expect(@mr.inputs).to eq([["%5Bfoo%5D", "%28bar%29","[]()"]])
|
191
191
|
end
|
192
192
|
|
193
|
-
it "
|
193
|
+
it "uses an escaped bucket name as the single input" do
|
194
194
|
@mr.add(Riak::Bucket.new(@client, "[foo]"))
|
195
195
|
expect(@mr.inputs).to eq("%5Bfoo%5D")
|
196
196
|
@mr.add("docs")
|
@@ -202,13 +202,13 @@ describe Riak::MapReduce do
|
|
202
202
|
before { Riak.disable_list_keys_warnings = false }
|
203
203
|
after { Riak.disable_list_keys_warnings = true }
|
204
204
|
|
205
|
-
it "
|
205
|
+
it "warns about list-keys on buckets" do
|
206
206
|
expect(@mr).to receive(:warn).twice
|
207
207
|
@mr.add("foo")
|
208
208
|
@mr.add(Riak::Bucket.new(@client, "foo"))
|
209
209
|
end
|
210
210
|
|
211
|
-
it "
|
211
|
+
it "warns about list-keys on key-filters" do
|
212
212
|
expect(@mr).to receive(:warn)
|
213
213
|
@mr.filter("foo") { matches "bar" }
|
214
214
|
end
|
@@ -217,11 +217,11 @@ describe Riak::MapReduce do
|
|
217
217
|
|
218
218
|
[:map, :reduce].each do |type|
|
219
219
|
describe "adding #{type} phases" do
|
220
|
-
it "
|
220
|
+
it "returns self for chaining" do
|
221
221
|
expect(@mr.send(type, "function(){}")).to eq(@mr)
|
222
222
|
end
|
223
223
|
|
224
|
-
it "
|
224
|
+
it "accepts a function string" do
|
225
225
|
@mr.send(type, "function(){}")
|
226
226
|
expect(@mr.query.size).to eq(1)
|
227
227
|
phase = @mr.query.first
|
@@ -229,7 +229,7 @@ describe Riak::MapReduce do
|
|
229
229
|
expect(phase.type).to eq(type)
|
230
230
|
end
|
231
231
|
|
232
|
-
it "
|
232
|
+
it "accepts a function and options" do
|
233
233
|
@mr.send(type, "function(){}", :keep => true)
|
234
234
|
expect(@mr.query.size).to eq(1)
|
235
235
|
phase = @mr.query.first
|
@@ -238,7 +238,7 @@ describe Riak::MapReduce do
|
|
238
238
|
expect(phase.keep).to be_truthy
|
239
239
|
end
|
240
240
|
|
241
|
-
it "
|
241
|
+
it "accepts a module/function pair" do
|
242
242
|
@mr.send(type, ["riak","mapsomething"])
|
243
243
|
expect(@mr.query.size).to eq(1)
|
244
244
|
phase = @mr.query.first
|
@@ -247,7 +247,7 @@ describe Riak::MapReduce do
|
|
247
247
|
expect(phase.language).to eq("erlang")
|
248
248
|
end
|
249
249
|
|
250
|
-
it "
|
250
|
+
it "accepts a module/function pair with extra options" do
|
251
251
|
@mr.send(type, ["riak", "mapsomething"], :arg => [1000])
|
252
252
|
expect(@mr.query.size).to eq(1)
|
253
253
|
phase = @mr.query.first
|
@@ -260,11 +260,11 @@ describe Riak::MapReduce do
|
|
260
260
|
end
|
261
261
|
|
262
262
|
describe "adding link phases" do
|
263
|
-
it "
|
263
|
+
it "returns self for chaining" do
|
264
264
|
expect(@mr.link({})).to eq(@mr)
|
265
265
|
end
|
266
266
|
|
267
|
-
it "
|
267
|
+
it "accepts a WalkSpec" do
|
268
268
|
@mr.link(Riak::WalkSpec.new(:tag => "next"))
|
269
269
|
expect(@mr.query.size).to eq(1)
|
270
270
|
phase = @mr.query.first
|
@@ -273,7 +273,7 @@ describe Riak::MapReduce do
|
|
273
273
|
expect(phase.function.tag).to eq("next")
|
274
274
|
end
|
275
275
|
|
276
|
-
it "
|
276
|
+
it "accepts a WalkSpec and a hash of options" do
|
277
277
|
@mr.link(Riak::WalkSpec.new(:bucket => "foo"), :keep => true)
|
278
278
|
expect(@mr.query.size).to eq(1)
|
279
279
|
phase = @mr.query.first
|
@@ -283,7 +283,7 @@ describe Riak::MapReduce do
|
|
283
283
|
expect(phase.keep).to be_truthy
|
284
284
|
end
|
285
285
|
|
286
|
-
it "
|
286
|
+
it "accepts a hash of options intermingled with the walk spec options" do
|
287
287
|
@mr.link(:tag => "snakes", :arg => [1000])
|
288
288
|
expect(@mr.query.size).to eq(1)
|
289
289
|
phase = @mr.query.first
|
@@ -294,34 +294,34 @@ describe Riak::MapReduce do
|
|
294
294
|
end
|
295
295
|
|
296
296
|
describe "converting to JSON for the job" do
|
297
|
-
it "
|
297
|
+
it "includes the inputs and query keys" do
|
298
298
|
expect(@mr.to_json).to match(/"inputs":/)
|
299
299
|
end
|
300
300
|
|
301
|
-
it "
|
301
|
+
it "maps phases to their JSON equivalents" do
|
302
302
|
phase = Riak::MapReduce::Phase.new(:type => :map, :function => "function(){}")
|
303
303
|
@mr.query << phase
|
304
304
|
expect(@mr.to_json).to include('"source":"function(){}"')
|
305
305
|
expect(@mr.to_json).to include('"query":[{"map":{')
|
306
306
|
end
|
307
307
|
|
308
|
-
it "
|
308
|
+
it "emits only the bucket name when the input is the whole bucket" do
|
309
309
|
@mr.add("foo")
|
310
310
|
expect(@mr.to_json).to include('"inputs":"foo"')
|
311
311
|
end
|
312
312
|
|
313
|
-
it "
|
313
|
+
it "emits an array of inputs when there are multiple inputs" do
|
314
314
|
@mr.add("foo","bar",1000).add("foo","baz")
|
315
315
|
expect(@mr.to_json).to include('"inputs":[["foo","bar",1000],["foo","baz"]]')
|
316
316
|
end
|
317
317
|
|
318
|
-
it "
|
318
|
+
it "adds the timeout value when set" do
|
319
319
|
@mr.timeout(50000)
|
320
320
|
expect(@mr.to_json).to include('"timeout":50000')
|
321
321
|
end
|
322
322
|
end
|
323
323
|
|
324
|
-
it "
|
324
|
+
it "returns self from setting the timeout" do
|
325
325
|
expect(@mr.timeout(5000)).to eq(@mr)
|
326
326
|
end
|
327
327
|
|
@@ -330,19 +330,19 @@ describe Riak::MapReduce do
|
|
330
330
|
@mr.map("Riak.mapValues",:keep => true)
|
331
331
|
end
|
332
332
|
|
333
|
-
it "
|
333
|
+
it "submits the query to the backend" do
|
334
334
|
expect(@backend).to receive(:mapred).with(@mr).and_return([])
|
335
335
|
expect(@mr.run).to eq([])
|
336
336
|
end
|
337
337
|
|
338
|
-
it "
|
338
|
+
it "passes the given block to the backend for streaming" do
|
339
339
|
arr = []
|
340
340
|
expect(@backend).to receive(:mapred).with(@mr).and_yield("foo").and_yield("bar")
|
341
341
|
@mr.run {|v| arr << v }
|
342
342
|
expect(arr).to eq(["foo", "bar"])
|
343
343
|
end
|
344
344
|
|
345
|
-
it "
|
345
|
+
it "interprets failed requests with JSON content-types as map reduce errors" do
|
346
346
|
allow(@backend).to receive(:mapred).
|
347
347
|
and_raise(Riak::ProtobuffsFailedRequest.new(:server_error, '{"error":"syntax error"}'))
|
348
348
|
expect{ @mr.run }.to raise_error(Riak::MapReduceError)
|
@@ -355,7 +355,7 @@ describe Riak::MapReduce do
|
|
355
355
|
end
|
356
356
|
end
|
357
357
|
|
358
|
-
it "
|
358
|
+
it "re-raises non-JSON error responses" do
|
359
359
|
allow(@backend).to receive(:mapred).
|
360
360
|
and_raise(Riak::ProtobuffsFailedRequest.new(:server_error, 'Oops, you bwoke it.'))
|
361
361
|
expect { @mr.run }.to raise_error(Riak::FailedRequest)
|
data/spec/riak/multiget_spec.rb
CHANGED
@@ -8,13 +8,13 @@ describe Riak::Multiget do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe "initialization" do
|
11
|
-
it "
|
11
|
+
it "accepts a client and an array of bucket/key pairs" do
|
12
12
|
expect { Riak::Multiget.new(@client, @pairs) }.not_to raise_error
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "operation" do
|
17
|
-
it "
|
17
|
+
it "fetches both keys from the bucket" do
|
18
18
|
expect(@bucket).to receive(:[]).with('key1')
|
19
19
|
expect(@bucket).to receive(:[]).with('key2')
|
20
20
|
|
@@ -23,7 +23,7 @@ describe Riak::Multiget do
|
|
23
23
|
@multiget.wait_for_finish
|
24
24
|
end
|
25
25
|
|
26
|
-
it "
|
26
|
+
it "fetches asynchronously" do
|
27
27
|
# make fetches slow
|
28
28
|
@slow_mtx = Mutex.new
|
29
29
|
@slow_mtx.lock
|
@@ -50,7 +50,7 @@ describe Riak::Multiget do
|
|
50
50
|
expect(@results).to be_a Hash
|
51
51
|
end
|
52
52
|
|
53
|
-
it "
|
53
|
+
it "returns found objects when only some objects are found" do
|
54
54
|
expect(@bucket).to receive(:[]).
|
55
55
|
with('key1').
|
56
56
|
and_raise(Riak::ProtobuffsFailedRequest.new(:not_found, "not found"))
|
@@ -67,7 +67,7 @@ describe Riak::Multiget do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
describe "results" do
|
70
|
-
it "
|
70
|
+
it "returns a hash of pairs to values" do
|
71
71
|
expect(@bucket).to receive(:[]).with('key1')
|
72
72
|
expect(@bucket).to receive(:[]).with('key2')
|
73
73
|
|
data/spec/riak/node_spec.rb
CHANGED
@@ -7,18 +7,18 @@ describe Riak::Client::Node do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe 'when initializing' do
|
10
|
-
it '
|
10
|
+
it 'defaults to the local interface on port 8087' do
|
11
11
|
node = Riak::Client::Node.new @client
|
12
12
|
expect(node.host).to eq('127.0.0.1')
|
13
13
|
expect(node.pb_port).to eq(8087)
|
14
14
|
end
|
15
15
|
|
16
|
-
it '
|
16
|
+
it 'accepts a host' do
|
17
17
|
node = Riak::Client::Node.new(@client, :host => 'riak.basho.com')
|
18
18
|
expect(node.host).to eq("riak.basho.com")
|
19
19
|
end
|
20
20
|
|
21
|
-
it '
|
21
|
+
it 'accepts a Protobuffs port' do
|
22
22
|
node = Riak::Client::Node.new @client, :pb_port => 9000
|
23
23
|
expect(node.pb_port).to eq(9000)
|
24
24
|
end
|
data/spec/riak/robject_spec.rb
CHANGED
@@ -7,34 +7,34 @@ describe Riak::RObject do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe "initialization" do
|
10
|
-
it "
|
10
|
+
it "sets the bucket" do
|
11
11
|
@object = Riak::RObject.new(@bucket)
|
12
12
|
expect(@object.bucket).to eq(@bucket)
|
13
13
|
end
|
14
14
|
|
15
|
-
it "
|
15
|
+
it "sets the key" do
|
16
16
|
@object = Riak::RObject.new(@bucket, "bar")
|
17
17
|
expect(@object.key).to eq("bar")
|
18
18
|
end
|
19
19
|
|
20
|
-
it "
|
20
|
+
it "initializes the links to an empty set" do
|
21
21
|
@object = Riak::RObject.new(@bucket, "bar")
|
22
22
|
expect(@object.links).to eq(Set.new)
|
23
23
|
end
|
24
24
|
|
25
|
-
it "
|
25
|
+
it "initializes the meta to an empty hash" do
|
26
26
|
@object = Riak::RObject.new(@bucket, "bar")
|
27
27
|
expect(@object.meta).to eq({})
|
28
28
|
end
|
29
29
|
|
30
|
-
it "
|
30
|
+
it "initializes indexes to an empty hash with a Set for the default value" do
|
31
31
|
@object = Riak::RObject.new(@bucket, "bar")
|
32
32
|
expect(@object.indexes).to be_kind_of(Hash)
|
33
33
|
expect(@object.indexes).to be_empty
|
34
34
|
expect(@object.indexes['foo_bin']).to be_kind_of(Set)
|
35
35
|
end
|
36
36
|
|
37
|
-
it "
|
37
|
+
it "yields itself to a given block" do
|
38
38
|
Riak::RObject.new(@bucket, "bar") do |r|
|
39
39
|
expect(r.key).to eq("bar")
|
40
40
|
end
|
@@ -73,19 +73,19 @@ describe Riak::RObject do
|
|
73
73
|
@object.data = { 'some' => 'data' }
|
74
74
|
end
|
75
75
|
|
76
|
-
it "
|
76
|
+
it "resets unserialized forms when stored" do
|
77
77
|
@object.raw_data = value = '{ "raw": "json" }'
|
78
78
|
|
79
79
|
expect(@object.raw_data).to eq(value)
|
80
80
|
expect(@object.data).to eq({ "raw" => "json" })
|
81
81
|
end
|
82
82
|
|
83
|
-
it "
|
83
|
+
it "lazily serializes when read" do
|
84
84
|
expect(@object.raw_data).to eq('{"some":"data"}')
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
it "
|
88
|
+
it "only marshal/demarshals when necessary" do
|
89
89
|
expect(@object).not_to receive(:serialize)
|
90
90
|
expect(@object).not_to receive(:deserialize)
|
91
91
|
@object.raw_data = value = "{not even valid json!}}"
|
@@ -99,13 +99,13 @@ describe Riak::RObject do
|
|
99
99
|
@object.raw_data = '{"some":"data"}'
|
100
100
|
end
|
101
101
|
|
102
|
-
it "
|
102
|
+
it "resets previously stored raw data" do
|
103
103
|
@object.data = value = { "new" => "data" }
|
104
104
|
expect(@object.raw_data).to eq('{"new":"data"}')
|
105
105
|
expect(@object.data).to eq(value)
|
106
106
|
end
|
107
107
|
|
108
|
-
it "
|
108
|
+
it "lazily deserializes when read" do
|
109
109
|
expect(@object.data).to eq({ "some" => "data" })
|
110
110
|
end
|
111
111
|
|
@@ -118,7 +118,8 @@ describe Riak::RObject do
|
|
118
118
|
expect(@object.data).to eq('deserialized')
|
119
119
|
end
|
120
120
|
|
121
|
-
it 'does not allow it to be assigned directly to data
|
121
|
+
it 'does not allow it to be assigned directly to data' do
|
122
|
+
# it should be assigned to raw_data instead
|
122
123
|
expect {
|
123
124
|
@object.data = io_object
|
124
125
|
}.to raise_error(ArgumentError)
|
@@ -126,7 +127,7 @@ describe Riak::RObject do
|
|
126
127
|
end
|
127
128
|
end
|
128
129
|
|
129
|
-
it "
|
130
|
+
it "only marshal/demarshals when necessary" do
|
130
131
|
expect(@object).not_to receive(:serialize)
|
131
132
|
expect(@object).not_to receive(:deserialize)
|
132
133
|
@object.data = value = { "some" => "data" }
|
@@ -166,55 +167,55 @@ describe Riak::RObject do
|
|
166
167
|
expect(@object).to be_kind_of(Riak::RObject)
|
167
168
|
end
|
168
169
|
|
169
|
-
it "
|
170
|
+
it "loads the content type" do
|
170
171
|
expect(@object.content_type).to eq("application/json")
|
171
172
|
end
|
172
173
|
|
173
|
-
it "
|
174
|
+
it "loads the body data" do
|
174
175
|
expect(@object.data).to be_present
|
175
176
|
end
|
176
177
|
|
177
|
-
it "
|
178
|
+
it "deserializes the body data" do
|
178
179
|
expect(@object.data).to eq({"email" => "mail@test.com", "_type" => "User"})
|
179
180
|
end
|
180
181
|
|
181
|
-
it "
|
182
|
+
it "sets the vclock" do
|
182
183
|
expect(@object.vclock).to eq("a85hYGBgzmDKBVIsCfs+fc9gSN9wlA8q/hKosDpIOAsA")
|
183
184
|
end
|
184
185
|
|
185
|
-
it "
|
186
|
+
it "loads and parse links" do
|
186
187
|
expect(@object.links.size).to eq(1)
|
187
188
|
expect(@object.links.first.url).to eq("/riak/addresses/A2cbUQ2KEMbeyWGtdz97LoTi1DN")
|
188
189
|
expect(@object.links.first.rel).to eq("home_address")
|
189
190
|
end
|
190
191
|
|
191
|
-
it "
|
192
|
+
it "loads and parse indexes" do
|
192
193
|
expect(@object.indexes.size).to eq(2)
|
193
194
|
expect(@object.indexes['email_bin'].size).to eq(2)
|
194
195
|
expect(@object.indexes['rank_int'].size).to eq(1)
|
195
196
|
end
|
196
197
|
|
197
|
-
it "
|
198
|
+
it "sets the ETag" do
|
198
199
|
expect(@object.etag).to eq("5bnavU3rrubcxLI8EvFXhB")
|
199
200
|
end
|
200
201
|
|
201
|
-
it "
|
202
|
+
it "sets modified date" do
|
202
203
|
expect(@object.last_modified.to_i).to eq(Time.httpdate("Mon, 12 Jul 2010 21:37:43 GMT").to_i)
|
203
204
|
end
|
204
205
|
|
205
|
-
it "
|
206
|
+
it "loads meta information" do
|
206
207
|
expect(@object.meta["King-Of-Robots"]).to eq(["I"])
|
207
208
|
end
|
208
209
|
|
209
|
-
it "
|
210
|
+
it "sets the key" do
|
210
211
|
expect(@object.key).to eq("A2IbUQ2KEMbe4WGtdL97LoTi1DN[(\\/)]")
|
211
212
|
end
|
212
213
|
|
213
|
-
it "
|
214
|
+
it "doesn't set conflict when there is none" do
|
214
215
|
expect(@object.conflict?).to be_falsey
|
215
216
|
end
|
216
217
|
|
217
|
-
it '
|
218
|
+
it 'returns [RContent] for siblings' do
|
218
219
|
expect(@object.siblings).to eq([@object.content])
|
219
220
|
end
|
220
221
|
|
@@ -234,27 +235,27 @@ describe Riak::RObject do
|
|
234
235
|
@object = Riak::RObject.load_from_mapreduce( @client, response ).first
|
235
236
|
end
|
236
237
|
|
237
|
-
it "
|
238
|
+
it "exposes siblings" do
|
238
239
|
expect(@object.siblings.size).to eq(2)
|
239
240
|
expect(@object.siblings[0].etag).to eq("5bnavU3rrubcxLI8EvFXhB")
|
240
241
|
expect(@object.siblings[1].etag).to eq("7jDZLdu0fIj2iRsjGD8qq8")
|
241
242
|
end
|
242
243
|
|
243
|
-
it "
|
244
|
+
it "raises the conflict? flag when in conflict" do
|
244
245
|
expect { @object.data }.to raise_error(Riak::Conflict)
|
245
246
|
expect(@object).to be_conflict
|
246
247
|
end
|
247
248
|
end
|
248
249
|
end
|
249
250
|
|
250
|
-
it "
|
251
|
+
it "doesn't allow duplicate links" do
|
251
252
|
@object = Riak::RObject.new(@bucket, "foo")
|
252
253
|
@object.links << Riak::Link.new("/riak/foo/baz", "next")
|
253
254
|
@object.links << Riak::Link.new("/riak/foo/baz", "next")
|
254
255
|
expect(@object.links.length).to eq(1)
|
255
256
|
end
|
256
257
|
|
257
|
-
it "
|
258
|
+
it "allows mass-overwriting indexes while preserving default behavior" do
|
258
259
|
@object = described_class.new(@bucket, 'foo')
|
259
260
|
@object.indexes = {"ts_int" => [12345], "foo_bin" => "bar"}
|
260
261
|
expect(@object.indexes['ts_int']).to eq(Set.new([12345]))
|
@@ -272,21 +273,21 @@ describe Riak::RObject do
|
|
272
273
|
# @headers = @object.store_headers
|
273
274
|
end
|
274
275
|
|
275
|
-
it "
|
276
|
+
it "raises an error when the content_type is blank" do
|
276
277
|
expect { @object.content_type = nil; @object.store }.to raise_error(ArgumentError)
|
277
278
|
expect { @object.content_type = " "; @object.store }.to raise_error(ArgumentError)
|
278
279
|
end
|
279
280
|
|
280
|
-
it "
|
281
|
+
it "raises an error when given an empty string as key" do
|
281
282
|
expect { @object.key = ''; @object.store }.to raise_error(ArgumentError)
|
282
283
|
end
|
283
284
|
|
284
|
-
it "
|
285
|
+
it "passes quorum parameters and returnbody to the backend" do
|
285
286
|
expect(@backend).to receive(:store_object).with(@object, :returnbody => false, :w => 3, :dw => 2).and_return(true)
|
286
287
|
@object.store(:returnbody => false, :w => 3, :dw => 2)
|
287
288
|
end
|
288
289
|
|
289
|
-
it "
|
290
|
+
it "raises an error if the object is in conflict" do
|
290
291
|
@object.siblings << Riak::RContent.new(@object)
|
291
292
|
expect { @object.store }.to raise_error(Riak::Conflict)
|
292
293
|
end
|
@@ -300,29 +301,29 @@ describe Riak::RObject do
|
|
300
301
|
@object.vclock = "somereallylongstring"
|
301
302
|
end
|
302
303
|
|
303
|
-
it "
|
304
|
+
it "returns without requesting if the key is blank" do
|
304
305
|
@object.key = nil
|
305
306
|
expect(@backend).not_to receive(:reload_object)
|
306
307
|
@object.reload
|
307
308
|
end
|
308
309
|
|
309
|
-
it "
|
310
|
+
it "returns without requesting if the vclock is blank" do
|
310
311
|
@object.vclock = nil
|
311
312
|
expect(@backend).not_to receive(:reload_object)
|
312
313
|
@object.reload
|
313
314
|
end
|
314
315
|
|
315
|
-
it "
|
316
|
+
it "reloads the object if the key is present" do
|
316
317
|
expect(@backend).to receive(:reload_object).with(@object, {}).and_return(@object)
|
317
318
|
@object.reload
|
318
319
|
end
|
319
320
|
|
320
|
-
it "
|
321
|
+
it "passes the requested R quorum to the backend" do
|
321
322
|
expect(@backend).to receive(:reload_object).with(@object, :r => 2).and_return(@object)
|
322
323
|
@object.reload :r => 2
|
323
324
|
end
|
324
325
|
|
325
|
-
it "
|
326
|
+
it "disables matching conditions if the key is present and the :force option is given" do
|
326
327
|
expect(@backend).to receive(:reload_object) do |obj, _|
|
327
328
|
expect(obj.etag).to be_nil
|
328
329
|
expect(obj.last_modified).to be_nil
|
@@ -339,42 +340,42 @@ describe Riak::RObject do
|
|
339
340
|
@object = Riak::RObject.new(@bucket, "bar")
|
340
341
|
end
|
341
342
|
|
342
|
-
it "
|
343
|
+
it "makes a DELETE request to the Riak server and freeze the object" do
|
343
344
|
expect(@backend).to receive(:delete_object).with(@bucket, "bar", {})
|
344
345
|
@object.delete
|
345
346
|
expect(@object).to be_frozen
|
346
347
|
end
|
347
348
|
|
348
|
-
it "
|
349
|
+
it "does nothing when the key is blank" do
|
349
350
|
expect(@backend).not_to receive(:delete_object)
|
350
351
|
@object.key = nil
|
351
352
|
@object.delete
|
352
353
|
end
|
353
354
|
|
354
|
-
it "
|
355
|
+
it "raises a failed request exception when the backend returns a server error" do
|
355
356
|
expect(@backend).to receive(:delete_object).
|
356
357
|
and_raise(Riak::ProtobuffsFailedRequest.new(:server_error, "server error"))
|
357
358
|
expect { @object.delete }.to raise_error(Riak::FailedRequest)
|
358
359
|
end
|
359
360
|
|
360
|
-
it "
|
361
|
+
it "sends the vector clock to the backend if present" do
|
361
362
|
@object.vclock = "somevclock"
|
362
363
|
expect(@backend).to receive(:delete_object).with(@bucket, "bar", {:vclock => "somevclock"})
|
363
364
|
@object.delete
|
364
365
|
end
|
365
366
|
end
|
366
367
|
|
367
|
-
it "
|
368
|
+
it "doesn't convert to link without a tag" do
|
368
369
|
@object = Riak::RObject.new(@bucket, "bar")
|
369
370
|
expect { @object.to_link }.to raise_error
|
370
371
|
end
|
371
372
|
|
372
|
-
it "
|
373
|
+
it "converts to a link having the same url and a supplied tag" do
|
373
374
|
@object = Riak::RObject.new(@bucket, "bar")
|
374
375
|
expect(@object.to_link("next")).to eq(Riak::Link.new("/riak/foo/bar", "next"))
|
375
376
|
end
|
376
377
|
|
377
|
-
it "
|
378
|
+
it "escapes the bucket and key when converting to a link" do
|
378
379
|
@object = Riak::RObject.new(@bucket, "deep/path")
|
379
380
|
expect(@bucket).to receive(:name).and_return("bucket spaces")
|
380
381
|
expect(@object.to_link("bar").url).to eq("/riak/bucket%20spaces/deep%2Fpath")
|