rubocop 1.56.4 → 1.57.2

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +11 -0
  4. data/lib/rubocop/cli/command/auto_generate_config.rb +10 -5
  5. data/lib/rubocop/cli.rb +1 -1
  6. data/lib/rubocop/cop/layout/end_alignment.rb +7 -1
  7. data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
  8. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +16 -1
  9. data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
  10. data/lib/rubocop/cop/lint/debugger.rb +10 -1
  11. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  12. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  13. data/lib/rubocop/cop/lint/mixed_case_range.rb +1 -1
  14. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +0 -1
  15. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -0
  16. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +20 -4
  17. data/lib/rubocop/cop/lint/void.rb +29 -11
  18. data/lib/rubocop/cop/metrics/block_length.rb +1 -1
  19. data/lib/rubocop/cop/metrics/class_length.rb +8 -3
  20. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
  21. data/lib/rubocop/cop/mixin/comments_help.rb +16 -12
  22. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +14 -11
  23. data/lib/rubocop/cop/style/class_equality_comparison.rb +5 -0
  24. data/lib/rubocop/cop/style/format_string.rb +24 -3
  25. data/lib/rubocop/cop/style/guard_clause.rb +26 -0
  26. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -3
  27. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  28. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
  29. data/lib/rubocop/cop/style/redundant_begin.rb +9 -1
  30. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
  31. data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
  32. data/lib/rubocop/cop/style/redundant_filter_chain.rb +22 -5
  33. data/lib/rubocop/cop/style/redundant_parentheses.rb +38 -14
  34. data/lib/rubocop/cop/style/single_argument_dig.rb +2 -1
  35. data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
  36. data/lib/rubocop/formatter/html_formatter.rb +4 -2
  37. data/lib/rubocop/server/cache.rb +1 -0
  38. data/lib/rubocop/version.rb +1 -1
  39. data/lib/rubocop.rb +1 -0
  40. metadata +6 -19
@@ -136,7 +136,7 @@ module RuboCop
136
136
 
137
137
  private
138
138
 
139
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
139
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
140
140
  def check_branches(node, branches)
141
141
  # return if any branch is empty. An empty branch can be an `if`
142
142
  # without an `else` or a branch that contains only comments.
@@ -149,9 +149,23 @@ module RuboCop
149
149
  branches.any? { |branch| single_child_branch?(branch) }
150
150
 
151
151
  heads = branches.map { |branch| head(branch) }
152
- check_expressions(node, heads, :before_condition) if duplicated_expressions?(node, heads)
152
+
153
+ return unless duplicated_expressions?(node, heads)
154
+
155
+ condition_variable = assignable_condition_value(node)
156
+
157
+ head = heads.first
158
+ if head.assignment?
159
+ # The `send` node is used instead of the `indexasgn` node, so `name` cannot be used.
160
+ # https://github.com/rubocop/rubocop-ast/blob/v1.29.0/lib/rubocop/ast/node/indexasgn_node.rb
161
+ assigned_value = head.send_type? ? head.receiver.source : head.name.to_s
162
+
163
+ return if condition_variable == assigned_value
164
+ end
165
+
166
+ check_expressions(node, heads, :before_condition)
153
167
  end
154
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
168
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
155
169
 
156
170
  def duplicated_expressions?(node, expressions)
157
171
  unique_expressions = expressions.uniq
@@ -164,6 +178,14 @@ module RuboCop
164
178
  node.condition.child_nodes.none? { |n| n.source == lhs.source if n.variable? }
165
179
  end
166
180
 
181
+ def assignable_condition_value(node)
182
+ if node.condition.call_type?
183
+ (receiver = node.condition.receiver) ? receiver.source : node.condition.source
184
+ elsif node.condition.variable?
185
+ node.condition.source
186
+ end
187
+ end
188
+
167
189
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
168
190
  def check_expressions(node, expressions, insert_position)
