dynamini 2.6.8 → 2.7.0

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
2
  SHA1:
3
- metadata.gz: fdfc84fe329dae011f69a61ac1af6b0c22f7a009
4
- data.tar.gz: 85dae7d4ed4e50e863c6717e6beff8ae5bc84ff7
3
+ metadata.gz: 7e1c5e5210674b1e75d93ca770697f796b9ca42e
4
+ data.tar.gz: 4de485ac6fa5fad8375104f6e3049abf3a542d09
5
5
  SHA512:
6
- metadata.gz: dfc9700d794a7c660bdf1090a9774326945bbc7a6f74e5fcb8658c9b453c53578207f0d8116f63c2f5fe62ade2d0e98efcc0a294dca31b81ec588a48a0cf7530
7
- data.tar.gz: d62dad577c5100725d13fe9658a13c0784dda7d24d0717e422b01d83d206b06aeba0fa24a09a7859f1b7d6970f82fb879f26a05d15c29ef26c15954174f57c38
6
+ metadata.gz: 141816813ba6319ebbede710503514cc1a88a55a2f915bc65e7b5d450e21b1ebd96e9df0b4fa6a1d0bf1e27e4f682d8f2eff3c13c87e824d8228dff608bfe1a2
7
+ data.tar.gz: 49a6b6842b43c606b6e766709d11de5ca8ef0da0eee8039446a3d00a0b8f165ff6ac1aff5a0d88869b62d9a0dd886c00413f6be51802ebf2a844960db5644712
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'dynamini'
3
- s.version = '2.6.8'
3
+ s.version = '2.7.0'
4
4
  s.summary = 'DynamoDB interface'
5
5
  s.description = 'Lightweight DynamoDB interface gem designed as
6
6
  a drop-in replacement for ActiveRecord.
@@ -6,7 +6,7 @@ module Dynamini
6
6
  def add_to(attribute, value)
7
7
  complain_about(attribute) unless handles[attribute]
8
8
  old_value = read_attribute(attribute)
9
- add_value = self.class.attribute_callback(TypeHandler::SETTER_PROCS, handles[attribute], value)
9
+ add_value = self.class.attribute_callback(TypeHandler::SETTER_PROCS, handles[attribute], value, true)
10
10
  if ADDABLE_TYPES.include? handles[attribute][:format]
11
11
  @attributes[attribute] ? @attributes[attribute] += add_value : @attributes[attribute] = add_value
12
12
  else
@@ -172,7 +172,6 @@ module Dynamini
172
172
  end
173
173
 
174
174
  def self.create_key_hash(hash_value, range_value = nil)
175
-
176
175
  key_hash = {self.hash_key => handled_key(self.hash_key, hash_value)}
177
176
  key_hash[self.range_key] = handled_key(self.range_key, range_value) if self.range_key
178
177
  key_hash
@@ -217,7 +216,7 @@ module Dynamini
217
216
  def write_attribute(attribute, new_value, change: true, **options)
218
217
  old_value = read_attribute(attribute)
219
218
  if (handle = self.class.handles[attribute.to_sym]) && !new_value.nil?
220
- new_value = self.class.attribute_callback(TypeHandler::SETTER_PROCS, handle, new_value)
219
+ new_value = self.class.attribute_callback(TypeHandler::SETTER_PROCS, handle, new_value, change)
221
220
  end
222
221
  @attributes[attribute] = new_value
223
222
  record_change(attribute, old_value, new_value, options[:action]) if change && new_value != old_value
@@ -227,7 +226,7 @@ module Dynamini
227
226
  value = @attributes[name]
228
227
  if (handle = self.class.handles[name.to_sym])
229
228
  value = handle[:options][:default] if value.nil?
230
- value = self.class.attribute_callback(TypeHandler::GETTER_PROCS, handle, value) unless value.nil?
229
+ value = self.class.attribute_callback(TypeHandler::GETTER_PROCS, handle, value, false) unless value.nil?
231
230
  end
232
231
  value
233
232
  end
@@ -9,8 +9,8 @@ module Dynamini
9
9
  symbol: proc { |v| v.to_sym },
10
10
  string: proc { |v| v.to_s },
11
11
  boolean: proc { |v| v },
12
- array: proc { |v| v.to_a },
13
- set: proc { |v| Set.new(v) }
12
+ array: proc { |v| v.is_a?(Enumerable) ? v.to_a : [v] },
13
+ set: proc { |v| v.is_a?(Enumerable) ? Set.new(v) : Set.new([v]) }
14
14
  }
15
15
 
16
16
  SETTER_PROCS = {
@@ -21,8 +21,8 @@ module Dynamini
21
21
  string: proc { |v| v.to_s },
22
22
  boolean: proc { |v| v },
23
23
  date: proc { |v| v.to_time.to_f },
24
- array: proc { |v| v.to_a },
25
- set: proc { |v| Set.new(v) }
24
+ array: proc { |v| v.is_a?(Enumerable) ? v.to_a : [v] },
25
+ set: proc { |v| v.is_a?(Enumerable) ? Set.new(v) : Set.new([v]) }
26
26
  }
27
27
 
28
28
  def handle(column, format_class, options = {})
@@ -73,19 +73,19 @@ module Dynamini
73
73
  end
74
74
 
75
75
  def handled_key(column, value)
76
- if handle = handles[column]
77
- attribute_callback(GETTER_PROCS, handle, value)
76
+ if handles[column]
77
+ attribute_callback(GETTER_PROCS, handles[column], value, false)
78
78
  else
79
79
  value
80
80
  end
81
81
  end
82
82
 
83
- def attribute_callback(procs, handle, value)
83
+ def attribute_callback(procs, handle, value, validate)
84
84
  callback = procs[handle[:format]]
85
85
  if should_convert_elements?(handle, value)
86
86
  result = convert_elements(value, procs[handle[:options][:of]])
87
87
  callback.call(result)
88
- elsif invalid_enumerable_value?(handle, value)
88
+ elsif validate && invalid_enumerable_value?(handle, value)
89
89
  raise ArgumentError, "Can't write a non-enumerable value to field handled as #{handle[:format]}"
90
90
  else
91
91
  callback.call(value)
@@ -7,7 +7,8 @@ describe Dynamini::Querying do
7
7
  name: 'Widget',
8
8
  price: 9.99,
9
9
  id: 'abcd1234',
10
- hash_key: '009'
10
+ hash_key: '009',
11
+ my_attrib: 'hello'
11
12
  }
12
13
  }
13
14
 
@@ -55,6 +56,19 @@ describe Dynamini::Querying do
55
56
  end
56
57
  end
57
58
 
59
+ context 'when the record has invalid data types for its handles' do
60
+ class SetHandler < Dynamini::Base
61
+ set_hash_key :id
62
+ end
63
+
64
+ it 'loads the record' do
65
+ SetHandler.create!(id: '1', attrib: 'hello')
66
+ SetHandler.handle(:attrib, :set)
67
+ found = SetHandler.find('1')
68
+ expect(found.id).to eq('1')
69
+ end
70
+ end
71
+
58
72
  context 'when retrieving a subclass' do
59
73
  class Foo < Dynamini::Base
60
74
  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.6.8
4
+ version: 2.7.0
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: 2016-10-12 00:00:00.000000000 Z
18
+ date: 2016-11-24 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: activemodel
@@ -185,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
185
  version: '0'
186
186
  requirements: []
187
187
  rubyforge_project:
188
- rubygems_version: 2.6.4
188
+ rubygems_version: 2.5.1
189
189
  signing_key:
190
190
  specification_version: 4
191
191
  summary: DynamoDB interface