rubocop 1.69.0 → 1.69.1

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 (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubocop/cop/generator.rb +6 -0
  3. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
  4. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -2
  5. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -0
  6. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -0
  7. data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
  8. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  9. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  10. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +3 -0
  11. data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
  12. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  13. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  14. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  15. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  16. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  17. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -1
  18. data/lib/rubocop/cop/style/block_delimiters.rb +9 -1
  19. data/lib/rubocop/cop/style/dig_chain.rb +5 -6
  20. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -0
  21. data/lib/rubocop/cop/style/hash_except.rb +19 -7
  22. data/lib/rubocop/cop/style/lambda_call.rb +3 -1
  23. data/lib/rubocop/cop/style/object_then.rb +1 -0
  24. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  25. data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
  26. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  27. data/lib/rubocop/cop/style/string_concatenation.rb +13 -11
  28. data/lib/rubocop/version.rb +1 -1
  29. metadata +11 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97d8db05a66f5153d186df8720a9ea65237569f976c572053b4830925df4a825
4
- data.tar.gz: a2864b5abc210251dc57f5ff1180043fd99069a3151cec6ab43824f9d4a40758
3
+ metadata.gz: 8ab30572529c057731f5ebd7548808a1aa9f588f75a45ec0d41ecec2dbbc8015
4
+ data.tar.gz: 9beff10b3b9361a9ffc58c0da4920c9c7c7d1caa09e813ea96c46cd7f01683a4
5
5
  SHA512:
6
- metadata.gz: 7ab8930edd85daa8e4eddbbedd1e6baa129875798644bcbb3b5e8d8359278d5f58fdc4f372d671654b21d7088606bab5202ef4c5fe34e38ad09e6590f5825339
7
- data.tar.gz: 336decf7113d831b30a5ca8c8c71d324827853fb8f7102c646a1420957f8d3022f56d2f02c9e21791b280a9659138d0fe041202fff66cb33de9ea3d08548a876
6
+ metadata.gz: a1fdca8813de85e849ba3ff5266c589b74986984192247fc53c541c81475ae672788a663444070fc5428cbfd1024de7cccc9ac7924fe0dab8e138069b3f6b8f7
7
+ data.tar.gz: 7896834ccaa34e897da918b457b7ab2c738e21b474536144ddbaf71af2d5ae1e829fdeb699701323f6c67d85cb7b2fb1adcc21f3fde1683cb6273387cd390ba2
@@ -71,11 +71,17 @@ module RuboCop
71
71
  (send nil? :bad_method ...)
72
72
  PATTERN
73
73
 
74
+ # Called on every `send` node (method call) while walking the AST.
75
+ # TODO: remove this method if inspecting `send` nodes is unneeded for your cop.
76
+ # By default, this is aliased to `on_csend` as well to handle method calls
77
+ # with safe navigation, remove the alias if this is unnecessary.
78
+ # If kept, ensure your tests cover safe navigation as well!
74
79
  def on_send(node)
75
80
  return unless bad_method?(node)
76
81
 
77
82
  add_offense(node)
78
83
  end
84
+ alias on_csend on_send
79
85
  end
80
86
  end
81
87
  end
@@ -19,6 +19,7 @@ module RuboCop
19
19
  extend AutoCorrector
20
20
 
21
21
  MSG = 'Use `%<preferred>s`.'
22
+ RESTRICT_ON_SEND = [:==].freeze
22
23
 
23
24
  # @!method line_send(node)
24
25
  def_node_matcher :line_send, <<~PATTERN
@@ -45,11 +45,10 @@ module RuboCop
45
45
  #
46
46
  class BinaryOperatorWithIdenticalOperands < Base
47
47
  MSG = 'Binary operator `%<op>s` has identical operands.'
48
- MATH_OPERATORS = %i[- + * / ** << >>].to_set.freeze
48
+ RESTRICT_ON_SEND = %i[== != === <=> =~ && || > >= < <= | ^].freeze
49
49
 
50
50
  def on_send(node)
51
51
  return unless node.binary_operation?
52
- return if MATH_OPERATORS.include?(node.method_name)
53
52
  return unless node.receiver == node.first_argument
54
53
 
55
54
  add_offense(node, message: format(MSG, op: node.method_name))
@@ -37,8 +37,12 @@ module RuboCop
37
37
  # dry_ingredients.combine
38
38
  # end
39
39
  class CircularArgumentReference < Base
40
+ extend TargetRubyVersion
41
+
40
42
  MSG = 'Circular argument reference - `%<arg_name>s`.'
41
43
 
44
+ maximum_target_ruby_version 2.6
45
+
42
46
  def on_kwoptarg(node)
43
47
  check_for_circular_argument_references(*node)
44
48
  end
@@ -33,6 +33,7 @@ module RuboCop
33
33
 
34
34
  MSG = 'Use `%<constant>s.%<method>s(%<replacement_args>s)` instead of `%<original>s`.'
35
35
 
36
+ RESTRICT_ON_SEND = %i[new digest].freeze
36
37
  NO_ARG_ALGORITHM = %w[BF DES IDEA RC4].freeze
37
38
 
38
39
  # @!method algorithm_const(node)
@@ -36,6 +36,7 @@ module RuboCop
36
36
  include RangeHelp
37
37
 
38
38
  MSG = 'Literal `%<literal>s` appeared as a condition.'
39
+ RESTRICT_ON_SEND = [:!].freeze
39
40
 
40
41
  def on_if(node)
41
42
  check_for_literal(node)
@@ -59,11 +59,13 @@ module RuboCop
59
59
  #
60
60
  class NonDeterministicRequireOrder < Base
61
61
  extend AutoCorrector
62
+ extend TargetRubyVersion
62
63
 
63
64
  MSG = 'Sort files before requiring them.'
64
65
 
66
+ maximum_target_ruby_version 2.7
67
+
65
68
  def on_block(node)
66
- return if target_ruby_version >= 3.0
67
69
  return unless node.body
68
70
  return unless unsorted_dir_loop?(node.send_node)
69
71
 
@@ -75,7 +77,6 @@ module RuboCop
75
77
  end
76
78
 
77
79
  def on_numblock(node)
78
- return if target_ruby_version >= 3.0
79
80
  return unless node.body
80
81
  return unless unsorted_dir_loop?(node.send_node)
81
82
 
@@ -87,7 +88,6 @@ module RuboCop
87
88
  end
88
89
 
89
90
  def on_block_pass(node)
90
- return if target_ruby_version >= 3.0
91
91
  return unless method_require?(node)
92
92
  return unless unsorted_dir_pass?(node.parent)
93
93
 
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks if `include` or `prepend` is called in `refine` block.
7
7
  # These methods are deprecated and should be replaced with `Refinement#import_methods`.
8
8
  #
9
- # It emulates deprecation warnings in Ruby 3.1.
9
+ # It emulates deprecation warnings in Ruby 3.1. Functionality has been removed in Ruby 3.2.
10
10
  #
11
11
  # @safety
12
12
  # This cop's autocorrection is unsafe because `include M` will affect the included class
@@ -58,6 +58,9 @@ module RuboCop
58
58
  Regexp::Parser.parse(text.value)&.each_expression do |expr|
59
59
  detect_offenses(text, expr)
60
60
  end
61
+ rescue Regexp::Parser::ParserError
62
+ # Upon encountering an invalid regular expression,
63
+ # we aim to proceed and identify any remaining potential offenses.
61
64
  end
62
65
  end
63
66
 
@@ -32,6 +32,22 @@ module RuboCop
32
32
  class UnreachableCode < Base
33
33
  MSG = 'Unreachable code detected.'
34
34
 
35
+ def initialize(config = nil, options = nil)
36
+ super
37
+ @redefined = []
38
+ @instance_eval_count = 0
39
+ end
40
+
41
+ def on_block(node)
42
+ @instance_eval_count += 1 if instance_eval_block?(node)
43
+ end
44
+
45
+ alias on_numblock on_block
46
+
47
+ def after_block(node)
48
+ @instance_eval_count -= 1 if instance_eval_block?(node)
49
+ end
50
+
35
51
  def on_begin(node)
36
52
  expressions = *node
37
53
 
@@ -46,19 +62,23 @@ module RuboCop
46
62
 
47
63
  private
48
64
 
65
+ def redefinable_flow_method?(method)
66
+ %i[raise fail throw exit exit! abort].include? method
67
+ end
68
+
49
69
  # @!method flow_command?(node)
50
70
  def_node_matcher :flow_command?, <<~PATTERN
51
71
  {
52
72
  return next break retry redo
53
73
  (send
54
74
  {nil? (const {nil? cbase} :Kernel)}
55
- {:raise :fail :throw :exit :exit! :abort}
75
+ #redefinable_flow_method?
56
76
  ...)
57
77
  }
58
78
  PATTERN
59
79
 
60
80
  def flow_expression?(node)
61
- return true if flow_command?(node)
81
+ return report_on_flow_command?(node) if flow_command?(node)
62
82
 
63
83
  case node.type
64
84
  when :begin, :kwbegin
@@ -68,6 +88,8 @@ module RuboCop
68
88
  check_if(node)
69
89
  when :case, :case_match
70
90
  check_case(node)
91
+ when :def
92
+ register_redefinition(node)
71
93
  else
72
94
  false
73
95
  end
@@ -88,6 +110,33 @@ module RuboCop
88
110
 
89
111
  branches.all? { |branch| branch.body && flow_expression?(branch.body) }
90
112
  end
113
+
114
+ def register_redefinition(node)
115
+ @redefined << node.method_name if redefinable_flow_method? node.method_name
116
+ false
117
+ end
118
+
119
+ def instance_eval_block?(node)
120
+ node.block_type? && node.method?(:instance_eval)
121
+ end
122
+
123
+ def report_on_flow_command?(node)
124
+ return true unless node.send_type?
125
+
126
+ # By the contract of this function, this case means that
127
+ # the method is called on `Kernel` in which case we
128
+ # always want to report a warning.
129
+ return true if node.receiver
130
+
131
+ # Inside an `instance_eval` we have no way to tell the
132
+ # type of `self` just by looking at the AST, so we can't
133
+ # tell if the give function that's called has been
134
+ # redefined or not, so to avoid false positives, we silence
135
+ # the warning.
136
+ return false if @instance_eval_count.positive?
137
+
138
+ !@redefined.include? node.method_name
139
+ end
91
140
  end
92
141
  end
93
142
  end
@@ -25,8 +25,12 @@ module RuboCop
25
25
  # do_something_else
26
26
  # end
27
27
  class UselessElseWithoutRescue < Base
28
+ extend TargetRubyVersion
29
+
28
30
  MSG = '`else` without `rescue` is useless.'
29
31
 
32
+ maximum_target_ruby_version 2.5
33
+
30
34
  def on_new_investigation
31
35
  processed_source.diagnostics.each do |diagnostic|
32
36
  next unless diagnostic.reason == :useless_else
@@ -9,7 +9,7 @@ module RuboCop
9
9
  extend NodePattern::Macros
10
10
  include Util
11
11
 
12
- FOLDABLE_TYPES = %i[array hash heredoc send csend].freeze
12
+ FOLDABLE_TYPES = %i[array hash heredoc method_call].freeze
13
13
  CLASSLIKE_TYPES = %i[class module].freeze
14
14
  private_constant :FOLDABLE_TYPES, :CLASSLIKE_TYPES
15
15
 
@@ -3,13 +3,13 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Naming
6
- # Makes sure that accessor methods are named properly. Applies
7
- # to both instance and class methods.
6
+ # Avoid prefixing accessor method names with `get_` or `set_`.
7
+ # Applies to both instance and class methods.
8
8
  #
9
- # NOTE: Offenses are only registered for methods with the expected
10
- # arity. Getters (`get_attribute`) must have no arguments to be
11
- # registered, and setters (`set_attribute(value)`) must have exactly
12
- # one.
9
+ # NOTE: Method names starting with `get_` or `set_` only register an offense
10
+ # when the methods match the expected arity for getters and setters respectively.
11
+ # Getters (`get_attribute`) must have no arguments to be registered,
12
+ # and setters (`set_attribute(value)`) must have exactly one.
13
13
  #
14
14
  # @example
15
15
  # # bad
@@ -32,6 +32,7 @@ module RuboCop
32
32
  MONUPLE_HASH_MSG =
33
33
  'Delegate hash directly without wrapping in an array when only using a single value.'
34
34
  REDUNDANT_HASH_MSG = 'Calling .hash on elements of a hashed array is redundant.'
35
+ RESTRICT_ON_SEND = %i[hash ^ + * |].freeze
35
36
 
36
37
  # @!method hash_method_definition?(node)
37
38
  def_node_matcher :hash_method_definition?, <<~PATTERN
@@ -25,18 +25,19 @@ module RuboCop
25
25
  #
26
26
  class YAMLLoad < Base
27
27
  extend AutoCorrector
28
+ extend TargetRubyVersion
28
29
 
29
30
  MSG = 'Prefer using `YAML.safe_load` over `YAML.load`.'
30
31
  RESTRICT_ON_SEND = %i[load].freeze
31
32
 
33
+ maximum_target_ruby_version 3.0
34
+
32
35
  # @!method yaml_load(node)
33
36
  def_node_matcher :yaml_load, <<~PATTERN
34
37
  (send (const {nil? cbase} :YAML) :load ...)
35
38
  PATTERN
36
39
 
37
40
  def on_send(node)
38
- return if target_ruby_version >= 3.1
39
-
40
41
  yaml_load(node) do
41
42
  add_offense(node.loc.selector) do |corrector|
42
43
  corrector.replace(node.loc.selector, 'safe_load')
@@ -196,7 +196,7 @@ module RuboCop
196
196
 
197
197
  def offense?(node)
198
198
  (group_style? && access_modifier_is_inlined?(node) &&
199
- !right_siblings_same_inline_method?(node)) ||
199
+ !node.parent&.if_type? && !right_siblings_same_inline_method?(node)) ||
200
200
  (inline_style? && access_modifier_is_not_inlined?(node))
