aws-record 1.0.0.pre.1 → 1.0.0.pre.2

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: 84fe186e9a5995f6ca277aa4776a37dfaef73928
4
- data.tar.gz: 267cf8b8556f23108e5cc3e660177af43ebe0c26
3
+ metadata.gz: f411d61078b7eeb8fbd7081d51c3f41b1c9116ca
4
+ data.tar.gz: 073b4953897897aba7298b5ba90e8050a015fcde
5
5
  SHA512:
6
- metadata.gz: e69390465c8fe8f2eb45eaffeeef9d90a8ded9159a440170e3d5a3258e0679a230f4c6cc50930e2b6cd377f4a132a84389607569c1811238cd858f6a5fb9e830
7
- data.tar.gz: b2ff7b50b0c2a652f21901d592ed6476fe97bd146cc95c89bdb0fccd34a2ffec3fe4233ea1e764fe72ff53bbf9af5d53e58a7cd4ac10e4717f2c45d9fe778778
6
+ metadata.gz: ba35bcbfadff82862f5170c428d213c23157307c07ef9325263d877596cb2c32e0a9b65ee150e7492538b67f422c90d3f8112b5d51def09508e55c974ae6944f
7
+ data.tar.gz: 9301a70e55fae642dd83c814720ab78543dae3ec12e1c806df096326009308dce7fbb2666a1a8610cd18c69418be9e70d93649b1d2780b42523fb9361c7e04a6
@@ -1,15 +1,31 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  require 'aws-sdk-resources'
2
15
 
3
16
  module Aws
4
17
  autoload :Record, 'aws-record/record'
5
18
 
6
19
  module Record
7
- autoload :Attribute, 'aws-record/record/attribute'
8
- autoload :Attributes, 'aws-record/record/attributes'
9
- autoload :Errors, 'aws-record/record/errors'
10
- autoload :ItemOperations, 'aws-record/record/item_operations'
11
- autoload :TableMigration, 'aws-record/record/table_migration'
12
- autoload :VERSION, 'aws-record/record/version'
20
+ autoload :Attribute, 'aws-record/record/attribute'
21
+ autoload :Attributes, 'aws-record/record/attributes'
22
+ autoload :Errors, 'aws-record/record/errors'
23
+ autoload :ItemCollection, 'aws-record/record/item_collection'
24
+ autoload :ItemOperations, 'aws-record/record/item_operations'
25
+ autoload :Query, 'aws-record/record/query'
26
+ autoload :SecondaryIndexes, 'aws-record/record/secondary_indexes'
27
+ autoload :TableMigration, 'aws-record/record/table_migration'
28
+ autoload :VERSION, 'aws-record/record/version'
13
29
 
14
30
  module Attributes
15
31
  autoload :StringMarshaler, 'aws-record/record/attributes/string_marshaler'
@@ -1,9 +1,33 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
16
+
17
+ # Usage of {Aws::Record} requires only that you include this module. This
18
+ # method will then pull in the other default modules.
19
+ #
20
+ # @example
21
+ # class MyTable
22
+ # include Aws::Record
23
+ # # Attribute definitions go here...
24
+ # end
3
25
  def self.included(sub_class)
4
- sub_class.extend(RecordClassMethods)
5
- sub_class.include(Attributes)
6
- sub_class.include(ItemOperations)
26
+ sub_class.send(:extend, RecordClassMethods)
27
+ sub_class.send(:include, Attributes)
28
+ sub_class.send(:include, ItemOperations)
29
+ sub_class.send(:include, Query)
30
+ sub_class.send(:include, SecondaryIndexes)
7
31
  end
8
32
 
9
33
  private
@@ -12,6 +36,25 @@ module Aws
12
36
  end
13
37
 
14
38
  module RecordClassMethods
39
+
40
+ # Returns the Amazon DynamoDB table name for this model class.
41
+ #
42
+ # By default, this will simply be the name of the class. However, you can
43
+ # also define a custom table name at the class level to be anything that
44
+ # you want.
45
+ #
46
+ # @example
47
+ # class MyTable
48
+ # include Aws::Record
49
+ # end
50
+ #
51
+ # class MyTableTest
52
+ # include Aws::Record
53
+ # set_table_name "test_MyTable"
54
+ # end
55
+ #
56
+ # MyTable.table_name # => "MyTable"
57
+ # MyOtherTable.table_name # => "test_MyTable"
15
58
  def table_name
16
59
  if @table_name
17
60
  @table_name
@@ -20,10 +63,33 @@ module Aws
20
63
  end
21
64
  end
22
65
 
