aws-record 2.10.1 → 2.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +83 -19
- data/VERSION +1 -1
- data/lib/aws-record/record/attribute.rb +8 -8
- data/lib/aws-record/record/attributes.rb +36 -49
- data/lib/aws-record/record/batch.rb +13 -12
- data/lib/aws-record/record/batch_read.rb +10 -12
- data/lib/aws-record/record/batch_write.rb +2 -1
- data/lib/aws-record/record/buildable_search.rb +37 -39
- data/lib/aws-record/record/client_configuration.rb +14 -14
- data/lib/aws-record/record/dirty_tracking.rb +29 -40
- data/lib/aws-record/record/errors.rb +11 -2
- data/lib/aws-record/record/item_collection.rb +7 -7
- data/lib/aws-record/record/item_data.rb +13 -17
- data/lib/aws-record/record/item_operations.rb +150 -138
- data/lib/aws-record/record/key_attributes.rb +0 -2
- data/lib/aws-record/record/marshalers/boolean_marshaler.rb +2 -5
- data/lib/aws-record/record/marshalers/date_marshaler.rb +1 -6
- data/lib/aws-record/record/marshalers/date_time_marshaler.rb +2 -5
- data/lib/aws-record/record/marshalers/epoch_time_marshaler.rb +2 -8
- data/lib/aws-record/record/marshalers/float_marshaler.rb +3 -8
- data/lib/aws-record/record/marshalers/integer_marshaler.rb +3 -8
- data/lib/aws-record/record/marshalers/list_marshaler.rb +4 -7
- data/lib/aws-record/record/marshalers/map_marshaler.rb +4 -7
- data/lib/aws-record/record/marshalers/numeric_set_marshaler.rb +7 -9
- data/lib/aws-record/record/marshalers/string_marshaler.rb +1 -2
- data/lib/aws-record/record/marshalers/string_set_marshaler.rb +5 -7
- data/lib/aws-record/record/marshalers/time_marshaler.rb +1 -5
- data/lib/aws-record/record/model_attributes.rb +17 -29
- data/lib/aws-record/record/query.rb +8 -11
- data/lib/aws-record/record/secondary_indexes.rb +40 -51
- data/lib/aws-record/record/table_config.rb +93 -115
- data/lib/aws-record/record/table_migration.rb +56 -72
- data/lib/aws-record/record/transactions.rb +40 -43
- data/lib/aws-record/record/version.rb +1 -1
- data/lib/aws-record/record.rb +36 -44
- metadata +13 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffc6a505faafd948f6bd7a553ebd1a6c75ff48d0d77df4b80c2eaae7c550d851
|
4
|
+
data.tar.gz: 0721314ff3f6755de1174c494f6d4f9b7b848db2c47106d721ba0458c438aa0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b54ae2d2834b31a7fcb32e62e5aab25966ff30fa5fe34b8fe4797507e8a99a37f42eeeb4910e2950f214c07af30f2ec9ea532820ff1ef56569fd17912c803e3
|
7
|
+
data.tar.gz: 957101a0f8ad105a613e3b2c33b5f2d3999ebf00bcb83ed0142008ebf213fde862aab433b4eca0403c2b932c35abf7fefc074be2051648e42ecdfda2cf1bbc9f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
2.12.0 (2023-09-28)
|
2
|
+
------------------
|
3
|
+
|
4
|
+
* Feature - Allow put, update, and delete item options to be passed through to
|
5
|
+
the underlying client calls.
|
6
|
+
|
7
|
+
* Feature - Add an `original_error` accessor to `Errors::ConditionalWriteFailed`
|
8
|
+
which contains the `Aws::DynamoDB::Errors::ConditionalCheckFailedException`
|
9
|
+
error. If `:return_values_on_condition_check_failure` was provided to a put,
|
10
|
+
update, or delete item call, this error will contain the item data that failed
|
11
|
+
the condition check.
|
12
|
+
|
13
|
+
* Issue - Fix default value for String/Numeric Sets to be unset. (#133)
|
14
|
+
|
15
|
+
* Feature - Set required Ruby version to >= 2.3 (#134)
|
16
|
+
|
17
|
+
* Issue - Run Rubocop on all files. (#135)
|
18
|
+
|
19
|
+
2.11.0 (2023-06-02)
|
20
|
+
------------------
|
21
|
+
|
22
|
+
* Feature - Improve User-Agent tracking and bump minimum DynamoDB version.
|
23
|
+
|
1
24
|
2.10.1 (2023-01-17)
|
2
25
|
------------------
|
3
26
|
|
@@ -11,7 +34,8 @@
|
|
11
34
|
2.9.0 (2022-11-16)
|
12
35
|
------------------
|
13
36
|
|
14
|
-
* Feature - Add support for inheritance. Aws Record models can now be extended
|
37
|
+
* Feature - Add support for inheritance. Aws Record models can now be extended
|
38
|
+
using standard ruby inheritance (#80).
|
15
39
|
|
16
40
|
2.8.0 (2022-10-12)
|
17
41
|
------------------
|
@@ -36,7 +60,8 @@
|
|
36
60
|
2.5.0 (2020-10-13)
|
37
61
|
------------------
|
38
62
|
|
39
|
-
* Feature - `Aws::Record::BuildableSearch` - Support queries yielding
|
63
|
+
* Feature - `Aws::Record::BuildableSearch` - Support queries yielding
|
64
|
+
heterogeneous results using `multi_model_filter` (#107)
|
40
65
|
|
41
66
|
2.4.1 (2020-05-29)
|
42
67
|
------------------
|
@@ -47,53 +72,89 @@
|
|
47
72
|
2.4.0 (2019-07-16)
|
48
73
|
------------------
|
49
74
|
|
50
|
-
* Feature - Aws::Record::BuildableSearch - Adds support for query and scan
|
75
|
+
* Feature - Aws::Record::BuildableSearch - Adds support for query and scan
|
76
|
+
builders using substitution expressions. This allows for streamlined and
|
77
|
+
expressive queries and scans using aws-record.
|
51
78
|
|
52
79
|
2.3.0 (2019-02-08)
|
53
80
|
------------------
|
54
81
|
|
55
|
-
* Feature - Aws::Record::Transactions - Adds support for transactional find and
|
82
|
+
* Feature - Aws::Record::Transactions - Adds support for transactional find and
|
83
|
+
transactional get requests. You can learn more about these new APIs in
|
84
|
+
the [documentation](https://docs.aws.amazon.com/awssdkrubyrecord/api/Aws/Record/Transactions.html).
|
56
85
|
|
57
86
|
2.2.0 (2018-12-05)
|
58
87
|
------------------
|
59
88
|
|
60
|
-
* Feature - Aws::Record::TableConfig - Adds support for the "PAY_PER_REQUEST"
|
89
|
+
* Feature - Aws::Record::TableConfig - Adds support for the "PAY_PER_REQUEST"
|
90
|
+
billing mode in table configurations.
|
61
91
|
|
62
92
|
2.1.2 (2018-11-15)
|
63
93
|
------------------
|
64
94
|
|
65
|
-
* Issue - Aws::Record::Marshalers::EpochTimeMarshaler - Fixed a bug where epoch
|
95
|
+
* Issue - Aws::Record::Marshalers::EpochTimeMarshaler - Fixed a bug where epoch
|
96
|
+
time objects didn't properly marshal from database entries.
|
66
97
|
|
67
98
|
2.1.1 (2018-07-10)
|
68
99
|
------------------
|
69
100
|
|
70
|
-
* Feature - Aws::Record::TableConfig - Adds `:ttl_attribute` to the TableConfig
|
101
|
+
* Feature - Aws::Record::TableConfig - Adds `:ttl_attribute` to the TableConfig
|
102
|
+
DSL. When used with `epoch_time_attr` attributes or other attributes stored as
|
103
|
+
epoch time, your TableConfig migrations will enable TTL on your DynamoDB
|
104
|
+
table, and will use your specified attribute as the TTL attribute.
|
71
105
|
|
72
|
-
* Feature - Aws::Record::Marshalers::EpochTimeMarshaler - Adds
|
106
|
+
* Feature - Aws::Record::Marshalers::EpochTimeMarshaler - Adds
|
107
|
+
the `epoch_time_attr`, which behaves much like `time_attr` except the Amazon
|
108
|
+
DynamoDB storage type is numeric, and the serialized value is epoch seconds.
|
73
109
|
|
74
110
|
2.1.0 (2018-06-25)
|
75
111
|
------------------
|
76
112
|
|
77
|
-
* Feature - Aws::Record - Add the `persisted?`, `new_record?`, and `destroyed?`
|
113
|
+
* Feature - Aws::Record - Add the `persisted?`, `new_record?`, and `destroyed?`
|
114
|
+
methods to `Aws::Record`, which supports use cases where you'd like to see if
|
115
|
+
a record has just been newly initialized, or has been deleted or was a
|
116
|
+
preexisting record retrieved from DynamoDB. Note that these methods are
|
117
|
+
present in `ActiveModel::Model` so you should require that module
|
118
|
+
before `Aws::Record`
|
78
119
|
|
79
|
-
* Feature - Aws::Record - Add the `assign_attributes`, `update`, and `update!`
|
120
|
+
* Feature - Aws::Record - Add the `assign_attributes`, `update`, and `update!`
|
121
|
+
methods to `Aws::Record` which supports the use case where the user might want
|
122
|
+
to mass assign or update a records attributes by hash. `update!` also ensures
|
123
|
+
that a `ValidationError` is thrown on an invalid update
|
80
124
|
|
81
|
-
* Upgrading - If you already include `ActiveModel::Model` on your models the
|
125
|
+
* Upgrading - If you already include `ActiveModel::Model` on your models the
|
126
|
+
new `persisted?`, `new_record?` and `destroyed?` methods will not function
|
127
|
+
properly unless you include `ActiveModel::Model` before `Aws::Record`.
|
128
|
+
Additionally, new methods could lead to collisions if you happened to have
|
129
|
+
attributes such as `:update` or `:assign_attributes`. In such a case, you
|
130
|
+
would want to version lock below `2.1.0`, or use
|
131
|
+
the `:database_attribute_name` property and change your attribute name in
|
132
|
+
code.
|
82
133
|
|
83
134
|
2.0.2 (2018-06-08)
|
84
135
|
------------------
|
85
136
|
|
86
|
-
* Feature - Aws::Record::Marshalers::TimeMarshaler - Adds the `time_attr` method
|
137
|
+
* Feature - Aws::Record::Marshalers::TimeMarshaler - Adds the `time_attr` method
|
138
|
+
to AWS Record models, which uses `Time` as the underlying type.
|
87
139
|
|
88
140
|
2.0.1 (2017-10-27)
|
89
141
|
------------------
|
90
142
|
|
91
|
-
* Feature - Aws::Record::ItemCollection - Add the `#page`
|
143
|
+
* Feature - Aws::Record::ItemCollection - Add the `#page`
|
144
|
+
and `#last_evaluated_key` methods to `Aws::Record::ItemCollection`. This helps
|
145
|
+
to support use cases where you'd like to control the result set size with
|
146
|
+
the `:limit` parameter, or if you want to expose pagination capabilities to an
|
147
|
+
outside caller, for example a list-type operation exposed in a web API.
|
92
148
|
|
93
149
|
2.0.0 (2017-08-29)
|
94
150
|
------------------
|
95
151
|
|
96
|
-
* Upgrading - Aws::Record - Support version 3 of the AWS SDK for Ruby. This is
|
152
|
+
* Upgrading - Aws::Record - Support version 3 of the AWS SDK for Ruby. This is
|
153
|
+
being released as major version 2 of `aws-record`, though the APIs remain the
|
154
|
+
same. Do note, however, that we've changed our SDK dependency to only depend
|
155
|
+
on `aws-sdk-dynamodb`. This means that if you were depending on other service
|
156
|
+
clients transitively via `aws-record`, you will need to add dependencies on
|
157
|
+
the appropriate service gems when upgrading.
|
97
158
|
|
98
159
|
1.1.1 (2017-06-16)
|
99
160
|
------------------
|
@@ -155,18 +216,21 @@
|
|
155
216
|
1.0.0.pre.10 (2016-08-03)
|
156
217
|
------------------
|
157
218
|
|
158
|
-
* Feature - Aws::Record - Refactored tracking of model attributes, key
|
159
|
-
|
219
|
+
* Feature - Aws::Record - Refactored tracking of model attributes, key
|
220
|
+
attributes,
|
221
|
+
and item data to use internal classes over module composition. Dirty tracking
|
222
|
+
is
|
160
223
|
also handled more consistently across attributes, and turning on/off of dirty
|
161
224
|
tracking is only possible at the model level (not for individual attributes).
|
162
225
|
|
163
226
|
1.0.0.pre.9 (2016-07-22)
|
164
227
|
------------------
|
165
228
|
|
166
|
-
* Feature - Aws::Record::Attribute - Added support for default values at the
|
167
|
-
level.
|
229
|
+
* Feature - Aws::Record::Attribute - Added support for default values at the
|
230
|
+
attribute level.
|
168
231
|
|
169
|
-
* Feature - Aws::Record::Marshalers - Removed the marshalers in
|
232
|
+
* Feature - Aws::Record::Marshalers - Removed the marshalers in
|
233
|
+
the `Aws::Attributes`
|
170
234
|
namespace, replacing them with instantiated marshaler objects. This enables
|
171
235
|
more functionality in marshalers such as the Date/DateTime marshalers.
|
172
236
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.12.0
|
@@ -2,14 +2,12 @@
|
|
2
2
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
|
-
|
6
5
|
# This class provides helper methods for +Aws::Record+ attributes. These
|
7
6
|
# include marshalers for type casting of item attributes, the Amazon
|
8
7
|
# DynamoDB type for use in certain table and item operation calls, and the
|
9
8
|
# ability to define a database name that is separate from the name used
|
10
9
|
# within the model class and item instances.
|
11
10
|
class Attribute
|
12
|
-
|
13
11
|
attr_reader :name, :database_name, :dynamodb_type
|
14
12
|
|
15
13
|
# @param [Symbol] name Name of the attribute. It should be a name that is
|
@@ -38,12 +36,14 @@ module Aws
|
|
38
36
|
# be used as a default value.
|
39
37
|
def initialize(name, options = {})
|
40
38
|
@name = name
|
41
|
-
@database_name = (options[:database_attribute_name]
|
39
|
+
@database_name = (options[:database_attribute_name] || name).to_s
|
42
40
|
@dynamodb_type = options[:dynamodb_type]
|
43
41
|
@marshaler = options[:marshaler] || DefaultMarshaler
|
44
42
|
@persist_nil = options[:persist_nil]
|
45
|
-
|
46
|
-
|
43
|
+
@default_value_or_lambda = if options.key?(:default_value)
|
44
|
+
dv = options[:default_value]
|
45
|
+
_is_lambda?(dv) ? dv : type_cast(dv)
|
46
|
+
end
|
47
47
|
end
|
48
48
|
|
49
49
|
# Attempts to type cast a raw value into the attribute's type. This call
|
@@ -90,6 +90,7 @@ module Aws
|
|
90
90
|
end
|
91
91
|
|
92
92
|
private
|
93
|
+
|
93
94
|
def _deep_copy(obj)
|
94
95
|
Marshal.load(Marshal.dump(obj))
|
95
96
|
end
|
@@ -97,17 +98,16 @@ module Aws
|
|
97
98
|
def _is_lambda?(obj)
|
98
99
|
obj.respond_to?(:call)
|
99
100
|
end
|
100
|
-
|
101
101
|
end
|
102
102
|
|
103
103
|
# This is an identity marshaler, which performs no changes for type casting
|
104
104
|
# or serialization. It is generally not recommended for use.
|
105
105
|
module DefaultMarshaler
|
106
|
-
def self.type_cast(raw_value,
|
106
|
+
def self.type_cast(raw_value, _options = {})
|
107
107
|
raw_value
|
108
108
|
end
|
109
109
|
|
110
|
-
def self.serialize(raw_value,
|
110
|
+
def self.serialize(raw_value, _options = {})
|
111
111
|
raw_value
|
112
112
|
end
|
113
113
|
end
|
@@ -3,15 +3,12 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Attributes
|
6
|
-
|
7
6
|
def self.included(sub_class)
|
8
7
|
sub_class.extend(ClassMethods)
|
9
8
|
model_attributes = ModelAttributes.new(self)
|
10
|
-
sub_class.instance_variable_set(
|
11
|
-
sub_class.instance_variable_set(
|
12
|
-
if Aws::Record.extends_record?(sub_class)
|
13
|
-
inherit_attributes(sub_class)
|
14
|
-
end
|
9
|
+
sub_class.instance_variable_set('@attributes', model_attributes)
|
10
|
+
sub_class.instance_variable_set('@keys', KeyAttributes.new(model_attributes))
|
11
|
+
inherit_attributes(sub_class) if Aws::Record.extends_record?(sub_class)
|
15
12
|
end
|
16
13
|
|
17
14
|
# Base initialization method for a new item. Optionally, allows you to
|
@@ -80,29 +77,24 @@ module Aws
|
|
80
77
|
@data.hash_copy
|
81
78
|
end
|
82
79
|
|
83
|
-
private
|
84
80
|
def self.inherit_attributes(klass)
|
85
|
-
superclass_attributes = klass.superclass.instance_variable_get(
|
81
|
+
superclass_attributes = klass.superclass.instance_variable_get('@attributes')
|
86
82
|
|
87
83
|
superclass_attributes.attributes.each do |name, attribute|
|
88
|
-
subclass_attributes = klass.instance_variable_get(
|
84
|
+
subclass_attributes = klass.instance_variable_get('@attributes')
|
89
85
|
subclass_attributes.register_superclass_attribute(name, attribute)
|
90
86
|
end
|
91
87
|
|
92
|
-
superclass_keys = klass.superclass.instance_variable_get(
|
93
|
-
subclass_keys = klass.instance_variable_get(
|
94
|
-
|
95
|
-
if superclass_keys.hash_key
|
96
|
-
subclass_keys.hash_key = superclass_keys.hash_key
|
97
|
-
end
|
88
|
+
superclass_keys = klass.superclass.instance_variable_get('@keys')
|
89
|
+
subclass_keys = klass.instance_variable_get('@keys')
|
98
90
|
|
99
|
-
if superclass_keys.
|
100
|
-
|
101
|
-
end
|
91
|
+
subclass_keys.hash_key = superclass_keys.hash_key if superclass_keys.hash_key
|
92
|
+
subclass_keys.range_key = superclass_keys.range_key if superclass_keys.range_key
|
102
93
|
end
|
103
94
|
|
104
|
-
|
95
|
+
private_class_method :inherit_attributes
|
105
96
|
|
97
|
+
module ClassMethods
|
106
98
|
# Define an attribute for your model, providing your own attribute type.
|
107
99
|
#
|
108
100
|
# @param [Symbol] name Name of this attribute. It should be a name that
|
@@ -157,7 +149,7 @@ module Aws
|
|
157
149
|
# item is nil or not set at persistence time. Additionally, lambda
|
158
150
|
# can be used as a default value.
|
159
151
|
def string_attr(name, opts = {})
|
160
|
-
opts[:dynamodb_type] =
|
152
|
+
opts[:dynamodb_type] = 'S'
|
161
153
|
attr(name, Marshalers::StringMarshaler.new(opts), opts)
|
162
154
|
end
|
163
155
|
|
@@ -179,7 +171,7 @@ module Aws
|
|
179
171
|
# item is nil or not set at persistence time. Additionally, lambda
|
180
172
|
# can be used as a default value.
|
181
173
|
def boolean_attr(name, opts = {})
|
182
|
-
opts[:dynamodb_type] =
|
174
|
+
opts[:dynamodb_type] = 'BOOL'
|
183
175
|
attr(name, Marshalers::BooleanMarshaler.new(opts), opts)
|
184
176
|
end
|
185
177
|
|
@@ -201,7 +193,7 @@ module Aws
|
|
201
193
|
# item is nil or not set at persistence time. Additionally, lambda
|
202
194
|
# can be used as a default value.
|
203
195
|
def integer_attr(name, opts = {})
|
204
|
-
opts[:dynamodb_type] =
|
196
|
+
opts[:dynamodb_type] = 'N'
|
205
197
|
attr(name, Marshalers::IntegerMarshaler.new(opts), opts)
|
206
198
|
end
|
207
199
|
|
@@ -223,7 +215,7 @@ module Aws
|
|
223
215
|
# item is nil or not set at persistence time. Additionally, lambda
|
224
216
|
# can be used as a default value.
|
225
217
|
def float_attr(name, opts = {})
|
226
|
-
opts[:dynamodb_type] =
|
218
|
+
opts[:dynamodb_type] = 'N'
|
227
219
|
attr(name, Marshalers::FloatMarshaler.new(opts), opts)
|
228
220
|
end
|
229
221
|
|
@@ -245,7 +237,7 @@ module Aws
|
|
245
237
|
# item is nil or not set at persistence time. Additionally, lambda
|
246
238
|
# can be used as a default value.
|
247
239
|
def date_attr(name, opts = {})
|
248
|
-
opts[:dynamodb_type] =
|
240
|
+
opts[:dynamodb_type] = 'S'
|
249
241
|
attr(name, Marshalers::DateMarshaler.new(opts), opts)
|
250
242
|
end
|
251
243
|
|
@@ -267,7 +259,7 @@ module Aws
|
|
267
259
|
# item is nil or not set at persistence time. Additionally, lambda
|
268
260
|
# can be used as a default value.
|
269
261
|
def datetime_attr(name, opts = {})
|
270
|
-
opts[:dynamodb_type] =
|
262
|
+
opts[:dynamodb_type] = 'S'
|
271
263
|
attr(name, Marshalers::DateTimeMarshaler.new(opts), opts)
|
272
264
|
end
|
273
265
|
|
@@ -289,7 +281,7 @@ module Aws
|
|
289
281
|
# item is nil or not set at persistence time. Additionally, lambda
|
290
282
|
# can be used as a default value.
|
291
283
|
def time_attr(name, opts = {})
|
292
|
-
opts[:dynamodb_type] =
|
284
|
+
opts[:dynamodb_type] = 'S'
|
293
285
|
attr(name, Marshalers::TimeMarshaler.new(opts), opts)
|
294
286
|
end
|
295
287
|
|
@@ -312,7 +304,7 @@ module Aws
|
|
312
304
|
# item is nil or not set at persistence time. Additionally, lambda
|
313
305
|
# can be used as a default value.
|
314
306
|
def epoch_time_attr(name, opts = {})
|
315
|
-
opts[:dynamodb_type] =
|
307
|
+
opts[:dynamodb_type] = 'N'
|
316
308
|
attr(name, Marshalers::EpochTimeMarshaler.new(opts), opts)
|
317
309
|
end
|
318
310
|
|
@@ -348,7 +340,7 @@ module Aws
|
|
348
340
|
# item is nil or not set at persistence time. Additionally, lambda
|
349
341
|
# can be used as a default value.
|
350
342
|
def list_attr(name, opts = {})
|
351
|
-
opts[:dynamodb_type] =
|
343
|
+
opts[:dynamodb_type] = 'L'
|
352
344
|
attr(name, Marshalers::ListMarshaler.new(opts), opts)
|
353
345
|
end
|
354
346
|
|
@@ -384,7 +376,7 @@ module Aws
|
|
384
376
|
# item is nil or not set at persistence time. Additionally, lambda
|
385
377
|
# can be used as a default value.
|
386
378
|
def map_attr(name, opts = {})
|
387
|
-
opts[:dynamodb_type] =
|
379
|
+
opts[:dynamodb_type] = 'M'
|
388
380
|
attr(name, Marshalers::MapMarshaler.new(opts), opts)
|
389
381
|
end
|
390
382
|
|
@@ -410,7 +402,7 @@ module Aws
|
|
410
402
|
# item is nil or not set at persistence time. Additionally, lambda
|
411
403
|
# can be used as a default value.
|
412
404
|
def string_set_attr(name, opts = {})
|
413
|
-
opts[:dynamodb_type] =
|
405
|
+
opts[:dynamodb_type] = 'SS'
|
414
406
|
attr(name, Marshalers::StringSetMarshaler.new(opts), opts)
|
415
407
|
end
|
416
408
|
|
@@ -436,7 +428,7 @@ module Aws
|
|
436
428
|
# item is nil or not set at persistence time. Additionally, lambda
|
437
429
|
# can be used as a default value.
|
438
430
|
def numeric_set_attr(name, opts = {})
|
439
|
-
opts[:dynamodb_type] =
|
431
|
+
opts[:dynamodb_type] = 'NS'
|
440
432
|
attr(name, Marshalers::NumericSetMarshaler.new(opts), opts)
|
441
433
|
end
|
442
434
|
|
@@ -452,8 +444,8 @@ module Aws
|
|
452
444
|
# * None of the attributes have dirty changes.
|
453
445
|
# * If there is a value passed in, it must be an integer.
|
454
446
|
# For more information, see
|
455
|
-
# {https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters
|
456
|
-
# in the Amazon DynamoDB Developer Guide.
|
447
|
+
# {https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters
|
448
|
+
# Atomic counter} in the Amazon DynamoDB Developer Guide.
|
457
449
|
#
|
458
450
|
# @param [Symbol] name Name of this attribute. It should be a name that
|
459
451
|
# is safe to use as a method.
|
@@ -476,14 +468,13 @@ module Aws
|
|
476
468
|
# record.increment_counter!(2) #=> 3
|
477
469
|
# @see #attr #attr method for additional hash options.
|
478
470
|
def atomic_counter(name, opts = {})
|
479
|
-
opts[:dynamodb_type] =
|
471
|
+
opts[:dynamodb_type] = 'N'
|
480
472
|
opts[:default_value] ||= 0
|
481
473
|
attr(name, Marshalers::IntegerMarshaler.new(opts), opts)
|
482
474
|
|
483
|
-
define_method("increment_#{name}!") do |increment=1|
|
484
|
-
|
475
|
+
define_method("increment_#{name}!") do |increment = 1|
|
485
476
|
if dirty?
|
486
|
-
msg =
|
477
|
+
msg = 'Attributes need to be saved before atomic counter can be incremented'
|
487
478
|
raise Errors::RecordError, msg
|
488
479
|
end
|
489
480
|
|
@@ -492,23 +483,22 @@ module Aws
|
|
492
483
|
raise ArgumentError, msg
|
493
484
|
end
|
494
485
|
|
495
|
-
resp = dynamodb_client.update_item(
|
486
|
+
resp = dynamodb_client.update_item(
|
496
487
|
table_name: self.class.table_name,
|
497
488
|
key: key_values,
|
498
489
|
expression_attribute_values: {
|
499
|
-
|
490
|
+
':i' => increment
|
500
491
|
},
|
501
492
|
expression_attribute_names: {
|
502
|
-
|
493
|
+
'#n' => name
|
503
494
|
},
|
504
|
-
update_expression:
|
505
|
-
return_values:
|
506
|
-
|
495
|
+
update_expression: 'SET #n = #n + :i',
|
496
|
+
return_values: 'UPDATED_NEW'
|
497
|
+
)
|
507
498
|
assign_attributes(resp[:attributes])
|
508
499
|
@data.clean!
|
509
500
|
@data.get_attribute(name)
|
510
501
|
end
|
511
|
-
|
512
502
|
end
|
513
503
|
|
514
504
|
# @return [Symbol,nil] The symbolic name of the table's hash key.
|
@@ -532,6 +522,7 @@ module Aws
|
|
532
522
|
end
|
533
523
|
|
534
524
|
private
|
525
|
+
|
535
526
|
def _define_attr_methods(name)
|
536
527
|
define_method(name) do
|
537
528
|
@data.get_attribute(name)
|
@@ -544,18 +535,14 @@ module Aws
|
|
544
535
|
|
545
536
|
def _key_attributes(id, opts)
|
546
537
|
if opts[:hash_key] == true && opts[:range_key] == true
|
547
|
-
raise ArgumentError.
|
548
|
-
"Cannot have the same attribute be a hash and range key."
|
549
|
-
)
|
538
|
+
raise ArgumentError, 'Cannot have the same attribute be a hash and range key.'
|
550
539
|
elsif opts[:hash_key] == true
|
551
540
|
@keys.hash_key = id
|
552
541
|
elsif opts[:range_key] == true
|
553
542
|
@keys.range_key = id
|
554
543
|
end
|
555
544
|
end
|
556
|
-
|
557
545
|
end
|
558
|
-
|
559
546
|
end
|
560
547
|
end
|
561
548
|
end
|
@@ -7,10 +7,10 @@ module Aws
|
|
7
7
|
|
8
8
|
class << self
|
9
9
|
# Provides a thin wrapper to the
|
10
|
-
# {https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#batch_write_item-instance_method
|
11
|
-
# method. Up to 25 +PutItem+ or +DeleteItem+
|
12
|
-
# A single request may write up to 16 MB of data, with each
|
13
|
-
# write limit of 400 KB.
|
10
|
+
# {https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#batch_write_item-instance_method
|
11
|
+
# Aws::DynamoDB::Client#batch_write_item} method. Up to 25 +PutItem+ or +DeleteItem+
|
12
|
+
# operations are supported. A single request may write up to 16 MB of data, with each
|
13
|
+
# item having a write limit of 400 KB.
|
14
14
|
#
|
15
15
|
# *Note*: this operation does not support dirty attribute handling,
|
16
16
|
# nor does it enforce safe write operations (i.e. update vs new record
|
@@ -25,8 +25,9 @@ module Aws
|
|
25
25
|
# when all operations have been completed.
|
26
26
|
#
|
27
27
|
# Please see
|
28
|
-
# {https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.BatchOperations
|
29
|
-
# in the DynamoDB Developer Guide for
|
28
|
+
# {https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.BatchOperations
|
29
|
+
# Batch Operations and Error Handling} in the DynamoDB Developer Guide for
|
30
|
+
# more details.
|
30
31
|
#
|
31
32
|
# @example Usage Example
|
32
33
|
# class Breakfast
|
@@ -54,15 +55,16 @@ module Aws
|
|
54
55
|
# @param [Hash] opts the options you wish to use to create the client.
|
55
56
|
# Note that if you include the option +:client+, all other options
|
56
57
|
# will be ignored. See the documentation for other options in the
|
57
|
-
# {https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#initialize-instance_method
|
58
|
+
# {https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#initialize-instance_method
|
59
|
+
# AWS SDK for Ruby}.
|
58
60
|
# @option opts [Aws::DynamoDB::Client] :client allows you to pass in your
|
59
61
|
# own pre-configured client.
|
60
62
|
#
|
61
63
|
# @return [Aws::Record::BatchWrite] An instance that contains any
|
62
64
|
# unprocessed items and allows for a retry strategy.
|
63
|
-
def write(opts = {}
|
65
|
+
def write(opts = {})
|
64
66
|
batch = BatchWrite.new(client: _build_client(opts))
|
65
|
-
|
67
|
+
yield(batch)
|
66
68
|
batch.execute!
|
67
69
|
end
|
68
70
|
|
@@ -133,13 +135,12 @@ module Aws
|
|
133
135
|
# @return [Aws::Record::BatchRead] An instance that contains modeled items
|
134
136
|
# from the +BatchGetItem+ result and stores unprocessed keys to be
|
135
137
|
# manually processed later.
|
136
|
-
def read(opts = {}
|
138
|
+
def read(opts = {})
|
137
139
|
batch = BatchRead.new(client: _build_client(opts))
|
138
|
-
|
140
|
+
yield(batch)
|
139
141
|
batch.execute!
|
140
142
|
batch
|
141
143
|
end
|
142
|
-
|
143
144
|
end
|
144
145
|
end
|
145
146
|
end
|
@@ -8,7 +8,8 @@ module Aws
|
|
8
8
|
# @api private
|
9
9
|
BATCH_GET_ITEM_LIMIT = 100
|
10
10
|
|
11
|
-
# @param [
|
11
|
+
# @param [Hash] opts
|
12
|
+
# @option opts [Aws::DynamoDB::Client] client the DynamoDB SDK client.
|
12
13
|
def initialize(opts = {})
|
13
14
|
@client = opts[:client]
|
14
15
|
end
|
@@ -44,9 +45,7 @@ module Aws
|
|
44
45
|
new_items = build_items(result.responses)
|
45
46
|
items.concat(new_items)
|
46
47
|
|
47
|
-
unless result.unprocessed_keys.nil?
|
48
|
-
update_unprocessed_keys(result.unprocessed_keys)
|
49
|
-
end
|
48
|
+
update_unprocessed_keys(result.unprocessed_keys) unless result.unprocessed_keys.nil?
|
50
49
|
|
51
50
|
new_items
|
52
51
|
end
|
@@ -61,13 +60,14 @@ module Aws
|
|
61
60
|
# @yieldparam [Aws::Record] item a modeled item
|
62
61
|
# @return [Enumerable<BatchRead>] an enumeration over the results of
|
63
62
|
# +batch_get_item+ request.
|
64
|
-
def each
|
63
|
+
def each(&block)
|
65
64
|
return enum_for(:each) unless block_given?
|
66
65
|
|
67
|
-
@items.each
|
66
|
+
@items.each(&block)
|
67
|
+
|
68
68
|
until complete?
|
69
69
|
new_items = execute!
|
70
|
-
new_items.each
|
70
|
+
new_items.each(&block)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -102,9 +102,7 @@ module Aws
|
|
102
102
|
item_key = {}
|
103
103
|
attributes = klass.attributes
|
104
104
|
klass.keys.each_value do |attr_sym|
|
105
|
-
unless key[attr_sym]
|
106
|
-
raise Errors::KeyMissing, "Missing required key #{attr_sym} in #{key}"
|
107
|
-
end
|
105
|
+
raise Errors::KeyMissing, "Missing required key #{attr_sym} in #{key}" unless key[attr_sym]
|
108
106
|
|
109
107
|
attr_name = attributes.storage_name_for(attr_sym)
|
110
108
|
item_key[attr_name] = attributes.attribute_for(attr_sym)
|
@@ -143,7 +141,7 @@ module Aws
|
|
143
141
|
item_class = find_item_class(table, item)
|
144
142
|
if item_class.nil? && @client.config.logger
|
145
143
|
@client.config.logger.warn(
|
146
|
-
'Unexpected response from service.'\
|
144
|
+
'Unexpected response from service.' \
|
147
145
|
"Received: #{item}. Skipping above item and continuing"
|
148
146
|
)
|
149
147
|
else
|
@@ -156,7 +154,7 @@ module Aws
|
|
156
154
|
|
157
155
|
def update_unprocessed_keys(keys)
|
158
156
|
keys.each do |table_name, table_values|
|
159
|
-
table_values.keys.each do |key|
|
157
|
+
table_values.keys.each do |key| # rubocop:disable Style/HashEachMethods
|
160
158
|
unprocessed_keys << { keys: key, table_name: table_name }
|
161
159
|
end
|
162
160
|
end
|
@@ -3,7 +3,8 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
class BatchWrite
|
6
|
-
# @param [
|
6
|
+
# @param [Hash] opts
|
7
|
+
# @option opts [Aws::DynamoDB::Client] client the DynamoDB SDK client.
|
7
8
|
def initialize(opts = {})
|
8
9
|
@client = opts[:client]
|
9
10
|
end
|