201
201
  end
202
202
 
@@ -342,16 +342,23 @@ module RuboCop
342
342
  node.respond_to?(:block_node) && node.block_node
343
343
  end
344
344
 
345
+ # rubocop:disable Metrics/CyclomaticComplexity
345
346
  def get_blocks(node, &block)
346
347
  case node.type
347
348
  when :block, :numblock
348
349
  yield node
349
350
  when :send
351
+ # When a method has an argument which is another method with a block,
352
+ # that block needs braces, otherwise a syntax error will be introduced
353
+ # for subsequent arguments.
354
+ # Additionally, even without additional arguments, changing `{...}` to
355
+ # `do...end` will change the binding of the block to the outer method.
350
356
  get_blocks(node.receiver, &block) if node.receiver
357
+ node.arguments.each { |argument| get_blocks(argument, &block) }
351
358
  when :hash
352
359
  # A hash which is passed as method argument may have no braces
353
360
  # In that case, one of the K/V pairs could contain a block node
354
- # which could change in meaning if do...end replaced {...}
361
+ # which could change in meaning if `do...end` is replaced with `{...}`
355
362
  return if node.braces?
356
363
 
357
364
  node.each_child_node { |child| get_blocks(child, &block) }
@@ -359,6 +366,7 @@ module RuboCop
359
366
  node.each_child_node { |child| get_blocks(child, &block) }