66
+ # Allows you to set a custom Amazon DynamoDB table name for this model
67
+ # class.
68
+ #
69
+ # @example
70
+ # class MyTable
71
+ # include Aws::Record
72
+ # set_table_name "prod_MyTable"
73
+ # end
74
+ #
75
+ # class MyTableTest
76
+ # include Aws::Record
77
+ # set_table_name "test_MyTable"
78
+ # end
79
+ #
80
+ # MyTable.table_name # => "prod_MyTable"
81
+ # MyOtherTable.table_name # => "test_MyTable"
23
82
  def set_table_name(name)
24
83
  @table_name = name
25
84
  end
26
85
 
86
+ # Fetches the table's provisioned throughput from the associated Amazon
87
+ # DynamoDB table.
88
+ #
89
+ # @return [Hash] a hash containing the +:read_capacity_units+ and
90
+ # +:write_capacity_units+ of your remote table.
91
+ # @raise [Aws::Record::Errors::TableDoesNotExist] if the table name does
92
+ # not exist in DynamoDB.
27
93
  def provisioned_throughput
28
94
  begin
29
95
  resp = dynamodb_client.describe_table(table_name: @table_name)
@@ -37,6 +103,9 @@ module Aws
37
103
  end
38
104
  end
39
105
 
106
+ # Checks if the model's table name exists in Amazon DynamoDB.
107
+ #
108
+ # @return [Boolean] true if the table does exist, false if it does not.
40
109
  def table_exists?
41
110
  begin
42
111
  resp = dynamodb_client.describe_table(table_name: @table_name)
@@ -50,16 +119,50 @@ module Aws
50
119
  end
51
120
  end
52
121
 
122
+ # Configures the Amazon DynamoDB client used by this class and all
123
+ # instances of this class.
124
+ #
125
+ # Please note that this method is also called internally when you first
126
+ # attempt to perform an operation against the remote end, if you have not
127
+ # already configured a client. As such, please read and understand the
128
+ # documentation in the AWS SDK for Ruby V2 around
129
+ # {http://docs.aws.amazon.com/sdkforruby/api/index.html#Configuration configuration}
130
+ # to ensure you understand how default configuration behavior works. When
131
+ # in doubt, call this method to ensure your client is configured the way
132
+ # you want it to be configured.
133
+ #
134
+ # @param [Hash] opts the options you wish to use to create the client.
135
+ # Note that if you include the option +:client+, all other options
136
+ # will be ignored. See the documentation for other options in the
137
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#initialize-instance_method AWS SDK for Ruby V2}.
138
+ # @option opts [Aws::DynamoDB::Client] :client allows you to pass in your
139
+ # own pre-configured client.
53
140
  def configure_client(opts = {})
54
141
  provided_client = opts.delete(:client)
55
- opts[:user_agent_suffix] = user_agent(opts.delete(:user_agent_suffix))
142
+ opts[:user_agent_suffix] = _user_agent(opts.delete(:user_agent_suffix))
56
143
  client = provided_client || Aws::DynamoDB::Client.new(opts)
57
144
  @dynamodb_client = client
58
145
  end
59
146
 
147
+ # Gets the
148
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html Aws::DynamoDB::Client}
149
+ # instance that this model uses. When called for the first time, if
150
+ # {#configure_client} has not yet been called, will configure a new client
151
+ # for you with default parameters.
152
+ #
153
+ # @return [Aws::DynamoDB::Client] the Amazon DynamoDB client instance.
60
154
  def dynamodb_client
61
155
  @dynamodb_client ||= configure_client
62
156
  end
157
+
158
+ private
159
+ def _user_agent(custom)
160
+ if custom
161
+ custom
162
+ else
163
+ " aws-record/#{VERSION}"
164
+ end
165
+ end
63
166
  end
64
167
  end
65
168
  end
@@ -1,9 +1,40 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  class Attribute
4
17
 
5
18
  attr_reader :name, :database_name, :dynamodb_type
6
19
 
20
+ # @param [Symbol] name Name of the attribute. It should be a name that is
21
+ # safe to use as a method.
22
+ # @param [Hash] options
23
+ # @option options [Marshaler] :marshaler The marshaler for this attribute.
24
+ # So long as you provide a marshaler which implements `#type_cast` and
25
+ # `#serialize` that consume raw values as expected, you can bring your
26
+ # own marshaler type.
27
+ # @option options [Array] :validators An array of validator classes that
28
+ # will be run when an attribute is checked for validity.
29
+ # @option options [String] :database_attribute_name Optional attribute
30
+ # used to specify a different name for database persistence than the
31
+ # `name` parameter. Must be unique (you can't have overlap between
32
+ # database attribute names and the names of other attributes).
33
+ # @option options [String] :dynamodb_type Generally used for keys and
34
+ # index attributes, one of "S", "N", "B", "BOOL", "SS", "NS", "BS",
35
+ # "M", "L". Optional if this attribute will never be used for a key or
36
+ # secondary index, but most convenience methods for setting attributes
37
+ # will provide this.
7
38
  def initialize(name, options = {})
8
39
  @name = name
9
40
  @database_name = options[:database_attribute_name] || name.to_s
@@ -12,14 +43,31 @@ module Aws
12
43
  @validators = options[:validators] || []
13
44
  end
14
45
 
46
+ # Attempts to type cast a raw value into the attribute's type. This call
47
+ # will forward the raw value to this attribute's marshaler class.
48
+ #
49
+ # @return [Object] the type cast object. Return type is dependent on the
50
+ # marshaler used. See your attribute's marshaler class for details.
15
51
  def type_cast(raw_value)
16
52
  @marshaler.type_cast(raw_value)
17
53
  end
18
54
 
55
+ # Attempts to serialize a raw value into the attribute's serialized
56
+ # storage type. This call will forward the raw value to this attribute's
57
+ # marshaler class.
58
+ #
59
+ # @return [Object] the serialized object. Return type is dependent on the
60
+ # marshaler used. See your attribute's marshaler class for details.
19
61
  def serialize(raw_value)
20
62
  @marshaler.serialize(raw_value)
21
63
  end
22
64
 
65
+ # Checks if the raw value is valid for this attribute. This is done by
66
+ # type casting the raw value, then running that value through each
67
+ # validator present for this attribute.
68
+ #
69
+ # @return [Boolean] true if the raw value is valid for this attribute,
70
+ # false if it is not.
23
71
  def valid?(raw_value)
24
72
  value = type_cast(raw_value)
25
73
  @validators.all? do |validator|
@@ -27,8 +75,9 @@ module Aws
27
75
  end
28
76
  end
29
77
 
78
+ # @api private
30
79
  def extract(dynamodb_item)
31
- dynamodb_item[database_name]
80
+ dynamodb_item[@database_name]
32
81
  end
33
82
 
34
83
  end
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  module Attributes
@@ -30,21 +43,21 @@ module Aws
30
43
  # as you provide a marshaler which implements `#type_cast` and
31
44
  # `#serialize` that consume raw values as expected, you can bring your
32
45
  # own marshaler type. Convenience methods will provide this for you.
33
- # @param [Hash] options
34
- # @option options [Array] :validators An array of validator classes that
46
+ # @param [Hash] opts
47
+ # @option opts [Array] :validators An array of validator classes that
35
48
  # will be run when an attribute is checked for validity.
36
- # @option options [String] :database_attribute_name Optional attribute
49
+ # @option opts [String] :database_attribute_name Optional attribute
37
50
  # used to specify a different name for database persistence than the
38
51
  # `name` parameter. Must be unique (you can't have overlap between
39
52
  # database attribute names and the names of other attributes).
40
- # @option options [String] :dynamodb_type Generally used for keys and
53
+ # @option opts [String] :dynamodb_type Generally used for keys and
41
54
  # index attributes, one of "S", "N", "B", "BOOL", "SS", "NS", "BS",
42
55
  # "M", "L". Optional if this attribute will never be used for a key or
43
56
  # secondary index, but most convenience methods for setting attributes
44
57
  # will provide this.
45
- # @option options [Boolean] :hash_key Set to true if this attribute is
58
+ # @option opts [Boolean] :hash_key Set to true if this attribute is
46
59
  # the hash key for the table.
47
- # @option options [Boolean] :range_key Set to true if this attribute is
60
+ # @option opts [Boolean] :range_key Set to true if this attribute is
48
61
  # the range key for the table.
49
62
  def attr(name, marshaler, opts = {})
50
63
  validate_attr_name(name)
@@ -68,84 +81,84 @@ module Aws
68
81
  #
69
82
  # @param [Symbol] name Name of this attribute. It should be a name that
70
83
  # is safe to use as a method.
71
- # @param [Hash] options
72
- # @option options [Boolean] :hash_key Set to true if this attribute is
84
+ # @param [Hash] opts
85
+ # @option opts [Boolean] :hash_key Set to true if this attribute is
73
86
  # the hash key for the table.
74
- # @option options [Boolean] :range_key Set to true if this attribute is
87
+ # @option opts [Boolean] :range_key Set to true if this attribute is
75
88
  # the range key for the table.
76
- def string_attr(id, opts = {})
89
+ def string_attr(name, opts = {})
77
90
  opts[:dynamodb_type] = "S"
78
- attr(id, Attributes::StringMarshaler, opts)
91
+ attr(name, Attributes::StringMarshaler, opts)
79
92
  end
80
93
 
81
94
  # Define a boolean-type attribute for your model.
82
95
  #
83
96
  # @param [Symbol] name Name of this attribute. It should be a name that
84
97
  # is safe to use as a method.
85
- # @param [Hash] options
86
- # @option options [Boolean] :hash_key Set to true if this attribute is
98
+ # @param [Hash] opts
99
+ # @option opts [Boolean] :hash_key Set to true if this attribute is
87
100
  # the hash key for the table.
88
- # @option options [Boolean] :range_key Set to true if this attribute is
101
+ # @option opts [Boolean] :range_key Set to true if this attribute is
89
102
  # the range key for the table.
90
- def boolean_attr(id, opts = {})
103
+ def boolean_attr(name, opts = {})
91
104
  opts[:dynamodb_type] = "BOOL"
92
- attr(id, Attributes::BooleanMarshaler, opts)
105
+ attr(name, Attributes::BooleanMarshaler, opts)
93
106
  end
94
107
 
95
108
  # Define a integer-type attribute for your model.
96
109
  #
97
110
  # @param [Symbol] name Name of this attribute. It should be a name that
98
111
  # is safe to use as a method.
99
- # @param [Hash] options
100
- # @option options [Boolean] :hash_key Set to true if this attribute is
112
+ # @param [Hash] opts
113
+ # @option opts [Boolean] :hash_key Set to true if this attribute is
101
114
  # the hash key for the table.
102
- # @option options [Boolean] :range_key Set to true if this attribute is
115
+ # @option opts [Boolean] :range_key Set to true if this attribute is
103
116
  # the range key for the table.
104
- def integer_attr(id, opts = {})
117
+ def integer_attr(name, opts = {})
105
118
  opts[:dynamodb_type] = "N"
106
- attr(id, Attributes::IntegerMarshaler, opts)
119
+ attr(name, Attributes::IntegerMarshaler, opts)
107
120
  end
108
121
 
109
122
  # Define a float-type attribute for your model.
110
123
  #
111
124
  # @param [Symbol] name Name of this attribute. It should be a name that
112
125
  # is safe to use as a method.
113
- # @param [Hash] options
114
- # @option options [Boolean] :hash_key Set to true if this attribute is
126
+ # @param [Hash] opts
127
+ # @option opts [Boolean] :hash_key Set to true if this attribute is
115
128
  # the hash key for the table.
116
- # @option options [Boolean] :range_key Set to true if this attribute is
129
+ # @option opts [Boolean] :range_key Set to true if this attribute is
117
130
  # the range key for the table.
118
- def float_attr(id, opts = {})
131
+ def float_attr(name, opts = {})
119
132
  opts[:dynamodb_type] = "N"
120
- attr(id, Attributes::FloatMarshaler, opts)
133
+ attr(name, Attributes::FloatMarshaler, opts)
121
134
  end
122
135
 
123
136
  # Define a date-type attribute for your model.
124
137
  #
125
138
  # @param [Symbol] name Name of this attribute. It should be a name that
126
139
  # is safe to use as a method.
127
- # @param [Hash] options
128
- # @option options [Boolean] :hash_key Set to true if this attribute is
140
+ # @param [Hash] opts
141
+ # @option opts [Boolean] :hash_key Set to true if this attribute is
129
142
  # the hash key for the table.
130
- # @option options [Boolean] :range_key Set to true if this attribute is
143
+ # @option opts [Boolean] :range_key Set to true if this attribute is
131
144
  # the range key for the table.
132
- def date_attr(id, opts = {})
145
+ def date_attr(name, opts = {})
133
146
  opts[:dynamodb_type] = "S"
134
- attr(id, Attributes::DateMarshaler, opts)
147
+ attr(name, Attributes::DateMarshaler, opts)
135
148
  end
136
149
 
137
150
  # Define a datetime-type attribute for your model.
138
151
  #
139
152
  # @param [Symbol] name Name of this attribute. It should be a name that
140
153
  # is safe to use as a method.
141
- # @param [Hash] options
142
- # @option options [Boolean] :hash_key Set to true if this attribute is
154
+ # @param [Hash] opts
155
+ # @option opts [Boolean] :hash_key Set to true if this attribute is
143
156
  # the hash key for the table.
144
- # @option options [Boolean] :range_key Set to true if this attribute is
157
+ # @option opts [Boolean] :range_key Set to true if this attribute is
145
158
  # the range key for the table.
146
- def datetime_attr(id, opts = {})
159
+ def datetime_attr(name, opts = {})
147
160
  opts[:dynamodb_type] = "S"
148
- attr(id, Attributes::DateTimeMarshaler, opts)
161
+ attr(name, Attributes::DateTimeMarshaler, opts)
149
162
  end
150
163
 
151
164
  # @return [Hash] hash of symbolized attribute names to attribute objects
@@ -153,6 +166,11 @@ module Aws
153
166
  @attributes
154
167
  end
155
168
 
169
+ # @return [Hash] hash of database names to attribute names
170
+ def storage_attributes
171
+ @storage_attributes
172
+ end
173
+
156
174
  # @return [Aws::Record::Attribute,nil]
157
175
  def hash_key
158
176
  @attributes[@keys[:hash]]
@@ -218,12 +236,12 @@ module Aws
218
236
  end
219
237
 
220
238
  def check_for_naming_collisions(name, storage_name)
221
- if @attributes[storage_name]
239
+ if @attributes[storage_name.to_sym]
222
240
  raise Errors::NameCollision.new(
223
241
  "Custom storage name #{storage_name} already exists as an"\
224
242
  " attribute name in #{@attributes}"
225
243
  )
226
- elsif @storage_attributes[name]
244
+ elsif @storage_attributes[name.to_s]
227
245
  raise Errors::NameCollision.new(
228
246
  "Attribute name #{name} already exists as a custom storage"\
229
247
  " name in #{@storage_attributes}"
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  module Attributes
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  require 'date'
2
15
 
3
16
  module Aws
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  require 'date'
2
15
 
3
16
  module Aws
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  module Attributes
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  module Attributes
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  module Attributes
@@ -1,3 +1,16 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  module Errors
@@ -0,0 +1,42 @@
1
+ module Aws
2
+ module Record
3
+ class ItemCollection
4
+ include Enumerable
5
+
6
+ def initialize(search_method, search_params, model, client)
7
+ @search_method = search_method
8
+ @search_params = search_params
9
+ @model = model
10
+ @client = client
11
+ end
12
+
13
+ def each(&block)
14
+ return enum_for(:each) unless block_given?
15
+ unless @result
16
+ @result = @client.send(@search_method, @search_params)
17
+ end
18
+ @result.each_page do |page|
19
+ items = _build_items_from_response(page.items, @model)
20
+ items.each do |item|
21
+ yield item
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+ def _build_items_from_response(items, model)
28
+ ret = []
29
+ items.each do |item|
30
+ record = model.new
31
+ data = record.instance_variable_get("@data")
32
+ model.attributes.each do |name, attr|
33
+ data[name] = attr.extract(item)
34
+ end
35
+ ret << record
36
+ end
37
+ ret
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -1,11 +1,32 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  module ItemOperations
4
17
 
18
+ # @api private
5
19
  def self.included(sub_class)
6
20
  sub_class.extend(ItemOperationsClassMethods)
7
21
  end
8
22
 
23
+ # Saves this instance of an item to Amazon DynamoDB using the
24
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#put_item-instance_method Aws::DynamoDB::Client#put_item}
25
+ # API. Uses this item instance's attributes in order to build the request
26
+ # on your behalf.
27
+ #
28
+ # @raise [Aws::Record::Errors::KeyMissing] if a required key attribute
29
+ # does not have a value within this item instance.
9
30
  def save
10
31
  dynamodb_client.put_item(
11
32
  table_name: self.class.table_name,
@@ -13,6 +34,10 @@ module Aws
13
34
  )
14
35
  end
15
36
 
37
+ # Deletes the item instance that matches the key values of this item
38
+ # instance in Amazon DynamoDB. Uses the
39
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#delete_item-instance_method Aws::DynamoDB::Client#delete_item}
40
+ # API.
16
41
  def delete!
17
42
  dynamodb_client.delete_item(
18
43
  table_name: self.class.table_name,
@@ -60,6 +85,21 @@ module Aws
60
85
  end
61
86
 
62
87
  module ItemOperationsClassMethods
88
+
89
+ # @example Usage Example
90
+ # class MyModel
91
+ # include Aws::Record
92
+ # integer_attr :id, hash_key: true
93
+ # string_attr :name, range_key: true
94
+ # end
95
+ #
96
+ # MyModel.find(id: 1, name: "First")
97
+ #
98
+ # @param [Hash] opts attribute-value pairs for the key you wish to
99
+ # search for.
100
+ # @return [Aws::Record] builds and returns an instance of your model.
101
+ # @raise [Aws::Record::Errors::KeyMissing] if your option parameters do
102
+ # not include all table keys.
63
103
  def find(opts)
64
104
  key = {}
65
105
  @keys.each_value do |attr_sym|
@@ -92,14 +132,6 @@ module Aws
92
132
  end
93
133
  record
94
134
  end
95
-
96
- def user_agent(custom)
97
- if custom
98
- custom
99
- else
100
- " aws-record/#{VERSION}"
101
- end
102
- end
103
135
  end
104
136
 
105
137
  end
@@ -0,0 +1,56 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
14
+ module Aws
15
+ module Record
16
+ module Query
17
+
18
+ # @api private
19
+ def self.included(sub_class)
20
+ sub_class.extend(QueryClassMethods)
21
+ end
22
+
23
+ module QueryClassMethods
24
+
25
+ # This method calls
26
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#query-instance_method Aws::DynamoDB::Client#query},
27
+ # populating the +:table_name+ parameter from the model class, and
28
+ # combining this with the other parameters you provide.
29
+ #
30
+ # @param [Hash] opts options to pass on to the client call to +#query+.
31
+ # See the documentation above in the AWS SDK for Ruby V2.
32
+ # @return [Aws::Record::ItemCollection] an enumerable collection of the
33
+ # query result.
34
+ def query(opts)
35
+ query_opts = opts.merge(table_name: table_name)
36
+ ItemCollection.new(:query, query_opts, self, dynamodb_client)
37
+ end
38
+
39
+ # This method calls
40
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#scan-instance_method Aws::DynamoDB::Client#scan},
41
+ # populating the +:table_name+ parameter from the model class, and
42
+ # combining this with the other parameters you provide.
43
+ #
44
+ # @param [Hash] opts options to pass on to the client call to +#scan+.
45
+ # See the documentation above in the AWS SDK for Ruby V2.
46
+ # @return [Aws::Record::ItemCollection] an enumerable collection of the
47
+ # scan result.
48
+ def scan(opts = {})
49
+ scan_opts = opts.merge(table_name: table_name)
50
+ ItemCollection.new(:scan, scan_opts, self, dynamodb_client)
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,156 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
14
+ module Aws
15
+ module Record
16
+ module SecondaryIndexes
17
+
18
+ # @api private
19
+ def self.included(sub_class)
20
+ sub_class.instance_variable_set("@local_secondary_indexes", {})
21
+ sub_class.instance_variable_set("@global_secondary_indexes", {})
22
+ sub_class.extend(SecondaryIndexesClassMethods)
23
+ end
24
+
25
+ module SecondaryIndexesClassMethods
26
+
27
+ # Creates a local secondary index for the model. Learn more about Local
28
+ # Secondary Indexes in the
29
+ # {http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html Amazon DynamoDB Developer Guide}.
30
+ #
31
+ # @param [Symbol] name index name for this local secondary index
32
+ # @param [Hash] opts
33
+ # @option opts [Symbol] :range_key the range key used by this local
34
+ # secondary index. Note that the hash key MUST be the table's hash
35
+ # key, and so that value will be filled in for you.
36
+ # @option opts [Hash] :projection a hash which defines which attributes
37
+ # are copied from the table to the index. See shape details in the
38
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Types/Projection.html AWS SDK for Ruby V2 docs}.
39
+ def local_secondary_index(name, opts)
40
+ opts[:hash_key] = hash_key.name
41
+ _validate_required_lsi_keys(opts)
42
+ local_secondary_indexes[name] = opts
43
+ end
44
+
45
+ # Creates a global secondary index for the model. Learn more about
46
+ # Global Secondary Indexes in the
47
+ # {http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html Amazon DynamoDB Developer Guide}.
48
+ #
49
+ # @param [Symbol] name index name for this global secondary index
50
+ # @param [Hash] opts
51
+ # @option opts [Symbol] :hash_key the hash key used by this global
52
+ # secondary index.
53
+ # @option opts [Symbol] :range_key the range key used by this global
54
+ # secondary index.
55
+ # @option opts [Hash] :projection a hash which defines which attributes
56
+ # are copied from the table to the index. See shape details in the
57
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Types/Projection.html AWS SDK for Ruby V2 docs}.
58
+ def global_secondary_index(name, opts)
59
+ _validate_required_gsi_keys(opts)
60
+ global_secondary_indexes[name] = opts
61
+ end
62
+
63
+ # @return [Hash] hash of local secondary index names to the index's
64
+ # attributes.
65
+ def local_secondary_indexes
66
+ @local_secondary_indexes
67
+ end
68
+
69
+ # @return [Hash] hash of global secondary index names to the index's
70
+ # attributes.
71
+ def global_secondary_indexes
72
+ @global_secondary_indexes
73
+ end
74
+
75
+ # @return [Hash] hash of the local secondary indexes in a form suitable
76
+ # for use in a table migration. For example, any attributes which
77
+ # have a unique database storage name will use that name instead.
78
+ def local_secondary_indexes_for_migration
79
+ _migration_format_indexes(local_secondary_indexes)
80
+ end
81
+
82
+ # @return [Hash] hash of the global secondary indexes in a form suitable
83
+ # for use in a table migration. For example, any attributes which
84
+ # have a unique database storage name will use that name instead.
85
+ def global_secondary_indexes_for_migration
86
+ _migration_format_indexes(global_secondary_indexes)
87
+ end
88
+
89
+ private
90
+ def _migration_format_indexes(indexes)
91
+ return nil if indexes.empty?
92
+ indexes.collect do |name, opts|
93
+ h = { index_name: name }
94
+ h[:key_schema] = _si_key_schema(opts)
95
+ opts.delete(:hash_key)
96
+ opts.delete(:range_key)
97
+ h = h.merge(opts)
98
+ h
99
+ end
100
+ end
101
+
102
+ def _si_key_schema(opts)
103
+ key_schema = [{
104
+ key_type: "HASH",
105
+ attribute_name: @attributes[opts[:hash_key]].database_name
106
+ }]
107
+ if opts[:range_key]
108
+ key_schema << {
109
+ key_type: "RANGE",
110
+ attribute_name: @attributes[opts[:range_key]].database_name
111
+ }
112
+ end
113
+ key_schema
114
+ end
115
+
116
+ def _validate_required_lsi_keys(params)
117
+ if params[:hash_key] && params[:range_key]
118
+ _validate_attributes_exist(params[:hash_key], params[:range_key])
119
+ else
120
+ raise ArgumentError.new(
121
+ "Local Secondary Indexes require a hash and range key!"
122
+ )
123
+ end
124
+ end
125
+
126
+ def _validate_required_gsi_keys(params)
127
+ if params[:hash_key]
128
+ if params[:range_key]
129
+ _validate_attributes_exist(params[:hash_key], params[:range_key])
130
+ else
131
+ _validate_attributes_exist(params[:hash_key])
132
+ end
133
+ else
134
+ raise ArgumentError.new(
135
+ "Global Secondary Indexes require at least a hash key!"
136
+ )
137
+ end
138
+ end
139
+
140
+ def _validate_attributes_exist(*attr_names)
141
+ missing = attr_names.select do |attr_name|
142
+ @attributes[attr_name].nil?
143
+ end
144
+ unless missing.empty?
145
+ raise ArgumentError.new(
146
+ "#{missing.join(", ")} not present in model attributes."\
147
+ " Please ensure that attributes are defined in the model"\
148
+ " class BEFORE defining a index on those attributes."
149
+ )
150
+ end
151
+ end
152
+ end
153
+
154
+ end
155
+ end
156
+ end
@@ -1,24 +1,88 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
16
  class TableMigration
4
17
 
18
+ # @!attribute [rw] client
19
+ # @return [Aws::DynamoDB::Client] the
20
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html Aws::DynamoDB::Client}
21
+ # class used by this table migration instance.
5
22
  attr_accessor :client
6
23
 
7
- def initialize(model, client: nil)
24
+ # @param [Aws::Record] model a model class that includes {Aws::Record}.
25
+ # @param [Hash] opts
26
+ # @option opts [Aws::DynamoDB::Client] :client Allows you to inject your
27
+ # own
28
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html Aws::DynamoDB::Client}
29
+ # class. If this option is not included, a client will be constructed for
30
+ # you with default parameters.
31
+ def initialize(model, opts = {})
8
32
  assert_model_valid(model)
9
33
  @model = model
10
- @client = client || Aws::DynamoDB::Client.new
34
+ @client = opts[:client] || Aws::DynamoDB::Client.new
11
35
  end
12
36
 
37
+ # This method calls
38
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#create_table-instance_method Aws::DynamoDB::Client#create_table},
39
+ # populating the attribute definitions and key schema based on your model
40
+ # class, as well as passing through other parameters as provided by you.
41
+ #
42
+ # @param [Hash] opts options to pass on to the client call to
43
+ # +#create_table+. See the documentation above in the AWS SDK for Ruby
44
+ # V2.
45
+ # @option opts [Hash] :provisioned_throughput This is a required argument,
46
+ # in which you must specify the +:read_capacity_units+ and
47
+ # +:write_capacity_units+ of your new table.
48
+ # @option opts [Hash] :global_secondary_index_throughput This argument is
49
+ # required if you define any global secondary indexes. It should map your
50
+ # global secondary index names to their provisioned throughput, similar
51
+ # to how you define the provisioned throughput for the table in general.
13
52
  def create!(opts)
53
+ gsit = opts.delete(:global_secondary_index_throughput)
14
54
  create_opts = opts.merge({
15
55
  table_name: @model.table_name,
16
56
  attribute_definitions: attribute_definitions,
17
57
  key_schema: key_schema
18
58
  })
59
+ if lsis = @model.local_secondary_indexes_for_migration
60
+ create_opts[:local_secondary_indexes] = lsis
61
+ _append_to_attribute_definitions(lsis, create_opts)
62
+ end
63
+ if gsis = @model.global_secondary_indexes_for_migration
64
+ unless gsit
65
+ raise ArgumentError.new(
66
+ "If you define global secondary indexes, you must also define"\
67
+ " :global_secondary_index_throughput on table creation."
68
+ )
69
+ end
70
+ gsis_with_throughput = _add_throughout_to_gsis(gsis, gsit)
71
+ create_opts[:global_secondary_indexes] = gsis_with_throughput
72
+ _append_to_attribute_definitions(gsis, create_opts)
73
+ end
19
74
  @client.create_table(create_opts)
20
75
  end
21
76
 
77
+ # This method calls
78
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#update_table-instance_method Aws::DynamoDB::Client#update_table}
79
+ # using the parameters that you provide.
80
+ #
81
+ # @param [Hash] opts options to pass on to the client call to
82
+ # +#update_table+. See the documentation above in the AWS SDK for Ruby
83
+ # V2.
84
+ # @raise [Aws::Record::Errors::TableDoesNotExist] if the table does not
85
+ # currently exist in Amazon DynamoDB.
22
86
  def update!(opts)
