ocean-dynamo 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 65a6bf63b42ff8ffecd0ea41b312b5657e62d5c9
4
- data.tar.gz: 3055b4f29b1006c4fe80de69d97e31802653eb27
3
+ metadata.gz: d067b77a882722c6a949672647c910338812ccf7
4
+ data.tar.gz: 48f95744f784e8cef31a65fe496c9d69737521f8
5
5
  SHA512:
6
- metadata.gz: 1d365ff5096522676044fa6edbb3fd8e4c48de842636d820192e8674ce046de2f3af871d0b50236a837363daa24349819485003f09d32f06ab9d52d5c457745a
7
- data.tar.gz: 997a24d91aa6a42f47dc38262200158120781ba74a9bd2355df304291d3796c3076d9dcd0710ce1cde96594abc8ea35cc617025f3034664b898e8d40ad0501a2
6
+ metadata.gz: 8e46bbfcce5105eef9737075b4042c049472ecb06bb7b938503d920a176083ffbeb0c281a4eba79698d34de7e3bec5c8483a4f8a7ca4f6dd9ee1df880fea24f3
7
+ data.tar.gz: c519f71fea7afc08ebfe2496c13cec6f3292ada38e51dc15893396005ae70ec29694d0dcfd9702a92a36b99f6c4e614f2b14a7a90b1d639b60ee874bc0f26a3c
data/README.rdoc CHANGED
@@ -91,11 +91,11 @@ value will return the empty string, <tt>""</tt>.
91
91
  ...
92
92
  end
93
93
 
94
- === +belongs_to+
94
+ === +has_many+ and +belongs_to+
95
95
 
96
96
  ==== Example
97
97
 
98
- The following example shows how to set up a +belongs_to+ relation:
98
+ The following example shows how to set up a +has_many+ / +belongs_to+ relation:
99
99
 
100
100
  class Parent < OceanDynamo::Table
101
101
  dynamo_schema do
@@ -103,7 +103,7 @@ The following example shows how to set up a +belongs_to+ relation:
103
103
  attribute :that
104
104
  attribute :the_other
105
105
  end
106
- #has_many :children -- coming soon
106
+ has_many :children
107
107
  end
108
108
 
109
109
 
@@ -124,6 +124,9 @@ Restrictions for +belongs_to+ tables:
124
124
  * +belongs_to+ can be specified only once in each class.
125
125
  * +belongs_to+ must be placed after the +dynamo_schema+ attribute block.
126
126
 
127
+ Restrictions for +has_many+ tables:
128
+ * The +has_many+ table may not have a range key.
129
+
127
130
  These restrictions allow OceanDynamo to implement the +has_many+ / +belongs_to+
128
131
  relation in a very efficient and massively scalable way.
129
132
 
@@ -157,18 +160,25 @@ controllers. OceanDynamo implements much of the infrastructure of ActiveRecord;
157
160
  for instance, +read_attribute+, +write_attribute+, and much of the control logic and
158
161
  parameters.
159
162
 
160
- +belongs_to+ is now operational. The other side, +has_many+, is much simpler and should
161
- follow very soon (probably today).
163
+ * has_many now works, in a minimalistic fashion. To implement the rest of the interface,
164
+ we need association proxies.
165
+
166
+ * Instances of classes with one or more has_many relations now save all relations after
167
+ the instance has been saved. To save only dirty association collections, we need
168
+ association proxies. Collections which are nil are not saved. Collections which are []
169
+ are saved, which means they clear all children. This difference is crucial, until we
170
+ get association proxies.
171
+
172
+ * #reload clears all relations.
162
173
 
163
174
  === Future milestones
164
175
 
165
- * After the +has_many+ / +belongs_to+ association, the +has_and_belongs_to_many+ assocation
166
- will be implemented.
176
+ * Association proxies, to implement the same kind of interace as ActiveRecord, e.g.:
177
+ <code>blog_entry.comments.build(body: "Cool!").save!</code>
167
178
 
