dymos 0.0.7 → 0.0.8
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/dymos.gemspec +1 -0
- data/lib/dymos.rb +22 -0
- data/lib/dymos/model.rb +17 -5
- data/lib/dymos/persistence.rb +9 -2
- data/lib/dymos/version.rb +1 -1
- data/spec/lib/dymos/model_spec.rb +51 -27
- data/spec/spec_helper.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcc2ca53b227af59529709c865fbec440d59b561
|
4
|
+
data.tar.gz: ae44901535497e1e3c0d771aa89167c82659d9fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 163fafcafb4f7d3b9501a85a39f209aa5bf003af6cb7eb9d262178fca672d4b2a6d953dd0cd1b162678bde892f7eb73ce8f182928fa0fd2722f989b01f1a436d
|
7
|
+
data.tar.gz: c2e1d1b19404ec4fc4d94575393eea33841c32b67b19d8e5913df4c2253ac1c2a2b6b76ced15cca79459ff49207ff3c0e78fac002f3953c0dbb500deadc01b60
|
data/dymos.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "rspec"
|
24
24
|
spec.add_development_dependency "fake_dynamo"
|
25
25
|
spec.add_development_dependency "coveralls"
|
26
|
+
spec.add_development_dependency "timecop"
|
26
27
|
spec.add_development_dependency "activemodel", '~> 4.1.5'
|
27
28
|
|
28
29
|
spec.add_dependency "aws-sdk-core", "2.0.0.rc15"
|
data/lib/dymos.rb
CHANGED
@@ -16,3 +16,25 @@ require "dymos/version"
|
|
16
16
|
|
17
17
|
module Dymos
|
18
18
|
end
|
19
|
+
|
20
|
+
module Aws
|
21
|
+
module DynamoDB
|
22
|
+
class AttributeValue
|
23
|
+
class Marshaler
|
24
|
+
def format(obj)
|
25
|
+
case obj
|
26
|
+
when String then { s: obj }
|
27
|
+
when Time then { s: obj.iso8601 }
|
28
|
+
when Numeric then { n: obj.to_s }
|
29
|
+
when StringIO, IO then { b: obj.read }
|
30
|
+
when Set then format_set(obj)
|
31
|
+
else
|
32
|
+
msg = "unsupported type, expected Set, String, Numeric, or "
|
33
|
+
msg << "IO object, got #{obj.class.name}"
|
34
|
+
raise ArgumentError, msg
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/dymos/model.rb
CHANGED
@@ -22,16 +22,28 @@ module Dymos
|
|
22
22
|
default: default
|
23
23
|
}
|
24
24
|
define_attribute_methods attr
|
25
|
-
define_method(attr) {
|
25
|
+
define_method(attr) {|raw=false|
|
26
|
+
val=read_attribute(attr) || default
|
27
|
+
return val if raw
|
28
|
+
if type == :time && val.present?
|
29
|
+
Time.parse val
|
30
|
+
else
|
31
|
+
val
|
32
|
+
end
|
33
|
+
}
|
26
34
|
define_method("#{attr}_type") { type }
|
27
35
|
define_method("#{attr}?") { !read_attribute(attr).nil? }
|
28
|
-
define_method("#{attr}=")
|
36
|
+
define_method("#{attr}=") do |value, initialize=false|
|
37
|
+
value = value.iso8601 if self.class.fields.include?(attr) && value.is_a?(Time)
|
38
|
+
write_attribute(attr, value, initialize)
|
39
|
+
end
|
29
40
|
end
|
30
41
|
|
31
42
|
def self.fields
|
32
43
|
@fields
|
33
44
|
end
|
34
45
|
|
46
|
+
|
35
47
|
def self.table(name)
|
36
48
|
define_singleton_method('table_name') { name }
|
37
49
|
define_method('table_name') { name }
|
@@ -40,15 +52,15 @@ module Dymos
|
|
40
52
|
def attributes=(attributes = {}, initialize = false)
|
41
53
|
if attributes
|
42
54
|
attributes.each do |attr, value|
|
43
|
-
|
55
|
+
send("#{attr}=", value, initialize) if respond_to? "#{attr}="
|
44
56
|
end
|
45
57
|
end
|
46
58
|
end
|
47
59
|
|
48
|
-
def attributes
|
60
|
+
def attributes(raw=false)
|
49
61
|
attrs = {}
|
50
62
|
@attributes.keys.each do |name|
|
51
|
-
attrs[name] =
|
63
|
+
attrs[name] = send "#{name}", raw if respond_to? "#{name}"
|
52
64
|
end
|
53
65
|
attrs
|
54
66
|
end
|
data/lib/dymos/persistence.rb
CHANGED
@@ -21,7 +21,7 @@ module Dymos
|
|
21
21
|
|
22
22
|
def save(*)
|
23
23
|
create_or_update
|
24
|
-
rescue
|
24
|
+
rescue => e
|
25
25
|
false
|
26
26
|
end
|
27
27
|
|
@@ -43,10 +43,17 @@ module Dymos
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def _update_record()
|
46
|
-
|
46
|
+
send :updated_at=, Time.new.iso8601 if respond_to? :updated_at
|
47
|
+
_execute
|
47
48
|
end
|
48
49
|
|
49
50
|
def _create_record()
|
51
|
+
send :created_at=, Time.new.iso8601 if respond_to? :created_at
|
52
|
+
send :updated_at=, Time.new.iso8601 if respond_to? :updated_at
|
53
|
+
_execute
|
54
|
+
end
|
55
|
+
|
56
|
+
def _execute()
|
50
57
|
result = self.class.put.item(attributes).execute
|
51
58
|
changes_applied
|
52
59
|
@new_record = false
|
data/lib/dymos/version.rb
CHANGED
@@ -6,6 +6,9 @@ describe Dymos::Model do
|
|
6
6
|
field :email, :string
|
7
7
|
field :list, :string_set
|
8
8
|
|
9
|
+
field :created_at, :time
|
10
|
+
field :updated_at, :time
|
11
|
+
|
9
12
|
validates :id, :presence => true
|
10
13
|
validates :name, :presence => true, length: {maximum: 8}
|
11
14
|
validates :email, :presence => true, format: {with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i}
|
@@ -32,17 +35,17 @@ describe Dymos::Model do
|
|
32
35
|
|
33
36
|
client.delete_table(table_name: 'dummy') if client.list_tables[:table_names].include?('dummy')
|
34
37
|
client.create_table(
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
38
|
+
table_name: 'dummy',
|
39
|
+
attribute_definitions: [
|
40
|
+
{attribute_name: 'id', attribute_type: 'S'}
|
41
|
+
],
|
42
|
+
key_schema: [
|
43
|
+
{attribute_name: 'id', key_type: 'HASH'}
|
44
|
+
],
|
45
|
+
provisioned_throughput: {
|
46
|
+
read_capacity_units: 1,
|
47
|
+
write_capacity_units: 1,
|
48
|
+
})
|
46
49
|
client.put_item(table_name: 'dummy', item: {id: 'hoge', name: '太郎', list: Set['a', 'b', 'c']})
|
47
50
|
client.put_item(table_name: 'dummy', item: {id: 'fuga', name: '次郎'})
|
48
51
|
client.put_item(table_name: 'dummy', item: {id: 'piyo', name: '三郎'})
|
@@ -50,26 +53,26 @@ describe Dymos::Model do
|
|
50
53
|
|
51
54
|
client.delete_table(table_name: 'post') if client.list_tables[:table_names].include?('post')
|
52
55
|
client.create_table(
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
56
|
+
table_name: 'post',
|
57
|
+
attribute_definitions: [
|
58
|
+
{attribute_name: 'id', attribute_type: 'S'},
|
59
|
+
{attribute_name: 'timestamp', attribute_type: 'N'},
|
60
|
+
],
|
61
|
+
key_schema: [
|
62
|
+
{attribute_name: 'id', key_type: 'HASH'},
|
63
|
+
{attribute_name: 'timestamp', key_type: 'RANGE'},
|
64
|
+
],
|
65
|
+
provisioned_throughput: {
|
66
|
+
read_capacity_units: 1,
|
67
|
+
write_capacity_units: 1,
|
68
|
+
})
|
66
69
|
end
|
67
70
|
|
68
71
|
# let(:model) { Dummy.new }
|
69
72
|
|
70
73
|
describe :fields do
|
71
74
|
it do
|
72
|
-
expect(DummyUser.fields.keys).to eq([:id, :name, :email, :list])
|
75
|
+
expect(DummyUser.fields.keys).to eq([:id, :name, :email, :list, :created_at, :updated_at])
|
73
76
|
end
|
74
77
|
end
|
75
78
|
describe "クラスマクロのデフォルト値" do
|
@@ -189,13 +192,34 @@ describe Dymos::Model do
|
|
189
192
|
end
|
190
193
|
end
|
191
194
|
|
192
|
-
describe :save do
|
195
|
+
describe :save, :order => :defined do
|
193
196
|
it '書き込み' do
|
194
197
|
user = DummyUser.new
|
195
198
|
user.id = 'aiueo'
|
196
199
|
user.name = '四郎'
|
197
|
-
|
200
|
+
user.email = 'hoge@sample.net'
|
201
|
+
expect(user.created_at).to eq(nil)
|
202
|
+
now = Time.now
|
203
|
+
Timecop.freeze(now)
|
204
|
+
result = user.save!
|
198
205
|
expect(result).to eq(true)
|
206
|
+
expect(user.created_at.to_s).to eq(now.to_s)
|
207
|
+
expect(user.updated_at.to_s).to eq(now.to_s)
|
208
|
+
end
|
209
|
+
|
210
|
+
it '更新' do
|
211
|
+
user = DummyUser.new
|
212
|
+
user.id = 'aiueo'
|
213
|
+
user.name = '四郎'
|
214
|
+
user.email = 'hoge@sample.net'
|
215
|
+
now = Time.now
|
216
|
+
Timecop.freeze(now)
|
217
|
+
user.save!
|
218
|
+
user.email = 'hoge@sample.net'
|
219
|
+
Timecop.freeze(now+1)
|
220
|
+
user.save!
|
221
|
+
expect(user.created_at.to_s).to eq(now.to_s)
|
222
|
+
expect(user.updated_at.to_s).not_to eq(now.to_s)
|
199
223
|
end
|
200
224
|
end
|
201
225
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dymos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hoshina85
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: timecop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: activemodel
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|