dynamini 2.6.0 → 2.6.2
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 +6 -4
- data/dynamini.gemspec +1 -1
- data/lib/dynamini/type_handler.rb +21 -11
- data/spec/dynamini/type_handler_spec.rb +8 -14
- 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: eb80f52caa4a21c3f189d5427e7aa9ae90a1a2e0
|
4
|
+
data.tar.gz: 1c2f76b9cd36ccba731f263efabceeeafeb8ae97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fc0ddf4c8c732c6943800a1fe735a1176203bb9f3740b2fb6cf762cfbe1d614bb684c7b34c32b9f04893668bc66f7745aa6d93addb55b9c199c09de81866a2e
|
7
|
+
data.tar.gz: a658de15ef8a2b607b68f7799d3ed23262df8df223fbfc838039e310a3986cfba8a99392fe0b5642eb56de2b38b4aa3d221fa244b22af109a34cd5dc5968d7dc
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -43,6 +43,7 @@ There are also some new functions specific to DynamoDB's API:
|
|
43
43
|
* find_or_nil(hash_key, range_key) - since ActiveRecord's find_by isn't applicable to noSQL, use this method if you want a .find that doesn't raise exceptions when the item doesn't exist
|
44
44
|
* batch_find([keys]) - to retrieve multiple objects at once.
|
45
45
|
* increment!({attribute1: amount, attribute2: amount}) - to update your record using DynamoDB's Atomic Counter functionality. (For more information, see http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters )
|
46
|
+
* add_to(attribute, value) - If you use this to modify your attribute, when saving, Dynamini will update that attribute with ADD instead of PUT. Your attribute must be handled as an addable type - :integer, :float, :array, :set, :date, or :time. (For more information on ADD actions, see http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html )
|
46
47
|
|
47
48
|
## Configuration
|
48
49
|
In application.rb, or in initializers/dynamini.rb, include your AWS settings like so:
|
@@ -99,12 +100,13 @@ The following datatypes are supported by handle:
|
|
99
100
|
* :time
|
100
101
|
* :string
|
101
102
|
* :array
|
103
|
+
* :set
|
102
104
|
|
103
105
|
Booleans and strings don't actually need to be translated, but you can set up defaults for those fields this way.
|
104
106
|
The magic fields updated_at and created_at are handled as :time by default.
|
105
107
|
|
106
|
-
##
|
107
|
-
You can save arrays to your Dynamini model. Optionally, you can have Dynamini perform type conversion on each element of your
|
108
|
+
## Enumerable Support
|
109
|
+
You can save arrays and sets to your Dynamini model. Optionally, you can have Dynamini perform type conversion on each element of your enumerable. Here's how it works:
|
108
110
|
|
109
111
|
```ruby
|
110
112
|
class Vehicle < Dynamini::Base
|
@@ -138,7 +140,7 @@ Vehicle.find('H3LLO').other_array
|
|
138
140
|
> ['wheel', 'brakes', BigDecimal(5)]
|
139
141
|
```
|
140
142
|
|
141
|
-
Please note that changing
|
143
|
+
Please note that changing enumerables in place using mutator methods like << or map! will not record a change to the object.
|
142
144
|
|
143
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.
|
144
146
|
|
@@ -222,7 +224,7 @@ config.after(:each) {
|
|
222
224
|
* You can also write any arbitrary attribute to your model.
|
223
225
|
* Other models in your app cannot have a has_one or has_many relationship with your Dynamini model, since these would require a table scan. Your other models can still use belongs_to.
|
224
226
|
* If you change the primary key value on an instance of your model, then resave it, you'll have two copies in your database.
|
225
|
-
* If you use non-numeric strings for your primary key, remember to change your foreign key columns on related
|
227
|
+
* If you use non-numeric strings for your primary key, remember to change your foreign key columns on related ActiveRecord tables to be string type.
|
226
228
|
* You might want to conditionally set the table name for your model based on the Rails.env, enabling separate tables for development and production.
|
227
229
|
|
228
230
|
## Contributing
|
data/dynamini.gemspec
CHANGED
@@ -9,8 +9,8 @@ module Dynamini
|
|
9
9
|
symbol: proc { |v| v.to_sym },
|
10
10
|
string: proc { |v| v },
|
11
11
|
boolean: proc { |v| v },
|
12
|
-
array: proc { |v| v },
|
13
|
-
set: proc { |v| v }
|
12
|
+
array: proc { |v| v.to_a },
|
13
|
+
set: proc { |v| Set.new(v) }
|
14
14
|
}
|
15
15
|
|
16
16
|
SETTER_PROCS = {
|
@@ -21,8 +21,8 @@ module Dynamini
|
|
21
21
|
string: proc { |v| v },
|
22
22
|
boolean: proc { |v| v },
|
23
23
|
date: proc { |v| v.to_time.to_f },
|
24
|
-
array: proc { |v| v },
|
25
|
-
set: proc { |v| v }
|
24
|
+
array: proc { |v| v.to_a },
|
25
|
+
set: proc { |v| Set.new(v) }
|
26
26
|
}
|
27
27
|
|
28
28
|
module ClassMethods
|
@@ -71,13 +71,11 @@ module Dynamini
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def attribute_callback(procs, handle, value)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
elsif
|
79
|
-
Set.new(value.map { |e| callback.call(e) })
|
80
|
-
elsif handled_as?(handle, [:array, :set])
|
74
|
+
callback = procs[handle[:format]]
|
75
|
+
if should_convert_elements?(handle, value)
|
76
|
+
result = convert_elements(value, procs[handle[:options][:of]])
|
77
|
+
callback.call(result)
|
78
|
+
elsif invalid_enumerable_value?(handle, value)
|
81
79
|
raise ArgumentError, "Can't write a non-enumerable value to field handled as #{handle[:format]}"
|
82
80
|
else
|
83
81
|
callback.call(value)
|
@@ -92,5 +90,17 @@ module Dynamini
|
|
92
90
|
base.extend ClassMethods
|
93
91
|
end
|
94
92
|
|
93
|
+
def should_convert_elements?(handle, value)
|
94
|
+
handle[:options][:of] && (value.is_a?(Array) || value.is_a?(Set))
|
95
|
+
end
|
96
|
+
|
97
|
+
def invalid_enumerable_value?(handle, value)
|
98
|
+
handled_as?(handle, [:array, :set]) && !value.is_a?(Enumerable)
|
99
|
+
end
|
100
|
+
|
101
|
+
def convert_elements(enumerable, callback)
|
102
|
+
enumerable.map { |e| callback.call(e) }
|
103
|
+
end
|
104
|
+
|
95
105
|
end
|
96
106
|
end
|
@@ -16,10 +16,6 @@ describe Dynamini::TypeHandler do
|
|
16
16
|
object = HandledClass.new
|
17
17
|
expect(object.price).to eq(9)
|
18
18
|
end
|
19
|
-
it 'should return an array with formatted items if handled' do
|
20
|
-
object = HandledClass.new(price: ["1", "2"])
|
21
|
-
expect(object.price).to eq([1, 2])
|
22
|
-
end
|
23
19
|
end
|
24
20
|
|
25
21
|
context 'when writing the handled attribute' do
|
@@ -101,6 +97,11 @@ describe Dynamini::TypeHandler do
|
|
101
97
|
it 'should allow default values for arrays' do
|
102
98
|
expect(handle_model.defaulted_ary).to eq([1, 2, 3])
|
103
99
|
end
|
100
|
+
|
101
|
+
it 'should convert sets to arrays' do
|
102
|
+
handle_model.float_array = Set.new([12,24,48])
|
103
|
+
expect(handle_model.float_array).to_not be_a(Set)
|
104
|
+
end
|
104
105
|
end
|
105
106
|
|
106
107
|
context 'when handling as set' do
|
@@ -121,17 +122,10 @@ describe Dynamini::TypeHandler do
|
|
121
122
|
it 'should allow default values for arrays' do
|
122
123
|
expect(handle_model.defaulted_ary).to eq([1, 2, 3])
|
123
124
|
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'legacy support' do
|
127
|
-
it 'should save casted arrays' do
|
128
|
-
handle_model.int_list = [12, 24, 48]
|
129
|
-
expect(handle_model.int_list).to eq([12, 24, 48])
|
130
|
-
end
|
131
125
|
|
132
|
-
it 'should
|
133
|
-
handle_model.
|
134
|
-
expect(handle_model.
|
126
|
+
it 'should convert arrays to sets' do
|
127
|
+
handle_model.float_set = [12,24,48]
|
128
|
+
expect(handle_model.float_set).to_not be_a(Array)
|
135
129
|
end
|
136
130
|
end
|
137
131
|
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.2
|
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-22 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: activemodel
|