dynamini 2.6.2 → 2.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +4 -4
- data/dynamini.gemspec +1 -1
- data/lib/dynamini/adder.rb +7 -7
- data/lib/dynamini/test_client.rb +1 -3
- data/lib/dynamini/type_handler.rb +10 -1
- data/spec/dynamini/adder_spec.rb +25 -1
- data/spec/dynamini/test_client_spec.rb +7 -0
- data/spec/dynamini/type_handler_spec.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7075482c77f8b6cec60de580a672fed23b646f51
|
4
|
+
data.tar.gz: 03b4480b94b8e8c312885339d06ed86fd59687ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49a1fff7890939d2cd39c8fb756c29cfd1c852155e90efa797f659d8488b26e720eedd7da0521734a047bb5e9f0ebf7e8c10cd090f8d2bed52337b55a1575b11
|
7
|
+
data.tar.gz: 1e0ece3e30f4c3d7acbc10a6f6a5ecf814f3b09efc4542776cc180c40a2c2e83a2f39fa33f9d3845f3a49155411fdd65e3282d287a47d786c2ae11111aa7c08d
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -111,7 +111,7 @@ You can save arrays and sets to your Dynamini model. Optionally, you can have Dy
|
|
111
111
|
```ruby
|
112
112
|
class Vehicle < Dynamini::Base
|
113
113
|
set_hash_key :vin
|
114
|
-
handle :parts, :array, of: :symbol # :of accepts
|
114
|
+
handle :parts, :array, of: :symbol # :of accepts all types except :set and :array
|
115
115
|
handle :other_array, :array
|
116
116
|
end
|
117
117
|
|
@@ -119,7 +119,7 @@ car = Vehicle.new(vin: 'H3LL0')
|
|
119
119
|
car.parts
|
120
120
|
> []
|
121
121
|
|
122
|
-
car.parts = 'wheel'
|
122
|
+
car.parts = ['wheel']
|
123
123
|
car.parts
|
124
124
|
> :wheel
|
125
125
|
|
@@ -130,7 +130,7 @@ car.parts
|
|
130
130
|
# This line will raise an error since 5 cannot be converted to a symbol.
|
131
131
|
car.parts = ['wheel', 'brakes', 5]
|
132
132
|
|
133
|
-
# If you want a multitype array,
|
133
|
+
# If you want a multitype array, use :handle without the :of option.
|
134
134
|
car.other_array = ['wheel', 'brakes', 5]
|
135
135
|
car.other_array
|
136
136
|
> ['wheel', 'brakes', 5]
|
@@ -140,7 +140,7 @@ Vehicle.find('H3LLO').other_array
|
|
140
140
|
> ['wheel', 'brakes', BigDecimal(5)]
|
141
141
|
```
|
142
142
|
|
143
|
-
Please note that changing enumerables in place using mutator methods like << or map! will not record a change to the object.
|
143
|
+
Please note that changing enumerables in place using mutator methods like << or map! will not record a change to the object.
|
144
144
|
|
145
145
|
If you want to make changes like this, either clone it then use the assignment operator (e.g. model.array = model.array.dup << 'foo') or call model.mark(:attribute) after mutation and before saving to force Dynamini to write the change.
|
146
146
|
|
data/dynamini.gemspec
CHANGED
data/lib/dynamini/adder.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
module Dynamini
|
2
2
|
module Adder
|
3
|
+
|
4
|
+
ADDABLE_TYPES = [:set, :array, :integer, :float, :time, :date]
|
5
|
+
|
3
6
|
def add_to(attribute, value)
|
4
7
|
complain_about(attribute) unless handles[attribute]
|
5
8
|
old_value = read_attribute(attribute)
|
6
9
|
add_value = attribute_callback(Dynamini::TypeHandler::SETTER_PROCS, handles[attribute], value)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
@attributes[attribute] += add_value
|
12
|
-
else
|
13
|
-
complain_about(attribute)
|
10
|
+
if ADDABLE_TYPES.include? handles[attribute][:format]
|
11
|
+
@attributes[attribute] ? @attributes[attribute] += add_value : @attributes[attribute] = add_value
|
12
|
+
else
|
13
|
+
complain_about(attribute)
|
14
14
|
end
|
15
15
|
record_change(attribute, old_value, add_value, 'ADD')
|
16
16
|
self
|
data/lib/dynamini/test_client.rb
CHANGED
@@ -220,13 +220,11 @@ module Dynamini
|
|
220
220
|
def handle_updates(args, hash_key_value, range_key_value, attribute_hash)
|
221
221
|
table = get_table(args[:table_name])
|
222
222
|
args[:attribute_updates].each do |k, v|
|
223
|
-
|
224
223
|
if v[:action] == 'ADD' && table[hash_key_value]
|
225
224
|
# if record has been saved
|
226
225
|
data = table[hash_key_value]
|
227
226
|
data = (data[range_key_value] ||= {}) if range_key_value
|
228
|
-
|
229
|
-
attribute_hash[k] = (v[:value] + data[k].to_f)
|
227
|
+
attribute_hash[k] = data[k] ? data[k] + v[:value] : v[:value]
|
230
228
|
else
|
231
229
|
attribute_hash[k] = v[:value]
|
232
230
|
end
|
@@ -27,6 +27,8 @@ module Dynamini
|
|
27
27
|
|
28
28
|
module ClassMethods
|
29
29
|
def handle(column, format_class, options = {})
|
30
|
+
validate_handle(format_class, options)
|
31
|
+
|
30
32
|
options[:default] ||= format_default(format_class)
|
31
33
|
options[:default] ||= Set.new if format_class == :set
|
32
34
|
|
@@ -62,6 +64,14 @@ module Dynamini
|
|
62
64
|
Set.new
|
63
65
|
end
|
64
66
|
end
|
67
|
+
|
68
|
+
def validate_handle(format, options)
|
69
|
+
if format == :set
|
70
|
+
if options[:of] && [:set, :array].include?(options[:of])
|
71
|
+
raise ArgumentError, 'Invalid handle: cannot store non-primitive datatypes within a set.'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
65
75
|
end
|
66
76
|
|
67
77
|
private
|
@@ -101,6 +111,5 @@ module Dynamini
|
|
101
111
|
def convert_elements(enumerable, callback)
|
102
112
|
enumerable.map { |e| callback.call(e) }
|
103
113
|
end
|
104
|
-
|
105
114
|
end
|
106
115
|
end
|
data/spec/dynamini/adder_spec.rb
CHANGED
@@ -9,6 +9,8 @@ describe Dynamini::Adder do
|
|
9
9
|
handle :when, :date
|
10
10
|
handle :what_time, :time
|
11
11
|
handle :widget_count, :integer
|
12
|
+
handle :new_set, :set
|
13
|
+
handle :new_array, :array
|
12
14
|
end
|
13
15
|
|
14
16
|
let(:model_attributes) {
|
@@ -22,7 +24,7 @@ describe Dynamini::Adder do
|
|
22
24
|
}
|
23
25
|
}
|
24
26
|
|
25
|
-
let(:model) { AddHandledModel.new(model_attributes
|
27
|
+
let(:model) { AddHandledModel.new(model_attributes) }
|
26
28
|
|
27
29
|
|
28
30
|
describe '.add_to' do
|
@@ -63,6 +65,12 @@ describe Dynamini::Adder do
|
|
63
65
|
expect{ model.add_to(:things, 4) }.to raise_error ArgumentError
|
64
66
|
end
|
65
67
|
end
|
68
|
+
context 'adding to an uninitialized set' do
|
69
|
+
it 'creates the set' do
|
70
|
+
model.add_to(:new_set, Set.new([4]))
|
71
|
+
expect(model.new_set).to eq(Set.new([4]))
|
72
|
+
end
|
73
|
+
end
|
66
74
|
end
|
67
75
|
|
68
76
|
context 'adding to an array' do
|
@@ -77,6 +85,22 @@ describe Dynamini::Adder do
|
|
77
85
|
expect{ model.add_to(:stuff, 4) }.to raise_error ArgumentError
|
78
86
|
end
|
79
87
|
end
|
88
|
+
context 'adding to an empty array' do
|
89
|
+
it 'creates the array' do
|
90
|
+
model.add_to(:new_array, [4])
|
91
|
+
expect(model.new_array).to eq([4])
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'without reading a previously saved item' do
|
97
|
+
it 'still adds' do
|
98
|
+
model.save
|
99
|
+
model2 = AddHandledModel.new(id: model_attributes[:id])
|
100
|
+
model2.add_to(:price, 2)
|
101
|
+
model2.save
|
102
|
+
expect(AddHandledModel.find(model_attributes[:id]).price).to eq(11.99)
|
103
|
+
end
|
80
104
|
end
|
81
105
|
end
|
82
106
|
end
|
@@ -26,6 +26,13 @@ describe Dynamini::TestClient do
|
|
26
26
|
test_client.update_item(table_name: table_name, key: {hash_key_name: 'hash_key_value'}, attribute_updates: {abc: {value: 1, action: 'ADD'}})
|
27
27
|
expect(test_client.data[table_name]['hash_key_value']).to eq(abc: 2, hash_key_name: 'hash_key_value')
|
28
28
|
end
|
29
|
+
|
30
|
+
it 'should be able to add to an existing set' do
|
31
|
+
test_client = Dynamini::TestClient.new(:hash_key_name)
|
32
|
+
test_client.update_item(table_name: table_name, key: {hash_key_name: 'hash_key_value'}, attribute_updates: {abc: {value: Set.new([1]), action: 'PUT'}})
|
33
|
+
test_client.update_item(table_name: table_name, key: {hash_key_name: 'hash_key_value'}, attribute_updates: {abc: {value: Set.new([2]), action: 'ADD'}})
|
34
|
+
expect(test_client.data[table_name]['hash_key_value']).to eq(abc: Set.new([1, 2]), hash_key_name: 'hash_key_value')
|
35
|
+
end
|
29
36
|
end
|
30
37
|
|
31
38
|
context 'with Hash key and range key' do
|
@@ -127,5 +127,13 @@ describe Dynamini::TypeHandler do
|
|
127
127
|
handle_model.float_set = [12,24,48]
|
128
128
|
expect(handle_model.float_set).to_not be_a(Array)
|
129
129
|
end
|
130
|
+
|
131
|
+
it 'should complain if trying to cast elements as arrays' do
|
132
|
+
expect{ HandleModel.handle :invalid, :set, of: :array}.to raise_error ArgumentError
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should complain if trying to cast elements as sets' do
|
136
|
+
expect{ HandleModel.handle :invalid, :set, of: :set}.to raise_error ArgumentError
|
137
|
+
end
|
130
138
|
end
|
131
139
|
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.
|
4
|
+
version: 2.6.3
|
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-09-
|
18
|
+
date: 2016-09-27 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: activemodel
|