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.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +0 -2
  4. data/README.markdown +11 -7
  5. data/RELEASE_NOTES.md +29 -2
  6. data/Rakefile +5 -3
  7. data/lib/riak/bucket.rb +55 -23
  8. data/lib/riak/bucket_properties.rb +8 -1
  9. data/lib/riak/bucket_type.rb +29 -0
  10. data/lib/riak/bucket_typed/bucket.rb +15 -7
  11. data/lib/riak/client.rb +24 -8
  12. data/lib/riak/client/beefcake/bucket_properties_operator.rb +8 -8
  13. data/lib/riak/client/beefcake/crdt/set_loader.rb +1 -1
  14. data/lib/riak/client/beefcake/crdt_loader.rb +1 -1
  15. data/lib/riak/client/beefcake/crdt_operator.rb +9 -9
  16. data/lib/riak/client/beefcake/message_codes.rb +4 -0
  17. data/lib/riak/client/beefcake/message_overlay.rb +4 -0
  18. data/lib/riak/client/beefcake/messages.rb +35 -5
  19. data/lib/riak/client/beefcake/object_methods.rb +21 -13
  20. data/lib/riak/client/beefcake/protocol.rb +7 -7
  21. data/lib/riak/client/beefcake/socket.rb +2 -2
  22. data/lib/riak/client/beefcake_protobuffs_backend.rb +58 -33
  23. data/lib/riak/client/protobuffs_backend.rb +5 -5
  24. data/lib/riak/client/yokozuna.rb +3 -3
  25. data/lib/riak/core_ext/deep_dup.rb +1 -1
  26. data/lib/riak/counter.rb +10 -10
  27. data/lib/riak/crdt/base.rb +39 -21
  28. data/lib/riak/crdt/batch_counter.rb +5 -5
  29. data/lib/riak/crdt/batch_map.rb +2 -2
  30. data/lib/riak/crdt/counter.rb +7 -7
  31. data/lib/riak/crdt/inner_counter.rb +4 -4
  32. data/lib/riak/crdt/inner_flag.rb +3 -3
  33. data/lib/riak/crdt/inner_map.rb +1 -1
  34. data/lib/riak/crdt/inner_register.rb +1 -1
  35. data/lib/riak/crdt/inner_set.rb +5 -5
  36. data/lib/riak/crdt/map.rb +9 -9
  37. data/lib/riak/crdt/set.rb +10 -10
  38. data/lib/riak/crdt/typed_collection.rb +39 -36
  39. data/lib/riak/errors/base.rb +1 -1
  40. data/lib/riak/errors/crdt_error.rb +20 -0
  41. data/lib/riak/errors/search_error.rb +6 -0
  42. data/lib/riak/index_collection.rb +1 -1
  43. data/lib/riak/link.rb +5 -3
  44. data/lib/riak/locale/en.yml +5 -1
  45. data/lib/riak/map_reduce.rb +7 -7
  46. data/lib/riak/map_reduce/filter_builder.rb +2 -2
  47. data/lib/riak/map_reduce/phase.rb +2 -2
  48. data/lib/riak/preflist_item.rb +7 -0
  49. data/lib/riak/rcontent.rb +8 -8
  50. data/lib/riak/robject.rb +27 -14
  51. data/lib/riak/search.rb +1 -0
  52. data/lib/riak/search/index.rb +17 -3
  53. data/lib/riak/search/query.rb +14 -6
  54. data/lib/riak/search/result_collection.rb +56 -3
  55. data/lib/riak/search/result_document.rb +71 -1
  56. data/lib/riak/search/schema.rb +6 -6
  57. data/lib/riak/secondary_index.rb +20 -12
  58. data/lib/riak/serializers.rb +0 -1
  59. data/lib/riak/util/escape.rb +2 -2
  60. data/lib/riak/util/translation.rb +1 -2
  61. data/lib/riak/version.rb +1 -1
  62. data/lib/riak/walk_spec.rb +67 -32
  63. data/riak-client.gemspec +5 -4
  64. data/spec/integration/riak/bucket_types_spec.rb +35 -5
  65. data/spec/integration/riak/conflict_resolution_spec.rb +1 -1
  66. data/spec/integration/riak/counters_spec.rb +1 -1
  67. data/spec/integration/riak/crdt/configuration_spec.rb +37 -0
  68. data/spec/integration/riak/crdt_search_spec.rb +176 -0
  69. data/spec/integration/riak/crdt_spec.rb +9 -33
  70. data/spec/integration/riak/crdt_validation/map_spec.rb +4 -4
  71. data/spec/integration/riak/crdt_validation/set_spec.rb +13 -13
  72. data/spec/integration/riak/preflist_spec.rb +31 -0
  73. data/spec/integration/riak/protobuffs/interrupted_request_spec.rb +2 -2
  74. data/spec/integration/riak/protobuffs_backends_spec.rb +9 -2
  75. data/spec/integration/riak/search_spec.rb +3 -3
  76. data/spec/integration/riak/secondary_index_spec.rb +3 -3
  77. data/spec/integration/riak/security_spec.rb +7 -7
  78. data/spec/integration/yokozuna/queries_spec.rb +1 -1
  79. data/spec/riak/beefcake_protobuffs_backend/bucket_properties_operator_spec.rb +9 -9
  80. data/spec/riak/beefcake_protobuffs_backend/crdt_operator_spec.rb +9 -9
  81. data/spec/riak/beefcake_protobuffs_backend/protocol_spec.rb +5 -5
  82. data/spec/riak/beefcake_protobuffs_backend_spec.rb +8 -8
  83. data/spec/riak/bucket_properties_spec.rb +27 -6
  84. data/spec/riak/bucket_spec.rb +5 -5
  85. data/spec/riak/bucket_type_spec.rb +21 -5
  86. data/spec/riak/bucket_typed/bucket_spec.rb +62 -0
  87. data/spec/riak/client_spec.rb +36 -18
  88. data/spec/riak/counter_spec.rb +4 -4
  89. data/spec/riak/crdt/counter_spec.rb +2 -2
  90. data/spec/riak/crdt/inner_flag_spec.rb +2 -2
  91. data/spec/riak/crdt/inner_map_spec.rb +4 -4
  92. data/spec/riak/crdt/inner_register_spec.rb +1 -1
  93. data/spec/riak/crdt/map_spec.rb +4 -4
  94. data/spec/riak/crdt/shared_examples.rb +5 -5
  95. data/spec/riak/crdt/typed_collection_spec.rb +21 -21
  96. data/spec/riak/map_reduce/filter_builder_spec.rb +2 -2
  97. data/spec/riak/map_reduce/phase_spec.rb +4 -4
  98. data/spec/riak/map_reduce_spec.rb +60 -42
  99. data/spec/riak/multiget_spec.rb +2 -2
  100. data/spec/riak/robject_spec.rb +55 -14
  101. data/spec/riak/search/index_spec.rb +12 -2
  102. data/spec/riak/search/query_spec.rb +4 -4
  103. data/spec/riak/search/result_collection_spec.rb +6 -4
  104. data/spec/riak/search/result_document_spec.rb +52 -9
  105. data/spec/riak/search/schema_spec.rb +2 -2
  106. data/spec/riak/secondary_index_spec.rb +6 -6
  107. data/spec/riak/serializers_spec.rb +27 -10
  108. data/spec/riak/walk_spec_spec.rb +10 -6
  109. data/spec/spec_helper.rb +11 -2
  110. data/spec/support/crdt_search_config.rb +112 -0
  111. data/spec/support/crdt_search_fixtures.rb +42 -0
  112. data/spec/support/search_config.rb +7 -5
  113. data/spec/support/search_corpus_setup.rb +2 -2
  114. data/spec/support/test_client.rb +2 -2
  115. data/spec/support/unified_backend_examples.rb +5 -5
  116. data/spec/support/version_filter.rb +5 -3
  117. data/spec/support/wait_until.rb +9 -3
  118. metadata +36 -13
  119. data/spec/riak/bucket_typed/bucket.rb +0 -43
