dynamini 2.11.1 → 2.12.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 57e821a0bc5b22015ec93c1a14b4618abfaf93dd
4
- data.tar.gz: da7cec18f2a3a5a822b63fe6cfd14210196fffb8
2
+ SHA256:
3
+ metadata.gz: 295d5d3e9ac24824561c2d3ea60328036a2a1ef08cb442c75dc07f07110f05dc
4
+ data.tar.gz: dc6a149f087e727efed3d20952468639a3ea0b82f3e3acc9d954d9a0a8307153
5
5
  SHA512:
6
- metadata.gz: 9833c5aba2fe9ba980f4c294954f1647d46744d34e3720ca0aa2acfbbb251f4297dd652e2baeaeec2cc8f3fe0295c2095f23235d0edf7bf54d43284251ba2a81
7
- data.tar.gz: b12415f6d442d49da0729cf566cf95a71f038dd70093acfe7f5822a2a5749ad173e40dfbaa99ed91cdb7aec82c6da46a447a77fbdfb601d8dc79f49ad18ed566
6
+ metadata.gz: 70172147217e1531d2be9a15973babb8cbd77361eff4025e39d816e0591e3c4e25278a6b73431b89a4bd5acdc7415f28ed40a9c423b1f0b36ba980151baca358
7
+ data.tar.gz: 3e8383facfa971c03a77e22ad8399cf5f5d024a88cc65bd67be213eaf0a967a315f5a4a34908c46afd44e1d4835de5d5a130e8d0950ec12282c6e67da206af8b
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dynamini (2.11.1)
4
+ dynamini (2.12.1)
5
5
  activemodel (>= 3, < 5.0)
6
6
  aws-sdk (~> 2)
7
7
 
@@ -16,13 +16,13 @@ GEM
16
16
  minitest (~> 5.1)
17
17
  thread_safe (~> 0.3, >= 0.3.4)
18
18
  tzinfo (~> 1.1)
19
- aws-sdk (2.10.131)
20
- aws-sdk-resources (= 2.10.131)
21
- aws-sdk-core (2.10.131)
19
+ aws-sdk (2.11.4)
20
+ aws-sdk-resources (= 2.11.4)
21
+ aws-sdk-core (2.11.4)
22
22
  aws-sigv4 (~> 1.0)
23
23
  jmespath (~> 1.0)
24
- aws-sdk-resources (2.10.131)
25
- aws-sdk-core (= 2.10.131)
24
+ aws-sdk-resources (2.11.4)
25
+ aws-sdk-core (= 2.11.4)
26
26
  aws-sigv4 (1.0.2)
27
27
  builder (3.2.3)
28
28
  coderay (1.1.0)
@@ -103,4 +103,4 @@ DEPENDENCIES
103
103
  rspec (~> 3)
104
104
 
105
105
  BUNDLED WITH
106
- 1.16.0.pre.2
106
+ 1.16.1
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'dynamini'
3
- s.version = '2.11.1'
3
+ s.version = '2.12.1'
4
4
  s.summary = 'DynamoDB interface'
5
5
  s.description = 'Lightweight DynamoDB interface gem designed as
6
6
  a drop-in replacement for ActiveRecord.
@@ -43,6 +43,10 @@ module Dynamini
43
43
  def query(args = {})
44
44
  fail ArgumentError, 'You must provide a :hash_key.' unless args[:hash_key]
45
45
 
46
+ if (args[:start] || args[:end]) && !current_index_range_key(args)
47
+ fail ArgumentError, 'You cannot query using start/end without using an index with a range key.'
48
+ end
49
+
46
50
  response = dynamo_query(args)
47
51
  objects = []
48
52
  response.items.each do |item|
@@ -69,20 +73,23 @@ module Dynamini
69
73
  end
70
74
 
71
75
  def build_expression_attribute_values(args)
72
- range_key = current_index_range_key(args)
76
+ expression_values = {':h' => args[:hash_key]}
73
77
 
