rubocop 1.75.7 → 1.76.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -13
  3. data/config/default.yml +48 -5
  4. data/config/obsoletion.yml +6 -3
  5. data/lib/rubocop/cop/autocorrect_logic.rb +18 -10
  6. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  7. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  8. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  9. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +1 -0
  10. data/lib/rubocop/cop/layout/class_structure.rb +35 -0
  11. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +6 -2
  12. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
  13. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
  14. data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -1
  15. data/lib/rubocop/cop/lint/float_comparison.rb +27 -0
  16. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  17. data/lib/rubocop/cop/lint/literal_as_condition.rb +16 -24
  18. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +5 -0
  19. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +87 -0
  20. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  21. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  22. data/lib/rubocop/cop/naming/predicate_method.rb +216 -0
  23. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +2 -2
  24. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
  25. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  26. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -4
  27. data/lib/rubocop/cop/style/it_block_parameter.rb +33 -14
  28. data/lib/rubocop/cop/style/map_to_hash.rb +11 -0
  29. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +1 -1
  30. data/lib/rubocop/cop/style/redundant_array_flatten.rb +48 -0
  31. data/lib/rubocop/cop/style/redundant_format.rb +6 -1
  32. data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -5
  33. data/lib/rubocop/cop/style/safe_navigation.rb +10 -7
  34. data/lib/rubocop/cop/team.rb +1 -1
  35. data/lib/rubocop/version.rb +1 -1
  36. data/lib/rubocop.rb +6 -1
  37. metadata +12 -7
@@ -45,6 +45,11 @@ module RuboCop
45
45
  }
46
46
  PATTERN
47
47
 
48
+ # @!method destructuring_argument(node)
49
+ def_node_matcher :destructuring_argument, <<~PATTERN
50
+ (args $(mlhs (arg _)+))
51
+ PATTERN
52
+
48
53
  def self.autocorrect_incompatible_with
49
54
  [Layout::SingleLineBlockChain]
50
55
  end
@@ -73,6 +78,12 @@ module RuboCop
73
78
  corrector.replace(map_dot, to_h.loc.dot.source)
74
79
  end
75
80
  corrector.replace(map.loc.selector, 'to_h')
81
+
82
+ return unless map.parent.block_type?
83
+
84
+ if (argument = destructuring_argument(map.parent.arguments))
85
+ corrector.replace(argument, argument.source[1..-2])
86
+ end
76
87
  end
77
88
  # rubocop:enable Metrics/AbcSize
78
89
  end
@@ -167,7 +167,7 @@ module RuboCop
167
167
  def call_in_match_pattern?(node)
168
168
  return false unless (parent = node.parent)
169
169
 
170
- parent.type?(:match_pattern, :match_pattern_p)
170
+ parent.any_match_pattern_type?
171
171
  end
172
172
 
173
173
  def hash_literal_in_arguments?(node)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for redundant calls of `Array#flatten`.
7
+ #
8
+ # `Array#join` joins nested arrays recursively, so flattening an array
9
+ # beforehand is redundant.
10
+ #
11
+ # @safety
12
+ # Cop is unsafe because the receiver of `flatten` method might not
13
+ # be an `Array`, so it's possible it won't respond to `join` method,
14
+ # or the end result would be different.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # x.flatten.join
19
+ # x.flatten(1).join
20
+ #
21
+ # # good
22
+ # x.join
23
+ #
24
+ class RedundantArrayFlatten < Base
25
+ extend AutoCorrector
26
+
27
+ MSG = 'Remove the redundant `flatten`.'
28
+
29
+ RESTRICT_ON_SEND = %i[flatten].freeze
30
+
31
+ # @!method flatten_join?(node)
32
+ def_node_matcher :flatten_join?, <<~PATTERN
33
+ (call (call !nil? :flatten _?) :join _?)
34
+ PATTERN
35
+
36
+ def on_send(node)
37
+ return unless flatten_join?(node.parent)
38
+
39
+ range = node.loc.dot.begin.join(node.source_range.end)
40
+ add_offense(range) do |corrector|
41
+ corrector.remove(range)
42
+ end
43
+ end
44
+ alias on_csend on_send
45
+ end
46
+ end
47
+ end
48
+ end
@@ -121,7 +121,12 @@ module RuboCop
121
121
  def register_all_fields_literal(node, string, arguments)
122
122
  return unless all_fields_literal?(string, arguments.dup)