data/riak-client.gemspec CHANGED
@@ -7,9 +7,9 @@ Gem::Specification.new do |gem|
7
7
  gem.version = Riak::VERSION
8
8
  gem.summary = %Q{riak-client is a rich client for Riak, the distributed database by Basho.}
9
9
  gem.description = %Q{riak-client is a rich client for Riak, the distributed database by Basho. It supports the full HTTP and Protocol Buffers interfaces including storage operations, bucket configuration, link-walking, secondary indexes and map-reduce.}
10
- gem.email = ["sean@basho.com", 'bryce@basho.com']
10
+ gem.email = ['bryce@basho.com']
11
11
  gem.homepage = "http://github.com/basho/riak-ruby-client"
12
- gem.authors = ["Sean Cribbs", 'Bryce Kerley']
12
+ gem.authors = ['Bryce Kerley']
13
13
  gem.license = 'Apache 2.0'
14
14
 
15
15
  gem.required_ruby_version = '>= 1.9.3'
@@ -19,11 +19,12 @@ Gem::Specification.new do |gem|
19
19
  gem.add_development_dependency 'rake', '~> 10.1.1'
20
20
  gem.add_development_dependency 'yard', '~> 0.8.7'
21
21
  gem.add_development_dependency 'kramdown', '~> 1.4'