74
- if (handle = handles[range_key.to_sym])
75
- start_val = args[:start] ? attribute_callback(TypeHandler::SETTER_PROCS, handle, args[:start], false) : nil
76
- end_val = args[:end] ? attribute_callback(TypeHandler::SETTER_PROCS, handle, args[:end], false) : nil
77
- else
78
- start_val = args[:start]
79
- end_val = args[:end]
78
+ if current_index_range_key(args)
79
+ range_key = current_index_range_key(args)
80
+
81
+ if (handle = handles[range_key.to_sym])
82
+ start_val = args[:start] ? attribute_callback(TypeHandler::SETTER_PROCS, handle, args[:start], false) : nil
83
+ end_val = args[:end] ? attribute_callback(TypeHandler::SETTER_PROCS, handle, args[:end], false) : nil
84
+ else
85
+ start_val = args[:start]
86
+ end_val = args[:end]
87
+ end
88
+
89
+ expression_values[':s'] = start_val if start_val
90
+ expression_values[':e'] = end_val if end_val
80
91
  end
81
92
 
82
- expression_values = {}
83
- expression_values[':h'] = args[:hash_key]
84
- expression_values[':s'] = start_val if start_val
85
- expression_values[':e'] = end_val if end_val
86
93
  expression_values
87
94
  end
88
95
 
@@ -154,140 +154,141 @@ describe Dynamini::Querying do
154
154
  end
155
155
 
156
156
  describe '.query' do
157
- before do
158
- 4.times do |i|
159
- TestClassWithRange.create(foo: 'foo', bar: i + 1, secondary_hash_key: 'secondary_hash_key', secondary_range_key: 10 - i)
160
- end
161
- TestClassWithRange.create(foo: 'foo2', bar: 5, secondary_hash_key: 'secondary_hash_key', secondary_range_key: 6)
162
-
163
- end
164
- context 'start value provided' do
165
- it 'should return records with a range key greater than or equal to the start value' do
166
- records = TestClassWithRange.query(hash_key: 'foo', start: 2)
167
- expect(records.length).to eq 3
168
- expect(records.first.bar).to eq 2
169
- expect(records.last.bar).to eq 4
157
+ context 'class with range key' do
158
+ before do
159
+ 4.times do |i|
160
+ TestClassWithRange.create(foo: 'foo', bar: i + 1, secondary_hash_key: 'secondary_hash_key', secondary_range_key: 10 - i)
161
+ end
162
+ TestClassWithRange.create(foo: 'foo2', bar: 5, secondary_hash_key: 'secondary_hash_key', secondary_range_key: 6)
163
+ end
164
+ context 'start value provided' do
165
+ it 'should return records with a range key greater than or equal to the start value' do
166
+ records = TestClassWithRange.query(hash_key: 'foo', start: 2)
167
+ expect(records.length).to eq 3
168
+ expect(records.first.bar).to eq 2
169
+ expect(records.last.bar).to eq 4
170
+ end
170
171
  end
171
- end
172
- context 'end value provided' do
173
- it 'should return records with a range key less than or equal to the start value' do
174
- records = TestClassWithRange.query(hash_key: 'foo', end: 2)
175
- expect(records.length).to eq 2
176
- expect(records.first.bar).to eq 1
177
- expect(records.last.bar).to eq 2
172
+ context 'end value provided' do
173
+ it 'should return records with a range key less than or equal to the start value' do
174
+ records = TestClassWithRange.query(hash_key: 'foo', end: 2)
175
+ expect(records.length).to eq 2
176
+ expect(records.first.bar).to eq 1
177
+ expect(records.last.bar).to eq 2
178
+ end
178
179
  end
179
- end
180
- context 'start and end values provided' do
181
- it 'should return records between the two values inclusive' do
182
- records = TestClassWithRange.query(hash_key: 'foo', start: 1, end: 3)
183
- expect(records.length).to eq 3
184
- expect(records.first.bar).to eq 1
185
- expect(records.last.bar).to eq 3
180
+ context 'start and end values provided' do
181
+ it 'should return records between the two values inclusive' do
182
+ records = TestClassWithRange.query(hash_key: 'foo', start: 1, end: 3)
183
+ expect(records.length).to eq 3
184
+ expect(records.first.bar).to eq 1
185
+ expect(records.last.bar).to eq 3
186
+ end
186
187
  end