123
123
 
124
- formatted_string = format(string, *argument_values(arguments))
124
+ format_arguments = argument_values(arguments)
125
+ begin
126
+ formatted_string = format(string, *format_arguments)
127
+ rescue ArgumentError
128
+ return
129
+ end
125
130
  replacement = quote(formatted_string, node)
126
131
 
127
132
  add_offense(node, message: message(node, replacement)) do |corrector|
@@ -49,6 +49,7 @@ module RuboCop
49
49
  empty_parentheses?(node) ||
50
50
  first_arg_begins_with_hash_literal?(node) ||
51
51
  rescue?(node) ||
52
+ in_pattern_matching_in_method_argument?(node) ||
52
53
  allowed_pin_operator?(node) ||
53
54
  allowed_expression?(node)
54
55
  end
@@ -122,6 +123,13 @@ module RuboCop
122
123
  hash_literal && first_argument?(node) && !parentheses?(hash_literal) && !parenthesized
123
124
  end
124
125
 
126
+ def in_pattern_matching_in_method_argument?(begin_node)
127
+ return false unless begin_node.parent&.call_type?
128
+ return false unless (node = begin_node.children.first)
129
+
130
+ target_ruby_version <= 2.7 ? node.match_pattern_type? : node.match_pattern_p_type?
131
+ end
132
+
125
133
  def method_chain_begins_with_hash_literal(node)
126
134
  return if node.nil?
127
135
  return node if node.hash_type?
@@ -134,7 +142,7 @@ module RuboCop
134
142
  node = begin_node.children.first
135
143
 
136
144
  if (message = find_offense_message(begin_node, node))
137
- if node.range_type? && !argument_of_parenthesized_method_call?(begin_node)
145
+ if node.range_type? && !argument_of_parenthesized_method_call?(begin_node, node)
138
146
  begin_node = begin_node.parent
139
147
  end
140
148
 
@@ -156,8 +164,10 @@ module RuboCop
156
164
  if node.lambda_or_proc? && (node.braces? || node.send_node.lambda_literal?)
157
165
  return 'an expression'
158
166
  end
167
+
168
+ return 'a one-line pattern matching' if node.any_match_pattern_type?
159
169
  return 'an interpolated expression' if interpolation?(begin_node)
160
- return 'a method argument' if argument_of_parenthesized_method_call?(begin_node)
170
+ return 'a method argument' if argument_of_parenthesized_method_call?(begin_node, node)
161
171
 
162
172
  return if begin_node.chained?
163
173
 
@@ -180,9 +190,10 @@ module RuboCop
180
190
  # @!method interpolation?(node)
181
191
  def_node_matcher :interpolation?, '[^begin ^^dstr]'
182
192
 
183
- def argument_of_parenthesized_method_call?(begin_node)
184
- node = begin_node.children.first
185
- return false if node.basic_conditional? || method_call_parentheses_required?(node)
193
+ def argument_of_parenthesized_method_call?(begin_node, node)
194
+ if node.basic_conditional? || node.rescue_type? || method_call_parentheses_required?(node)
195
+ return false
196
+ end
186
197
  return false unless (parent = begin_node.parent)
187
198
 
188
199
  parent.call_type? && parent.parenthesized? && parent.receiver != begin_node
@@ -235,7 +235,7 @@ module RuboCop
235
235
  return false if !matching_nodes?(lhs_receiver, rhs_receiver) || rhs_receiver.nil?
236
236
  return false if use_var_only_in_unless_modifier?(node, lhs_receiver)
237
237
  return false if chain_length(rhs, rhs_receiver) > max_chain_length
238
- return false if unsafe_method_used?(rhs, rhs_receiver.parent)
238
+ return false if unsafe_method_used?(node, rhs, rhs_receiver.parent)
239
239
  return false if rhs.send_type? && rhs.method?(:empty?)
240
240
 
241
241
  true
@@ -334,21 +334,24 @@ module RuboCop
334
334
  end
335
335
  end
336
336
 
337
- def unsafe_method_used?(method_chain, method)
338
- return true if unsafe_method?(method)
337
+ def unsafe_method_used?(node, method_chain, method)
338
+ return true if unsafe_method?(node, method)
339
339
 
340
340
  method.each_ancestor(:send).any? do |ancestor|
341
341
  break true unless config.cop_enabled?('Lint/SafeNavigationChain')
342
342
 