22
- gem.add_development_dependency 'simplecov', '~> 0.8.2'
22
+ gem.add_development_dependency 'simplecov', '~> 0.10.0'
23
23
  gem.add_development_dependency "instrumentable", "~> 1.1.0"
24
+ gem.add_development_dependency "rubocop", "~> 0.28.0"
24
25
 
25
26
  gem.add_runtime_dependency "i18n", ">=0.4.0"
26
- gem.add_runtime_dependency "beefcake", "~> 1.0"
27
+ gem.add_runtime_dependency "beefcake", "~> 1.1"
27
28
  gem.add_runtime_dependency "multi_json", "~>1.0"
28
29
  gem.add_runtime_dependency "innertube", "~>1.0.2"
29
30
  gem.add_runtime_dependency 'cert_validator', '~> 0.0.1'
@@ -41,6 +41,31 @@ describe 'Bucket Types', test_client: true, integration: true do
41
41
  expect(bucket.exists?('lawnmower')).to be
42
42
  end
43
43
 
44
+ describe 'loading and modifying a RObject' do
45
+ it "doesn't modify objects in other buckets" do
46
+ expect(o = bucket.get(object.key)).to be
47
+ o.data = 'updated'
48
+ o.store
49
+ o.reload
50
+
51
+ expect(o.data).to eq 'updated'
52
+
53
+ expect{ untyped_bucket.get(object.key)}.to raise_error(/not found/)
54
+
55
+ expect(o3 = bucket.get(object.key)).to be
56
+ expect(o3.data).to eq o.data
57
+ end
58
+
59
+ it "doesn't delete objects in other buckets'" do
60
+ expect{ untyped_object.reload }.to_not raise_error
61
+
62
+ expect(o = bucket.get(object.key)).to be
63
+ o.delete
64
+
65
+ expect{ untyped_object.reload }.to_not raise_error
66
+ end
67
+ end
68
+
44
69
  it 'only retrieves with a bucket type' do
45
70
  expect(bucket.get(object.key).data).to eq object.data
46
71
  expect{ untyped_bucket.get object.key }.to raise_error /not_found/
@@ -59,10 +84,15 @@ describe 'Bucket Types', test_client: true, integration: true do
59
84
  expect(bucket.keys).to include object.key
60
85
  end
61
86
 
87
+ it 'keeps the bucket type attached to value objects' do
88
+ expect(bucket.get(object.key).bucket).to eq bucket
89
+ expect(bucket.get(object.key).bucket.type).to eq bucket_type
90
+ end
91
+
62
92
  describe 'deletion' do
63
93
  it 'self-deletes with a bucket type' do
64
94
  expect(untyped_object).to be # ensure existence
65
-
95
+
66
96
  expect(object.delete).to be
67
97
  expect{ object.reload }.to raise_error /not_found/
68
98
  expect(untyped_object).to be
@@ -116,7 +146,7 @@ describe 'Bucket Types', test_client: true, integration: true do
116
146
  it 'map-reduces correctly with a robject in a typed bucket' do
117
147
  expect(object).to be
118
148
  expect(untyped_object).to be
119
-
149
+
120
150
  mapred.add object
121
151
  result = mapred.run
122
152
 
@@ -130,11 +160,11 @@ describe 'Bucket Types', test_client: true, integration: true do
130
160
  let(:bucket_type){ test_client.bucket_type 'yokozuna' }
