riak-client 2.2.0.pre1 → 2.2.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +0 -2
- data/README.markdown +11 -7
- data/RELEASE_NOTES.md +29 -2
- data/Rakefile +5 -3
- data/lib/riak/bucket.rb +55 -23
- data/lib/riak/bucket_properties.rb +8 -1
- data/lib/riak/bucket_type.rb +29 -0
- data/lib/riak/bucket_typed/bucket.rb +15 -7
- data/lib/riak/client.rb +24 -8
- data/lib/riak/client/beefcake/bucket_properties_operator.rb +8 -8
- data/lib/riak/client/beefcake/crdt/set_loader.rb +1 -1
- data/lib/riak/client/beefcake/crdt_loader.rb +1 -1
- data/lib/riak/client/beefcake/crdt_operator.rb +9 -9
- data/lib/riak/client/beefcake/message_codes.rb +4 -0
- data/lib/riak/client/beefcake/message_overlay.rb +4 -0
- data/lib/riak/client/beefcake/messages.rb +35 -5
- data/lib/riak/client/beefcake/object_methods.rb +21 -13
- data/lib/riak/client/beefcake/protocol.rb +7 -7
- data/lib/riak/client/beefcake/socket.rb +2 -2
- data/lib/riak/client/beefcake_protobuffs_backend.rb +58 -33
- data/lib/riak/client/protobuffs_backend.rb +5 -5
- data/lib/riak/client/yokozuna.rb +3 -3
- data/lib/riak/core_ext/deep_dup.rb +1 -1
- data/lib/riak/counter.rb +10 -10
- data/lib/riak/crdt/base.rb +39 -21
- data/lib/riak/crdt/batch_counter.rb +5 -5
- data/lib/riak/crdt/batch_map.rb +2 -2
- data/lib/riak/crdt/counter.rb +7 -7
- data/lib/riak/crdt/inner_counter.rb +4 -4
- data/lib/riak/crdt/inner_flag.rb +3 -3
- data/lib/riak/crdt/inner_map.rb +1 -1
- data/lib/riak/crdt/inner_register.rb +1 -1
- data/lib/riak/crdt/inner_set.rb +5 -5
- data/lib/riak/crdt/map.rb +9 -9
- data/lib/riak/crdt/set.rb +10 -10
- data/lib/riak/crdt/typed_collection.rb +39 -36
- data/lib/riak/errors/base.rb +1 -1
- data/lib/riak/errors/crdt_error.rb +20 -0
- data/lib/riak/errors/search_error.rb +6 -0
- data/lib/riak/index_collection.rb +1 -1
- data/lib/riak/link.rb +5 -3
- data/lib/riak/locale/en.yml +5 -1
- data/lib/riak/map_reduce.rb +7 -7
- data/lib/riak/map_reduce/filter_builder.rb +2 -2
- data/lib/riak/map_reduce/phase.rb +2 -2
- data/lib/riak/preflist_item.rb +7 -0
- data/lib/riak/rcontent.rb +8 -8
- data/lib/riak/robject.rb +27 -14
- data/lib/riak/search.rb +1 -0
- data/lib/riak/search/index.rb +17 -3
- data/lib/riak/search/query.rb +14 -6
- data/lib/riak/search/result_collection.rb +56 -3
- data/lib/riak/search/result_document.rb +71 -1
- data/lib/riak/search/schema.rb +6 -6
- data/lib/riak/secondary_index.rb +20 -12
- data/lib/riak/serializers.rb +0 -1
- data/lib/riak/util/escape.rb +2 -2
- data/lib/riak/util/translation.rb +1 -2
- data/lib/riak/version.rb +1 -1
- data/lib/riak/walk_spec.rb +67 -32
- data/riak-client.gemspec +5 -4
- data/spec/integration/riak/bucket_types_spec.rb +35 -5
- data/spec/integration/riak/conflict_resolution_spec.rb +1 -1
- data/spec/integration/riak/counters_spec.rb +1 -1
- data/spec/integration/riak/crdt/configuration_spec.rb +37 -0
- data/spec/integration/riak/crdt_search_spec.rb +176 -0
- data/spec/integration/riak/crdt_spec.rb +9 -33
- data/spec/integration/riak/crdt_validation/map_spec.rb +4 -4
- data/spec/integration/riak/crdt_validation/set_spec.rb +13 -13
- data/spec/integration/riak/preflist_spec.rb +31 -0
- data/spec/integration/riak/protobuffs/interrupted_request_spec.rb +2 -2
- data/spec/integration/riak/protobuffs_backends_spec.rb +9 -2
- data/spec/integration/riak/search_spec.rb +3 -3
- data/spec/integration/riak/secondary_index_spec.rb +3 -3
- data/spec/integration/riak/security_spec.rb +7 -7
- data/spec/integration/yokozuna/queries_spec.rb +1 -1
- data/spec/riak/beefcake_protobuffs_backend/bucket_properties_operator_spec.rb +9 -9
- data/spec/riak/beefcake_protobuffs_backend/crdt_operator_spec.rb +9 -9
- data/spec/riak/beefcake_protobuffs_backend/protocol_spec.rb +5 -5
- data/spec/riak/beefcake_protobuffs_backend_spec.rb +8 -8
- data/spec/riak/bucket_properties_spec.rb +27 -6
- data/spec/riak/bucket_spec.rb +5 -5
- data/spec/riak/bucket_type_spec.rb +21 -5
- data/spec/riak/bucket_typed/bucket_spec.rb +62 -0
- data/spec/riak/client_spec.rb +36 -18
- data/spec/riak/counter_spec.rb +4 -4
- data/spec/riak/crdt/counter_spec.rb +2 -2
- data/spec/riak/crdt/inner_flag_spec.rb +2 -2
- data/spec/riak/crdt/inner_map_spec.rb +4 -4
- data/spec/riak/crdt/inner_register_spec.rb +1 -1
- data/spec/riak/crdt/map_spec.rb +4 -4
- data/spec/riak/crdt/shared_examples.rb +5 -5
- data/spec/riak/crdt/typed_collection_spec.rb +21 -21
- data/spec/riak/map_reduce/filter_builder_spec.rb +2 -2
- data/spec/riak/map_reduce/phase_spec.rb +4 -4
- data/spec/riak/map_reduce_spec.rb +60 -42
- data/spec/riak/multiget_spec.rb +2 -2
- data/spec/riak/robject_spec.rb +55 -14
- data/spec/riak/search/index_spec.rb +12 -2
- data/spec/riak/search/query_spec.rb +4 -4
- data/spec/riak/search/result_collection_spec.rb +6 -4
- data/spec/riak/search/result_document_spec.rb +52 -9
- data/spec/riak/search/schema_spec.rb +2 -2
- data/spec/riak/secondary_index_spec.rb +6 -6
- data/spec/riak/serializers_spec.rb +27 -10
- data/spec/riak/walk_spec_spec.rb +10 -6
- data/spec/spec_helper.rb +11 -2
- data/spec/support/crdt_search_config.rb +112 -0
- data/spec/support/crdt_search_fixtures.rb +42 -0
- data/spec/support/search_config.rb +7 -5
- data/spec/support/search_corpus_setup.rb +2 -2
- data/spec/support/test_client.rb +2 -2
- data/spec/support/unified_backend_examples.rb +5 -5
- data/spec/support/version_filter.rb +5 -3
- data/spec/support/wait_until.rb +9 -3
- metadata +36 -13
- data/spec/riak/bucket_typed/bucket.rb +0 -43
data/spec/riak/bucket_spec.rb
CHANGED
|
@@ -38,7 +38,7 @@ describe Riak::Bucket do
|
|
|
38
38
|
@bucket.keys do |list|
|
|
39
39
|
all_keys.concat(list)
|
|
40
40
|
end
|
|
41
|
-
expect(all_keys).to eq(
|
|
41
|
+
expect(all_keys).to eq(%w(bar baz))
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
it "fetches a fresh list of keys" do
|
|
@@ -66,7 +66,7 @@ describe Riak::Bucket do
|
|
|
66
66
|
describe "accessing a counter" do
|
|
67
67
|
it "returns a counter object" do
|
|
68
68
|
expect(Riak::Counter).to receive(:new).with(@bucket, 'asdf').and_return('example counter')
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
new_counter = @bucket.counter 'asdf'
|
|
71
71
|
|
|
72
72
|
expect(new_counter).to eq('example counter')
|
|
@@ -146,7 +146,7 @@ describe Riak::Bucket do
|
|
|
146
146
|
|
|
147
147
|
it "returns the existing object if present" do
|
|
148
148
|
@object = double("RObject")
|
|
149
|
-
expect(@backend).to receive(:fetch_object).with(@bucket,"db", {}).and_return(@object)
|
|
149
|
+
expect(@backend).to receive(:fetch_object).with(@bucket, "db", {}).and_return(@object)
|
|
150
150
|
expect(@bucket.get_or_new('db')).to eq(@object)
|
|
151
151
|
end
|
|
152
152
|
|
|
@@ -164,7 +164,7 @@ describe Riak::Bucket do
|
|
|
164
164
|
|
|
165
165
|
it "passes the given R quorum parameter to the backend" do
|
|
166
166
|
@object = double("RObject")
|
|
167
|
-
expect(@backend).to receive(:fetch_object).with(@bucket,"db", {:r => "all"}).and_return(@object)
|
|
167
|
+
expect(@backend).to receive(:fetch_object).with(@bucket, "db", {:r => "all"}).and_return(@object)
|
|
168
168
|
expect(@bucket.get_or_new('db', :r => "all")).to eq(@object)
|
|
169
169
|
end
|
|
170
170
|
end
|
|
@@ -243,7 +243,7 @@ describe Riak::Bucket do
|
|
|
243
243
|
|
|
244
244
|
it "sets the #{q} quorum" do
|
|
245
245
|
expect(@bucket).to receive(:props=).with(hash_including("#{q}" => 1))
|
|
246
|
-
@bucket.send("#{q}=",1)
|
|
246
|
+
@bucket.send("#{q}=", 1)
|
|
247
247
|
end
|
|
248
248
|
end
|
|
249
249
|
end
|
|
@@ -24,11 +24,27 @@ describe Riak::BucketType do
|
|
|
24
24
|
expect(typed_bucket.type).to eq subject
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
describe 'equality' do
|
|
28
|
+
let(:same){ described_class.new client, name }
|
|
29
|
+
let(:different_client){ described_class.new Riak::Client.allocate, name }
|
|
30
|
+
let(:different_name){ described_class.new client, 'different name' }
|
|
31
|
+
it { is_expected.to eq same }
|
|
32
|
+
it { is_expected.to_not eq different_client }
|
|
33
|
+
it { is_expected.to_not eq different_name }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe 'properties' do
|
|
37
|
+
let(:props_expectation){ expect(backend).to receive(:get_bucket_type_props).with(name) }
|
|
28
38
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
39
|
+
it 'is queryable' do
|
|
40
|
+
props_expectation.and_return(allow_mult: true)
|
|
41
|
+
expect(props = subject.properties).to be_a Hash
|
|
42
|
+
expect(props[:allow_mult]).to be
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'asks for data type' do
|
|
46
|
+
props_expectation.and_return(datatype: 'set')
|
|
47
|
+
expect(subject.data_type_class).to eq Riak::Crdt::Set
|
|
48
|
+
end
|
|
33
49
|
end
|
|
34
50
|
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'riak/bucket_typed/bucket'
|
|
3
|
+
|
|
4
|
+
describe Riak::BucketTyped::Bucket do
|
|
5
|
+
let(:client){ Riak::Client.allocate }
|
|
6
|
+
let(:type){ client.bucket_type 'type' }
|
|
7
|
+
let(:name){ 'bucket_typed_bucket_spec' }
|
|
8
|
+
|
|
9
|
+
subject{ described_class.new client, name, type }
|
|
10
|
+
|
|
11
|
+
it 'initializes a typed RObject' do
|
|
12
|
+
typed_robject = subject.new 'panther'
|
|
13
|
+
expect(typed_robject).to be_a Riak::RObject
|
|
14
|
+
expect(typed_robject.key).to eq 'panther'
|
|
15
|
+
expect(typed_robject.bucket.type).to eq type
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'has a bucket type' do
|
|
19
|
+
expect(subject.type).to eq type
|
|
20
|
+
expect(subject.type.name).to eq 'type'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe 'equality' do
|
|
24
|
+
let(:same){ described_class.new client, name, type }
|
|
25
|
+
let(:different){ described_class.new client, 'other', type }
|
|
26
|
+
let(:untyped){ Riak::Bucket.new client, name }
|
|
27
|
+
it { is_expected.to eq subject }
|
|
28
|
+
it { is_expected.to eq same }
|
|
29
|
+
it { is_expected.to_not eq untyped }
|
|
30
|
+
it { is_expected.to_not eq different }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe 'bucket properties' do
|
|
34
|
+
it 'returns properties scoped by bucket and type' do
|
|
35
|
+
expect(client).to receive(:get_bucket_props).
|
|
36
|
+
with(subject, { type: subject.type.name }).
|
|
37
|
+
and_return('allow_mult' => true)
|
|
38
|
+
|
|
39
|
+
expect(props = subject.props).to be_a Hash
|
|
40
|
+
expect(props['allow_mult']).to be
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'clears properties scoped by bucket and type' do
|
|
44
|
+
expect(client).to receive(:clear_bucket_props).
|
|
45
|
+
with(subject, { type: subject.type.name })
|
|
46
|
+
|
|
47
|
+
expect{ subject.clear_props }.to_not raise_error
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'sets properties scoped by bucket and type' do
|
|
51
|
+
expect(client).to receive(:get_bucket_props).
|
|
52
|
+
with(subject, { type: subject.type.name }).
|
|
53
|
+
and_return('allow_mult' => false)
|
|
54
|
+
expect(client).to receive(:set_bucket_props).
|
|
55
|
+
with(subject,
|
|
56
|
+
{ 'allow_mult' => true },
|
|
57
|
+
subject.type.name)
|
|
58
|
+
|
|
59
|
+
expect{ subject.props = { 'allow_mult' => true } }.to_not raise_error
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
data/spec/riak/client_spec.rb
CHANGED
|
@@ -26,15 +26,16 @@ describe Riak::Client, test_client: true do
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
it "creates a client ID if not specified" do
|
|
29
|
-
expect(Riak::Client.new(pb_port: test_client.nodes.first.pb_port).
|
|
29
|
+
expect(Riak::Client.new(pb_port: test_client.nodes.first.pb_port).
|
|
30
|
+
client_id).to_not be_nil
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
it "accepts multiple nodes" do
|
|
33
|
-
client = Riak::Client.new :
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
client = Riak::Client.new nodes: [
|
|
35
|
+
{host: 'riak1.basho.com'},
|
|
36
|
+
{host: 'riak2.basho.com', pb_port: 1234},
|
|
37
|
+
{host: 'riak3.basho.com', pb_port: 5678}
|
|
38
|
+
]
|
|
38
39
|
expect(client.nodes.size).to eq(3)
|
|
39
40
|
expect(client.nodes.first.host).to eq("riak1.basho.com")
|
|
40
41
|
end
|
|
@@ -64,11 +65,15 @@ describe Riak::Client, test_client: true do
|
|
|
64
65
|
end
|
|
65
66
|
|
|
66
67
|
it "rejects an integer equal to the maximum client id" do
|
|
67
|
-
expect
|
|
68
|
+
expect do
|
|
69
|
+
@client.client_id = Riak::Client::MAX_CLIENT_ID
|
|
70
|
+
end.to raise_error(ArgumentError)
|
|
68
71
|
end
|
|
69
72
|
|
|
70
73
|
it "rejects an integer larger than the maximum client id" do
|
|
71
|
-
expect
|
|
74
|
+
expect do
|
|
75
|
+
@client.client_id = Riak::Client::MAX_CLIENT_ID + 1
|
|
76
|
+
end.to raise_error(ArgumentError)
|
|
72
77
|
end
|
|
73
78
|
end
|
|
74
79
|
end
|
|
@@ -91,8 +96,11 @@ describe Riak::Client, test_client: true do
|
|
|
91
96
|
end
|
|
92
97
|
|
|
93
98
|
it "raises an error when the chosen backend is not valid" do
|
|
94
|
-
expect(Riak::Client::BeefcakeProtobuffsBackend).to receive(:configured?).
|
|
95
|
-
|
|
99
|
+
expect(Riak::Client::BeefcakeProtobuffsBackend).to receive(:configured?).
|
|
100
|
+
and_return(false)
|
|
101
|
+
expect do
|
|
102
|
+
@client.protobuffs { |x| }
|
|
103
|
+
end.to raise_error Riak::BackendCreationError
|
|
96
104
|
end
|
|
97
105
|
end
|
|
98
106
|
|
|
@@ -112,8 +120,12 @@ describe Riak::Client, test_client: true do
|
|
|
112
120
|
before :each do
|
|
113
121
|
@client = Riak::Client.new
|
|
114
122
|
@bucket = @client.bucket('foo')
|
|
115
|
-
expect(@bucket).to receive(:[]).
|
|
116
|
-
|
|
123
|
+
expect(@bucket).to receive(:[]).
|
|
124
|
+
with('value1').
|
|
125
|
+
and_return(double('robject'))
|
|
126
|
+
expect(@bucket).to receive(:[]).
|
|
127
|
+
with('value2').
|
|
128
|
+
and_return(double('robject'))
|
|
117
129
|
@pairs = [
|
|
118
130
|
[@bucket, 'value1'],
|
|
119
131
|
[@bucket, 'value2']
|
|
@@ -143,13 +155,19 @@ describe Riak::Client, test_client: true do
|
|
|
143
155
|
end
|
|
144
156
|
|
|
145
157
|
it "fetches bucket properties if asked" do
|
|
146
|
-
expect(@backend).to receive(:get_bucket_props)
|
|
158
|
+
expect(@backend).to receive(:get_bucket_props) do |b|
|
|
159
|
+
expect(b.name).to eq("foo")
|
|
160
|
+
{}
|
|
161
|
+
end
|
|
147
162
|
@client.bucket("foo", :props => true)
|
|
148
163
|
end
|
|
149
164
|
|
|
150
165
|
it "memoizes bucket parameters" do
|
|
151
166
|
@bucket = double("Bucket")
|
|
152
|
-
expect(Riak::Bucket).to receive(:new).
|
|
167
|
+
expect(Riak::Bucket).to receive(:new).
|
|
168
|
+
with(@client, "baz").
|
|
169
|
+
once.
|
|
170
|
+
and_return(@bucket)
|
|
153
171
|
expect(@client.bucket("baz")).to eq(@bucket)
|
|
154
172
|
expect(@client.bucket("baz")).to eq(@bucket)
|
|
155
173
|
end
|
|
@@ -194,14 +212,14 @@ describe Riak::Client, test_client: true do
|
|
|
194
212
|
|
|
195
213
|
describe "when receiving errors from the backend" do
|
|
196
214
|
before do
|
|
197
|
-
@client = Riak::Client.new
|
|
215
|
+
@client = Riak::Client.new
|
|
198
216
|
end
|
|
199
217
|
|
|
200
218
|
it "retries on recoverable errors" do
|
|
201
219
|
call_count = 0
|
|
202
|
-
|
|
220
|
+
|
|
203
221
|
begin
|
|
204
|
-
@client.backend do |b|
|
|
222
|
+
@client.backend do |b|
|
|
205
223
|
call_count += 1
|
|
206
224
|
raise Riak::ProtobuffsFailedHeader
|
|
207
225
|
end
|
|
@@ -214,7 +232,7 @@ describe Riak::Client, test_client: true do
|
|
|
214
232
|
it "throws a RuntimeError if it runs out of retries" do
|
|
215
233
|
error = nil
|
|
216
234
|
begin
|
|
217
|
-
@client.backend do |b|
|
|
235
|
+
@client.backend do |b|
|
|
218
236
|
raise Riak::ProtobuffsFailedHeader
|
|
219
237
|
end
|
|
220
238
|
rescue RuntimeError => e
|
data/spec/riak/counter_spec.rb
CHANGED
|
@@ -22,10 +22,10 @@ describe Riak::Counter do
|
|
|
22
22
|
allow(@bad_bucket).to receive(:client).and_return(double('client'))
|
|
23
23
|
|
|
24
24
|
expect{ctr = Riak::Counter.new @bad_bucket, @key}.to raise_error(ArgumentError)
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
describe "incrementing and decrementing" do
|
|
30
30
|
before :each do
|
|
31
31
|
@backend = double 'backend'
|
|
@@ -92,7 +92,7 @@ describe Riak::Counter do
|
|
|
92
92
|
|
|
93
93
|
@fake_pool = double 'pool'
|
|
94
94
|
@backend = double 'backend'
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
@client = Riak::Client.new nodes: @nodes
|
|
97
97
|
@client.instance_variable_set :@protobuffs_pool, @fake_pool
|
|
98
98
|
|
|
@@ -113,7 +113,7 @@ describe Riak::Counter do
|
|
|
113
113
|
@expect_post.once.and_raise('timeout')
|
|
114
114
|
expect(proc { @ctr.increment }).to raise_error
|
|
115
115
|
end
|
|
116
|
-
|
|
116
|
+
|
|
117
117
|
it "doesn't retry on quorum failure" do
|
|
118
118
|
@expect_post.once.and_raise('quorum not satisfied')
|
|
119
119
|
expect(proc { @ctr.increment }).to raise_error
|
|
@@ -22,14 +22,14 @@ describe Riak::Crdt::Counter do
|
|
|
22
22
|
let(:loader){ double 'loader', get_loader_for_value: nil }
|
|
23
23
|
let(:backend){ double 'backend' }
|
|
24
24
|
let(:client){ double 'client' }
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
before(:each) do
|
|
27
27
|
allow(bucket).to receive(:client).and_return(client)
|
|
28
28
|
allow(client).to receive(:backend).and_yield(backend)
|
|
29
29
|
allow(backend).to receive(:crdt_operator).and_return(operator)
|
|
30
30
|
allow(backend).to receive(:crdt_loader).and_return(loader)
|
|
31
31
|
end
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
include_examples 'Counter CRDT'
|
|
34
34
|
|
|
35
35
|
it 'batches properly' do
|
|
@@ -9,7 +9,7 @@ describe Riak::Crdt::InnerFlag do
|
|
|
9
9
|
expect(subject).to be
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
describe 'a falsey flag' do
|
|
14
14
|
subject { described_class.new parent, false }
|
|
15
15
|
|
|
@@ -20,7 +20,7 @@ describe Riak::Crdt::InnerFlag do
|
|
|
20
20
|
|
|
21
21
|
describe 'updating' do
|
|
22
22
|
let(:new_value){ false }
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
it '\asks the class for an update operation' do
|
|
25
25
|
operation = described_class.update(new_value)
|
|
26
26
|
|
|
@@ -13,10 +13,10 @@ describe Riak::Crdt::InnerMap do
|
|
|
13
13
|
flags: {bravo: true},
|
|
14
14
|
maps: {},
|
|
15
15
|
registers: {delta: 'the expendables' },
|
|
16
|
-
sets: {echo: %w{stallone statham li lundgren}}
|
|
16
|
+
sets: {echo: %w{stallone statham li lundgren}}
|
|
17
17
|
}
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
it 'is initializable with a nested hash of maps' do
|
|
21
21
|
expect{described_class.new parent, populated_contents}.
|
|
22
22
|
to_not raise_error
|
|
@@ -34,13 +34,13 @@ describe Riak::Crdt::InnerMap do
|
|
|
34
34
|
let(:inner_operation){ double 'inner operation' }
|
|
35
35
|
it 'wraps the operation in an update operation and pass it to the parent' do
|
|
36
36
|
subject.name = 'name'
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
expect(parent).to receive(:operate) do |name, op|
|
|
39
39
|
expect(name).to eq 'name'
|
|
40
40
|
expect(op.type).to eq :map
|
|
41
41
|
expect(op.value).to eq inner_operation
|
|
42
42
|
end
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
subject.operate inner_operation
|
|
45
45
|
end
|
|
46
46
|
end
|
data/spec/riak/crdt/map_spec.rb
CHANGED
|
@@ -15,7 +15,7 @@ describe Riak::Crdt::Map do
|
|
|
15
15
|
let(:backend){ double 'backend' }
|
|
16
16
|
let(:client){ double 'client' }
|
|
17
17
|
let(:key){ 'map' }
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
before(:each) do
|
|
20
20
|
allow(client).to receive(:backend).and_yield(backend)
|
|
21
21
|
allow(backend).to receive(:crdt_operator).and_return(operator)
|
|
@@ -23,9 +23,9 @@ describe Riak::Crdt::Map do
|
|
|
23
23
|
allow(loader).to receive(:load).and_return({})
|
|
24
24
|
allow(loader).to receive(:context).and_return('context')
|
|
25
25
|
end
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
subject{ described_class.new bucket, key }
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
include_examples 'Map CRDT'
|
|
30
30
|
|
|
31
31
|
describe 'batch mode' do
|
|
@@ -38,7 +38,7 @@ describe Riak::Crdt::Map do
|
|
|
38
38
|
expect(type).to eq subject.bucket_type
|
|
39
39
|
|
|
40
40
|
expect(operations.length).to eq 2
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
expect(operations.first).to be_a Riak::Crdt::Operation::Update
|
|
43
43
|
|
|
44
44
|
expect(operations.first.value).to be_a Riak::Crdt::Operation::Update
|
|
@@ -5,22 +5,22 @@ shared_examples_for "Map CRDT" do
|
|
|
5
5
|
expect(subject).to respond_to(:counters)
|
|
6
6
|
expect(subject.counters).to be_an_instance_of typed_collection
|
|
7
7
|
end
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
it 'contains flags' do
|
|
10
10
|
expect(subject).to respond_to(:flags)
|
|
11
11
|
expect(subject.counters).to be_an_instance_of typed_collection
|
|
12
12
|
end
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
it 'contains maps' do
|
|
15
15
|
expect(subject).to respond_to(:maps)
|
|
16
16
|
expect(subject.counters).to be_an_instance_of typed_collection
|
|
17
17
|
end
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
it 'contains registers' do
|
|
20
20
|
expect(subject).to respond_to(:registers)
|
|
21
21
|
expect(subject.counters).to be_an_instance_of typed_collection
|
|
22
22
|
end
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
it 'contains sets' do
|
|
25
25
|
expect(subject).to respond_to(:sets)
|
|
26
26
|
expect(subject.counters).to be_an_instance_of typed_collection
|
|
@@ -35,7 +35,7 @@ shared_examples_for "Counter CRDT" do
|
|
|
35
35
|
it 'has a value' do
|
|
36
36
|
expect(subject).to respond_to :value
|
|
37
37
|
end
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
it 'has an increment method' do
|
|
40
40
|
expect(subject).to respond_to :increment
|
|
41
41
|
end
|
|
@@ -16,7 +16,7 @@ describe Riak::Crdt::TypedCollection do
|
|
|
16
16
|
subject do
|
|
17
17
|
described_class.new register_class, parent, existing: 'existing'
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
it 'exposes them as frozen strings that are really Registers' do
|
|
21
21
|
expect(subject[:existing]).to eq 'existing'
|
|
22
22
|
expect(subject['existing']).to eq 'existing'
|
|
@@ -28,7 +28,7 @@ describe Riak::Crdt::TypedCollection do
|
|
|
28
28
|
describe 'creating and updating' do
|
|
29
29
|
|
|
30
30
|
let(:new_value){ 'the new value' }
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
it 'asks the register class for an operation' do
|
|
33
33
|
expect(register_class).to receive(:update).
|
|
34
34
|
with(new_value).
|
|
@@ -70,7 +70,7 @@ describe Riak::Crdt::TypedCollection do
|
|
|
70
70
|
subject do
|
|
71
71
|
described_class.new flag_class, parent, truthy: true, falsey: false
|
|
72
72
|
end
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
it 'exposes them as booleans' do
|
|
75
75
|
expect(subject[:truthy]).to eq true
|
|
76
76
|
expect(subject['falsey']).to eq false
|
|
@@ -92,7 +92,7 @@ describe Riak::Crdt::TypedCollection do
|
|
|
92
92
|
|
|
93
93
|
subject['become_truthy'] = true
|
|
94
94
|
end
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
it 'deletes them' do
|
|
97
97
|
expect(flag_class).
|
|
98
98
|
to receive(:delete).
|
|
@@ -113,22 +113,22 @@ describe Riak::Crdt::TypedCollection do
|
|
|
113
113
|
let(:counter_class){ Riak::Crdt::InnerCounter }
|
|
114
114
|
|
|
115
115
|
subject{ described_class.new counter_class, parent, zero: 0, one: 1 }
|
|
116
|
-
|
|
116
|
+
|
|
117
117
|
it 'exposes existing ones as Counter instances' do
|
|
118
118
|
expect(subject['zero']).to be_an_instance_of counter_class
|
|
119
119
|
expect(subject['zero'].to_i).to eq 0
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
expect(subject['one'].to_i).to eq 1
|
|
122
122
|
end
|
|
123
|
-
|
|
123
|
+
|
|
124
124
|
it 'exposes new ones as Counter instances' do
|
|
125
125
|
expect(subject['new_zero']).to be_an_instance_of counter_class
|
|
126
126
|
expect(subject['new_zero'].to_i).to eq 0
|
|
127
127
|
end
|
|
128
|
-
|
|
128
|
+
|
|
129
129
|
it 'allows incrementing and decrementing' do
|
|
130
130
|
counter_name = 'counter'
|
|
131
|
-
|
|
131
|
+
|
|
132
132
|
expect(parent).to receive(:operate) do |op|
|
|
133
133
|
expect(op.name).to eq counter_name
|
|
134
134
|
expect(op.type).to eq :counter
|
|
@@ -141,7 +141,7 @@ describe Riak::Crdt::TypedCollection do
|
|
|
141
141
|
expect(op.type).to eq :counter
|
|
142
142
|
expect(op.value).to eq -5
|
|
143
143
|
end
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
subject[counter_name].decrement 5
|
|
146
146
|
end
|
|
147
147
|
end
|
|
@@ -149,17 +149,17 @@ describe Riak::Crdt::TypedCollection do
|
|
|
149
149
|
let(:set_class){ Riak::Crdt::InnerSet }
|
|
150
150
|
|
|
151
151
|
subject{ described_class.new set_class, parent, brewers: %w{aeropress clever v60}}
|
|
152
|
-
|
|
152
|
+
|
|
153
153
|
it 'exposes existing ones as Set instances' do
|
|
154
154
|
expect(subject['brewers']).to be_an_instance_of set_class
|
|
155
155
|
expect(subject['brewers']).to include 'aeropress'
|
|
156
156
|
end
|
|
157
|
-
|
|
157
|
+
|
|
158
158
|
it 'exposes new ones as empty Set instances' do
|
|
159
159
|
expect(subject['filters']).to be_an_instance_of set_class
|
|
160
160
|
expect(subject['filters']).to be_empty
|
|
161
161
|
end
|
|
162
|
-
|
|
162
|
+
|
|
163
163
|
it 'allows adding and removing' do
|
|
164
164
|
set_name = 'brewers'
|
|
165
165
|
|
|
@@ -180,7 +180,7 @@ describe Riak::Crdt::TypedCollection do
|
|
|
180
180
|
subject[set_name].remove 'aeropress'
|
|
181
181
|
end
|
|
182
182
|
end
|
|
183
|
-
|
|
183
|
+
|
|
184
184
|
describe 'maps' do
|
|
185
185
|
let(:map_class){ Riak::Crdt::InnerMap }
|
|
186
186
|
|
|
@@ -192,32 +192,32 @@ describe Riak::Crdt::TypedCollection do
|
|
|
192
192
|
sets: {}
|
|
193
193
|
}}
|
|
194
194
|
end
|
|
195
|
-
|
|
195
|
+
|
|
196
196
|
let(:inner_map_name){ 'inner map' }
|
|
197
|
-
|
|
197
|
+
|
|
198
198
|
subject do
|
|
199
199
|
described_class.new map_class, parent, contents
|
|
200
200
|
end
|
|
201
|
-
|
|
201
|
+
|
|
202
202
|
it 'exposes existing ones as populated Map instances' do
|
|
203
203
|
expect(subject['a']).to be_an_instance_of map_class
|
|
204
204
|
expect(subject['a'].registers['hello']).to eq 'world'
|
|
205
205
|
end
|
|
206
|
-
|
|
206
|
+
|
|
207
207
|
it 'exposes new ones as empty Map instances' do
|
|
208
208
|
expect(subject['b']).to be_an_instance_of map_class
|
|
209
209
|
expect(subject['b'].registers['hello']).to be_nil
|
|
210
210
|
end
|
|
211
|
-
|
|
211
|
+
|
|
212
212
|
it 'cascades operations to a parent map' do
|
|
213
213
|
expect(operation).
|
|
214
214
|
to receive(:name=).
|
|
215
215
|
with(inner_map_name)
|
|
216
|
-
|
|
216
|
+
|
|
217
217
|
expect(parent).
|
|
218
218
|
to receive(:operate).
|
|
219
219
|
with(operation)
|
|
220
|
-
|
|
220
|
+
|
|
221
221
|
subject.operate inner_map_name, operation
|
|
222
222
|
end
|
|
223
223
|
end
|