343
- break true if unsafe_method?(ancestor)
343
+ break true if unsafe_method?(node, ancestor)
344
344
  break true if nil_methods.include?(ancestor.method_name)
345
345
  break false if ancestor == method_chain
346
346
  end
347
347
  end
348
348
 
349
- def unsafe_method?(send_node)
350
- negated?(send_node) ||
351
- send_node.assignment? ||
349
+ def unsafe_method?(node, send_node)
350
+ return true if negated?(send_node)
351
+
352
+ return false if node.respond_to?(:ternary?) && node.ternary?
353
+
354
+ send_node.assignment? ||
352
355
  (!send_node.dot? && !send_node.safe_navigation?)
353
356
  end
354
357
 
@@ -279,7 +279,7 @@ module RuboCop
279
279
  @errors << message
280
280
  warn message
281
281
  if debug?
282
- puts error.message, error.backtrace
282
+ puts error.full_message
283
283
  else
284
284
  warn 'To see the complete backtrace run rubocop -d.'
285
285
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.75.7'
6
+ STRING = '1.76.0'
7
7
 
8
8
  MSG = '%<version>s (using %<parser_version>s, ' \
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
data/lib/rubocop.rb CHANGED
@@ -430,10 +430,12 @@ require_relative 'rubocop/cop/lint/uri_regexp'
430
430
  require_relative 'rubocop/cop/lint/useless_access_modifier'
431
431
  require_relative 'rubocop/cop/lint/useless_assignment'
432
432
  require_relative 'rubocop/cop/lint/useless_constant_scoping'
433
+ require_relative 'rubocop/cop/lint/useless_default_value_argument'
433
434
  require_relative 'rubocop/cop/lint/useless_defined'
434
435
  require_relative 'rubocop/cop/lint/useless_else_without_rescue'
435
436
  require_relative 'rubocop/cop/lint/useless_method_definition'
436
437
  require_relative 'rubocop/cop/lint/useless_numeric_operation'
438
+ require_relative 'rubocop/cop/lint/useless_or'
437
439
  require_relative 'rubocop/cop/lint/useless_rescue'
438
440
  require_relative 'rubocop/cop/lint/useless_ruby2_keywords'
439
441
  require_relative 'rubocop/cop/lint/useless_setter_call'
@@ -469,7 +471,8 @@ require_relative 'rubocop/cop/naming/memoized_instance_variable_name'
469
471
  require_relative 'rubocop/cop/naming/method_name'
470
472
  require_relative 'rubocop/cop/naming/method_parameter_name'
471
473
  require_relative 'rubocop/cop/naming/binary_operator_parameter_name'
472
- require_relative 'rubocop/cop/naming/predicate_name'
474
+ require_relative 'rubocop/cop/naming/predicate_method'
475
+ require_relative 'rubocop/cop/naming/predicate_prefix'
473
476
  require_relative 'rubocop/cop/naming/rescued_exceptions_variable_name'
474
477
  require_relative 'rubocop/cop/naming/variable_name'
475
478
  require_relative 'rubocop/cop/naming/variable_number'
@@ -538,6 +541,7 @@ require_relative 'rubocop/cop/style/empty_heredoc'
538
541
  require_relative 'rubocop/cop/style/empty_lambda_parameter'
539
542
  require_relative 'rubocop/cop/style/empty_literal'
540
543
  require_relative 'rubocop/cop/style/empty_method'
544
+ require_relative 'rubocop/cop/style/empty_string_inside_interpolation'
541
545
  require_relative 'rubocop/cop/style/endless_method'
542
546
  require_relative 'rubocop/cop/style/encoding'
543
547
  require_relative 'rubocop/cop/style/end_block'
@@ -604,6 +608,7 @@ require_relative 'rubocop/cop/style/numbered_parameters'
604
608
  require_relative 'rubocop/cop/style/open_struct_use'
605
609
  require_relative 'rubocop/cop/style/operator_method_call'
606
610
  require_relative 'rubocop/cop/style/redundant_array_constructor'
611
+ require_relative 'rubocop/cop/style/redundant_array_flatten'
607
612
  require_relative 'rubocop/cop/style/redundant_assignment'
608
613
  require_relative 'rubocop/cop/style/redundant_constant_base'