187
- end
188
- context 'neither value provided' do
189
- it 'should return all records belonging to that hash key' do
190
- records = TestClassWithRange.query(hash_key: 'foo')
191
- expect(records.length).to eq 4
192
- expect(records.first.bar).to eq 1
193
- expect(records.last.bar).to eq 4
188
+ context 'neither value provided' do
189
+ it 'should return all records belonging to that hash key' do
190
+ records = TestClassWithRange.query(hash_key: 'foo')
191
+ expect(records.length).to eq 4
192
+ expect(records.first.bar).to eq 1
193
+ expect(records.last.bar).to eq 4
194
+ end
194
195
  end
195
- end
196
196
 
197
- context 'hash key does not exist' do
198
- it 'should return an empty array' do
199
- expect(TestClassWithRange.query(hash_key: 'non-existent-key')).to eq([])
197
+ context 'hash key does not exist' do
198
+ it 'should return an empty array' do
199
+ expect(TestClassWithRange.query(hash_key: 'non-existent-key')).to eq([])
200
+ end
200
201
  end
201
- end
202
202
 
203
- context 'when :limit is provided' do
204
- it 'should return only the first two records' do
205
- records = TestClassWithRange.query(hash_key: 'foo', limit: 2)
206
- expect(records.length).to eq 2
207
- expect(records.first.bar).to eq 1
208
- expect(records.last.bar).to eq 2
203
+ context 'when :limit is provided' do
204
+ it 'should return only the first two records' do
205
+ records = TestClassWithRange.query(hash_key: 'foo', limit: 2)
206
+ expect(records.length).to eq 2
207
+ expect(records.first.bar).to eq 1
208
+ expect(records.last.bar).to eq 2
209
+ end
209
210
  end
210
- end
211
211
 
212
- context 'when :scan_index_forward is provided' do
213
- it 'should return records in order when given true' do
214
- records = TestClassWithRange.query(hash_key: 'foo', scan_index_forward: true)
215
- expect(records.length).to eq 4
216
- expect(records.first.bar).to eq 1
217
- expect(records.last.bar).to eq 4
218
- end
212
+ context 'when :scan_index_forward is provided' do
213
+ it 'should return records in order when given true' do
214
+ records = TestClassWithRange.query(hash_key: 'foo', scan_index_forward: true)
215
+ expect(records.length).to eq 4
216
+ expect(records.first.bar).to eq 1
217
+ expect(records.last.bar).to eq 4
218
+ end
219
219
 
220
- it 'should return records in reverse order when given false' do
221
- records = TestClassWithRange.query(hash_key: 'foo', scan_index_forward: false)
222
- expect(records.length).to eq 4
223
- expect(records.first.bar).to eq 4
224
- expect(records.last.bar).to eq 1
220
+ it 'should return records in reverse order when given false' do
221
+ records = TestClassWithRange.query(hash_key: 'foo', scan_index_forward: false)
222
+ expect(records.length).to eq 4
223
+ expect(records.first.bar).to eq 4
224
+ expect(records.last.bar).to eq 1
225
+ end
225
226
  end
226
- end
227
227
 
228
- context 'using secondary index' do
229
- it 'should be able to query using the secondary index' do
230
- records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index)
231
- expect(records.length).to eq(5)
232
- expect(records.first.secondary_range_key).to eq(6)
233
- expect(records.last.secondary_range_key).to eq(10)
234
- end
228
+ context 'using secondary index' do
229
+ it 'should be able to query using the secondary index' do
230
+ records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index)
231
+ expect(records.length).to eq(5)
232
+ expect(records.first.secondary_range_key).to eq(6)
233
+ expect(records.last.secondary_range_key).to eq(10)
234
+ end
235
235
 
236
- it 'should be able to sort backwards' do
237
- records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, scan_index_forward: false)
238
- expect(records.length).to eq(5)
239
- expect(records.first.secondary_range_key).to eq(10)
240
- expect(records.last.secondary_range_key).to eq(6)
241
- end
236
+ it 'should be able to sort backwards' do
237
+ records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, scan_index_forward: false)
238
+ expect(records.length).to eq(5)
239
+ expect(records.first.secondary_range_key).to eq(10)
240
+ expect(records.last.secondary_range_key).to eq(6)
241
+ end
242
242
 
243
- it 'should be able to limit number of results' do
244
- records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, limit: 3)
245
- expect(records.length).to eq(3)
246
- expect(records.first.secondary_range_key).to eq(6)
247
- expect(records.last.secondary_range_key).to eq(8)
248
- end
243
+ it 'should be able to limit number of results' do
244
+ records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, limit: 3)
245
+ expect(records.length).to eq(3)
246
+ expect(records.first.secondary_range_key).to eq(6)
247
+ expect(records.last.secondary_range_key).to eq(8)
248
+ end
249
249
 
