dynamo_record 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- 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
|