168
- * A generator to install the <tt>config/aws.yml</tt> file.
179
+ * The +has_and_belongs_to_many+ assocation.
169
180
 
170
- * OceanDynamo will use association proxies to achieve the same kind of
171
- interface as ActiveRecord, e.g.: <code>blog_entry.comments.build(body: "Cool!").save!</code>
181
+ * A generator to install the <tt>config/aws.yml</tt> file.
172
182
 
173
183
 
174
184
  === Current use
@@ -14,6 +14,17 @@ module OceanDynamo
14
14
 
15
15
  module ClassMethods
16
16
 
17
+ #
18
+ #
19
+ #
20
+ def relations_of_type(rel_type)
21
+ relations.inject([]) do |acc, rel|
22
+ kl, type = rel
23
+ acc << kl if type == rel_type
24
+ acc
25
+ end
26
+ end
27
+
17
28
  #
18
29
  #
19
30
  #
@@ -116,17 +116,26 @@ module OceanDynamo
116
116
  #
117
117
  # ---------------------------------------------------------
118
118
 
119
+ def initialize(attrs={})
120
+ super
121
+ end
122
+
123
+
119
124
  protected
120
125
 
121
126
  #
122
127
  # This is run by #initialize and by #assign_attributes to set the
123
128
  # association variables (@master, for instance) and its associated attribute
124
- # (such as master_id) to the value given.
129
+ # (such as master_id) to the value given. This is a hack, do away with
130
+ # the double storage when association proxies are introduced.
125
131
  #
126
- def assign_associations(attrs) # :nodoc:
127
- if attrs && attrs.include?(:master)
128
- @master = attrs[:master]
129
- write_attribute('master_id', @master)
132
+ def set_belongs_to_association(attrs) # :nodoc:
133
+ parent_class = self.class.belongs_to_class
134
+ return unless parent_class
135
+ parent_class = parent_class.to_s.underscore.to_sym
136
+ if attrs && attrs.include?(parent_class)
137
+ instance_variable_set("@#{parent_class}", attrs[parent_class])
138
+ write_attribute("#{parent_class}_id", attrs[parent_class])
130
139
  end
131
140
  end
132
141
 
@@ -14,17 +14,25 @@ module OceanDynamo
14
14
 
15
15
  module ClassMethods
16
16
 
17
+
17
18
  #
18
- #
19
+ # Defines a has_many relation to a belongs_to class.
19
20
  #
20
21
  def has_many(children) # :children
21
22
  children_attr = children.to_s.underscore # "children"
22
23
  child_class = children_attr.singularize.camelize.constantize # Child
23
24
  register_relation(child_class, :has_many)
24
25
  # Define accessors for instances
25
- self.class_eval "def #{children_attr}; read_children(#{child_class}); end"
26
- self.class_eval "def #{children_attr}=(value); write_children(#{child_class}, value); end"
27
- # TODO: "?" method
26
+ self.class_eval "def #{children_attr}
27
+ @#{children_attr} ||= read_children(#{child_class})
28
+ end"
29
+ self.class_eval "def #{children_attr}=(value)
30
+ @#{children_attr} = value
31
+ end"
32
+ self.class_eval "def #{children_attr}?
33
+ @#{children_attr} ||= read_children(#{child_class})
34
+ @#{children_attr}.present?
35
+ end"
28
36
  end
29
37
 
30
38
  end
@@ -36,8 +44,9 @@ module OceanDynamo
36
44
  #
37
45
  # ---------------------------------------------------------
38
46
 
47
+
39
48
  #
40
- #
49
+ # Reads all children of a has_many relation.
41
50
  #
42
51
  def read_children(child_class)
43
52
  if new_record?
@@ -53,16 +62,59 @@ module OceanDynamo
53
62
  end
54
63
  end
55
64
 