169
191
  return if expressions.any?(&:nil?)
@@ -28,7 +28,7 @@ module RuboCop
28
28
  MSG = 'Avoid multi-line chains of blocks.'
29
29
 
30
30
  def on_block(node)
31
- node.send_node.each_node(:send) do |send_node|
31
+ node.send_node.each_node(:send, :csend) do |send_node|
32
32
  receiver = send_node.receiver
33
33
 
34
34
  next unless (receiver&.block_type? || receiver&.numblock_type?) && receiver&.multiline?
@@ -27,24 +27,16 @@ module RuboCop
27
27
 
28
28
  node.each_descendant(:if).select(&:ternary?).each do |nested_ternary|
29
29
  add_offense(nested_ternary) do |corrector|
30
- if_node = if_node(nested_ternary)
31
- next if part_of_ignored_node?(if_node)
30
+ next if part_of_ignored_node?(node)
32
31
 
33
- autocorrect(corrector, if_node)
34
- ignore_node(if_node)
32
+ autocorrect(corrector, node)
33
+ ignore_node(node)
35
34
  end
36
35
  end
37
36
  end
38
37
 
39
38
  private
40
39
 
41
- def if_node(node)
42
- node = node.parent
43
- return node if node.if_type?
44
-
45
- if_node(node)
46
- end
47
-
48
40
  def autocorrect(corrector, if_node)
49
41
  replace_loc_and_whitespace(corrector, if_node.loc.question, "\n")
50
42
  replace_loc_and_whitespace(corrector, if_node.loc.colon, "\nelse\n")
@@ -114,7 +114,7 @@ module RuboCop
114
114
  if node.parent&.assignment?
115
115
  replace_begin_with_statement(corrector, offense_range, node)
116
116
  else
117
- corrector.remove(offense_range)
117
+ remove_begin(corrector, offense_range, node)
118
118
  end
119
119
 
120
120
  if use_modifier_form_after_multiline_begin_block?(node)
@@ -136,6 +136,14 @@ module RuboCop
136
136
  restore_removed_comments(corrector, offense_range, node, first_child)
137
137
  end
138
138
 
139
+ def remove_begin(corrector, offense_range, node)
140
+ if node.parent.respond_to?(:endless?) && node.parent.endless?
141
+ offense_range = range_with_surrounding_space(offense_range, newlines: true)
142
+ end
143
+
144
+ corrector.remove(offense_range)
145
+ end
146
+
139
147
  # Restore comments that occur between "begin" and "first_child".
140
148
  # These comments will be moved to above the assignment line.
141
149
  def restore_removed_comments(corrector, offense_range, node, first_child)
@@ -13,25 +13,71 @@ module RuboCop
13
13
  # # good
14
14
  # do_something(foo: bar, baz: qux)
15
15
  #
16
+ # # bad
17
+ # do_something(**{foo: bar, baz: qux}.merge(options))
18
+ #
19
+ # # good
20
+ # do_something(foo: bar, baz: qux, **options)
21
+ #
16
22
  class RedundantDoubleSplatHashBraces < Base
17
23
  extend AutoCorrector
18
24
 
19
25
  MSG = 'Remove the redundant double splat and braces, use keyword arguments directly.'
26
+ MERGE_METHODS = %i[merge merge!].freeze
20
27
 
28
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
21
29
  def on_hash(node)
22
30
  return if node.pairs.empty? || node.pairs.any?(&:hash_rocket?)
23
31
  return unless (parent = node.parent)
24
- return unless parent.kwsplat_type?
32
+ return unless parent.call_type? || parent.kwsplat_type?
33
+ return unless mergeable?(parent)
34
+ return unless (kwsplat = node.each_ancestor(:kwsplat).first)
35
+ return if allowed_double_splat_receiver?(kwsplat)
25
36
 
