aws-record 2.10.1 → 2.11.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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-record/record/attribute.rb +4 -6
  5. data/lib/aws-record/record/attributes.rb +36 -49
  6. data/lib/aws-record/record/batch.rb +13 -12
  7. data/lib/aws-record/record/batch_read.rb +5 -2
  8. data/lib/aws-record/record/buildable_search.rb +29 -26
  9. data/lib/aws-record/record/client_configuration.rb +9 -9
  10. data/lib/aws-record/record/dirty_tracking.rb +29 -32
  11. data/lib/aws-record/record/errors.rb +0 -1
  12. data/lib/aws-record/record/item_collection.rb +4 -4
  13. data/lib/aws-record/record/item_data.rb +3 -6
  14. data/lib/aws-record/record/item_operations.rb +77 -93
  15. data/lib/aws-record/record/key_attributes.rb +0 -2
  16. data/lib/aws-record/record/marshalers/boolean_marshaler.rb +1 -4
  17. data/lib/aws-record/record/marshalers/date_marshaler.rb +0 -3
  18. data/lib/aws-record/record/marshalers/date_time_marshaler.rb +1 -2
  19. data/lib/aws-record/record/marshalers/epoch_time_marshaler.rb +0 -2
  20. data/lib/aws-record/record/marshalers/float_marshaler.rb +2 -7
  21. data/lib/aws-record/record/marshalers/integer_marshaler.rb +2 -7
  22. data/lib/aws-record/record/marshalers/list_marshaler.rb +1 -4
  23. data/lib/aws-record/record/marshalers/map_marshaler.rb +1 -4
  24. data/lib/aws-record/record/marshalers/numeric_set_marshaler.rb +2 -4
  25. data/lib/aws-record/record/marshalers/string_marshaler.rb +1 -4
  26. data/lib/aws-record/record/marshalers/string_set_marshaler.rb +2 -4
  27. data/lib/aws-record/record/marshalers/time_marshaler.rb +0 -2
  28. data/lib/aws-record/record/model_attributes.rb +13 -23
  29. data/lib/aws-record/record/query.rb +6 -9
  30. data/lib/aws-record/record/secondary_indexes.rb +22 -30
  31. data/lib/aws-record/record/table_config.rb +51 -62
  32. data/lib/aws-record/record/table_migration.rb +42 -54
  33. data/lib/aws-record/record/transactions.rb +32 -35
  34. data/lib/aws-record/record.rb +29 -37
  35. metadata +11 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b6ed904b6114e07186e11b86c8e8a3e7d94c487cdfc7aba412f2f85a0352528
4
- data.tar.gz: 5a3cbab3c5daf7b820b0d865ab433de7e8a17d9030916dc513e8db8d8c027d0d
3
+ metadata.gz: 737cba9ded94a3d3785cda00b45989e7deee3592c53cae2f4a63a769f1ba3f55
4
+ data.tar.gz: 1f086b7c3958985bc57ca2a39b22255e88cee84fe0930118ad6c5b8ff78e3c2c
5
5
  SHA512:
6
- metadata.gz: 9acd345bf2e2280b51e0ed0be2b96a8788f02e358fb9e49ebc91e18f5d6dd1016756e7ce27b36174e15f73084b8e1f5f591d8424d832fd8a27ee5c3794cf1a1c
7
- data.tar.gz: 21995e47b1565913b5ae1812c19074818a5a1ca9ed7b468d6f0f41273458f92d398dc8fdcec64ca4eebef45f49492c1f134939b7ab97274493f0fde157af860e
6
+ metadata.gz: 5cd823dc1edfe588f87d2b7f770a4fa25ca248a055940196264660b803bac3ecce4714f6fb5cb157e1d7d0a668b41bcade92de49851f87f336aaacc6406af167
7
+ data.tar.gz: 3174f0eb63e34a421b3cbe4c494f7c86ddf5a66e1da6e572351a294cbdfad89b4bd0a41197b7b569b67967e270fe57a9e8f5b07ddedb411d1225e27a0c958b9b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ 2.11.0 (2023-06-02)
2
+ ------------------
3
+
4
+ * Feature - Improve User-Agent tracking and bump minimum DynamoDB version.
5
+
1
6
  2.10.1 (2023-01-17)
2
7
  ------------------
3
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.10.1
1
+ 2.11.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,7 +36,7 @@ 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] || name).to_s
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]
@@ -90,6 +88,7 @@ module Aws
90
88
  end
91
89
 
92
90
  private
91
+
93
92
  def _deep_copy(obj)
94
93
  Marshal.load(Marshal.dump(obj))
95
94
  end
@@ -97,17 +96,16 @@ module Aws
97
96
  def _is_lambda?(obj)
98
97
  obj.respond_to?(:call)
99
98
  end
100
-
101
99
  end
102
100
 
103
101
  # This is an identity marshaler, which performs no changes for type casting
104
102
  # or serialization. It is generally not recommended for use.
105
103
  module DefaultMarshaler
106
- def self.type_cast(raw_value, options = {})
104
+ def self.type_cast(raw_value, _options = {})
107
105
  raw_value