131
161
  let(:bucket){ bucket_type.bucket random_key }
132
162
  let(:untyped_bucket){ test_client.bucket bucket.name }
133
-
163
+
134
164
  it 'allows reading and writing bucket properties' do
135
165
  expect(test_client.get_bucket_props(bucket, type: 'yokozuna')['last_write_wins']).to_not be
136
166
  expect(test_client.get_bucket_props(untyped_bucket)['last_write_wins']).to_not be
137
-
167
+
138
168
  # test setting
139
169
  expect{ bucket.props = {'last_write_wins' => true} }.to_not raise_error
140
170
 
@@ -152,7 +182,7 @@ describe 'Bucket Types', test_client: true, integration: true do
152
182
  # test clearing
153
183
  expect{ bucket.clear_props }.to_not raise_error
154
184
 
155
- # make sure clearing doesn't leak to canary setting on untyped bucket
185
+ # make sure clearing doesn't leak to canary setting on untyped bucket
156
186
  expect(test_client.get_bucket_props(bucket, type: 'yokozuna')['last_write_wins']).to_not be
157
187
  expect(test_client.get_bucket_props(untyped_bucket)['n_val']).to eq 1
158
188
  end
@@ -57,7 +57,7 @@ describe 'Conflict resolution', integration: true, test_client: true do
57
57
 
58
58
  subject.attempt_conflict_resolution
59
59
  subject.reload
60
-
60
+
61
61
  expect(subject).to_not be_conflict
62
62
  expect(subject.data).to eq 100
63
63
 
@@ -23,7 +23,7 @@ describe Riak::Counter, test_client: true, integration: true do
23
23
 
24
24
  5.times do
25
25
  amt = rand(10_000)
26
-
26
+
27
27
  @counter.increment amt
28
28
  expect(@counter.value).to eq(initial + amt)
