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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b894d9241914afc233192cd1da3794a69b92ab2
4
- data.tar.gz: e76acf5fddcbff9209328938dd0cd8467443c92a
3
+ metadata.gz: bcc2ca53b227af59529709c865fbec440d59b561
4
+ data.tar.gz: ae44901535497e1e3c0d771aa89167c82659d9fb
5
5
  SHA512:
6
- metadata.gz: 881ce83d77e2fcf3fc8f65c2b55e8b3b3dc2e472b1c3c38023e0867fae7da79ccc68f730489e5fa87f593f7d7c33f826cc20b1f7fcb1cd16a10bca7a79519f2b
7
- data.tar.gz: c26127e28cb0b5e0712939cf7afda440567d22088dd877712eff84c395273de8a873c00024271e37a8635e1d4ff75dea3e87511d6c71a61ab9bc4f8e06aa31ec
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) { read_attribute(attr) || default }
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}=") { |value| write_attribute(attr, value) }
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
- write_attribute(attr, value, initialize)
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] = read_attribute(name)
63
+ attrs[name] = send "#{name}", raw if respond_to? "#{name}"
52
64
  end
53
65
  attrs
54
66
  end
@@ -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
- _create_record
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
@@ -1,3 +1,3 @@
1
1
  module Dymos
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -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
- table_name: 'dummy',
36
- attribute_definitions: [
37
- {attribute_name: 'id', attribute_type: 'S'}
38
- ],
39
- key_schema: [
40
- {attribute_name: 'id', key_type: 'HASH'}
41
- ],
42
- provisioned_throughput: {
43
- read_capacity_units: 1,
44
- write_capacity_units: 1,
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
- table_name: 'post',
54
- attribute_definitions: [
55
- {attribute_name: 'id', attribute_type: 'S'},
56
- {attribute_name: 'timestamp', attribute_type: 'N'},
57
- ],
58
- key_schema: [
59
- {attribute_name: 'id', key_type: 'HASH'},
60
- {attribute_name: 'timestamp', key_type: 'RANGE'},
61
- ],
62
- provisioned_throughput: {
63
- read_capacity_units: 1,
64
- write_capacity_units: 1,
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
- result = user.save
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
@@ -3,7 +3,7 @@ Coveralls.wear!
3
3
 
4
4
  require 'rubygems'
5
5
  require 'bundler/setup'
6
-
6
+ require 'timecop'
7
7
  require 'dymos'
8
8
 
9
9
  I18n.enforce_available_locales = false
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.7
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 00:00:00.000000000 Z
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