26
- add_offense(parent) do |corrector|
27
- corrector.remove(parent.loc.operator)
28
- corrector.remove(opening_brace(node))
29
- corrector.remove(closing_brace(node))
37
+ add_offense(kwsplat) do |corrector|
38
+ autocorrect(corrector, node, kwsplat)
30
39
  end
31
40
  end
41
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
32
42
 
33
43
  private
34
44
 
45
+ def allowed_double_splat_receiver?(kwsplat)
46
+ first_child = kwsplat.children.first
47
+ return true if first_child.block_type? || first_child.numblock_type?
48
+ return false unless first_child.call_type?
49
+
50
+ root_receiver = root_receiver(first_child)
51
+
52
+ !root_receiver&.hash_type?
53
+ end
54
+
55
+ def autocorrect(corrector, node, kwsplat)
56
+ corrector.remove(kwsplat.loc.operator)
57
+ corrector.remove(opening_brace(node))
58
+ corrector.remove(closing_brace(node))
59
+
60
+ merge_methods = select_merge_method_nodes(kwsplat)
61
+ return if merge_methods.empty?
62
+
63
+ autocorrect_merge_methods(corrector, merge_methods, kwsplat)
64
+ end
65
+
66
+ def root_receiver(node)
67
+ receiver = node.receiver
68
+ if receiver&.receiver
69
+ root_receiver(receiver)
70
+ else
71
+ receiver
72
+ end
73
+ end
74
+
75
+ def select_merge_method_nodes(kwsplat)
76
+ extract_send_methods(kwsplat).select do |node|
77
+ mergeable?(node)
78
+ end
79
+ end
80
+
35
81
  def opening_brace(node)
36
82
  node.loc.begin.join(node.children.first.source_range.begin)
37
83
  end
@@ -39,6 +85,48 @@ module RuboCop
39
85
  def closing_brace(node)
40
86
  node.children.last.source_range.end.join(node.loc.end)
41
87
  end
88
+
89
+ def autocorrect_merge_methods(corrector, merge_methods, kwsplat)
90
+ range = range_of_merge_methods(merge_methods)
91
+
92
+ new_kwsplat_arguments = extract_send_methods(kwsplat).map do |descendant|
93
+ convert_to_new_arguments(descendant)
94
+ end
95
+ new_source = new_kwsplat_arguments.compact.reverse.unshift('').join(', ')
96
+
97
+ corrector.replace(range, new_source)
98
+ end
99
+
100
+ def range_of_merge_methods(merge_methods)
101
+ begin_merge_method = merge_methods.last
102
+ end_merge_method = merge_methods.first
103
+
104
+ begin_merge_method.loc.dot.begin.join(end_merge_method.source_range.end)
105
+ end
106
+
107
+ def extract_send_methods(kwsplat)
108
+ kwsplat.each_descendant(:send, :csend)
109
+ end
110
+
111
+ def convert_to_new_arguments(node)
112
+ return unless mergeable?(node)
113
+
114
+ node.arguments.map do |arg|
115
+ if arg.hash_type?
116
+ arg.source
117
+ else
118
+ "**#{arg.source}"
119
+ end
120
+ end
121
+ end
122
+
123
+ def mergeable?(node)
124
+ return true unless node.call_type?
125
+ return false unless MERGE_METHODS.include?(node.method_name)
126
+ return true unless (parent = node.parent)
127
+
128
+ mergeable?(parent)
129
+ end
42
130
  end
43
131
  end
44
132
  end
@@ -5,17 +5,21 @@ module RuboCop
5
5
  module Style
6
6
  # Checks for RuntimeError as the argument of raise/fail.
7
7
  #
8
- # It checks for code like this:
9
- #
10
8
  # @example
11
- # # Bad
9
+ # # bad
12
10
  # raise RuntimeError, 'message'
13
- #
14
- # # Bad
15
11
  # raise RuntimeError.new('message')
16
12
  #
17
- # # Good
13
+ # # good
18
14
  # raise 'message'