29
29
 
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ require 'riak'
3
+
4
+ describe "CRDT configuration", integration: true, test_client: true do
5
+ let(:bucket) { random_bucket }
6
+
7
+ it "allows default bucket-types to be configured for each data type" do
8
+ expect(Riak::Crdt::Set.new(bucket, 'set').bucket_type).to eq 'sets'
9
+
10
+ Riak::Crdt::DEFAULT_BUCKET_TYPES[:set] = 'new_set_default'
11
+ expect(Riak::Crdt::Set.new(bucket, 'set').bucket_type).to eq 'new_set_default'
12
+
13
+ Riak::Crdt::DEFAULT_BUCKET_TYPES[:set] = 'sets'
14
+ expect(Riak::Crdt::Set.new(bucket, 'set').bucket_type).to eq 'sets'
15
+ end
16
+
17
+ describe 'overriding bucket-types' do
18
+ let(:name){ 'other_counters' }
19
+ let(:type){ test_client.bucket_type name }
20
+ let(:typed_bucket){ type.bucket bucket.name }
21
+
22
+ it "overrides with a string" do
23
+ ctr = Riak::Crdt::Counter.new(bucket, 'ctr', name)
24
+ expect(ctr.bucket_type).to eq name
25
+ end
26
+
27
+ it "overrides with a typed bucket" do
28
+ ctr = Riak::Crdt::Counter.new(typed_bucket, 'ctr')
29
+ expect(ctr.bucket_type).to eq name
30
+ end
31
+
32
+ it "overrides with a bucket type object" do
33
+ ctr = Riak::Crdt::Counter.new(bucket, 'ctr', type)
34
+ expect(ctr.bucket_type).to eq name
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,176 @@
1
+ require 'spec_helper'
2
+ require 'riak/search'
3
+
4
+ describe 'CRDT Search API', crdt_search_config: true do
5
+ describe 'querying maps' do
6
+ let(:query) { index.query 'arroz_register:frijoles' }
7
+
8
+ before(:all) do
9
+ expect(first_map).to be
10
+ end
11
+
12
+ subject{ query.results }
13
+
14
+ it 'finds maps' do
15
+ expect(subject.length).to be > 0
16
+ end
17
+
18
+ it 'provides access to maps through the #map accessor' do
19
+ expect(subject.maps.first).to eq first_map
20
+ expect(subject.docs.first.map).to eq first_map
21
+ end
22
+
23
+ it 'provides access to maps through the #crdt accessor' do
24
+ expect(subject.crdts.first).to eq first_map
25
+ expect(subject.docs.first.crdt).to eq first_map
26
+ end
27
+
28
+ it 'provides access to maps through the #object accessor' do
29
+ expect(subject.first).to eq first_map
30
+ expect(subject.docs.first.object).to eq first_map
31
+ end
32
+
33
+ it 'raises errors on the set, counter, and robject accessors' do
34
+ expect{ subject.docs.first.robject }.
35
+ to raise_error Riak::SearchError::UnexpectedResultError
36
+ expect{ subject.docs.first.counter }.
37
+ to raise_error Riak::CrdtError::UnexpectedDataType
38
+ expect{ subject.docs.first.set }.
39
+ to raise_error Riak::CrdtError::UnexpectedDataType
40
+ end
41
+ end
42
+
43
+ describe 'querying sets' do
44
+ let(:query) { index.query 'set:frijoles' }
45
+
46
+ before(:all) do
47
+ expect(first_set).to be
48
+ end
49
+
50
+ subject{ query.results }
51
+
52
+ it 'finds sets' do
53
+ expect(subject.length).to be > 0
54
+ end
55
+
56
+ it 'provides access to sets through the #set accessor' do
57
+ expect(subject.sets.first).to eq first_set
58
+ expect(subject.docs.first.set).to eq first_set
59
+ end
60
+
61
+ it 'provides access to sets through the #object accessor' do
62
+ expect(subject.first).to eq first_set
63
+ expect(subject.docs.first.object).to eq first_set
64
+ end
65
+
66
+ it 'raises errors on the counter, map, and robject accessors' do
67
+ expect{ subject.docs.first.robject }.
68
+ to raise_error Riak::SearchError::UnexpectedResultError
69
+ expect{ subject.docs.first.counter }.
70
+ to raise_error Riak::CrdtError::UnexpectedDataType
71
+ expect{ subject.docs.first.map }.
72
+ to raise_error Riak::CrdtError::UnexpectedDataType
73
+ end
74
+ end
75
+
76
+ describe 'querying counters' do
77
+ let(:query) { index.query 'counter:83475' }
78
+
79
+ before(:all) do
80
+ expect(first_counter).to be
81
+ end
82
+
83
+ subject{ query.results }
84
+
85
+ it 'finds counters' do
86
+ expect(subject.length).to be > 0
87
+ end
88
+
89
+ it 'provides access to counters through the #counter accessor' do
90
+ expect(subject.counters.first).to eq first_counter
91
+ expect(subject.docs.first.counter).to eq first_counter
92
+ end
93
+
94
+ it 'provides access to counters through the #object accessor' do
95
+ expect(subject.first).to eq first_counter
96
+ expect(subject.docs.first.object).to eq first_counter
97
+ end
98
+
99
+ it 'raises errors on the counter, map, and robject accessors' do
100
+ expect{ subject.docs.first.robject }.
101
+ to raise_error Riak::SearchError::UnexpectedResultError
102
+ expect{ subject.docs.first.set }.
103
+ to raise_error Riak::CrdtError::UnexpectedDataType
104
+ expect{ subject.docs.first.map }.
105
+ to raise_error Riak::CrdtError::UnexpectedDataType
106
+ end
107
+ end
108
+
109
+ describe 'querying multiple kinds of CRDT' do
110
+ let(:query) do
111
+ index.query 'arroz_register:frijoles OR set:frijoles OR counter:83475'
112
+ end
113
+ subject{ query.results }
114
+
115
+ before(:all) do
116
+ expect(first_counter).to be
117
+ expect(first_map).to be
118
+ expect(first_set).to be
119
+ end
120
+
121
+ it 'finds CRDTs' do
122
+ expect(subject.length).to be >= 3
123
+ end
124
+
125
+ it 'provides access through appropriate accessors' do
126
+ expect(subject.counters.first).to eq first_counter
127
+ expect(subject.maps.first).to eq first_map
128
+ expect(subject.sets.first).to eq first_set
129
+ expect(subject.crdts).to include first_counter
130
+ expect(subject.crdts).to include first_map
131
+ expect(subject.crdts).to include first_set
132
+ end
133
+
134
+ it 'allows looping through each object' do
135
+ # I worry that this may be order-dependent and occasionally fail
136
+ expect{ |b| subject.crdts.each &b }.
137
+ to yield_successive_args(first_counter, first_map, first_set)
138
+ end
139
+
140
+ it 'allows looping through each kind of object' do
141
+ expect{ |b| subject.counters.each &b }.to yield_with_args(first_counter)
142
+ expect{ |b| subject.maps.each &b }.to yield_with_args(first_map)
143
+ expect{ |b| subject.sets.each &b }.to yield_with_args(first_set)
144
+ end
145
+ end
146
+
147
+ describe 'querying both CRDTs and RObjects' do
148
+ let(:query) do
149
+ index.query 'arroz_register:frijoles OR set:frijoles OR counter:83475 OR "bitcask"'
150
+ end
151
+ subject{ query.results }
152
+
153
+ before(:all) do
154
+ load_corpus
155
+ expect(first_counter).to be
156
+ expect(first_map).to be
157
+ expect(first_set).to be
158
+ end
159
+
160
+ let(:first_robject){ subject.robjects.first }
161
+
162
+ it 'finds CRDTs and RObjects' do
163
+ expect(subject.objects).to include first_counter
164
+ expect(subject.objects).to include first_map
165
+ expect(subject.objects).to include first_set
166
+ expect(subject.objects).to include first_robject
167
+ end
168
+
169
+ it 'provides access through appropriate accessors' do
170
+ expect(subject.crdts).to_not include first_robject
171
+ expect(subject.robjects).to_not include first_counter
172
+ expect(subject.robjects).to_not include first_map
173
+ expect(subject.robjects).to_not include first_set
174
+ end
175
+ end
176
+ end
@@ -4,39 +4,6 @@ require 'riak'
4
4
  describe "CRDTs", integration: true, test_client: true do