360
367
  end
361
368
  end
369
+ # rubocop:enable Metrics/CyclomaticComplexity
362
370
 
363
371
  # rubocop:disable Metrics/CyclomaticComplexity
364
372
  def proper_block_style?(node)
@@ -24,7 +24,6 @@ module RuboCop
24
24
  #
25
25
  class DigChain < Base
26
26
  extend AutoCorrector
27
- include RangeHelp
28
27
  include CommentsHelp
29
28
  include DigHelp
30
29
 
@@ -49,17 +48,17 @@ module RuboCop
49
48
  # Walk up the method chain while the receiver is `dig` with arguments.
50
49
  def inspect_chain(node)
51
50
  arguments = node.arguments.dup
52
- end_pos = node.source_range.end_pos
51
+ end_range = node.source_range.end
53
52
 
54
- while dig?((node = node.receiver))
55
- begin_pos = node.loc.dot ? node.loc.dot.begin_pos + 1 : 0
53
+ while dig?(node = node.receiver)
54
+ begin_range = node.loc.selector
56
55
  arguments.unshift(*node.arguments)
57
56
  ignore_node(node)
58
57
  end
59
58
 
60
- return unless begin_pos
59
+ return unless begin_range
61
60
 
62
- [range_between(begin_pos, end_pos), arguments]
61
+ [begin_range.join(end_range), arguments]
63
62
  end
