dynamo_record 0.0.11 → 0.0.12
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 +4 -4
- data/lib/dynamo_record/document.rb +7 -29
- data/lib/dynamo_record/fields.rb +46 -0
- data/lib/dynamo_record/persistence.rb +2 -1
- data/lib/dynamo_record/version.rb +1 -1
- data/spec/app/models/person.rb +1 -0
- data/spec/dynamo_record/fields_spec.rb +7 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52df01e379863dd298b03b2d959d5fb413232042
|
4
|
+
data.tar.gz: 3551424dafe92d4911befd4724a20419d6af8b95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc3a850ae10daf4bc24b473f6c551ad15d0d3925355a93614f0d8f755f15ecd363ef2cedc9f85c5a6d7ee555b4b78b1de7b3fd07682156e9ced767fc4400c148
|
7
|
+
data.tar.gz: 6be092762e7572e4a878649de003facbb40f2f3910c1a0bb1ba7140667fee8b8dab8b9bb687a21ddff04802a71fa89c09f1ae2e6074981ab10fc003d855b0307
|
@@ -12,9 +12,11 @@ module DynamoRecord
|
|
12
12
|
end
|
13
13
|
|
14
14
|
module ClassMethods
|
15
|
+
|
15
16
|
def from_database(attrs)
|
16
17
|
self.new(attrs, true).tap { |r| r.new_record = false}
|
17
18
|
end
|
19
|
+
|
18
20
|
end
|
19
21
|
|
20
22
|
attr_accessor :new_record, :attributes
|
@@ -28,37 +30,13 @@ module DynamoRecord
|
|
28
30
|
send("#{key}=", value[:options][:default]) if value[:options][:default]
|
29
31
|
end
|
30
32
|
|
31
|
-
attrs
|
32
|
-
next if ignore_unknown_field && !respond_to?("#{key}=")
|
33
|
-
send("#{key}=", undump_field(value, self.class.attributes[key.to_sym]))
|
34
|
-
end
|
33
|
+
load(attrs, ignore_unknown_field)
|
35
34
|
end
|
36
35
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
value.to_i
|
42
|
-
when :string
|
43
|
-
value.to_s
|
44
|
-
when :float
|
45
|
-
value.to_f
|
46
|
-
when :boolean
|
47
|
-
if value == "true" || value == true
|
48
|
-
true
|
49
|
-
elsif value == "false" || value == false
|
50
|
-
false
|
51
|
-
else
|
52
|
-
raise ArgumentError, "Boolean column neither true nor false"
|
53
|
-
end
|
54
|
-
when :datetime
|
55
|
-
if value.is_a?(Date) || value.is_a?(DateTime) || value.is_a?(Time)
|
56
|
-
value
|
57
|
-
else
|
58
|
-
DateTime.parse(value)
|
59
|
-
end
|
60
|
-
else
|
61
|
-
raise ArgumentError, "Unknown type #{options[:type]}"
|
36
|
+
def load(attrs, ignore_unknown_field=false)
|
37
|
+
attrs.each do |key, value|
|
38
|
+
next if ignore_unknown_field && !respond_to?("#{key}=")
|
39
|
+
send("#{key}=", self.class.undump_field(value, self.class.attributes[key.to_sym]))
|
62
40
|
end
|
63
41
|
end
|
64
42
|
end
|
data/lib/dynamo_record/fields.rb
CHANGED
@@ -23,6 +23,52 @@ module DynamoRecord
|
|
23
23
|
!!value
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
def undump_field(value, options)
|
28
|
+
return nil if options.nil?
|
29
|
+
case options[:type]
|
30
|
+
when :integer
|
31
|
+
value.to_i
|
32
|
+
when :string
|
33
|
+
value.to_s
|
34
|
+
when :float
|
35
|
+
value.to_f
|
36
|
+
when :boolean
|
37
|
+
if value == "true" || value == true
|
38
|
+
true
|
39
|
+
elsif value == "false" || value == false
|
40
|
+
false
|
41
|
+
else
|
42
|
+
raise ArgumentError, "Boolean column neither true nor false"
|
43
|
+
end
|
44
|
+
when :datetime
|
45
|
+
if value.is_a?(Date) || value.is_a?(DateTime) || value.is_a?(Time)
|
46
|
+
value
|
47
|
+
else
|
48
|
+
DateTime.parse(value)
|
49
|
+
end
|
50
|
+
else
|
51
|
+
raise ArgumentError, "Unknown type #{options[:type]}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def dump_field(value, options)
|
56
|
+
return value if options.nil?
|
57
|
+
case options[:type]
|
58
|
+
when :datetime
|
59
|
+
value.iso8601
|
60
|
+
else
|
61
|
+
value # aws-sdk supports the rest of data yptes
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def unload(attrs)
|
66
|
+
Hash.new.tap do |hash|
|
67
|
+
attrs.each do |key, value|
|
68
|
+
hash[key] = dump_field(value, self.attributes[key.to_sym])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
26
72
|
end
|
27
73
|
|
28
74
|
def write_attribute(name, value)
|
@@ -82,12 +82,13 @@ module DynamoRecord
|
|
82
82
|
options.merge!(condition_expression: 'id <> :s', expression_attribute_values: { ':s' => self.id })
|
83
83
|
end
|
84
84
|
|
85
|
-
options.merge!(item: attributes)
|
85
|
+
options.merge!(item: self.class.unload(attributes))
|
86
86
|
response = self.class.client.put_item(options)
|
87
87
|
@new_record = false
|
88
88
|
true
|
89
89
|
rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException
|
90
90
|
false
|
91
91
|
end
|
92
|
+
|
92
93
|
end
|
93
94
|
end
|
data/spec/app/models/person.rb
CHANGED
@@ -68,4 +68,11 @@ RSpec.describe DynamoRecord::Fields do
|
|
68
68
|
specify { expect(Person.new(activated: 'false').activated?).to be_falsy }
|
69
69
|
end
|
70
70
|
|
71
|
+
describe '#unload' do
|
72
|
+
it 'unloads DateTime into String' do
|
73
|
+
now = DateTime.now
|
74
|
+
attrs = Person.unload({created_at: now})
|
75
|
+
expect(attrs[:created_at]).to eq(now.iso8601)
|
76
|
+
end
|
77
|
+
end
|
71
78
|
end
|