5
5
  let(:bucket) { random_bucket }
6
6
 
7
- describe 'configuration' do
8
- it "allows default bucket-types to be configured for each data type" do
9
- expect(Riak::Crdt::Set.new(bucket, 'set').bucket_type).to eq 'sets'
10
-
11
- Riak::Crdt::DEFAULT_BUCKET_TYPES[:set] = 'new_set_default'
12
- expect(Riak::Crdt::Set.new(bucket, 'set').bucket_type).to eq 'new_set_default'
13
-
14
- Riak::Crdt::DEFAULT_BUCKET_TYPES[:set] = 'sets'
15
- expect(Riak::Crdt::Set.new(bucket, 'set').bucket_type).to eq 'sets'
16
- end
17
-
18
- describe 'overriding bucket-types' do
19
- let(:name){ 'other_counters' }
20
- let(:type){ test_client.bucket_type name }
21
- let(:typed_bucket){ type.bucket bucket.name }
22
-
23
- it "overrides with a string" do
24
- ctr = Riak::Crdt::Counter.new(bucket, 'ctr', name)
25
- expect(ctr.bucket_type).to eq name
26
- end
27
-
28
- it "overrides with a typed bucket" do
29
- ctr = Riak::Crdt::Counter.new(typed_bucket, 'ctr')
30
- expect(ctr.bucket_type).to eq name
31
- end
32
-
33
- it "overrides with a bucket type object" do
34
- ctr = Riak::Crdt::Counter.new(bucket, 'ctr', type)
35
- expect(ctr.bucket_type).to eq name
36
- end
37
- end
38
- end
39
-
40
7
  describe 'Riak-assigned names' do
41
8
  describe 'an anonymous counter' do
42
9
  subject { Riak::Crdt::Counter.new bucket, nil }
@@ -105,6 +72,15 @@ describe "CRDTs", integration: true, test_client: true do
105
72
  expect(subject.dirty?).to_not be
106
73
  expect(subject.value).to eq(start + 10 + 1)
107
74
  end
75
+
76
+ describe 'equality' do
77
+ let(:same){ Riak::Crdt::Counter.new subject.bucket, subject.key }
78
+ let(:same_bucket){ Riak::Bucket.new test_client, bucket.name }
79
+ let(:similar){ Riak::Crdt::Counter.new same_bucket, subject.key }
80
+ it { is_expected.to eq subject }
81
+ it { is_expected.to eq same }
82
+ it { is_expected.to eq similar }
83
+ end
108
84
  end
