aws-record 2.11.0 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
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