64
63
 
65
64
  def invalid_arguments?(arguments)
@@ -26,6 +26,7 @@ module RuboCop
26
26
  extend AutoCorrector
27
27
 
28
28
  MSG = 'Use `ENV.fetch(%<key>s)` or `ENV.fetch(%<key>s, nil)` instead of `ENV[%<key>s]`.'
29
+ RESTRICT_ON_SEND = [:[]].freeze
29
30
 
30
31
  # @!method env_with_bracket?(node)
31
32
  def_node_matcher :env_with_bracket?, <<~PATTERN
@@ -23,10 +23,21 @@ module RuboCop
23
23
  # {foo: 1, bar: 2, baz: 3}.reject {|k, v| k == :bar }
24
24
  # {foo: 1, bar: 2, baz: 3}.select {|k, v| k != :bar }
25
25
  # {foo: 1, bar: 2, baz: 3}.filter {|k, v| k != :bar }
26
+ # {foo: 1, bar: 2, baz: 3}.reject {|k, v| k.eql?(:bar) }
27
+ #
28
+ # # bad
26
29
  # {foo: 1, bar: 2, baz: 3}.reject {|k, v| %i[bar].include?(k) }
27
30
  # {foo: 1, bar: 2, baz: 3}.select {|k, v| !%i[bar].include?(k) }
28
31
  # {foo: 1, bar: 2, baz: 3}.filter {|k, v| !%i[bar].include?(k) }
29
32
  #
33
+ # # bad
34
+ # {foo: 1, bar: 2, baz: 3}.reject {|k, v| !%i[bar].exclude?(k) }
35
+ # {foo: 1, bar: 2, baz: 3}.select {|k, v| %i[bar].exclude?(k) }
36
+ #
37
+ # # bad
38
+ # {foo: 1, bar: 2, baz: 3}.reject {|k, v| k.in?(%i[bar]) }
39
+ # {foo: 1, bar: 2, baz: 3}.select {|k, v| !k.in?(%i[bar]) }
40
+ #
30
41
  # # good
31
42
  # {foo: 1, bar: 2, baz: 3}.except(:bar)
32
43
  #
@@ -73,9 +84,8 @@ module RuboCop
73
84
  PATTERN
74
85
 
75
86
  def on_send(node)
76
- method_name = node.method_name
77
87
  block = node.parent
78
- return unless bad_method?(method_name, block) && semantically_except_method?(node, block)
88
+ return unless bad_method?(block) && semantically_except_method?(node, block)
79
89
 
80
90
  except_key = except_key(block)
81
91
  return if except_key.nil? || !safe_to_register_offense?(block, except_key)