109
85
  describe 'sets' do
110
86
 
@@ -22,7 +22,7 @@ describe 'CRDT map validation', integration: true, test_client: true do
22
22
  end.to_not raise_error
23
23
 
24
24
  map2 = Riak::Crdt::Map.new bucket, map.key
25
-
25
+
26
26
  expect(map2.sets['set'].members).to eq ::Set.new(['Z'])
27
27
  end
28
28
 
@@ -30,7 +30,7 @@ describe 'CRDT map validation', integration: true, test_client: true do
30
30
  map.counters['counter'].increment 5
31
31
 
32
32
  map.reload
33
-
33
+
34
34
  expect(map.counters['counter'].value).to eq 5
35
35
 
36
36
  map.batch do |m|
@@ -50,13 +50,13 @@ describe 'CRDT map validation', integration: true, test_client: true do
50
50
  end
51
51
 
52
52
  map.reload
53
- expect(map.maps['map'].sets['set'].members).to eq ::Set.new(['X', 'Y'])
53
+ expect(map.maps['map'].sets['set'].members).to eq ::Set.new(%w(X Y))
54
54
 
55
55
  map.batch do |m|
56
56
  m.maps.delete 'map'
57
57
  m.maps['map'].sets['set'].add "Z"
58
58
  end
59
-
59
+
60
60
  map2 = Riak::Crdt::Map.new bucket, map.key
61
61
  expect(map2.maps['map'].sets['set'].members).to eq ::Set.new(['Z'])
62
62
  end
@@ -4,7 +4,7 @@ require 'riak'
4
4
  describe 'CRDT set validation', integration: true, test_client: true do
5
5
  let(:bucket){ random_bucket 'crdt_validation' }
6
6
  let(:set){ Riak::Crdt::Set.new bucket, random_key }
7
-
7
+
8
8
  it 'removes recently-added set entries during batch mode' do
9
9
  expect do
10
10
  set.batch do |s|
@@ -15,17 +15,17 @@ describe 'CRDT set validation', integration: true, test_client: true do
15
15
  end
16
16
  end.to raise_error Riak::CrdtError::SetRemovalWithoutContextError
17
17
  end
18
-
18
+
19
19
  it 'removes non-members with context' do
20
20
  set.batch do |s|
21
21
  s.add 'X'
22
22
  s.add 'Y'
23
23
  end
24
-
24
+
25
25
  set.reload
26
-
26
+
27
27
  expect{ set.remove 'bogus' }.to_not raise_error
28
-
28
+
29
29
  set2 = Riak::Crdt::Set.new bucket, set.key
30
30
  expect(set2.members).to eq ::Set.new(%w{X Y})
31
31
  end
@@ -35,9 +35,9 @@ describe 'CRDT set validation', integration: true, test_client: true do
35
35
  s.add 'X'
36
36
  s.add 'Y'
37
37
  end
38
-
38
+
39
39
  set.reload
40
-
40
+
41
41
  expect{ set.add 'X' }.to_not raise_error
42
42
 
43
43
  set2 = Riak::Crdt::Set.new bucket, set.key
@@ -90,14 +90,14 @@ describe 'CRDT set validation', integration: true, test_client: true do
90
90
  s.add 'X'
91
91
  s.add 'Y'
92
92
  end
93
-
93
+
94
94
  set_parallel = Riak::Crdt::Set.new bucket, set.key
95
95
  set_parallel.add 'Z'
96
-
96
+
97
97
  set.reload
98
-
98
+
99
99
  expect{ set.remove 'Z' }.to_not raise_error
100
-
100
+
101
101
  set2 = Riak::Crdt::Set.new bucket, set.key
102
102
  expect(set2.members).to eq ::Set.new(%w{X Y})
103
103
  end
@@ -107,9 +107,9 @@ describe 'CRDT set validation', integration: true, test_client: true do
107
107
  s.add 'X'
108
108
  s.add 'Y'
109
109
  end
110
-
110
+
111
111
  set.reload
112
-
112
+
113
113
  set_parallel = Riak::Crdt::Set.new bucket, set.key
114
114
  set_parallel.add 'Z'
115
115