dynamini 2.6.8 → 2.7.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.
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