65
+
66
+ #
67
+ # Write all children in the arg, which should be nil or an array.
68
+ #
69
+ def write_children(child_class, arg)
70
+ return nil if arg.blank?
71
+ raise AssociationTypeMismatch, "not an array or nil" if !arg.is_a?(Array)
72
+ raise AssociationTypeMismatch, "an array element is not a #{child_class}" unless arg.all? { |m| m.is_a?(child_class) }
73
+ # We now know that arg is an array containing only members of the child_class
74
+ arg.each(&:save!)
75
+ arg
76
+ end
77
+
78
+
79
+ #
80
+ # Sets all has_many relations to nil.
56
81
  #
82
+ def reload(*)
83
+ result = super
84
+
85
+ self.class.relations_of_type(:has_many).each do |klass|
86
+ attr_name = klass.to_s.pluralize.underscore
87
+ instance_variable_set("@#{attr_name}", nil)
88
+ end
89
+
90
+ result
91
+ end
92
+
93
+
94
+ protected
95
+
57
96
  #
97
+ # This version also writes back any relations. TODO: only
98
+ # dirty relations should be persisted. Introduce a dirty flag.
99
+ # Easiest done via an association proxy object.
58
100
  #
59
- def write_children(child_class, value)
60
- return nil if value.blank?
61
- raise AssociationTypeMismatch, "not an array or nil" if !value.is_a?(Array)
62
- raise AssociationTypeMismatch, "an array element is not a #{child_class}" unless value.all? { |m| m.is_a?(child_class) }
63
- # We now know that value is an array containing only members of the child_class
64
- value.each(&:save!)
65
- value
101
+ def dynamo_persist(*) # :nodoc:
102
+ result = super
103
+
104
+ self.class.relations_of_type(:has_many).each do |klass|
105
+ attr_name = klass.to_s.pluralize.underscore
106
+ # First create or update the children in the new set
107
+ new_children = instance_variable_get("@#{attr_name}")
108
+ next unless new_children
109
+ write_children klass, new_children
110
+ # Destroy all children not in the new set (this is not yet scalable)
111
+ read_children(klass).each do |c|
112
+ next if new_children.include?(c)
113
+ c.delete
114
+ end
115
+ end
116
+
117
+ result
66
118
  end
67
119
 
68
120
  end
@@ -13,6 +13,31 @@ module OceanDynamo
13
13
  # ---------------------------------------------------------
14
14
 
15
15
  module ClassMethods
16
+
17
+ def dynamo_schema(table_hash_key=:id,
18
+ table_range_key=nil,
19
+ locking: :lock_version,
20
+ timestamps: [:created_at, :updated_at],
21
+ **keywords,
22
+ &block)
23
+ self.lock_attribute = locking
24
+ self.timestamp_attributes = timestamps
25
+ # Init
26
+ self.fields = HashWithIndifferentAccess.new
27
+ attribute(table_hash_key, :string, default: "")
28
+ if table_range_key
29
+ attribute(table_range_key, :string, default: "")
30
+ self.validates(table_range_key, presence: true)
31
+ end
32
+ timestamp_attributes.each { |name| attribute name, :datetime } if timestamp_attributes
33
+ attribute(lock_attribute, :integer, default: 0) if locking
34
+ block.call
35
+ # Define attribute accessors
36
+ fields.each { |name, md| define_attribute_accessors(name) }
37
+ # Return table name
38
+ super
39
+ end
40
+
16
41
  end
17
42
 
18
43
 
@@ -32,6 +57,19 @@ module OceanDynamo
32
57
  attr_reader :dynamo_item # :nodoc:
33
58
 
34
59
 
60
+ def initialize(attrs={})
61
+ @attributes = Hash.new
62
+ fields.each do |name, md|
63
+ write_attribute(name, evaluate_default(md[:default], md[:type]))
64
+ end
65
+ raise UnknownPrimaryKey unless table_hash_key
66
+ set_belongs_to_association(attrs)
67
+ # Barf on unknown attributes here?
68
+ attrs && attrs.delete_if { |k, v| !fields.has_key?(k) }
69
+ super(attrs)
70
+ end
71
+
72
+
35
73
  #