@@ -92,7 +102,7 @@ module RuboCop
92
102
  private
93
103
 
94
104
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
95
- def bad_method?(method_name, block)
105
+ def bad_method?(block)
96
106
  if active_support_extensions_enabled?
97
107
  bad_method_with_active_support?(block) do |key_arg, send_node|
98
108
  if send_node.method?(:in?) && send_node.receiver&.source != key_arg.source
@@ -104,8 +114,6 @@ module RuboCop
104
114
  end
105
115
  else
106
116
  bad_method_with_poro?(block) do |key_arg, send_node|
107
- return false if method_name == :reject && block.body.method?(:!)
108
-
109
117
  !send_node.method?(:include?) || send_node.first_argument&.source == key_arg.source
110
118
  end
111
119
  end
@@ -129,11 +137,15 @@ module RuboCop
129
137
  end
130
138
 
131
139
  def included?(negated, body)
132
- body.method?('include?') || body.method?('in?') || (negated && body.method?('exclude?'))
140
+ if negated
141
+ body.method?('exclude?')
142
+ else
143
+ body.method?('include?') || body.method?('in?')
144
+ end
133
145
  end
134
146
 
135
147
  def not_included?(negated, body)
136
- body.method?('exclude?') || (negated && (body.method?('include?') || body.method?('in?')))
148
+ included?(!negated, body)
137
149
  end
138
150
 
139
151
  def safe_to_register_offense?(block, except_key)
@@ -44,6 +44,7 @@ module RuboCop
44
44
  correct_style_detected
45
45
  end
46
46
  end
47
+ alias on_csend on_send
47
48
 
48
49
  private
49
50
 
@@ -54,9 +55,10 @@ module RuboCop
54
55
  def prefer(node)
55
56
  receiver = node.receiver.source
56
57
  arguments = node.arguments.map(&:source).join(', ')
58
+ dot = node.loc.dot.source
57
59
  method = explicit_style? ? "call(#{arguments})" : "(#{arguments})"
58
60
 
59
- "#{receiver}.#{method}"
61
+ "#{receiver}#{dot}#{method}"
60
62
  end
61
63
 
62
64
  def implicit_style?
@@ -30,6 +30,7 @@ module RuboCop
30
30
  minimum_target_ruby_version 2.6
31
31
 
32
32
  MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
33
+ RESTRICT_ON_SEND = %i[then yield_self].freeze
33
34
 
34
35
  def on_block(node)
35
36
  check_method_node(node.send_node)
@@ -118,7 +118,9 @@ module RuboCop
118
118
  end
119
119
 
120
120
  def exclude_cntrl_character?(target_argument, redundant_argument)
121
- !target_argument.to_s.sub(/\A'/, '"').sub(/'\z/, '"').match?(/[[:cntrl:]]/) ||
121
+ return true unless (target_argument_string = target_argument.to_s).valid_encoding?
122
+
123
+ !target_argument_string.sub(/\A'/, '"').sub(/'\z/, '"').match?(/[[:cntrl:]]/) ||
122
124
  !redundant_argument.match?(/[[:cntrl:]]/)
123
125
  end
124
126
  end
@@ -244,7 +244,7 @@ module RuboCop
244
244
  end
245
245
 
246
246
  def only_begin_arg?(args)
247
- args.one? && args.first.begin_type?
247
+ args.one? && args.first&.begin_type?
248
248
  end
249
249
 
250
250
  def first_argument?(node)
@@ -175,7 +175,7 @@ module RuboCop
175
175
  def on_argument(node)
176
176
  if node.mlhs_type?
177
177
  on_args(node)
178
- else
178
+ elsif node.respond_to?(:name)
179
179
  @local_variables_scopes[node] << node.name
180
180
  end
181
181
  end
@@ -142,22 +142,24 @@ module RuboCop
142
142
  end
143
143
 
144
144
  def replacement(parts)
145
- interpolated_parts =
146
- parts.map do |part|
147
- case part.type
148
- when :str
149
- value = part.value
150
- single_quoted?(part) ? value.gsub(/(\\|")/, '\\\\\&') : value.inspect[1..-2]
151
- when :dstr
152
- contents_range(part).source
153
- else
154
- "\#{#{part.source}}"
155
- end
145
+ interpolated_parts = parts.map do |part|
146
+ case part.type
147
+ when :str
148
+ adjust_str(part)
149
+ when :dstr
150
+ part.children.all?(&:str_type?) ? adjust_str(part) : contents_range(part).source
151
+ else
152
+ "\#{#{part.source}}"
156
153
  end
154
+ end
157
155
 
158
156
  "\"#{handle_quotes(interpolated_parts).join}\""
159
157
  end
160
158
 
159
+ def adjust_str(node)
160
+ single_quoted?(node) ? node.value.gsub(/(\\|")/, '\\\\\&') : node.value.inspect[1..-2]
161
+ end
162
+
161
163
  def handle_quotes(parts)
162
164
  parts.map do |part|
163
165
  part == '"' ? '\"' : part
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.69.0'
6
+ STRING = '1.69.1'
7
7
 
8
8
  MSG = '%<version>s (using %<parser_version>s, ' \
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.69.0
4
+ version: 1.69.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
8
8
  - Jonas Arvidsson
9
9
  - Yuji Nakayama
10
- autorequire:
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2024-11-26 00:00:00.000000000 Z
13
+ date: 2024-12-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json
@@ -94,7 +94,7 @@ dependencies:
94
94
  requirements:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: '2.4'
97
+ version: 2.9.3
98
98
  - - "<"
99
99
  - !ruby/object:Gem::Version
100
100
  version: '3.0'
@@ -104,7 +104,7 @@ dependencies:
104
104
  requirements:
105
105
  - - ">="
106
106
  - !ruby/object:Gem::Version
107
- version: '2.4'
107
+ version: 2.9.3
108
108
  - - "<"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.0'
@@ -114,7 +114,7 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 1.36.1
117
+ version: 1.36.2
118
118
  - - "<"
119
119
  - !ruby/object:Gem::Version
120
120
  version: '2.0'
@@ -124,7 +124,7 @@ dependencies:
124
124
  requirements:
125
125
  - - ">="
126
126
  - !ruby/object:Gem::Version
127
- version: 1.36.1
127
+ version: 1.36.2
128
128
  - - "<"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '2.0'
@@ -1035,12 +1035,12 @@ licenses:
1035
1035
  - MIT
1036
1036
  metadata:
1037
1037
  homepage_uri: https://rubocop.org/
1038
- changelog_uri: https://github.com/rubocop/rubocop/releases/tag/v1.69.0
1038
+ changelog_uri: https://github.com/rubocop/rubocop/releases/tag/v1.69.1
1039
1039
  source_code_uri: https://github.com/rubocop/rubocop/
1040
1040
  documentation_uri: https://docs.rubocop.org/rubocop/1.69/
1041
1041
  bug_tracker_uri: https://github.com/rubocop/rubocop/issues
1042
1042
  rubygems_mfa_required: 'true'
1043
- post_install_message:
1043
+ post_install_message:
1044
1044
  rdoc_options: []
1045
1045
  require_paths:
1046
1046
  - lib
@@ -1055,8 +1055,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1055
1055
  - !ruby/object:Gem::Version
1056
1056
  version: '0'
1057
1057
  requirements: []
1058
- rubygems_version: 3.4.22
1059
- signing_key:
1058
+ rubygems_version: 3.3.7
1059
+ signing_key:
1060
1060
  specification_version: 4
1061
1061
  summary: Automatic Ruby code style checking tool.
1062
1062
  test_files: []