15
+ #
16
+ # # bad - message is not a string
17
+ # raise RuntimeError, Object.new
18
+ # raise RuntimeError.new(Object.new)
19
+ #
20
+ # # good
21
+ # raise Object.new.to_s
22
+ #
19
23
  class RedundantException < Base
20
24
  extend AutoCorrector
21
25
 
@@ -30,26 +34,42 @@ module RuboCop
30
34
  fix_exploded(node) || fix_compact(node)
31
35
  end
32
36
 
37
+ private
38
+
33
39
  def fix_exploded(node)
34
40
  exploded?(node) do |command, message|
35
41
  add_offense(node, message: MSG_1) do |corrector|
36
- if node.parenthesized?
37
- corrector.replace(node, "#{command}(#{message.source})")
38
- else
39
- corrector.replace(node, "#{command} #{message.source}")
40
- end
42
+ corrector.replace(node, replaced_exploded(node, command, message))
41
43
  end
42
44
  end
43
45
  end
44
46
 
47
+ def replaced_exploded(node, command, message)
48
+ arg = string_message?(message) ? message.source : "#{message.source}.to_s"
49
+ arg = node.parenthesized? ? "(#{arg})" : " #{arg}"
50
+ "#{command}#{arg}"
51
+ end
52
+
53
+ def string_message?(message)
54
+ message.str_type? || message.dstr_type? || message.xstr_type?
55
+ end
56
+
45
57
  def fix_compact(node)
46
58
  compact?(node) do |new_call, message|
47
59
  add_offense(node, message: MSG_2) do |corrector|
48
- corrector.replace(new_call, message.source)
60
+ corrector.replace(new_call, replaced_compact(message))
49
61
  end
50
62
  end
51
63
  end
52
64
 
65
+ def replaced_compact(message)
66
+ if string_message?(message)
67
+ message.source
68
+ else
69
+ "#{message.source}.to_s"
70
+ end
71
+ end
72
+
53
73
  # @!method exploded?(node)
54
74
  def_node_matcher :exploded?, <<~PATTERN
55
75
  (send nil? ${:raise :fail} (const {nil? cbase} :RuntimeError) $_)
@@ -6,6 +6,12 @@ module RuboCop
6
6
  # Identifies usages of `any?`, `empty?` or `none?` predicate methods
7
7
  # chained to `select`/`filter`/`find_all` and change them to use predicate method instead.
8
8
  #
9
+ # @safety
10
+ # This cop's autocorrection is unsafe because `array.select.any?` evaluates all elements
11
+ # through the `select` method, while `array.any?` uses short-circuit evaluation.
12
+ # In other words, `array.select.any?` guarantees the evaluation of every element,
13
+ # but `array.any?` does not necessarily evaluate all of them.
14
+ #
9
15
  # @example
10
16
  # # bad
11
17
  # arr.select { |x| x > 1 }.any?
@@ -28,6 +34,9 @@ module RuboCop
28
34
  # # good
29
35
  # arr.select { |x| x > 1 }.many?
30
36
  #
37
+ # # good
38
+ # arr.select { |x| x > 1 }.present?
39
+ #
31
40
  # @example AllCops:ActiveSupportExtensionsEnabled: true
32
41
  # # bad
33
42
  # arr.select { |x| x > 1 }.many?
@@ -35,20 +44,26 @@ module RuboCop
35
44
  # # good
36
45
  # arr.many? { |x| x > 1 }
37
46
  #
47
+ # # bad
48
+ # arr.select { |x| x > 1 }.present?
49
+ #
50
+ # # good
51
+ # arr.any? { |x| x > 1 }
52
+ #
38
53
  class RedundantFilterChain < Base
39
54
  extend AutoCorrector
40
55
 
41
56
  MSG = 'Use `%<prefer>s` instead of `%<first_method>s.%<second_method>s`.'
42
57
 