36
74
  # Returns the value of the hash key attribute
37
75
  #
@@ -49,23 +87,6 @@ module OceanDynamo
49
87
  end
50
88
 
51
89
 
52
- def initialize(attrs={})
53
- run_callbacks :initialize do
54
- @attributes = Hash.new
55
- fields.each do |name, md|
56
- write_attribute(name, evaluate_default(md[:default], md[:type]))
57
- end
58
- @dynamo_item = nil
59
- @destroyed = false
60
- @new_record = true
61
- raise UnknownPrimaryKey unless table_hash_key
62
- end
63
- assign_associations(attrs)
64
- attrs && attrs.delete_if { |k, v| !fields.has_key?(k) }
65
- super(attrs)
66
- end
67
-
68
-
69
90
  def [](attribute)
70
91
  read_attribute attribute
71
92
  end
@@ -77,7 +98,7 @@ module OceanDynamo
77
98
 
78
99
 
79
100
  def id
80
- read_attribute(table_hash_key)
101
+ hash_key
81
102
  end
82
103
 
83
104
 
@@ -85,8 +106,9 @@ module OceanDynamo
85
106
  write_attribute(table_hash_key, value)
86
107
  end
87
108
 
109
+
88
110
  def id?
89
- read_attribute(table_hash_key).present?
111
+ hash_key.present?
90
112
  end
91
113
 
92
114
 
@@ -101,7 +123,7 @@ module OceanDynamo
101
123
  if fields.has_key?(attr_name)
102
124
  @attributes[attr_name]
103
125
  else
104
- raise ActiveModel::MissingAttributeError, "can't read unknown attribute `#{attr_ name}"
126
+ raise ActiveModel::MissingAttributeError, "can't read unknown attribute '#{attr_ name}"
105
127
  end
106
128
  end
107
129
 
@@ -112,7 +134,7 @@ module OceanDynamo
112
134
  if fields.has_key?(attr_name)
113
135
  @attributes[attr_name] = type_cast_attribute_for_write(attr_name, value)
114
136
  else
115
- raise ActiveModel::MissingAttributeError, "can't write unknown attribute `#{attr_name}'"
137
+ raise ActiveModel::MissingAttributeError, "can't write unknown attribute '#{attr_name}'"
116
138
  end
117
139
  end
118
140
 
@@ -121,14 +143,14 @@ module OceanDynamo
121
143
  return nil unless persisted?
122
144
  key = respond_to?(:id) && id
123
145
  return nil unless key
124
- table_range_key ? [key, read_attribute(table_range_key)] : [key]
146
+ table_range_key ? [key, range_key] : [key]
125
147
  end
126
148
 
127
149
 
128
150
  def assign_attributes(values, without_protection: false)
129
151
  return if values.blank?
130
152
  values = values.stringify_keys
131
- assign_associations(values)
153
+ set_belongs_to_association(values)
132
154
  # if values.respond_to?(:permitted?)
133
155
  # unless values.permitted?
134
156
  # raise ActiveModel::ForbiddenAttributesError
@@ -180,7 +202,7 @@ module OceanDynamo
180
202
  if respond_to?("#{k}=")
181
203
  raise
182
204
  else
183
- raise UnknownAttributeError, "unknown attribute: `#{k}'"
205
+ raise UnknownAttributeError, "unknown attribute: '#{k}'"
184
206
  end
185
207
  end
186
208
 
@@ -1,32 +1,46 @@
1
- module Basal
2
-
3
- def ==(comparison_object)
4
- super ||
5
- comparison_object.instance_of?(self.class) &&
6
- id.present? &&
7
- comparison_object.id == id
8
- end
9
- alias :eql? :==
1
+ module OceanDynamo
2
+ module Basal
3
+
4
+ #
5
+ # The equality comparator.
6
+ #
7
+ def ==(comparison_object)
8
+ super ||
9
+ comparison_object.instance_of?(self.class) &&
10
+ hash_key.present? &&
11
+ comparison_object.hash_key == hash_key &&
12
+ (range_key == comparison_object.range_key)
13
+ end
14
+ alias :eql? :==
10
15
 
11
16
 
12
- # Clone and freeze the attributes hash such that associations are still
13
- # accessible, even on destroyed records, but cloned models will not be
14
- # frozen.
15
- def freeze
16
- @attributes = @attributes.clone.freeze
17
- self
18
- end
17
+ #
18
+ # Allows sort on instances
19
+ #
20
+ def <=>(other_object)
21
+ if other_object.is_a?(self.class)
22
+ self.to_key <=> other_object.to_key
23
+ end
24
+ end
19
25
 
20
- # Returns +true+ if the attributes hash has been frozen.
21
- def frozen?
22
- @attributes.frozen?
23
- end
24
26
 
25
- # Allows sort on objects
26
- def <=>(other_object)
27
- if other_object.is_a?(self.class)
28
- self.to_key <=> other_object.to_key
27
+ #
28
+ # Clone and freeze the attributes hash such that associations are still
29
+ # accessible, even on destroyed records, but cloned models will not be
30
+ # frozen.
31
+ #
32
+ def freeze
33
+ @attributes = @attributes.clone.freeze
34
+ self
29
35
  end
30
- end
31
36
 
37
+
38
+ #
39
+ # Returns +true+ if the attributes hash has been frozen.
40
+ #
41
+ def frozen?
42
+ @attributes.frozen?
43
+ end
44
+
45
+ end
32
46
  end
@@ -70,6 +70,18 @@ module OceanDynamo
70
70
  #
71
71
  # ---------------------------------------------------------
72
72
 
73
+ def initialize(attrs={})
74
+ @destroyed = false
75
+ @new_record = true
76
+ super
77
+ end
78
+
79
+
80
+ def dynamo_schema(*)
81
+ super
82
+ end
83
+
84
+
73
85
  def destroyed?
74
86
  @destroyed
75
87
  end
@@ -7,48 +7,8 @@ module OceanDynamo
7
7
  #
8
8
  # ---------------------------------------------------------
9
9
 
10
- def dynamo_schema(table_hash_key=:id,
11
- table_range_key=nil,
12
- table_name: compute_table_name,
13
- table_name_prefix: nil,
14
- table_name_suffix: nil,
15
- read_capacity_units: 10,
16
- write_capacity_units: 5,
17
- connect: :late,
18
- create: false,
19
- locking: :lock_version,
20
- timestamps: [:created_at, :updated_at],
21
- &block)
22
- # Set class vars
23
- self.dynamo_client = nil
24
- self.dynamo_table = nil
25
- self.dynamo_items = nil
26
- self.table_connected = false
27
- self.table_connect_policy = connect
28
- self.table_create_policy = create
29
- self.table_hash_key = table_hash_key
30
- self.table_range_key = table_range_key
31
- self.table_name = table_name
32
- self.table_name_prefix = table_name_prefix
33
- self.table_name_suffix = table_name_suffix
34
- self.table_read_capacity_units = read_capacity_units
35
- self.table_write_capacity_units = write_capacity_units
36
- self.lock_attribute = locking
37
- self.timestamp_attributes = timestamps
38
- # Init
39
- self.fields = HashWithIndifferentAccess.new
40
- attribute(table_hash_key, :string, default: "")
41
- if table_range_key
42
- attribute(table_range_key, :string, default: "")
43
- self.validates(table_range_key, presence: true)
44
- end
45
- timestamp_attributes.each { |name| attribute name, :datetime } if timestamp_attributes
46
- attribute(lock_attribute, :integer, default: 0) if locking
47
- block.call
48
- # Define attribute accessors
49
- fields.each { |name, md| define_attribute_accessors(name) }
50
- # Connect to AWS
51
- establish_db_connection if connect == true
10
+ def dynamo_schema(*)
11
+ super
52
12
  # Finally return the full table name
