dynamini 2.2.5 → 2.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/dynamini.gemspec +1 -1
- data/lib/dynamini/dirty.rb +8 -1
- data/lib/dynamini/test_client.rb +5 -5
- data/spec/dynamini/dirty_spec.rb +33 -8
- data/spec/dynamini/test_client_spec.rb +7 -1
- 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: 42a0405b70513e4b385e3e5817bd165f3965a9da
|
4
|
+
data.tar.gz: c248a81d97633dd595b6dfb3ff3f5881dee6c264
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba66289642c867b5cbadbf3078a80d0d809e1210170c7b7ab41046dd6ced32a8d753596dcc919b4f7a602a9c552de0661a39d184593a9c7bc4422b16776d84c6
|
7
|
+
data.tar.gz: 56d3a8b2f619e62de98763b88fec4fec50c2681a53b5086dae33865d979f7f2ac00e9d16af773d61047f6c8fb3c7c564d8625de48c2bb6394a24923ee9c38ce8
|
data/README.md
CHANGED
@@ -187,6 +187,8 @@ Vehicle.find('H3LLO').stuff
|
|
187
187
|
> ['wheel', 'brakes', BigDecimal(5)]
|
188
188
|
```
|
189
189
|
|
190
|
+
Please note that changing arrays in place using mutator methods like << or map! will not record a change to the object. If you want to make changes like this, either use the assignment operator (e.g. model.array = model.array << 'foo') or call model.mark(:attribute) after mutation and before saving to force Dynamini to write the change.
|
191
|
+
|
190
192
|
## Testing
|
191
193
|
We've included an optional in-memory test client, so you don't necessarily have to connect to a real Dynamo instance when running tests. You could also use this in your development environment if you don't have a real Dynamo instance yet, but the data saved to it won't persist through a server restart.
|
192
194
|
|
data/dynamini.gemspec
CHANGED
data/lib/dynamini/dirty.rb
CHANGED
@@ -14,6 +14,13 @@ module Dynamini
|
|
14
14
|
@new_record
|
15
15
|
end
|
16
16
|
|
17
|
+
def mark(attr)
|
18
|
+
if @changes[attr] == [nil, nil]
|
19
|
+
val = @attributes[attr]
|
20
|
+
@changes[attr] = [val, val]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
17
24
|
private
|
18
25
|
|
19
26
|
def record_change(attribute, new_value, old_value)
|
@@ -35,4 +42,4 @@ module Dynamini
|
|
35
42
|
@changes[attr_name].compact.present? ? @changes[attr_name][0] : read_attribute(attr_name)
|
36
43
|
end
|
37
44
|
end
|
38
|
-
end
|
45
|
+
end
|
data/lib/dynamini/test_client.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'ostruct'
|
2
|
+
require 'active_support/core_ext/object/deep_dup'
|
3
3
|
|
4
|
+
module Dynamini
|
4
5
|
# In-memory database client for test purposes.
|
5
6
|
class TestClient
|
6
7
|
|
@@ -30,7 +31,6 @@ module Dynamini
|
|
30
31
|
)
|
31
32
|
|
32
33
|
primary_index_insertion(hash_key_value, range_key_value, updates, table) if hash_key_value
|
33
|
-
|
34
34
|
end
|
35
35
|
|
36
36
|
def primary_index_insertion(hash_key_value, range_key_value, updates, table)
|
@@ -66,7 +66,7 @@ module Dynamini
|
|
66
66
|
attributes_hash = table[hash_key_value]
|
67
67
|
attributes_hash = attributes_hash[range_key_value] if attributes_hash && range_key_value
|
68
68
|
|
69
|
-
OpenStruct.new(item: attributes_hash)
|
69
|
+
OpenStruct.new(item: (attributes_hash ? attributes_hash.deep_dup : nil))
|
70
70
|
end
|
71
71
|
|
72
72
|
# No range key support - use query instead.
|
@@ -90,7 +90,7 @@ module Dynamini
|
|
90
90
|
put_requests.each do |request_hash|
|
91
91
|
item = request_hash[:put_request][:item]
|
92
92
|
key = item[hash_key_attr.to_s]
|
93
|
-
get_table(table_name)[key] = item
|
93
|
+
get_table(table_name)[key] = item # not merging since real client does not support batch update
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
data/spec/dynamini/dirty_spec.rb
CHANGED
@@ -3,13 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe Dynamini::Dirty do
|
4
4
|
|
5
5
|
let(:model_attributes) {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
{
|
7
|
+
name: 'Widget',
|
8
|
+
price: 9.99,
|
9
|
+
id: 'abcd1234',
|
10
|
+
hash_key: '009'
|
11
|
+
}
|
12
12
|
}
|
13
|
+
|
13
14
|
let(:dirty_model) { Dynamini::Base.new(model_attributes) }
|
14
15
|
let(:model) { Dynamini::Base.new(model_attributes, false) }
|
15
16
|
|
@@ -22,7 +23,31 @@ describe Dynamini::Dirty do
|
|
22
23
|
end
|
23
24
|
|
24
25
|
it 'should not include the primary key in the changes' do
|
25
|
-
expect(dirty_model.changes[
|
26
|
+
expect(dirty_model.changes['id']).to be_nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#mark' do
|
31
|
+
context 'when marking an unchanged attribute' do
|
32
|
+
it 'should add the marked attribute to @changed' do
|
33
|
+
model.mark(:price)
|
34
|
+
expect(model.changed).to eq(['price'])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
context 'when marking an already changed attribute' do
|
38
|
+
it 'should do nothing' do
|
39
|
+
dirty_model.mark(:price)
|
40
|
+
expect(dirty_model.changes['price']).to eq([nil, model_attributes[:price]])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
context 'when using it to mark a changed array' do
|
44
|
+
it 'should write the mutated array value when saving' do
|
45
|
+
model_with_array = Dynamini::Base.new({elements: ['a','b','c'], id: 'foo'}, false)
|
46
|
+
model_with_array.elements << 'd'
|
47
|
+
model_with_array.mark(:elements)
|
48
|
+
model_with_array.save
|
49
|
+
expect(Dynamini::Base.find('foo').elements).to eq(['a','b','c','d'])
|
50
|
+
end
|
26
51
|
end
|
27
52
|
end
|
28
53
|
|
@@ -141,4 +166,4 @@ describe Dynamini::Dirty do
|
|
141
166
|
expect(model.changed).to eq(['price', 'name'])
|
142
167
|
end
|
143
168
|
end
|
144
|
-
end
|
169
|
+
end
|
@@ -19,7 +19,6 @@ describe Dynamini::TestClient do
|
|
19
19
|
test_client.update_item(table_name: table_name, key: {hash_key_name: 'hash_key_value'}, attribute_updates: {abc: {value: 'def', action: 'PUT'}})
|
20
20
|
expect(test_client.data[table_name]['hash_key_value']).to eq(abc: 'def', :hash_key_name => "hash_key_value")
|
21
21
|
end
|
22
|
-
|
23
22
|
end
|
24
23
|
|
25
24
|
context 'with Hash key and range key' do
|
@@ -76,6 +75,13 @@ describe Dynamini::TestClient do
|
|
76
75
|
|
77
76
|
expect(test_client.get_item(table_name: table_name, key: {test_client.hash_key_attr => "abc", :extra_key => "extra"}).item[:test_attr]).to eq('test')
|
78
77
|
end
|
78
|
+
|
79
|
+
it 'should return new (cloned) arrays if arrays are present in the model attributes' do
|
80
|
+
test_client.update_item(table_name: table_name, key: {test_client.hash_key_attr => "abc"}, attribute_updates: {ary: {value: ['a','b','c'], action: 'PUT'}})
|
81
|
+
retrieved = test_client.get_item(table_name: table_name, key: {test_client.hash_key_attr => "abc", :extra_key => "extra"}).item
|
82
|
+
retrieved[:ary] = ['a','b','c','d']
|
83
|
+
expect(test_client.get_item(table_name: table_name, key: {test_client.hash_key_attr => "abc", :extra_key => "extra"}).item[:ary]).to eq(['a','b','c'])
|
84
|
+
end
|
79
85
|
end
|
80
86
|
|
81
87
|
context 'table with hash and range key' do
|
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.2.
|
4
|
+
version: 2.2.6
|
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-
|
18
|
+
date: 2016-06-23 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: activemodel
|