aws-record 2.10.1 → 2.11.0

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