53
13
  table_full_name
54
14
  end
@@ -1,86 +1,136 @@
1
1
  module OceanDynamo
2
2
  module Tables
3
3
 
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+
4
9
  # ---------------------------------------------------------
5
10
  #
6
11
  # Class methods
7
12
  #
8
13
  # ---------------------------------------------------------
9
14
 
10
- def establish_db_connection
11
- setup_dynamo
12
- if dynamo_table.exists?
13
- wait_until_table_is_active
14
- self.table_connected = true
15
- else
16
- raise(TableNotFound, table_full_name) unless table_create_policy
17
- create_table
15
+ module ClassMethods
16
+
17
+ def dynamo_schema(table_hash_key=:id,
18
+ table_range_key=nil,
19
+ table_name: compute_table_name,
20
+ table_name_prefix: nil,
21
+ table_name_suffix: nil,
22
+ read_capacity_units: 10,
23
+ write_capacity_units: 5,
24
+ connect: :late,
25
+ create: false,
26
+ **keywords,
27
+ &block)
28
+ self.dynamo_client = nil
29
+ self.dynamo_table = nil
30
+ self.dynamo_items = nil
31
+ self.table_connected = false
32
+ self.table_connect_policy = connect
33
+ self.table_create_policy = create
34
+ self.table_hash_key = table_hash_key
35
+ self.table_range_key = table_range_key
36
+ self.table_name = table_name
37
+ self.table_name_prefix = table_name_prefix
38
+ self.table_name_suffix = table_name_suffix
39
+ self.table_read_capacity_units = read_capacity_units
40
+ self.table_write_capacity_units = write_capacity_units
41
+ # Connect if asked to
42
+ establish_db_connection if connect == true
18
43
  end
19
- set_dynamo_table_keys
20
- end
21
44
 
22
45
 
23
- def setup_dynamo
24
- #self.dynamo_client = AWS::DynamoDB::Client.new(:api_version => '2012-08-10')
25
- self.dynamo_client ||= AWS::DynamoDB.new
26
- self.dynamo_table = dynamo_client.tables[table_full_name]
27
- self.dynamo_items = dynamo_table.items
28
- end
46
+ def establish_db_connection
47
+ setup_dynamo
48
+ if dynamo_table.exists?
49
+ wait_until_table_is_active
50
+ self.table_connected = true
51
+ else
52
+ raise(TableNotFound, table_full_name) unless table_create_policy
53
+ create_table
54
+ end
55
+ set_dynamo_table_keys
56
+ end
29
57
 
30
58
 
31
- def wait_until_table_is_active
32
- loop do
33
- case dynamo_table.status
34
- when :active
35
- set_dynamo_table_keys
36
- return
37
- when :updating, :creating
38
- sleep 1
39
- next
40
- when :deleting
41
- sleep 1 while dynamo_table.exists?
42
- create_table
43
- return
44
- else
45
- raise UnknownTableStatus.new("Unknown DynamoDB table status '#{dynamo_table.status}'")
59
+ def setup_dynamo
60
+ #self.dynamo_client = AWS::DynamoDB::Client.new(:api_version => '2012-08-10')
61
+ self.dynamo_client ||= AWS::DynamoDB.new
62
+ self.dynamo_table = dynamo_client.tables[table_full_name]
63
+ self.dynamo_items = dynamo_table.items
64
+ end
65
+
66
+
67
+ def wait_until_table_is_active
68
+ loop do
69
+ case dynamo_table.status
70
+ when :active
71
+ set_dynamo_table_keys
72
+ return
73
+ when :updating, :creating
74
+ sleep 1
75
+ next
76
+ when :deleting
77
+ sleep 1 while dynamo_table.exists?
78
+ create_table
79
+ return
80
+ else
81
+ raise UnknownTableStatus.new("Unknown DynamoDB table status '#{dynamo_table.status}'")
82
+ end
46
83
  end