43
- RAILS_METHODS = %i[many?].freeze
58
+ RAILS_METHODS = %i[many? present?].freeze
44
59
  RESTRICT_ON_SEND = (%i[any? empty? none? one?] + RAILS_METHODS).freeze
45
60
 
46
61
  # @!method select_predicate?(node)
47
62
  def_node_matcher :select_predicate?, <<~PATTERN
48
- (send
63
+ (call
49
64
  {
50
- (block $(send _ {:select :filter :find_all}) ...)
51
- $(send _ {:select :filter :find_all} block_pass_type?)
65
+ (block $(call _ {:select :filter :find_all}) ...)
66
+ $(call _ {:select :filter :find_all} block_pass_type?)
52
67
  }
53
68
  ${:#{RESTRICT_ON_SEND.join(' :')}})
54
69
  PATTERN
@@ -58,7 +73,8 @@ module RuboCop
58
73
  empty?: :none?,
59
74
  none?: :none?,
60
75
  one?: :one?,
61
- many?: :many?
76
+ many?: :many?,
77
+ present?: :any?
62
78
  }.freeze
63
79
  private_constant :REPLACEMENT_METHODS
64
80
 
@@ -71,6 +87,7 @@ module RuboCop
71
87
  register_offense(select_node, node)
72
88
  end
73
89
  end
90
+ alias on_csend on_send
74
91
 
75
92
  private
76
93
 
@@ -111,31 +111,49 @@ module RuboCop
111
111
 
112
112
  def first_arg_begins_with_hash_literal?(node)
113
113
  # Don't flag `method ({key: value})` or `method ({key: value}.method)`
114
- method_chain_begins_with_hash_literal?(node.children.first) &&
115
- first_argument?(node) &&
116
- !parentheses?(node.parent)
114
+ hash_literal = method_chain_begins_with_hash_literal(node.children.first)
115
+ if (root_method = node.each_ancestor(:send).to_a.last)
116
+ parenthesized = root_method.parenthesized_call?
117
+ end
118
+ hash_literal && first_argument?(node) && !parentheses?(hash_literal) && !parenthesized
117
119
  end
118
120
 
119
- def method_chain_begins_with_hash_literal?(node)
120
- return false if node.nil?
121
- return true if node.hash_type?
122
- return false unless node.send_type?
121
+ def method_chain_begins_with_hash_literal(node)
122
+ return if node.nil?
123
+ return node if node.hash_type?
124
+ return unless node.send_type?
123
125
 
124
- method_chain_begins_with_hash_literal?(node.children.first)
126
+ method_chain_begins_with_hash_literal(node.children.first)
125
127
  end
126
128
 
127
129
  def check(begin_node)
128
130
  node = begin_node.children.first
129
- return offense(begin_node, 'a keyword') if keyword_with_redundant_parentheses?(node)
130
- return offense(begin_node, 'a literal') if disallowed_literal?(begin_node, node)
131
- return offense(begin_node, 'a variable') if node.variable?
132
- return offense(begin_node, 'a constant') if node.const_type?
133
131
 
134
- return offense(begin_node, 'an interpolated expression') if interpolation?(begin_node)
132
+ if (message = find_offense_message(begin_node, node))
133
+ return offense(begin_node, message)
134
+ end
135
135
 
136
136
  check_send(begin_node, node) if node.call_type?
137
137
  end
138
138
 
139
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
140
+ def find_offense_message(begin_node, node)
141
+ return 'a keyword' if keyword_with_redundant_parentheses?(node)
142
+ return 'a literal' if disallowed_literal?(begin_node, node)
143
+ return 'a variable' if node.variable?
144
+ return 'a constant' if node.const_type?
145
+ return 'an interpolated expression' if interpolation?(begin_node)
146
+
147
+ return if begin_node.chained? || !begin_node.parent.nil?
148
+
149
+ if node.and_type? || node.or_type?
150
+ 'a logical expression'
151
+ elsif node.respond_to?(:comparison_method?) && node.comparison_method?
152
+ 'a comparison expression'
153
+ end
154
+ end
155
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
156
+
139
157
  # @!method interpolation?(node)
140
158
  def_node_matcher :interpolation?, '[^begin ^^dstr]'
141
159
 
@@ -215,7 +233,13 @@ module RuboCop
215
233
  end
216
234
 
217
235
  def first_argument?(node)
218
- first_send_argument?(node) || first_super_argument?(node) || first_yield_argument?(node)
236
+ if first_send_argument?(node) ||
237
+ first_super_argument?(node) ||
238
+ first_yield_argument?(node)
239
+ return true
240
+ end
241
+
242
+ node.each_ancestor.any? { |ancestor| first_argument?(ancestor) }
219
243
  end
220
244
 
221
245
  # @!method first_send_argument?(node)
@@ -33,6 +33,7 @@ module RuboCop
33
33
 
34
34
  MSG = 'Use `%<receiver>s[%<argument>s]` instead of `%<original>s`.'
35
35
  RESTRICT_ON_SEND = %i[dig].freeze
36
+ IGNORED_ARGUMENT_TYPES = %i[block_pass forwarded_restarg forwarded_args hash].freeze
36
37
 
37
38
  # @!method single_argument_dig?(node)
38
39
  def_node_matcher :single_argument_dig?, <<~PATTERN
@@ -44,7 +45,7 @@ module RuboCop
44
45
 
45
46
  expression = single_argument_dig?(node)
46
47
  return unless expression
47
- return if expression.forwarded_args_type?
48
+ return if IGNORED_ARGUMENT_TYPES.include?(expression.type)
48
49
 
49
50
  receiver = node.receiver.source
50
51
  argument = expression.source
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for single-line `do`...`end` block.
7
+ #
8
+ # In practice a single line `do`...`end` is autocorrected when `EnforcedStyle: semantic`
9
+ # in `Style/BlockDelimiters`. The autocorrection maintains the `do` ... `end` syntax to
10
+ # preserve semantics and does not change it to `{`...`}` block.
11
+ #
12
+ # @example
13
+ #
14
+ # # bad
15
+ # foo do |arg| bar(arg) end
16
+ #
17
+ # # good
18
+ # foo do |arg|
19
+ # bar(arg)
20
+ # end
21
+ #
22
+ # # bad
23
+ # ->(arg) do bar(arg) end
24
+ #
25
+ # # good
26
+ # ->(arg) { bar(arg) }
27
+ #
28
+ class SingleLineDoEndBlock < Base
29
+ extend AutoCorrector
30
+
31
+ MSG = 'Prefer multiline `do`...`end` block.'
32
+
33
+ # rubocop:disable Metrics/AbcSize
34
+ def on_block(node)
35
+ return if !node.single_line? || node.braces?
36
+
37
+ add_offense(node) do |corrector|
38
+ corrector.insert_after(do_line(node), "\n")
39
+
40
+ node_body = node.body
41
+
42
+ if node_body.respond_to?(:heredoc?) && node_body.heredoc?
43
+ corrector.remove(node.loc.end)
44
+ corrector.insert_after(node_body.loc.heredoc_end, "\nend")
45
+ else
46
+ corrector.insert_before(node.loc.end, "\n")
47
+ end
48
+ end
49
+ end
50
+ # rubocop:enable Metrics/AbcSize
51
+ alias on_numblock on_block
52
+
53
+ private
54
+
55
+ def do_line(node)
56
+ if node.numblock_type? || node.arguments.children.empty? || node.send_node.lambda_literal?
57
+ node.loc.begin
58
+ else
59
+ node.arguments
60
+ end
61
+ end
62
+
63
+ def x(corrector, node); end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'base64'
4
3
  require 'cgi'
5
4
  require 'erb'
6
5
  require 'ostruct'
@@ -124,7 +123,10 @@ module RuboCop
124
123
 
125
124
  def base64_encoded_logo_image
126
125
  image = File.read(LOGO_IMAGE_PATH, binmode: true)
127
- Base64.encode64(image)
126
+
127
+ # `Base64.encode64` compatible:
128
+ # https://github.com/ruby/base64/blob/v0.1.1/lib/base64.rb#L27-L40
129
+ [image].pack('m')
128
130
  end
129
131
  end
130
132
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'fileutils'
3
4
  require 'pathname'
4
5
  require_relative '../cache_config'
5
6
  require_relative '../config_finder'
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.56.4'
6
+ STRING = '1.57.2'
7
7
 
8
8
  MSG = '%<version>s (using Parser %<parser_version>s, ' \
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
data/lib/rubocop.rb CHANGED
@@ -580,6 +580,7 @@ require_relative 'rubocop/cop/style/redundant_regexp_constructor'
580
580
  require_relative 'rubocop/cop/style/redundant_self_assignment'
581
581
  require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
582
582
  require_relative 'rubocop/cop/style/require_order'
583
+ require_relative 'rubocop/cop/style/single_line_do_end_block'
583
584
  require_relative 'rubocop/cop/style/sole_nested_conditional'
584
585
  require_relative 'rubocop/cop/style/static_class'
585
586
  require_relative 'rubocop/cop/style/map_compact_with_conditional_block'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.56.4
4
+ version: 1.57.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,22 +10,8 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2023-09-28 00:00:00.000000000 Z
13
+ date: 2023-10-26 00:00:00.000000000 Z
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: base64
17
- requirement: !ruby/object:Gem::Requirement
18
- requirements:
19
- - - "~>"
20
- - !ruby/object:Gem::Version
21
- version: 0.1.1
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- requirements:
26
- - - "~>"
27
- - !ruby/object:Gem::Version
28
- version: 0.1.1
29
15
  - !ruby/object:Gem::Dependency
30
16
  name: json
31
17
  requirement: !ruby/object:Gem::Requirement
@@ -74,14 +60,14 @@ dependencies:
74
60
  requirements:
75
61
  - - ">="
76
62
  - !ruby/object:Gem::Version
77
- version: 3.2.2.3
63
+ version: 3.2.2.4
78
64
  type: :runtime
79
65
  prerelease: false
80
66
  version_requirements: !ruby/object:Gem::Requirement
81
67
  requirements:
82
68
  - - ">="
83
69
  - !ruby/object:Gem::Version
84
- version: 3.2.2.3
70
+ version: 3.2.2.4
85
71
  - !ruby/object:Gem::Dependency
86
72
  name: rainbow
87
73
  requirement: !ruby/object:Gem::Requirement
@@ -895,6 +881,7 @@ files:
895
881
  - lib/rubocop/cop/style/signal_exception.rb
896
882
  - lib/rubocop/cop/style/single_argument_dig.rb
897
883
  - lib/rubocop/cop/style/single_line_block_params.rb
884
+ - lib/rubocop/cop/style/single_line_do_end_block.rb
898
885
  - lib/rubocop/cop/style/single_line_methods.rb
899
886
  - lib/rubocop/cop/style/slicing_with_range.rb
900
887
  - lib/rubocop/cop/style/sole_nested_conditional.rb
@@ -1038,7 +1025,7 @@ metadata:
1038
1025
  homepage_uri: https://rubocop.org/
1039
1026
  changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
1040
1027
  source_code_uri: https://github.com/rubocop/rubocop/
1041
- documentation_uri: https://docs.rubocop.org/rubocop/1.56/
1028
+ documentation_uri: https://docs.rubocop.org/rubocop/1.57/
1042
1029
  bug_tracker_uri: https://github.com/rubocop/rubocop/issues
1043
1030
  rubygems_mfa_required: 'true'
1044
1031
  post_install_message: