dynamini 1.5.1 → 1.5.2
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/lib/dynamini.rb +2 -1
- data/lib/dynamini/base.rb +35 -22
- data/lib/dynamini/test_client.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fdfa96c8bf677260145f5d6bb35de6cf667cf90
|
4
|
+
data.tar.gz: 9044d8ce4cf6dfbaab3daa7003e0c5eab9862d43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c73f11b146c731254765292c25a777d77efef22f50298db7e203480d1ac01e6cd58c12a585f777dfdea06fc2526fb21cad65d46198ebada01b8f480709c8f15e
|
7
|
+
data.tar.gz: 6c586d97d5bafa884c5011020cfcd716ce3e8023ab807a51249a44d5cd3d605459f8b1350eac758b0bfdd7671bc50d1bfcfb42eaa7330b8e39fb7bf32e23e968
|
data/lib/dynamini.rb
CHANGED
data/lib/dynamini/base.rb
CHANGED
@@ -104,8 +104,10 @@ module Dynamini
|
|
104
104
|
def batch_find(ids = [])
|
105
105
|
return [] if ids.length < 1
|
106
106
|
objects = []
|
107
|
-
|
108
|
-
|
107
|
+
if ids.length > 100
|
108
|
+
raise StandardError, 'Batch find is limited to 100 items'
|
109
|
+
end
|
110
|
+
key_structure = ids.map { |i| { hash_key => i.to_s } }
|
109
111
|
response = self.dynamo_batch_get(key_structure)
|
110
112
|
response.responses[table_name].each do |item|
|
111
113
|
objects << self.new(item.symbolize_keys, false)
|
@@ -192,17 +194,11 @@ module Dynamini
|
|
192
194
|
end
|
193
195
|
end
|
194
196
|
|
195
|
-
def increment!(
|
196
|
-
|
197
|
-
|
198
|
-
if current_value.nil? || current_value.is_a?(Integer) || current_value.is_a?(Float)
|
199
|
-
increment_to_dynamo(attribute, amount, opts)
|
200
|
-
else
|
201
|
-
raise StandardError, 'You cannot increment! a non-numeric non-nil value. If your current value is a numeric string, use :handle to autocast it as a number.'
|
202
|
-
end
|
203
|
-
else
|
204
|
-
raise StandardError, 'You cannot increment an attribute by a non-numeric value.'
|
197
|
+
def increment!(attribute_increments, opts = {})
|
198
|
+
attribute_increments.each do |a, v|
|
199
|
+
validate_incrementable_attribute(a, v)
|
205
200
|
end
|
201
|
+
increment_to_dynamo(attribute_increments, opts)
|
206
202
|
end
|
207
203
|
|
208
204
|
def delete
|
@@ -252,19 +248,15 @@ module Dynamini
|
|
252
248
|
end
|
253
249
|
|
254
250
|
def touch_to_dynamo
|
255
|
-
self.class.client.update_item(table_name: self.class.table_name, key: key, attribute_updates: {updated_at: {value:
|
251
|
+
self.class.client.update_item(table_name: self.class.table_name, key: key, attribute_updates: {updated_at: {value: Time.now.to_f, action: 'PUT'}})
|
256
252
|
end
|
257
253
|
|
258
254
|
def delete_from_dynamo
|
259
255
|
self.class.client.delete_item(table_name: self.class.table_name, key: key)
|
260
256
|
end
|
261
257
|
|
262
|
-
def increment_to_dynamo(
|
263
|
-
|
264
|
-
self.class.client.update_item(table_name: self.class.table_name, key: key, attribute_updates: {attribute => {value: amount, action: 'ADD'}})
|
265
|
-
else
|
266
|
-
self.class.client.update_item(table_name: self.class.table_name, key: key, attribute_updates: {attribute => {value: amount, action: 'ADD'}, updated_at: {value: attributes[:updated_at], action: 'PUT'}})
|
267
|
-
end
|
258
|
+
def increment_to_dynamo(attribute_increments, opts={})
|
259
|
+
self.class.client.update_item(table_name: self.class.table_name, key: key, attribute_updates: increment_updates(attribute_increments, opts))
|
268
260
|
end
|
269
261
|
|
270
262
|
def self.dynamo_batch_get(key_structure)
|
@@ -274,10 +266,10 @@ module Dynamini
|
|
274
266
|
def self.dynamo_batch_save(model_array)
|
275
267
|
put_requests = []
|
276
268
|
model_array.each do |model|
|
277
|
-
put_requests << {put_request: {item: model.attributes.reject{|
|
269
|
+
put_requests << { put_request: { item: model.attributes.reject{|_k, v| v.blank? }.stringify_keys } }
|
278
270
|
end
|
279
|
-
request_options = {request_items: {
|
280
|
-
"#{table_name}" => put_requests}
|
271
|
+
request_options = { request_items: {
|
272
|
+
"#{table_name}" => put_requests }
|
281
273
|
}
|
282
274
|
client.batch_write_item(request_options)
|
283
275
|
end
|
@@ -301,6 +293,27 @@ module Dynamini
|
|
301
293
|
end
|
302
294
|
end
|
303
295
|
|
296
|
+
def increment_updates(attribute_increments, opts={})
|
297
|
+
updates = {}
|
298
|
+
attribute_increments.each do |k,v|
|
299
|
+
updates[k] = {value: v, action: 'ADD'}
|
300
|
+
end
|
301
|
+
updates[:updated_at] = {value: Time.now.to_f, action: 'PUT'} unless opts[:skip_timestamps]
|
302
|
+
updates[:created_at] = {value: Time.now.to_f, action: 'PUT'} unless attributes[:created_at]
|
303
|
+
updates
|
304
|
+
end
|
305
|
+
|
306
|
+
def validate_incrementable_attribute(attribute, value)
|
307
|
+
if value.is_a?(Integer) || value.is_a?(Float)
|
308
|
+
current_value = self.send(attribute)
|
309
|
+
unless current_value.nil? || current_value.is_a?(Integer) || current_value.is_a?(Float)
|
310
|
+
raise StandardError, "You cannot increment a non-numeric non-nil value: #{attribute} is currently #{current_value}. If your current value is a numeric string, use :handle to autocast it as a number."
|
311
|
+
end
|
312
|
+
else
|
313
|
+
raise StandardError, "You cannot increment an attribute by a non-numeric value: #{value}"
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
304
317
|
def clear_changes
|
305
318
|
@changed = Set.new
|
306
319
|
end
|
data/lib/dynamini/test_client.rb
CHANGED
@@ -68,7 +68,7 @@ module Dynamini
|
|
68
68
|
attribute_hash = {}
|
69
69
|
|
70
70
|
args[:attribute_updates].each do |k, v|
|
71
|
-
if v[:action] == 'ADD'
|
71
|
+
if v[:action] == 'ADD' && @data[args[:table_name]][args[:key][hash_key]] #if record has been saved
|
72
72
|
attribute_hash[k] = v[:value] + @data[args[:table_name]][args[:key][hash_key]][k].to_f
|
73
73
|
else
|
74
74
|
attribute_hash[k] = v[:value]
|
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: 1.5.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Ward
|
@@ -93,8 +93,9 @@ dependencies:
|
|
93
93
|
- - ~>
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '2'
|
96
|
-
description:
|
97
|
-
|
96
|
+
description: |-
|
97
|
+
Lightweight DynamoDB interface gem designed as a drop-in replacement for ActiveRecord.
|
98
|
+
Built & maintained by the team at yroo.com.
|
98
99
|
email: dev@retailcommon.com
|
99
100
|
executables: []
|
100
101
|
extensions: []
|