ocean-dynamo 0.3.8 → 0.3.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ocean-dynamo/attributes.rb +3 -79
- data/lib/ocean-dynamo/persistence.rb +114 -17
- data/lib/ocean-dynamo/queries.rb +19 -3
- data/lib/ocean-dynamo/schema.rb +5 -1
- data/lib/ocean-dynamo/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d36ffc88503b1fb28acf30eb86d8b5e709561e72
|
4
|
+
data.tar.gz: 126589875287f2df88701c60aea134918e0b6c55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54c12079e7262327235bd3bae2fd40151c817ea7950ecbd1a22a61ac11f288c9bdec67a31f1e256b39aef30699aa56a1de14211ca29b2588f6a789d75a4e0d2a
|
7
|
+
data.tar.gz: 67e51cfa1e840deca03e0119b897b20a2a5de29b3f4b23df8b2669b375493efa728c914172820f1e160ff902cb0e4253bb2fe3b84384e049475fb76348db94b7
|
@@ -6,9 +6,9 @@ module OceanDynamo
|
|
6
6
|
#
|
7
7
|
attr_reader :attributes
|
8
8
|
|
9
|
-
attr_reader :destroyed
|
10
|
-
attr_reader :new_record
|
11
|
-
attr_reader :dynamo_item
|
9
|
+
attr_reader :destroyed # :nodoc:
|
10
|
+
attr_reader :new_record # :nodoc:
|
11
|
+
attr_reader :dynamo_item # :nodoc:
|
12
12
|
|
13
13
|
|
14
14
|
def initialize(attrs={})
|
@@ -132,82 +132,6 @@ module OceanDynamo
|
|
132
132
|
end
|
133
133
|
|
134
134
|
|
135
|
-
def serialized_attributes
|
136
|
-
result = Hash.new
|
137
|
-
fields.each do |attribute, metadata|
|
138
|
-
serialized = serialize_attribute(attribute, read_attribute(attribute), metadata)
|
139
|
-
result[attribute] = serialized unless serialized == nil
|
140
|
-
end
|
141
|
-
result
|
142
|
-
end
|
143
|
-
|
144
|
-
|
145
|
-
def serialize_attribute(attribute, value, metadata=fields[attribute],
|
146
|
-
target_class: metadata[:target_class],
|
147
|
-
type: metadata[:type],
|
148
|
-
no_save: metadata[:no_save]
|
149
|
-
)
|
150
|
-
return nil if value == nil
|
151
|
-
case type
|
152
|
-
when :reference
|
153
|
-
return nil if no_save
|
154
|
-
raise DynamoError, ":reference must always have a :target_class" unless target_class
|
155
|
-
return value if value.is_a?(String)
|
156
|
-
return value.id if value.is_a?(target_class)
|
157
|
-
raise AssociationTypeMismatch, "can't save a #{value.class} in a #{target_class} :reference"
|
158
|
-
when :string
|
159
|
-
return nil if ["", []].include?(value)
|
160
|
-
value
|
161
|
-
when :integer
|
162
|
-
value == [] ? nil : value
|
163
|
-
when :float
|
164
|
-
value == [] ? nil : value
|
165
|
-
when :boolean
|
166
|
-
value ? "true" : "false"
|
167
|
-
when :datetime
|
168
|
-
value.to_i
|
169
|
-
when :serialized
|
170
|
-
value.to_json
|
171
|
-
else
|
172
|
-
raise UnsupportedType.new(type.to_s)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
|
177
|
-
def deserialize_attribute(value, metadata, type: metadata[:type])
|
178
|
-
case type
|
179
|
-
when :reference
|
180
|
-
return value
|
181
|
-
when :string
|
182
|
-
return "" if value == nil
|
183
|
-
value.is_a?(Set) ? value.to_a : value
|
184
|
-
when :integer
|
185
|
-
return nil if value == nil
|
186
|
-
value.is_a?(Set) || value.is_a?(Array) ? value.collect(&:to_i) : value.to_i
|
187
|
-
when :float
|
188
|
-
return nil if value == nil
|
189
|
-
value.is_a?(Set) || value.is_a?(Array) ? value.collect(&:to_f) : value.to_f
|
190
|
-
when :boolean
|
191
|
-
case value
|
192
|
-
when "true"
|
193
|
-
true
|
194
|
-
when "false"
|
195
|
-
false
|
196
|
-
else
|
197
|
-
nil
|
198
|
-
end
|
199
|
-
when :datetime
|
200
|
-
return nil if value == nil
|
201
|
-
Time.zone.at(value.to_i)
|
202
|
-
when :serialized
|
203
|
-
return nil if value == nil
|
204
|
-
JSON.parse(value)
|
205
|
-
else
|
206
|
-
raise UnsupportedType.new(type.to_s)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
|
211
135
|
private
|
212
136
|
|
213
137
|
def _assign_attribute(k, v) # :nodoc:
|
@@ -180,6 +180,43 @@ module OceanDynamo
|
|
180
180
|
end
|
181
181
|
|
182
182
|
|
183
|
+
#
|
184
|
+
# Sets the dynamo_item and deserialises and assigns all its defined
|
185
|
+
# attributes. Skips undeclared attributes.
|
186
|
+
#
|
187
|
+
# The arg may be either an Item or an ItemData. If Item, a request will be
|
188
|
+
# made for the attributes from DynamoDB. If ItemData, no DB access will
|
189
|
+
# be made and the existing data will be used.
|
190
|
+
#
|
191
|
+
# The :consistent keyword may only be used when the arg is an Item.
|
192
|
+
#
|
193
|
+
def _setup_from_dynamo(arg, consistent: false)
|
194
|
+
case arg
|
195
|
+
when AWS::DynamoDB::Item
|
196
|
+
item = arg
|
197
|
+
item_data = nil
|
198
|
+
when AWS::DynamoDB::ItemData
|
199
|
+
item = arg.item
|
200
|
+
item_data = arg
|
201
|
+
raise ArgumentError, ":consistent may not be specified when passing an ItemData" if consistent
|
202
|
+
else
|
203
|
+
raise ArgumentError, "arg must be an AWS::DynamoDB::Item or an AWS::DynamoDB::ItemData"
|
204
|
+
end
|
205
|
+
|
206
|
+
@dynamo_item = item
|
207
|
+
|
208
|
+
if !item_data
|
209
|
+
raw_attrs = item.attributes.to_hash(consistent_read: consistent)
|
210
|
+
else
|
211
|
+
raw_attrs = item_data.attributes
|
212
|
+
end
|
213
|
+
|
214
|
+
dynamo_deserialize_attributes(raw_attrs)
|
215
|
+
@new_record = false
|
216
|
+
self
|
217
|
+
end
|
218
|
+
|
219
|
+
|
183
220
|
|
184
221
|
protected
|
185
222
|
|
@@ -196,11 +233,6 @@ module OceanDynamo
|
|
196
233
|
end
|
197
234
|
|
198
235
|
|
199
|
-
def perform_validations(options={}) # :nodoc:
|
200
|
-
options[:validate] == false || valid?(options[:context])
|
201
|
-
end
|
202
|
-
|
203
|
-
|
204
236
|
def dynamo_persist(lock: nil) # :nodoc:
|
205
237
|
_late_connect?
|
206
238
|
begin
|
@@ -209,7 +241,6 @@ module OceanDynamo
|
|
209
241
|
rescue AWS::DynamoDB::Errors::ConditionalCheckFailedException
|
210
242
|
raise OceanDynamo::StaleObjectError.new(self)
|
211
243
|
end
|
212
|
-
|
213
244
|
@new_record = false
|
214
245
|
true
|
215
246
|
end
|
@@ -226,28 +257,94 @@ module OceanDynamo
|
|
226
257
|
end
|
227
258
|
|
228
259
|
|
229
|
-
def
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
260
|
+
def serialized_attributes
|
261
|
+
result = Hash.new
|
262
|
+
fields.each do |attribute, metadata|
|
263
|
+
serialized = serialize_attribute(attribute, read_attribute(attribute), metadata)
|
264
|
+
result[attribute] = serialized unless serialized == nil
|
265
|
+
end
|
266
|
+
result
|
235
267
|
end
|
236
268
|
|
237
269
|
|
238
|
-
def
|
239
|
-
hash = _dynamo_read_raw_attributes(consistent_read)
|
270
|
+
def dynamo_deserialize_attributes(hash) # :nodoc:
|
240
271
|
result = Hash.new
|
241
272
|
fields.each do |attribute, metadata|
|
242
273
|
next if metadata[:no_save]
|
243
274
|
result[attribute] = deserialize_attribute(hash[attribute], metadata)
|
244
275
|
end
|
245
|
-
result
|
276
|
+
assign_attributes(result)
|
277
|
+
end
|
278
|
+
|
279
|
+
|
280
|
+
def serialize_attribute(attribute, value, metadata=fields[attribute],
|
281
|
+
target_class: metadata[:target_class],
|
282
|
+
type: metadata[:type],
|
283
|
+
no_save: metadata[:no_save]
|
284
|
+
)
|
285
|
+
return nil if value == nil
|
286
|
+
case type
|
287
|
+
when :reference
|
288
|
+
return nil if no_save
|
289
|
+
raise DynamoError, ":reference must always have a :target_class" unless target_class
|
290
|
+
return value if value.is_a?(String)
|
291
|
+
return value.id if value.is_a?(target_class)
|
292
|
+
raise AssociationTypeMismatch, "can't save a #{value.class} in a #{target_class} :reference"
|
293
|
+
when :string
|
294
|
+
return nil if ["", []].include?(value)
|
295
|
+
value
|
296
|
+
when :integer
|
297
|
+
value == [] ? nil : value
|
298
|
+
when :float
|
299
|
+
value == [] ? nil : value
|
300
|
+
when :boolean
|
301
|
+
value ? "true" : "false"
|
302
|
+
when :datetime
|
303
|
+
value.to_i
|
304
|
+
when :serialized
|
305
|
+
value.to_json
|
306
|
+
else
|
307
|
+
raise UnsupportedType.new(type.to_s)
|
308
|
+
end
|
246
309
|
end
|
247
310
|
|
248
311
|
|
249
|
-
def
|
250
|
-
|
312
|
+
def deserialize_attribute(value, metadata, type: metadata[:type])
|
313
|
+
case type
|
314
|
+
when :reference
|
315
|
+
return value
|
316
|
+
when :string
|
317
|
+
return "" if value == nil
|
318
|
+
value.is_a?(Set) ? value.to_a : value
|
319
|
+
when :integer
|
320
|
+
return nil if value == nil
|
321
|
+
value.is_a?(Set) || value.is_a?(Array) ? value.collect(&:to_i) : value.to_i
|
322
|
+
when :float
|
323
|
+
return nil if value == nil
|
324
|
+
value.is_a?(Set) || value.is_a?(Array) ? value.collect(&:to_f) : value.to_f
|
325
|
+
when :boolean
|
326
|
+
case value
|
327
|
+
when "true"
|
328
|
+
true
|
329
|
+
when "false"
|
330
|
+
false
|
331
|
+
else
|
332
|
+
nil
|
333
|
+
end
|
334
|
+
when :datetime
|
335
|
+
return nil if value == nil
|
336
|
+
Time.zone.at(value.to_i)
|
337
|
+
when :serialized
|
338
|
+
return nil if value == nil
|
339
|
+
JSON.parse(value)
|
340
|
+
else
|
341
|
+
raise UnsupportedType.new(type.to_s)
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
|
346
|
+
def perform_validations(options={}) # :nodoc:
|
347
|
+
options[:validate] == false || valid?(options[:context])
|
251
348
|
end
|
252
349
|
|
253
350
|
|
data/lib/ocean-dynamo/queries.rb
CHANGED
@@ -5,7 +5,7 @@ module OceanDynamo
|
|
5
5
|
_late_connect?
|
6
6
|
item = dynamo_items[hash, range]
|
7
7
|
raise RecordNotFound, "can't find a #{self} with primary key ['#{hash}', #{range.inspect}]" unless item.exists?
|
8
|
-
new.
|
8
|
+
new._setup_from_dynamo(item, consistent: consistent)
|
9
9
|
end
|
10
10
|
|
11
11
|
|
@@ -21,9 +21,25 @@ module OceanDynamo
|
|
21
21
|
end
|
22
22
|
|
23
23
|
|
24
|
-
|
24
|
+
#
|
25
|
+
# The number of records in the table.
|
26
|
+
#
|
27
|
+
def self.count(**options)
|
25
28
|
_late_connect?
|
26
|
-
|
29
|
+
dynamo_items.count(options)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
#
|
34
|
+
# Returns all records in the table.
|
35
|
+
#
|
36
|
+
def self.all(**options)
|
37
|
+
_late_connect?
|
38
|
+
result = []
|
39
|
+
dynamo_items.select(options) do |item_data|
|
40
|
+
result << new._setup_from_dynamo(item_data)
|
41
|
+
end
|
42
|
+
result
|
27
43
|
end
|
28
44
|
|
29
45
|
end
|
data/lib/ocean-dynamo/schema.rb
CHANGED
@@ -32,7 +32,11 @@ module OceanDynamo
|
|
32
32
|
self.timestamp_attributes = timestamps
|
33
33
|
# Init
|
34
34
|
self.fields = HashWithIndifferentAccess.new
|
35
|
-
attribute
|
35
|
+
attribute(table_hash_key, :string, default: "")
|
36
|
+
if table_range_key
|
37
|
+
attribute(table_range_key, :string, default: "")
|
38
|
+
self.validates(table_range_key, presence: true)
|
39
|
+
end
|
36
40
|
timestamp_attributes.each { |name| attribute name, :datetime } if timestamp_attributes
|
37
41
|
attribute(lock_attribute, :integer, default: 0) if locking
|
38
42
|
block.call
|
data/lib/ocean-dynamo/version.rb
CHANGED