47
84
  end
48
- end
49
85
 
50
86
 
51
- def set_dynamo_table_keys
52
- hash_key_type = fields[table_hash_key][:type]
53
- hash_key_type = :string if hash_key_type == :reference
54
- dynamo_table.hash_key = [table_hash_key, hash_key_type]
87
+ def set_dynamo_table_keys
88
+ hash_key_type = fields[table_hash_key][:type]
89
+ hash_key_type = :string if hash_key_type == :reference
90
+ dynamo_table.hash_key = [table_hash_key, hash_key_type]
55
91
 
56
- if table_range_key
57
- range_key_type = fields[table_range_key][:type]
58
- dynamo_table.range_key = [table_range_key, range_key_type]
92
+ if table_range_key
93
+ range_key_type = fields[table_range_key][:type]
94
+ dynamo_table.range_key = [table_range_key, range_key_type]
95
+ end
59
96
  end
60
- end
61
97
 
62
98
 
63
- def create_table
64
- hash_key_type = fields[table_hash_key][:type]
65
- hash_key_type = :string if hash_key_type == :reference
99
+ def create_table
100
+ hash_key_type = fields[table_hash_key][:type]
101
+ hash_key_type = :string if hash_key_type == :reference
102
+
103
+ range_key_type = table_range_key && fields[table_range_key][:type]
104
+
105
+ self.dynamo_table = dynamo_client.tables.create(table_full_name,
106
+ table_read_capacity_units, table_write_capacity_units,
107
+ hash_key: { table_hash_key => hash_key_type},
108
+ range_key: table_range_key && { table_range_key => range_key_type }
109
+ )
110
+ sleep 1 until dynamo_table.status == :active
111
+ setup_dynamo
112
+ true
113
+ end
114
+
66
115
 
67
- range_key_type = table_range_key && fields[table_range_key][:type]
116
+ def delete_table
117
+ return false unless dynamo_table.exists? && dynamo_table.status == :active
118
+ dynamo_table.delete
119
+ true
120
+ end
68
121
 
69
- self.dynamo_table = dynamo_client.tables.create(table_full_name,
70
- table_read_capacity_units, table_write_capacity_units,
71
- hash_key: { table_hash_key => hash_key_type},
72
- range_key: table_range_key && { table_range_key => range_key_type }
73
- )
74
- sleep 1 until dynamo_table.status == :active
75
- setup_dynamo
76
- true
77
122
  end
123
+
78
124
 
125
+ # ---------------------------------------------------------
126
+ #
127
+ # Instance methods
128
+ #
129
+ # ---------------------------------------------------------
79
130
 
80
- def delete_table
81
- return false unless dynamo_table.exists? && dynamo_table.status == :active
82
- dynamo_table.delete
83
- true
131
+ def initialize(*)
132
+ @dynamo_item = nil
133
+ super
84
134
  end
85
135
 
86
136
  end
@@ -1,3 +1,3 @@
1
1
  module OceanDynamo
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
data/lib/ocean-dynamo.rb CHANGED
@@ -35,7 +35,7 @@ module OceanDynamo
35
35
 
36
36
  include Basal
37
37
 
38
- extend Tables
38
+ include Tables
39
39
  extend Schema
40
40
 
41
41
  include Attributes
@@ -47,5 +47,11 @@ module OceanDynamo
47
47
  include HasMany
48
48
 
49
49
 
50
+ def initialize(attrs={})
51
+ run_callbacks :initialize do
52
+ super
53
+ end
54
+ end
55
+
50
56
  end
51
57
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocean-dynamo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Bengtson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-16 00:00:00.000000000 Z
11
+ date: 2013-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk