aws-record 2.11.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +84 -19
  3. data/VERSION +1 -1
  4. data/lib/aws-record/record/attribute.rb +4 -2
  5. data/lib/aws-record/record/batch_read.rb +8 -13
  6. data/lib/aws-record/record/batch_write.rb +2 -1
  7. data/lib/aws-record/record/buildable_search.rb +15 -20
  8. data/lib/aws-record/record/client_configuration.rb +7 -7
  9. data/lib/aws-record/record/dirty_tracking.rb +3 -11
  10. data/lib/aws-record/record/errors.rb +18 -1
  11. data/lib/aws-record/record/item_collection.rb +5 -5
  12. data/lib/aws-record/record/item_data.rb +10 -11
  13. data/lib/aws-record/record/item_operations.rb +128 -96
  14. data/lib/aws-record/record/marshalers/boolean_marshaler.rb +4 -4
  15. data/lib/aws-record/record/marshalers/date_marshaler.rb +1 -3
  16. data/lib/aws-record/record/marshalers/date_time_marshaler.rb +1 -3
  17. data/lib/aws-record/record/marshalers/epoch_time_marshaler.rb +2 -6
  18. data/lib/aws-record/record/marshalers/float_marshaler.rb +4 -4
  19. data/lib/aws-record/record/marshalers/integer_marshaler.rb +4 -4
  20. data/lib/aws-record/record/marshalers/list_marshaler.rb +6 -6
  21. data/lib/aws-record/record/marshalers/map_marshaler.rb +6 -6
  22. data/lib/aws-record/record/marshalers/numeric_set_marshaler.rb +7 -7
  23. data/lib/aws-record/record/marshalers/string_marshaler.rb +3 -1
  24. data/lib/aws-record/record/marshalers/string_set_marshaler.rb +6 -6
  25. data/lib/aws-record/record/marshalers/time_marshaler.rb +1 -3
  26. data/lib/aws-record/record/model_attributes.rb +14 -16
  27. data/lib/aws-record/record/query.rb +4 -4
  28. data/lib/aws-record/record/secondary_indexes.rb +22 -25
  29. data/lib/aws-record/record/table_config.rb +45 -56
  30. data/lib/aws-record/record/table_migration.rb +32 -36
  31. data/lib/aws-record/record/transactions.rb +15 -23
  32. data/lib/aws-record/record/version.rb +1 -1
  33. data/lib/aws-record/record.rb +8 -8
  34. metadata +4 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 737cba9ded94a3d3785cda00b45989e7deee3592c53cae2f4a63a769f1ba3f55
4
- data.tar.gz: 1f086b7c3958985bc57ca2a39b22255e88cee84fe0930118ad6c5b8ff78e3c2c
3
+ metadata.gz: 4101d86e9fc3c9644b701a42e3ff48c09a24f60169d5d1c0d6cd9aced0ff8e64
4
+ data.tar.gz: d672cbe2ab1b4e8b27749729fe0810684501a564893f6cc2d704e63581dfe53f
5
5
  SHA512:
6
- metadata.gz: 5cd823dc1edfe588f87d2b7f770a4fa25ca248a055940196264660b803bac3ecce4714f6fb5cb157e1d7d0a668b41bcade92de49851f87f336aaacc6406af167
7
- data.tar.gz: 3174f0eb63e34a421b3cbe4c494f7c86ddf5a66e1da6e572351a294cbdfad89b4bd0a41197b7b569b67967e270fe57a9e8f5b07ddedb411d1225e27a0c958b9b
6
+ metadata.gz: d63848749ec893de308eb3e97e3131b6479d0f4781f1277ac14f4dbbeed0a6fdb6237546ba881f41448c1c5933d00a960c25091af8e85cbb768bf5560d4c3d89
7
+ data.tar.gz: f4feb5e0f1c6199945cb18cbfd3ca9a61344c795643aba58ec73a958dc0b315365bc82632e31eced2a2ada684b635e6fead8ef4995ae7b5c4babc46802d137fb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ 2.13.0 (2023-10-17)
2
+ ------------------
3
+
4
+ * Feature - Allow custom `update_expression` to be passed through to the
5
+ underlying client calls. (#137)
6
+
7
+ 2.12.0 (2023-09-28)
8
+ ------------------
9
+
10
+ * Feature - Allow put, update, and delete item options to be passed through to
11
+ the underlying client calls.
12
+
13
+ * Feature - Add an `original_error` accessor to `Errors::ConditionalWriteFailed`
14
+ which contains the `Aws::DynamoDB::Errors::ConditionalCheckFailedException`
15
+ error. If `:return_values_on_condition_check_failure` was provided to a put,
16
+ update, or delete item call, this error will contain the item data that failed
17
+ the condition check.
18
+
19
+ * Issue - Fix default value for String/Numeric Sets to be unset. (#133)
20
+
21
+ * Feature - Set required Ruby version to >= 2.3 (#134)
22
+
23
+ * Issue - Run Rubocop on all files. (#135)
24
+
1
25
  2.11.0 (2023-06-02)
2
26
  ------------------
3
27
 
@@ -16,7 +40,8 @@
16
40
  2.9.0 (2022-11-16)
17
41
  ------------------
18
42
 
19
- * Feature - Add support for inheritance. Aws Record models can now be extended using standard ruby inheritance (#80).
43
+ * Feature - Add support for inheritance. Aws Record models can now be extended
44
+ using standard ruby inheritance (#80).
20
45
 
21
46
  2.8.0 (2022-10-12)
22
47
  ------------------
@@ -41,7 +66,8 @@
41
66
  2.5.0 (2020-10-13)
42
67
  ------------------
43
68
 
44
- * Feature - `Aws::Record::BuildableSearch` - Support queries yielding heterogeneous results using `multi_model_filter` (#107)
69
+ * Feature - `Aws::Record::BuildableSearch` - Support queries yielding
70
+ heterogeneous results using `multi_model_filter` (#107)
45
71
 
46
72
  2.4.1 (2020-05-29)
47
73
  ------------------
@@ -52,53 +78,89 @@
52
78
  2.4.0 (2019-07-16)
53
79
  ------------------
54
80
 
55
- * Feature - Aws::Record::BuildableSearch - Adds support for query and scan builders using substitution expressions. This allows for streamlined and expressive queries and scans using aws-record.
81
+ * Feature - Aws::Record::BuildableSearch - Adds support for query and scan
82
+ builders using substitution expressions. This allows for streamlined and
83
+ expressive queries and scans using aws-record.
56
84
 
57
85
  2.3.0 (2019-02-08)
58
86
  ------------------
59
87
 
60
- * Feature - Aws::Record::Transactions - Adds support for transactional find and transactional get requests. You can learn more about these new APIs in the [documentation](https://docs.aws.amazon.com/awssdkrubyrecord/api/Aws/Record/Transactions.html).
88
+ * Feature - Aws::Record::Transactions - Adds support for transactional find and
89
+ transactional get requests. You can learn more about these new APIs in
90
+ the [documentation](https://docs.aws.amazon.com/awssdkrubyrecord/api/Aws/Record/Transactions.html).
61
91
 
62
92
  2.2.0 (2018-12-05)
63
93
  ------------------
64
94
 
65
- * Feature - Aws::Record::TableConfig - Adds support for the "PAY_PER_REQUEST" billing mode in table configurations.
95
+ * Feature - Aws::Record::TableConfig - Adds support for the "PAY_PER_REQUEST"
96
+ billing mode in table configurations.
66
97
 
67
98
  2.1.2 (2018-11-15)
68
99
  ------------------
69
100
 
70
- * Issue - Aws::Record::Marshalers::EpochTimeMarshaler - Fixed a bug where epoch time objects didn't properly marshal from database entries.
101
+ * Issue - Aws::Record::Marshalers::EpochTimeMarshaler - Fixed a bug where epoch
102
+ time objects didn't properly marshal from database entries.
71
103
 
72
104
  2.1.1 (2018-07-10)
73
105
  ------------------
74
106
 
75
- * Feature - Aws::Record::TableConfig - Adds `:ttl_attribute` to the TableConfig DSL. When used with `epoch_time_attr` attributes or other attributes stored as epoch time, your TableConfig migrations will enable TTL on your DynamoDB table, and will use your specified attribute as the TTL attribute.
107
+ * Feature - Aws::Record::TableConfig - Adds `:ttl_attribute` to the TableConfig
108
+ DSL. When used with `epoch_time_attr` attributes or other attributes stored as
109
+ epoch time, your TableConfig migrations will enable TTL on your DynamoDB
110
+ table, and will use your specified attribute as the TTL attribute.
76
111
 
77
- * Feature - Aws::Record::Marshalers::EpochTimeMarshaler - Adds the `epoch_time_attr`, which behaves much like `time_attr` except the Amazon DynamoDB storage type is numeric, and the serialized value is epoch seconds.
112
+ * Feature - Aws::Record::Marshalers::EpochTimeMarshaler - Adds
113
+ the `epoch_time_attr`, which behaves much like `time_attr` except the Amazon
114
+ DynamoDB storage type is numeric, and the serialized value is epoch seconds.
78
115
 
79
116
  2.1.0 (2018-06-25)
80
117
  ------------------
81
118
 
82
- * Feature - Aws::Record - Add the `persisted?`, `new_record?`, and `destroyed?` methods to `Aws::Record`, which supports use cases where you'd like to see if a record has just been newly initialized, or has been deleted or was a preexisting record retrieved from DynamoDB. Note that these methods are present in `ActiveModel::Model` so you should require that module before `Aws::Record`
119
+ * Feature - Aws::Record - Add the `persisted?`, `new_record?`, and `destroyed?`
120
+ methods to `Aws::Record`, which supports use cases where you'd like to see if
121
+ a record has just been newly initialized, or has been deleted or was a
122
+ preexisting record retrieved from DynamoDB. Note that these methods are
123
+ present in `ActiveModel::Model` so you should require that module
124
+ before `Aws::Record`
83
125
 
84
- * Feature - Aws::Record - Add the `assign_attributes`, `update`, and `update!` methods to `Aws::Record` which supports the use case where the user might want to mass assign or update a records attributes by hash. `update!` also ensures that a `ValidationError` is thrown on an invalid update
126
+ * Feature - Aws::Record - Add the `assign_attributes`, `update`, and `update!`
127
+ methods to `Aws::Record` which supports the use case where the user might want
128
+ to mass assign or update a records attributes by hash. `update!` also ensures
129
+ that a `ValidationError` is thrown on an invalid update
85
130
 
86
- * Upgrading - If you already include `ActiveModel::Model` on your models the new `persisted?`, `new_record?` and `destroyed?` methods will not function properly unless you include `ActiveModel::Model` before `Aws::Record`. Additionally, new methods could lead to collisions if you happened to have attributes such as `:update` or `:assign_attributes`. In such a case, you would want to version lock below `2.1.0`, or use the `:database_attribute_name` property and change your attribute name in code.
131
+ * Upgrading - If you already include `ActiveModel::Model` on your models the
132
+ new `persisted?`, `new_record?` and `destroyed?` methods will not function
133
+ properly unless you include `ActiveModel::Model` before `Aws::Record`.
134
+ Additionally, new methods could lead to collisions if you happened to have
135
+ attributes such as `:update` or `:assign_attributes`. In such a case, you
136
+ would want to version lock below `2.1.0`, or use
137
+ the `:database_attribute_name` property and change your attribute name in
138
+ code.
87
139
 
88
140
  2.0.2 (2018-06-08)
89
141
  ------------------
90
142
 
91
- * Feature - Aws::Record::Marshalers::TimeMarshaler - Adds the `time_attr` method to AWS Record models, which uses `Time` as the underlying type.
143
+ * Feature - Aws::Record::Marshalers::TimeMarshaler - Adds the `time_attr` method
144
+ to AWS Record models, which uses `Time` as the underlying type.
92
145
 
93
146
  2.0.1 (2017-10-27)
94
147
  ------------------
95
148
 
96
- * Feature - Aws::Record::ItemCollection - Add the `#page` and `#last_evaluated_key` methods to `Aws::Record::ItemCollection`. This helps to support use cases where you'd like to control the result set size with the `:limit` parameter, or if you want to expose pagination capabilities to an outside caller, for example a list-type operation exposed in a web API.
149
+ * Feature - Aws::Record::ItemCollection - Add the `#page`
150
+ and `#last_evaluated_key` methods to `Aws::Record::ItemCollection`. This helps
151
+ to support use cases where you'd like to control the result set size with
152
+ the `:limit` parameter, or if you want to expose pagination capabilities to an
153
+ outside caller, for example a list-type operation exposed in a web API.
97
154
 
98
155
  2.0.0 (2017-08-29)
99
156
  ------------------
100
157
 
101
- * Upgrading - Aws::Record - Support version 3 of the AWS SDK for Ruby. This is being released as major version 2 of `aws-record`, though the APIs remain the same. Do note, however, that we've changed our SDK dependency to only depend on `aws-sdk-dynamodb`. This means that if you were depending on other service clients transitively via `aws-record`, you will need to add dependencies on the appropriate service gems when upgrading.
158
+ * Upgrading - Aws::Record - Support version 3 of the AWS SDK for Ruby. This is
159
+ being released as major version 2 of `aws-record`, though the APIs remain the
160
+ same. Do note, however, that we've changed our SDK dependency to only depend
161
+ on `aws-sdk-dynamodb`. This means that if you were depending on other service
162
+ clients transitively via `aws-record`, you will need to add dependencies on
163
+ the appropriate service gems when upgrading.
102
164
 
103
165
  1.1.1 (2017-06-16)
104
166
  ------------------
@@ -160,18 +222,21 @@
160
222
  1.0.0.pre.10 (2016-08-03)
161
223
  ------------------
162
224
 
163
- * Feature - Aws::Record - Refactored tracking of model attributes, key attributes,
164
- and item data to use internal classes over module composition. Dirty tracking is
225
+ * Feature - Aws::Record - Refactored tracking of model attributes, key
226
+ attributes,
227
+ and item data to use internal classes over module composition. Dirty tracking
228
+ is
165
229
  also handled more consistently across attributes, and turning on/off of dirty
166
230
  tracking is only possible at the model level (not for individual attributes).
167
231
 
168
232
  1.0.0.pre.9 (2016-07-22)
169
233
  ------------------
170
234
 
171
- * Feature - Aws::Record::Attribute - Added support for default values at the attribute
172
- level.
235
+ * Feature - Aws::Record::Attribute - Added support for default values at the
236
+ attribute level.
173
237
 
174
- * Feature - Aws::Record::Marshalers - Removed the marshalers in the `Aws::Attributes`
238
+ * Feature - Aws::Record::Marshalers - Removed the marshalers in
239
+ the `Aws::Attributes`
175
240
  namespace, replacing them with instantiated marshaler objects. This enables
176
241
  more functionality in marshalers such as the Date/DateTime marshalers.
177
242
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.11.0
1
+ 2.13.0
@@ -40,8 +40,10 @@ module Aws
40
40
  @dynamodb_type = options[:dynamodb_type]
41
41
  @marshaler = options[:marshaler] || DefaultMarshaler
42
42
  @persist_nil = options[:persist_nil]
43
- dv = options[:default_value]
44
- @default_value_or_lambda = _is_lambda?(dv) ? dv : type_cast(dv)
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
45
47
  end
46
48
 
47
49
  # Attempts to type cast a raw value into the attribute's type. This call
@@ -8,7 +8,8 @@ module Aws
8
8
  # @api private
9
9
  BATCH_GET_ITEM_LIMIT = 100
10
10
 
11
- # @param [Aws::DynamoDB::Client] client the DynamoDB SDK client.
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,16 +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 do |item|
68
- yield(item)
69
- end
66
+ @items.each(&block)
70
67
 
71
68
  until complete?
72
69
  new_items = execute!
73
- new_items.each { |new_item| yield new_item }
70
+ new_items.each(&block)
74
71
  end
75
72
  end
76
73
 
@@ -105,9 +102,7 @@ module Aws
105
102
  item_key = {}
106
103
  attributes = klass.attributes
107
104
  klass.keys.each_value do |attr_sym|
108
- unless key[attr_sym]
109
- raise Errors::KeyMissing, "Missing required key #{attr_sym} in #{key}"
110
- end
105
+ raise Errors::KeyMissing, "Missing required key #{attr_sym} in #{key}" unless key[attr_sym]
111
106
 
112
107
  attr_name = attributes.storage_name_for(attr_sym)
113
108
  item_key[attr_name] = attributes.attribute_for(attr_sym)
@@ -146,7 +141,7 @@ module Aws
146
141
  item_class = find_item_class(table, item)
147
142
  if item_class.nil? && @client.config.logger
148
143
  @client.config.logger.warn(
149
- 'Unexpected response from service.'\
144
+ 'Unexpected response from service.' \
150
145
  "Received: #{item}. Skipping above item and continuing"
151
146
  )
152
147
  else
@@ -3,7 +3,8 @@
3
3
  module Aws
4
4
  module Record
5
5
  class BatchWrite
6
- # @param [Aws::DynamoDB::Client] client the DynamoDB SDK client.
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
@@ -10,11 +10,10 @@ module Aws
10
10
  def initialize(opts)
11
11
  operation = opts[:operation]
12
12
  model = opts[:model]
13
- if SUPPORTED_OPERATIONS.include?(operation)
14
- @operation = operation
15
- else
16
- raise ArgumentError, "Unsupported operation: #{operation}"
17
- end
13
+ raise ArgumentError, "Unsupported operation: #{operation}" unless SUPPORTED_OPERATIONS.include?(operation)
14
+
15
+ @operation = operation
16
+
18
17
  @model = model
19
18
  @params = {}
20
19
  @next_name = 'BUILDERA'
@@ -41,12 +40,11 @@ module Aws
41
40
  # builder method to provide the :total_segments of your parallel scan and
42
41
  # the :segment number of this scan.
43
42
  def parallel_scan(opts)
44
- unless @operation == :scan
45
- raise ArgumentError, 'parallel_scan is only supported for scans'
46
- end
43
+ raise ArgumentError, 'parallel_scan is only supported for scans' unless @operation == :scan
47
44
  unless opts[:total_segments] && opts[:segment]
48
45
  raise ArgumentError, 'Must specify :total_segments and :segment in a parallel scan.'
49
46
  end
47
+
50
48
  @params[:total_segments] = opts[:total_segments]
51
49
  @params[:segment] = opts[:segment]
52
50
  self
@@ -56,9 +54,8 @@ module Aws
56
54
  # ascending or descending order on your range key. By default, a query is
57
55
  # run in ascending order.
58
56
  def scan_ascending(b)
59
- unless @operation == :query
60
- raise ArgumentError, 'scan_ascending is only supported for queries.'
61
- end
57
+ raise ArgumentError, 'scan_ascending is only supported for queries.' unless @operation == :query
58
+
62
59
  @params[:scan_index_forward] = b
63
60
  self
64
61
  end
@@ -90,9 +87,8 @@ module Aws
90
87
  # ).complete!
91
88
  # q.to_a # You can use this like any other query result in aws-record
92
89
  def key_expr(statement_str, *subs)
93
- unless @operation == :query
94
- raise ArgumentError, 'key_expr is only supported for queries.'
95
- end
90
+ raise ArgumentError, 'key_expr is only supported for queries.' unless @operation == :query
91
+
96
92
  names = @params[:expression_attribute_names]
97
93
  if names.nil?
98
94
  @params[:expression_attribute_names] = {}
@@ -252,28 +248,27 @@ module Aws
252
248
 
253
249
  def _apply_values(statement, subs, values)
254
250
  count = 0
255
- result = statement.gsub(/[?]/) do ||
251
+ result = statement.gsub(/[?]/) do
256
252
  sub_value = _next_value
257
253
  raise 'Substitution collision!' if values[sub_value]
254
+
258
255
  values[sub_value] = subs[count]
259
256
  count += 1
260
257
  sub_value
261
258
  end
262
259
  result.tap do
263
- unless count == subs.size
264
- raise "Expected #{count} values in the substitution set, but found #{subs.size}"
265
- end
260
+ raise "Expected #{count} values in the substitution set, but found #{subs.size}" unless count == subs.size
266
261
  end
267
262
  end
268
263
 
269
264
  def _next_name
270
- ret = '#' + @next_name
265
+ ret = "##{@next_name}"
271
266
  @next_name = @next_name.next
272
267
  ret
273
268
  end
274
269
 
275
270
  def _next_value
276
- ret = ':' + @next_value
271
+ ret = ":#{@next_value}"
277
272
  @next_value = @next_value.next
278
273
  ret
279
274
  end
@@ -10,7 +10,7 @@ module Aws
10
10
  # attempt to perform an operation against the remote end, if you have not
11
11
  # already configured a client. As such, please read and understand the
12
12
  # documentation in the AWS SDK for Ruby around
13
- # {http://docs.aws.amazon.com/sdkforruby/api/index.html#Configuration configuration}
13
+ # {http://docs.aws.amazon.com/sdk-for-ruby/v3/api/index.html#Configuration configuration}
14
14
  # to ensure you understand how default configuration behavior works. When
15
15
  # in doubt, call this method to ensure your client is configured the way
16
16
  # you want it to be configured.
@@ -26,12 +26,12 @@ module Aws
26
26
  # own pre-configured client.
27
27
  def configure_client(opts = {})
28
28
  # rubocop:disable Style/RedundantSelf
29
- if self.class != Module && Aws::Record.extends_record?(self) && opts.empty? &&
30
- self.superclass.instance_variable_get('@dynamodb_client')
31
- @dynamodb_client = self.superclass.instance_variable_get('@dynamodb_client')
32
- else
33
- @dynamodb_client = _build_client(opts)
34
- end
29
+ @dynamodb_client = if self.class != Module && Aws::Record.extends_record?(self) && opts.empty? &&
30
+ self.superclass.instance_variable_get('@dynamodb_client')
31
+ self.superclass.instance_variable_get('@dynamodb_client')
32
+ else
33
+ _build_client(opts)
34
+ end
35
35
  # rubocop:enable Style/RedundantSelf
36
36
  end
37
37
 
@@ -203,11 +203,9 @@ module Aws
203
203
 
204
204
  record = self.class.find(primary_key)
205
205
 
206
- if record.present?
207
- @data = record.instance_variable_get('@data')
208
- else
209
- raise Errors::NotFound, 'No record found'
210
- end
206
+ raise Errors::NotFound, 'No record found' unless record.present?
207
+
208
+ @data = record.instance_variable_get('@data')
211
209
 
212
210
  clean!
213
211
 
@@ -258,8 +256,6 @@ module Aws
258
256
  end
259
257
 
260
258
  # @private
261
- #
262
- # @override save(*)
263
259
  def save(*)
264
260
  super.tap { clean! }
265
261
  end
@@ -268,15 +264,11 @@ module Aws
268
264
  private
269
265
 
270
266
  # @private
271
- #
272
- # @override build_item_from_resp(*)
273
267
  def build_item_from_resp(*)
274
268
  super.tap(&:clean!)
275
269
  end
276
270
 
277
271
  # @private
278
- #
279
- # @override define_attr_methods(*)
280
272
  def _define_attr_methods(name)
281
273
  super.tap do
282
274
  define_method("#{name}_dirty?") do
@@ -16,7 +16,17 @@ module Aws
16
16
  class NotFound < RecordError; end
17
17
 
18
18
  # Raised when a conditional write fails.
19
- class ConditionalWriteFailed < RecordError; end
19
+ # Provides access to the original ConditionalCheckFailedException error
20
+ # which may have item data if the return values option was used.
21
+ class ConditionalWriteFailed < RecordError
22
+ def initialize(message, original_error)
23
+ @original_error = original_error
24
+ super(message)
25
+ end
26
+
27
+ # @return [Aws::DynamoDB::Errors::ConditionalCheckFailedException]
28
+ attr_reader :original_error
29
+ end
20
30
 
21
31
  # Raised when a validation hook call to +:valid?+ fails.
22
32
  class ValidationError < RecordError; end
@@ -50,6 +60,13 @@ module Aws
50
60
  # the key existance check yourself in your condition expression if you
51
61
  # wish to do so.
52
62
  class TransactionalSaveConditionCollision < RuntimeError; end
63
+
64
+ # Raised when you attempt to combine your own update expression with
65
+ # the update expression auto-generated from updates to an item's
66
+ # attributes. The path forward until this case is supported is to
67
+ # perform attribute updates yourself in your update expression if you
68
+ # wish to do so.
69
+ class UpdateExpressionCollision < RuntimeError; end
53
70
  end
54
71
  end
55
72
  end
@@ -25,14 +25,13 @@ module Aws
25
25
  # @return [Enumerable<Aws::Record>] an enumeration over the results of
26
26
  # your query or scan request. These results are automatically converted
27
27
  # into items on your behalf.
28
- def each
28
+ def each(&block)
29
29
  return enum_for(:each) unless block_given?
30
+
30
31
  items.each_page do |page|
31
32
  @last_evaluated_key = page.last_evaluated_key
32
33
  items_array = _build_items_from_response(page.items, @model)
33
- items_array.each do |item|
34
- yield item
35
- end
34
+ items_array.each(&block)
36
35
  end
37
36
  end
38
37
 
@@ -84,6 +83,7 @@ module Aws
84
83
  items.each do |item|
85
84
  model_class = @model_filter ? @model_filter.call(item) : model
86
85
  next unless model_class
86
+
87
87
  record = model_class.new
88
88
  data = record.instance_variable_get('@data')
89
89
  model_class.attributes.attributes.each do |name, attr|
@@ -97,7 +97,7 @@ module Aws
97
97
  end
98
98
 
99
99
  def items
100
- @_items ||= @client.send(@search_method, @search_params)
100
+ @items ||= @client.send(@search_method, @search_params)
101
101
  end
102
102
  end
103
103
  end
@@ -47,11 +47,11 @@ module Aws
47
47
  @model_attributes.attributes.each_key do |name|
48
48
  populate_default_values
49
49
  value = get_attribute(name)
50
- if @track_mutations
51
- @clean_copies[name] = _deep_copy(value)
52
- else
53
- @clean_copies[name] = value
54
- end
50
+ @clean_copies[name] = if @track_mutations
51
+ _deep_copy(value)
52
+ else
53
+ value
54
+ end
55
55
  end
56
56
  end
57
57
 
@@ -80,7 +80,7 @@ module Aws
80
80
  end
81
81
 
82
82
  def dirty?
83
- dirty.empty? ? false : true
83
+ !dirty.empty?
84
84
  end
85
85
 
86
86
  def rollback_attribute!(name)
@@ -109,11 +109,10 @@ module Aws
109
109
 
110
110
  def populate_default_values
111
111
  @model_attributes.attributes.each do |name, attribute|
112
- unless (default_value = attribute.default_value).nil?
113
- if @data[name].nil? && @data[name].nil?
114
- @data[name] = default_value
115
- end
116
- end
112
+ next if (default_value = attribute.default_value).nil?
113
+ next unless @data[name].nil?
114
+
115
+ @data[name] = default_value
117
116
  end
118
117
  end
119
118