23
87
  begin
24
88
  update_opts = opts.merge({
@@ -30,6 +94,12 @@ module Aws
30
94
  end
31
95
  end
32
96
 
97
+ # This method calls
98
+ # {http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#delete_table-instance_method Aws::DynamoDB::Client#delete_table}
99
+ # using the table name of your model.
100
+ #
101
+ # @raise [Aws::Record::Errors::TableDoesNotExist] if the table did not
102
+ # exist in Amazon DynamoDB at the time of calling.
33
103
  def delete!
34
104
  begin
35
105
  @client.delete_table(table_name: @model.table_name)
@@ -38,6 +108,10 @@ module Aws
38
108
  end
39
109
  end
40
110
 
111
+ # This method waits on the table specified in the model to exist and be
112
+ # marked as ACTIVE in Amazon DynamoDB. Note that this method can run for
113
+ # several minutes if the table does not exist, and is not created within
114
+ # the wait period.
41
115
  def wait_until_available
42
116
  @client.wait_until(:table_exists, table_name: @model.table_name)
43
117
  end
@@ -69,6 +143,46 @@ module Aws
69
143
  end
70
144
  end
71
145
 
146
+ def _append_to_attribute_definitions(secondary_indexes, create_opts)
147
+ attr_def = create_opts[:attribute_definitions]
148
+ secondary_indexes.each do |si|
149
+ si[:key_schema].each do |key_schema|
150
+ exists = attr_def.find { |a|
151
+ a[:attribute_name] == key_schema[:attribute_name]
152
+ }
153
+ unless exists
154
+ attr = @model.attributes[
155
+ @model.storage_attributes[key_schema[:attribute_name]]
156
+ ]
157
+ attr_def << {
158
+ attribute_name: attr.database_name,
159
+ attribute_type: attr.dynamodb_type
160
+ }
161
+ end
162
+ end
163
+ end
164
+ create_opts[:attribute_definitions] = attr_def
165
+ end
166
+
167
+ def _add_throughout_to_gsis(global_secondary_indexes, gsi_throughput)
168
+ missing_throughput = []
169
+ ret = global_secondary_indexes.map do |params|
170
+ name = params[:index_name]
171
+ throughput = gsi_throughput[name]
172
+ missing_throughput << name unless throughput
173
+ params.merge(provisioned_throughput: throughput)
174
+ end
175
+ unless missing_throughput.empty?
176
+ raise ArgumentError.new(
177
+ "Missing provisioned throughput for the following global secondary"\
178
+ " indexes: #{missing_throughput.join(", ")}. GSIs:"\
179
+ " #{global_secondary_indexes} and defined throughput:"\
180
+ " #{gsi_throughput}"
181
+ )
182
+ end
183
+ ret
184
+ end
185
+
72
186
  def key_schema
73
187
  keys.map do |type, attr|
74
188
  {
@@ -1,5 +1,18 @@
1
+ # Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not
4
+ # use this file except in compliance with the License. A copy of the License is
5
+ # located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is distributed on
10
+ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ # or implied. See the License for the specific language governing permissions
12
+ # and limitations under the License.
13
+
1
14
  module Aws
2
15
  module Record
3
- VERSION = "1.0.0.pre.1"
16
+ VERSION = "1.0.0.pre.2"
4
17
  end
5
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-record
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.1
4
+ version: 1.0.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amazon Web Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-23 00:00:00.000000000 Z
11
+ date: 2016-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-resources
@@ -42,7 +42,10 @@ files:
42
42
  - lib/aws-record/record/attributes/integer_marshaler.rb
43
43
  - lib/aws-record/record/attributes/string_marshaler.rb
44
44
  - lib/aws-record/record/errors.rb
45
+ - lib/aws-record/record/item_collection.rb
45
46
  - lib/aws-record/record/item_operations.rb
47
+ - lib/aws-record/record/query.rb
48
+ - lib/aws-record/record/secondary_indexes.rb
46
49
  - lib/aws-record/record/table_migration.rb
47
50
  - lib/aws-record/record/version.rb
48
51
  homepage: http://github.com/aws/aws-sdk-ruby-record
@@ -65,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
68
  version: 1.3.1
66
69
  requirements: []
67
70
  rubyforge_project:
68
- rubygems_version: 2.2.2
71
+ rubygems_version: 2.4.8
69
72
  signing_key:
70
73
  specification_version: 4
71
74
  summary: AWS Record library for Amazon DynamoDB