108
106
  end
109
107
 
110
- def self.serialize(raw_value, options = {})
108
+ def self.serialize(raw_value, _options = {})
111
109
  raw_value
112
110
  end
113
111
  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("@attributes", model_attributes)
11
- sub_class.instance_variable_set("@keys", KeyAttributes.new(model_attributes))
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("@attributes")
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("@attributes")
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("@keys")
93
- subclass_keys = klass.instance_variable_get("@keys")
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.range_key
100
- subclass_keys.range_key = superclass_keys.range_key
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
- module ClassMethods
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] = "S"
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] = "BOOL"
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] = "N"
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] = "N"
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] = "S"
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] = "S"
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] = "S"
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] = "N"
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] = "L"
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] = "M"
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] = "SS"
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] = "NS"
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 Atomic counter}
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] = "N"
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 = "Attributes need to be saved before atomic counter can be incremented"
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
- ":i" => increment
490
+ ':i' => increment
500
491
  },
501
492
  expression_attribute_names: {
502
- "#n" => name
493
+ '#n' => name
503
494
  },
504
- update_expression: "SET #n = #n + :i",
505
- return_values: "UPDATED_NEW"
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.new(
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 Aws::DynamoDB::Client#batch_write_item}
11
- # method. Up to 25 +PutItem+ or +DeleteItem+ operations are supported.
12
- # A single request may write up to 16 MB of data, with each item having a
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 Batch Operations and Error Handling}
29
- # in the DynamoDB Developer Guide for more details.
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 AWS SDK for Ruby}.
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 = {}, &block)
65
+ def write(opts = {})
64
66
  batch = BatchWrite.new(client: _build_client(opts))
65
- block.call(batch)
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 = {}, &block)
138
+ def read(opts = {})
137
139
  batch = BatchRead.new(client: _build_client(opts))
138
- block.call(batch)
140
+ yield(batch)
139
141
  batch.execute!
140
142
  batch
141
143
  end
142
-
143
144
  end
144
145
  end
145
146
  end
@@ -64,7 +64,10 @@ module Aws
64
64
  def each
65
65
  return enum_for(:each) unless block_given?
66
66
 
67
- @items.each { |item| yield item }
67
+ @items.each do |item|
68
+ yield(item)
69
+ end
70
+
68
71
  until complete?
69
72
  new_items = execute!
70
73
  new_items.each { |new_item| yield new_item }
@@ -156,7 +159,7 @@ module Aws
156
159
 
157
160
  def update_unprocessed_keys(keys)
158
161
  keys.each do |table_name, table_values|
159
- table_values.keys.each do |key|
162
+ table_values.keys.each do |key| # rubocop:disable Style/HashEachMethods
160
163
  unprocessed_keys << { keys: key, table_name: table_name }
161
164
  end
162
165
  end
@@ -3,7 +3,7 @@
3
3
  module Aws
4
4
  module Record
5
5
  class BuildableSearch
6
- SUPPORTED_OPERATIONS = [:query, :scan]
6
+ SUPPORTED_OPERATIONS = %i[query scan].freeze
7
7
 
8
8
  # This should never be called directly, rather it is called by the
9
9
  # #build_query or #build_scan methods of your aws-record model class.
@@ -13,12 +13,12 @@ module Aws
13
13
  if SUPPORTED_OPERATIONS.include?(operation)
14
14
  @operation = operation
15
15
  else
16
- raise ArgumentError.new("Unsupported operation: #{operation}")
16
+ raise ArgumentError, "Unsupported operation: #{operation}"
17
17
  end
18
18
  @model = model
19
19
  @params = {}
20
- @next_name = "BUILDERA"
21
- @next_value = "buildera"
20
+ @next_name = 'BUILDERA'
21
+ @next_value = 'buildera'
22
22
  end
23
23
 
24
24
  # If you are querying or scanning on an index, you can specify it with
@@ -42,10 +42,10 @@ module Aws
42
42
  # the :segment number of this scan.
43
43
  def parallel_scan(opts)
44
44
  unless @operation == :scan
45
- raise ArgumentError.new("parallel_scan is only supported for scans")
45
+ raise ArgumentError, 'parallel_scan is only supported for scans'
46
46
  end
47
47
  unless opts[:total_segments] && opts[:segment]
48
- raise ArgumentError.new("Must specify :total_segments and :segment in a parallel scan.")
48
+ raise ArgumentError, 'Must specify :total_segments and :segment in a parallel scan.'
49
49
  end
50
50
  @params[:total_segments] = opts[:total_segments]
51
51
  @params[:segment] = opts[:segment]
@@ -57,7 +57,7 @@ module Aws
57
57
  # run in ascending order.
58
58
  def scan_ascending(b)
59
59
  unless @operation == :query
60
- raise ArgumentError.new("scan_ascending is only supported for queries.")
60
+ raise ArgumentError, 'scan_ascending is only supported for queries.'
61
61
  end
62
62
  @params[:scan_index_forward] = b
63
63
  self