250
- it 'should be able to give a minimum value for the range key' do
251
- records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, start: 8)
252
- expect(records.length).to eq(3)
253
- expect(records.first.secondary_range_key).to eq(8)
254
- expect(records.last.secondary_range_key).to eq(10)
255
- end
250
+ it 'should be able to give a minimum value for the range key' do
251
+ records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, start: 8)
252
+ expect(records.length).to eq(3)
253
+ expect(records.first.secondary_range_key).to eq(8)
254
+ expect(records.last.secondary_range_key).to eq(10)
255
+ end
256
256
 
257
- it 'should be able to give a maximum for the range key' do
258
- records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, end: 8)
259
- expect(records.length).to eq(3)
260
- expect(records.first.secondary_range_key).to eq(6)
261
- expect(records.last.secondary_range_key).to eq(8)
262
- end
257
+ it 'should be able to give a maximum for the range key' do
258
+ records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, end: 8)
259
+ expect(records.length).to eq(3)
260
+ expect(records.first.secondary_range_key).to eq(6)
261
+ expect(records.last.secondary_range_key).to eq(8)
262
+ end
263
263
 
264
- it 'should be able to give a maximum for the range key' do
265
- records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, start: 7, end: 9)
266
- expect(records.length).to eq(3)
267
- expect(records.first.secondary_range_key).to eq(7)
268
- expect(records.last.secondary_range_key).to eq(9)
269
- end
264
+ it 'should be able to give a maximum for the range key' do
265
+ records = TestClassWithRange.query(hash_key: 'secondary_hash_key', index_name: :secondary_index, start: 7, end: 9)
266
+ expect(records.length).to eq(3)
267
+ expect(records.first.secondary_range_key).to eq(7)
268
+ expect(records.last.secondary_range_key).to eq(9)
269
+ end
270
270
 
271
- it 'should return no results if none are found with the secondary index' do
272
- expect(TestClassWithRange.query(hash_key: 'non-existent-key', index_name: :secondary_index)).to eq([])
271
+ it 'should return no results if none are found with the secondary index' do
272
+ expect(TestClassWithRange.query(hash_key: 'non-existent-key', index_name: :secondary_index)).to eq([])
273
+ end
273
274
  end
274
- end
275
275
 
276
- context 'with a type handled range key' do
277
- it 'converts the start and end parameter to the raw type' do
278
- start_param = Time.new(2000, 1, 1)
279
- end_param = Time.new(2001, 1, 1)
280
-
281
- expect(TestClassWithRange.client).to receive(:query).with(hash_including(
282
- expression_attribute_values: {':h' => '12345', ':s' => start_param.to_f, ':e' => end_param.to_f}
283
- )).and_return(OpenStruct.new(items: []))
284
-
285
- TestClassWithRange.query(
286
- hash_key: '12345',
287
- index_name: :tertiary_index,
288
- start: start_param,
289
- end: end_param
290
- )
276
+ context 'with a type handled range key' do
277
+ it 'converts the start and end parameter to the raw type' do
278
+ start_param = Time.new(2000, 1, 1)
279
+ end_param = Time.new(2001, 1, 1)
280
+
281
+ expect(TestClassWithRange.client).to receive(:query).with(hash_including(
282
+ expression_attribute_values: {':h' => '12345', ':s' => start_param.to_f, ':e' => end_param.to_f}
283
+ )).and_return(OpenStruct.new(items: []))
284
+
285
+ TestClassWithRange.query(
286
+ hash_key: '12345',
287
+ index_name: :tertiary_index,
288
+ start: start_param,
289
+ end: end_param
290
+ )
291
+ end
291
292
  end
292
293
  end
293
294
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamini
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.1
4
+ version: 2.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Ward
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2018-02-14 00:00:00.000000000 Z
18
+ date: 2018-02-26 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: activemodel
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  version: '0'
185
185
  requirements: []
186
186
  rubyforge_project:
187
- rubygems_version: 2.5.1
187
+ rubygems_version: 2.7.3
188
188
  signing_key:
189
189
  specification_version: 4
190
190
  summary: DynamoDB interface