609
614
  require_relative 'rubocop/cop/style/redundant_current_directory_in_path'
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.75.7
4
+ version: 1.76.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -9,7 +9,7 @@ authors:
9
9
  - Yuji Nakayama
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2025-05-21 00:00:00.000000000 Z
12
+ date: 2025-06-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -127,7 +127,7 @@ dependencies:
127
127
  requirements:
128
128
  - - ">="
129
129
  - !ruby/object:Gem::Version
130
- version: 1.44.0
130
+ version: 1.45.0
131
131
  - - "<"
132
132
  - !ruby/object:Gem::Version
133
133
  version: '2.0'
@@ -137,7 +137,7 @@ dependencies:
137
137
  requirements:
138
138
  - - ">="
139
139
  - !ruby/object:Gem::Version
140
- version: 1.44.0
140
+ version: 1.45.0
141
141
  - - "<"
142
142
  - !ruby/object:Gem::Version
143
143
  version: '2.0'
@@ -561,10 +561,12 @@ files:
561
561
  - lib/rubocop/cop/lint/useless_access_modifier.rb
562
562
  - lib/rubocop/cop/lint/useless_assignment.rb
563
563
  - lib/rubocop/cop/lint/useless_constant_scoping.rb
564
+ - lib/rubocop/cop/lint/useless_default_value_argument.rb
564
565
  - lib/rubocop/cop/lint/useless_defined.rb
565
566
  - lib/rubocop/cop/lint/useless_else_without_rescue.rb
566
567
  - lib/rubocop/cop/lint/useless_method_definition.rb
567
568
  - lib/rubocop/cop/lint/useless_numeric_operation.rb
569
+ - lib/rubocop/cop/lint/useless_or.rb
568
570
  - lib/rubocop/cop/lint/useless_rescue.rb
569
571
  - lib/rubocop/cop/lint/useless_ruby2_keywords.rb
570
572
  - lib/rubocop/cop/lint/useless_setter_call.rb
@@ -679,7 +681,8 @@ files:
679
681
  - lib/rubocop/cop/naming/memoized_instance_variable_name.rb
680
682
  - lib/rubocop/cop/naming/method_name.rb
681
683
  - lib/rubocop/cop/naming/method_parameter_name.rb
682
- - lib/rubocop/cop/naming/predicate_name.rb
684
+ - lib/rubocop/cop/naming/predicate_method.rb
685
+ - lib/rubocop/cop/naming/predicate_prefix.rb
683
686
  - lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb
684
687
  - lib/rubocop/cop/naming/variable_name.rb
685
688
  - lib/rubocop/cop/naming/variable_number.rb
@@ -758,6 +761,7 @@ files:
758
761
  - lib/rubocop/cop/style/empty_lambda_parameter.rb
759
762
  - lib/rubocop/cop/style/empty_literal.rb
760
763
  - lib/rubocop/cop/style/empty_method.rb
764
+ - lib/rubocop/cop/style/empty_string_inside_interpolation.rb
761
765
  - lib/rubocop/cop/style/encoding.rb
762
766
  - lib/rubocop/cop/style/end_block.rb
763
767
  - lib/rubocop/cop/style/endless_method.rb
@@ -878,6 +882,7 @@ files:
878
882
  - lib/rubocop/cop/style/random_with_offset.rb
879
883
  - lib/rubocop/cop/style/redundant_argument.rb
880
884
  - lib/rubocop/cop/style/redundant_array_constructor.rb
885
+ - lib/rubocop/cop/style/redundant_array_flatten.rb
881
886
  - lib/rubocop/cop/style/redundant_assignment.rb
882
887
  - lib/rubocop/cop/style/redundant_begin.rb
883
888
  - lib/rubocop/cop/style/redundant_capital_w.rb
@@ -1080,9 +1085,9 @@ licenses:
1080
1085
  - MIT
1081
1086
  metadata:
1082
1087
  homepage_uri: https://rubocop.org/
1083
- changelog_uri: https://github.com/rubocop/rubocop/releases/tag/v1.75.7
1088
+ changelog_uri: https://github.com/rubocop/rubocop/releases/tag/v1.76.0
1084
1089
  source_code_uri: https://github.com/rubocop/rubocop/
1085
- documentation_uri: https://docs.rubocop.org/rubocop/1.75/
1090
+ documentation_uri: https://docs.rubocop.org/rubocop/1.76/
1086
1091
  bug_tracker_uri: https://github.com/rubocop/rubocop/issues
1087
1092
  rubygems_mfa_required: 'true'
1088
1093
  rdoc_options: []