@@ -91,7 +91,7 @@ module Aws
91
91
  # q.to_a # You can use this like any other query result in aws-record
92
92
  def key_expr(statement_str, *subs)
93
93
  unless @operation == :query
94
- raise ArgumentError.new("key_expr is only supported for queries.")
94
+ raise ArgumentError, 'key_expr is only supported for queries.'
95
95
  end
96
96
  names = @params[:expression_attribute_names]
97
97
  if names.nil?
@@ -145,10 +145,10 @@ module Aws
145
145
 
146
146
  # Allows you to define a projection expression for the values returned by
147
147
  # a query or scan. See
148
- # {https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html the Amazon DynamoDB Developer Guide}
149
- # for more details on projection expressions. You can use the symbols from
150
- # your aws-record model class in a projection expression. Keys are always
151
- # retrieved.
148
+ # {https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html
149
+ # the Amazon DynamoDB Developer Guide} for more details on projection expressions.
150
+ # You can use the symbols from your aws-record model class in a projection expression.
151
+ # Keys are always retrieved.
152
152
  #
153
153
  # @example Scan with a projection expression:
154
154
  # # Example model class
@@ -233,30 +233,33 @@ module Aws
233
233
  end
234
234
 
235
235
  private
236
+
236
237
  def _key_pass(statement, names)
237
238
  statement.gsub(/:(\w+)/) do |match|
238
- key = match.gsub(':','').to_sym
239
+ key = match.gsub(':', '').to_sym
239
240
  key_name = @model.attributes.storage_name_for(key)
240
- if key_name
241
- sub_name = _next_name
242
- raise "Substitution collision!" if names[sub_name]
243
- names[sub_name] = key_name
244
- sub_name
245
- else
246
- raise "No such key #{key}"
247
- end
241
+
242
+ raise "No such key #{key}" unless key_name
243
+
244
+ sub_name = _next_name
245
+
246
+ raise 'Substitution collision!' if names[sub_name]
247
+
248
+ names[sub_name] = key_name
249
+ sub_name
248
250
  end
249
251
  end
250
252
 
251
253
  def _apply_values(statement, subs, values)
252
254
  count = 0
253
- statement.gsub(/[?]/) do |match|
255
+ result = statement.gsub(/[?]/) do ||
254
256
  sub_value = _next_value
255
- raise "Substitution collision!" if values[sub_value]
257
+ raise 'Substitution collision!' if values[sub_value]
256
258
  values[sub_value] = subs[count]
257
259
  count += 1
258
260
  sub_value
259
- end.tap do
261
+ end
262
+ result.tap do
260
263
  unless count == subs.size
261
264
  raise "Expected #{count} values in the substitution set, but found #{subs.size}"
262
265
  end
@@ -264,13 +267,13 @@ module Aws
264
267
  end
265
268
 
266
269
  def _next_name
267
- ret = "#" + @next_name
270
+ ret = '#' + @next_name
268
271
  @next_name = @next_name.next
269
272
  ret
270
273
  end
271
274
 
272
275
  def _next_value
273
- ret = ":" + @next_value
276
+ ret = ':' + @next_value
274
277
  @next_value = @next_value.next
275
278
  ret
276
279
  end
@@ -20,16 +20,19 @@ module Aws
20
20
  # @param [Hash] opts the options you wish to use to create the client.
21
21
  # Note that if you include the option +:client+, all other options
22
22
  # will be ignored. See the documentation for other options in the
23
- # {https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#initialize-instance_method AWS SDK for Ruby}.
23
+ # {https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#initialize-instance_method
24
+ # AWS SDK for Ruby}.
24
25
  # @option opts [Aws::DynamoDB::Client] :client allows you to pass in your
25
26
  # own pre-configured client.
26
27
  def configure_client(opts = {})
28
+ # rubocop:disable Style/RedundantSelf
27
29
  if self.class != Module && Aws::Record.extends_record?(self) && opts.empty? &&
28
- self.superclass.instance_variable_get('@dynamodb_client')
29
- @dynamodb_client = self.superclass.instance_variable_get('@dynamodb_client')
30
+ self.superclass.instance_variable_get('@dynamodb_client')
31
+ @dynamodb_client = self.superclass.instance_variable_get('@dynamodb_client')
30
32
  else
31
33
  @dynamodb_client = _build_client(opts)
32
34
  end
35
+ # rubocop:enable Style/RedundantSelf
33
36
  end
34
37
 
35
38
  # Gets the
@@ -50,12 +53,9 @@ module Aws
50
53
 
51
54
  def _build_client(opts = {})
52
55
  provided_client = opts.delete(:client)
53
- opts[:user_agent_suffix] = _user_agent(opts.delete(:user_agent_suffix))
54
- provided_client || Aws::DynamoDB::Client.new(opts)
55
- end
56
-
57
- def _user_agent(custom)
58
- custom || " aws-record/#{VERSION}"
56
+ client = provided_client || Aws::DynamoDB::Client.new(opts)
57
+ client.config.user_agent_frameworks << 'aws-record'
58
+ client
59
59
  end
60
60
  end
61
61
  end