rubocop 1.84.2 → 1.86.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 (176) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +86 -14
  3. data/config/obsoletion.yml +5 -0
  4. data/lib/rubocop/cache_config.rb +1 -1
  5. data/lib/rubocop/cli/command/auto_generate_config.rb +1 -1
  6. data/lib/rubocop/cli/command/mcp.rb +19 -0
  7. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  8. data/lib/rubocop/cli/command/show_docs_url.rb +1 -1
  9. data/lib/rubocop/cli.rb +6 -3
  10. data/lib/rubocop/config.rb +1 -1
  11. data/lib/rubocop/config_finder.rb +1 -1
  12. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
  13. data/lib/rubocop/config_store.rb +1 -1
  14. data/lib/rubocop/config_validator.rb +1 -1
  15. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  16. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  17. data/lib/rubocop/cop/gemspec/require_mfa.rb +1 -1
  18. data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
  19. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  20. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -2
  21. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  22. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  23. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +9 -2
  24. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
  25. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
  26. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12 -2
  27. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
  28. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
  29. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  30. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +7 -1
  31. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -1
  32. data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
  33. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
  34. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +28 -3
  35. data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
  36. data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -1
  37. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
  38. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -1
  39. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -0
  40. data/lib/rubocop/cop/lint/constant_reassignment.rb +59 -9
  41. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  42. data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
  43. data/lib/rubocop/cop/lint/duplicate_methods.rb +50 -8
  44. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  45. data/lib/rubocop/cop/lint/empty_conditional_body.rb +6 -1
  46. data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
  47. data/lib/rubocop/cop/lint/empty_when.rb +8 -1
  48. data/lib/rubocop/cop/lint/interpolation_check.rb +7 -2
  49. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
  50. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -1
  51. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  52. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +0 -9
  53. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +23 -6
  54. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -0
  55. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
  56. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -0
  57. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
  58. data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
  59. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  60. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +4 -4
  61. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
  62. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +6 -5
  63. data/lib/rubocop/cop/lint/void.rb +32 -12
  64. data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
  65. data/lib/rubocop/cop/migration/department_name.rb +12 -1
  66. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  67. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  68. data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
  69. data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -60
  70. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  71. data/lib/rubocop/cop/registry.rb +20 -13
  72. data/lib/rubocop/cop/security/eval.rb +15 -2
  73. data/lib/rubocop/cop/style/accessor_grouping.rb +4 -2
  74. data/lib/rubocop/cop/style/alias.rb +4 -1
  75. data/lib/rubocop/cop/style/and_or.rb +1 -0
  76. data/lib/rubocop/cop/style/arguments_forwarding.rb +25 -7
  77. data/lib/rubocop/cop/style/array_join.rb +4 -2
  78. data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
  79. data/lib/rubocop/cop/style/attr.rb +5 -2
  80. data/lib/rubocop/cop/style/bare_percent_literals.rb +3 -1
  81. data/lib/rubocop/cop/style/begin_block.rb +3 -1
  82. data/lib/rubocop/cop/style/block_delimiters.rb +25 -33
  83. data/lib/rubocop/cop/style/case_equality.rb +4 -0
  84. data/lib/rubocop/cop/style/class_and_module_children.rb +10 -2
  85. data/lib/rubocop/cop/style/collection_compact.rb +36 -16
  86. data/lib/rubocop/cop/style/colon_method_call.rb +3 -1
  87. data/lib/rubocop/cop/style/concat_array_literals.rb +2 -0
  88. data/lib/rubocop/cop/style/conditional_assignment.rb +0 -4
  89. data/lib/rubocop/cop/style/copyright.rb +1 -1
  90. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  91. data/lib/rubocop/cop/style/each_with_object.rb +2 -0
  92. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  93. data/lib/rubocop/cop/style/empty_class_definition.rb +43 -20
  94. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  95. data/lib/rubocop/cop/style/encoding.rb +7 -1
  96. data/lib/rubocop/cop/style/end_block.rb +3 -1
  97. data/lib/rubocop/cop/style/endless_method.rb +8 -3
  98. data/lib/rubocop/cop/style/file_open.rb +84 -0
  99. data/lib/rubocop/cop/style/for.rb +3 -0
  100. data/lib/rubocop/cop/style/format_string_token.rb +29 -2
  101. data/lib/rubocop/cop/style/global_vars.rb +5 -2
  102. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +21 -5
  103. data/lib/rubocop/cop/style/hash_lookup_method.rb +7 -0
  104. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
  105. data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
  106. data/lib/rubocop/cop/style/if_unless_modifier.rb +14 -3
  107. data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
  108. data/lib/rubocop/cop/style/inline_comment.rb +4 -1
  109. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  110. data/lib/rubocop/cop/style/magic_comment_format.rb +2 -2
  111. data/lib/rubocop/cop/style/map_join.rb +123 -0
  112. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +5 -3
  113. data/lib/rubocop/cop/style/multiline_if_then.rb +3 -1
  114. data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
  115. data/lib/rubocop/cop/style/nil_comparison.rb +2 -3
  116. data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
  117. data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
  118. data/lib/rubocop/cop/style/not.rb +2 -0
  119. data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
  120. data/lib/rubocop/cop/style/one_class_per_file.rb +95 -0
  121. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
  122. data/lib/rubocop/cop/style/parallel_assignment.rb +4 -0
  123. data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
  124. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -0
  125. data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
  126. data/lib/rubocop/cop/style/proc.rb +3 -2
  127. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  128. data/lib/rubocop/cop/style/reduce_to_hash.rb +184 -0
  129. data/lib/rubocop/cop/style/redundant_begin.rb +3 -3
  130. data/lib/rubocop/cop/style/redundant_each.rb +3 -3
  131. data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -1
  132. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
  133. data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
  134. data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -22
  135. data/lib/rubocop/cop/style/redundant_percent_q.rb +4 -1
  136. data/lib/rubocop/cop/style/redundant_return.rb +3 -1
  137. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
  138. data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +104 -0
  139. data/lib/rubocop/cop/style/safe_navigation.rb +7 -7
  140. data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
  141. data/lib/rubocop/cop/style/select_by_range.rb +197 -0
  142. data/lib/rubocop/cop/style/select_by_regexp.rb +51 -21
  143. data/lib/rubocop/cop/style/semicolon.rb +2 -0
  144. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  145. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -1
  146. data/lib/rubocop/cop/style/single_line_methods.rb +3 -1
  147. data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
  148. data/lib/rubocop/cop/style/symbol_proc.rb +4 -3
  149. data/lib/rubocop/cop/style/tally_method.rb +181 -0
  150. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  151. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
  152. data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
  153. data/lib/rubocop/cop/variable_force/branch.rb +2 -2
  154. data/lib/rubocop/directive_comment.rb +2 -1
  155. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  156. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  157. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  158. data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
  159. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  160. data/lib/rubocop/formatter.rb +22 -21
  161. data/lib/rubocop/lsp/diagnostic.rb +1 -0
  162. data/lib/rubocop/lsp/routes.rb +10 -3
  163. data/lib/rubocop/mcp/server.rb +198 -0
  164. data/lib/rubocop/options.rb +10 -1
  165. data/lib/rubocop/path_util.rb +14 -2
  166. data/lib/rubocop/plugin/loader.rb +1 -1
  167. data/lib/rubocop/result_cache.rb +22 -10
  168. data/lib/rubocop/rspec/shared_contexts.rb +11 -2
  169. data/lib/rubocop/runner.rb +8 -3
  170. data/lib/rubocop/server/cache.rb +5 -7
  171. data/lib/rubocop/server/core.rb +2 -0
  172. data/lib/rubocop/target_finder.rb +1 -1
  173. data/lib/rubocop/target_ruby.rb +18 -12
  174. data/lib/rubocop/version.rb +2 -2
  175. data/lib/rubocop.rb +14 -0
  176. metadata +20 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f04de47751f13e6453b15f6114038e6c9ef89418cde47c8e8ce73abecc1664ee
4
- data.tar.gz: d1d9cd363db45392d753d24324b1828fe20834bfea01f5efcd2ee246352cbef1
3
+ metadata.gz: a8991e66e8594a8ba30b4122a2990df1d7f610e3e51515b016e68432bcd94855
4
+ data.tar.gz: dadc1936594395ec71c4b628867d1ed2e2f585fcafedb886e5493d0b81c4cb2f
5
5
  SHA512:
6
- metadata.gz: f28b74f272f302feb77cdf3053f1116c7b24e3b0c57b139c71fd315d3c38fa8b4f3c122691fd071af1990699f7b7a52d9de5296ac8bb257435ef612ca317ef11
7
- data.tar.gz: 82cba886044606ae3b12eb9ef3b2b706be63d1503e80a10a9b22df2b329ed318b8b286e1b110d64bce0c9f10d7f39f84ad48735ba8a6b2d2f259dd78f4592550
6
+ metadata.gz: f95a7d048724e297f77b42444bd2eae15889bfa1b9b815fabbde131af75e99e114ab6ba2b4c0d078c937be9abd899ec7d9fb0650354b4bfd3cfb5a554f4bcfc3
7
+ data.tar.gz: ed088266152e384f4c2c82dead8363ced3c990b6492a4b4652f98a548ec16b0c57da73e1295dbbc302b00c5affd3fe2e540d9c012221068449d733d1c812139c
data/config/default.yml CHANGED
@@ -3,20 +3,16 @@
3
3
  AllCops:
4
4
  RubyInterpreters:
5
5
  - ruby
6
- - macruby
7
6
  - rake
8
7
  - jruby
9
- - rbx
10
8
  # Include common Ruby source files.
11
9
  Include:
12
10
  - '**/*.rb'
13
11
  - '**/*.arb'
14
12
  - '**/*.axlsx'
15
13
  - '**/*.builder'
16
- - '**/*.fcgi'
17
14
  - '**/*.gemfile'
18
15
  - '**/*.gemspec'
19
- - '**/*.god'
20
16
  - '**/*.jb'
21
17
  - '**/*.jbuilder'
22
18
  - '**/*.mspec'
@@ -25,15 +21,12 @@ AllCops:
25
21
  - '**/*.podspec'
26
22
  - '**/*.rabl'
27
23
  - '**/*.rake'
28
- - '**/*.rbuild'
29
24
  - '**/*.rbw'
30
- - '**/*.rbx'
31
25
  - '**/*.ru'
32
26
  - '**/*.ruby'
33
27
  - '**/*.schema'
34
28
  - '**/*.spec'
35
29
  - '**/*.thor'
36
- - '**/*.watchr'
37
30
  - '**/.irbrc'
38
31
  - '**/.pryrc'
39
32
  - '**/.simplecov'
@@ -43,7 +36,6 @@ AllCops:
43
36
  - '**/Brewfile'
44
37
  - '**/Buildfile'
45
38
  - '**/Capfile'
46
- - '**/Cheffile'
47
39
  - '**/Dangerfile'
48
40
  - '**/Deliverfile'
49
41
  - '**/Fastfile'
@@ -60,7 +52,6 @@ AllCops:
60
52
  - '**/Snapfile'
61
53
  - '**/Steepfile'
62
54
  - '**/Thorfile'
63
- - '**/Vagabondfile'
64
55
  - '**/Vagrantfile'
65
56
  Exclude:
66
57
  - 'node_modules/**/*'
@@ -117,7 +108,7 @@ AllCops:
117
108
  # line option.
118
109
  UseCache: true
119
110
  # Threshold for how many files can be stored in the result cache before some
120
- # of the files are automatically removed.
111
+ # of the files are automatically removed. Set to false to disable cache pruning.
121
112
  MaxFilesInCache: 20000
122
113
  # The cache will be stored in "rubocop_cache" under this directory. If
123
114
  # CacheRootDirectory is ~ (nil), which it is by default, the root will be
@@ -1720,6 +1711,11 @@ Lint/CopDirectiveSyntax:
1720
1711
  Enabled: pending
1721
1712
  VersionAdded: '1.72'
1722
1713
 
1714
+ Lint/DataDefineOverride:
1715
+ Description: 'Disallow overriding the `Data` built-in methods via `Data.define`.'
1716
+ Enabled: pending
1717
+ VersionAdded: '1.85'
1718
+
1723
1719
  Lint/Debugger:
1724
1720
  Description: 'Checks for debugger calls.'
1725
1721
  Enabled: true
@@ -2409,8 +2405,9 @@ Lint/SafeNavigationConsistency:
2409
2405
  consistent and appropriate safe navigation, without excess or deficiency,
2410
2406
  is used for all method calls on the same object.
2411
2407
  Enabled: true
2408
+ SafeAutoCorrect: false
2412
2409
  VersionAdded: '0.55'
2413
- VersionChanged: '0.77'
2410
+ VersionChanged: '1.85'
2414
2411
  AllowedMethods:
2415
2412
  - present?
2416
2413
  - blank?
@@ -2587,6 +2584,11 @@ Lint/UnreachableLoop:
2587
2584
  # eg. `exactly(2).times`
2588
2585
  - !ruby/regexp /(exactly|at_least|at_most)\(\d+\)\.times/
2589
2586
 
2587
+ Lint/UnreachablePatternBranch:
2588
+ Description: 'Checks for unreachable `in` pattern branches after an unconditional catch-all pattern.'
2589
+ Enabled: pending
2590
+ VersionAdded: '1.85'
2591
+
2590
2592
  Lint/UnusedBlockArgument:
2591
2593
  Description: 'Checks for unused block arguments.'
2592
2594
  StyleGuide: '#underscore-unused-vars'
@@ -3982,10 +3984,13 @@ Style/EmptyClassDefinition:
3982
3984
  Description: 'Enforces consistent style for empty class definitions.'
3983
3985
  Enabled: pending
3984
3986
  VersionAdded: '1.84'
3985
- EnforcedStyle: class_definition
3987
+ VersionChanged: '1.86'
3988
+ EnforcedStyle: class_keyword
3986
3989
  SupportedStyles:
3987
- - class_definition
3990
+ - class_keyword
3988
3991
  - class_new
3992
+ - class_definition # Deprecated.
3993
+ AllowedParentClasses: []
3989
3994
 
3990
3995
  Style/EmptyElse:
3991
3996
  Description: 'Avoid empty else-clauses.'
@@ -4145,6 +4150,12 @@ Style/FileNull:
4145
4150
  SafeAutoCorrect: false
4146
4151
  VersionAdded: '1.69'
4147
4152
 
4153
+ Style/FileOpen:
4154
+ Description: 'Checks for `File.open` without a block, which can leak file descriptors.'
4155
+ Enabled: pending
4156
+ Safe: false
4157
+ VersionAdded: '1.85'
4158
+
4148
4159
  Style/FileRead:
4149
4160
  Description: 'Favor `File.(bin)read` convenience methods.'
4150
4161
  StyleGuide: '#file-read'
@@ -4642,6 +4653,12 @@ Style/MapIntoArray:
4642
4653
  VersionChanged: '1.67'
4643
4654
  Safe: false
4644
4655
 
4656
+ Style/MapJoin:
4657
+ Description: 'Checks for redundant `map(&:to_s)` before `join`.'
4658
+ Enabled: pending
4659
+ Safe: false
4660
+ VersionAdded: '1.85'
4661
+
4645
4662
  Style/MapToHash:
4646
4663
  Description: 'Prefer `to_h` with a block over `map.to_h`.'
4647
4664
  Enabled: pending
@@ -5091,6 +5108,12 @@ Style/ObjectThen:
5091
5108
  - then
5092
5109
  - yield_self
5093
5110
 
5111
+ Style/OneClassPerFile:
5112
+ Description: 'Checks that each source file defines at most one top-level class or module.'
5113
+ Enabled: pending
5114
+ VersionAdded: '1.85'
5115
+ AllowedClasses: []
5116
+
5094
5117
  Style/OneLineConditional:
5095
5118
  Description: >-
5096
5119
  Favor the ternary operator (?:) or multi-line constructs over
@@ -5179,6 +5202,14 @@ Style/ParenthesesAroundCondition:
5179
5202
  AllowSafeAssignment: true
5180
5203
  AllowInMultilineConditions: false
5181
5204
 
5205
+ Style/PartitionInsteadOfDoubleSelect:
5206
+ Description: >-
5207
+ Checks for consecutive `select`/`filter`/`find_all` and `reject` calls
5208
+ on the same receiver with the same block body.
5209
+ Enabled: pending
5210
+ Safe: false
5211
+ VersionAdded: '1.85'
5212
+
5182
5213
  Style/PercentLiteralDelimiters:
5183
5214
  Description: 'Use `%`-literal delimiters consistently.'
5184
5215
  StyleGuide: '#percent-literal-braces'
@@ -5211,6 +5242,12 @@ Style/PerlBackrefs:
5211
5242
  Enabled: true
5212
5243
  VersionAdded: '0.13'
5213
5244
 
5245
+ Style/PredicateWithKind:
5246
+ Description: 'Prefer `any?(Klass)` to `any? { |x| x.is_a?(Klass) }`.'
5247
+ Enabled: pending
5248
+ SafeAutoCorrect: false
5249
+ VersionAdded: '1.85'
5250
+
5214
5251
  Style/PreferredHashMethods:
5215
5252
  Description: 'Checks use of `has_key?` and `has_value?` Hash methods.'
5216
5253
  StyleGuide: '#hash-key'
@@ -5261,6 +5298,12 @@ Style/RandomWithOffset:
5261
5298
  Enabled: true
5262
5299
  VersionAdded: '0.52'
5263
5300
 
5301
+ Style/ReduceToHash:
5302
+ Description: 'Use `to_h { ... }` instead of `each_with_object`, `inject`, or `reduce` to build a hash.'
5303
+ Enabled: pending
5304
+ Safe: false
5305
+ VersionAdded: '1.85'
5306
+
5264
5307
  Style/RedundantArgument:
5265
5308
  Description: 'Checks for a redundant argument passed to certain methods.'
5266
5309
  Enabled: pending
@@ -5430,6 +5473,11 @@ Style/RedundantLineContinuation:
5430
5473
  Enabled: pending
5431
5474
  VersionAdded: '1.49'
5432
5475
 
5476
+ Style/RedundantMinMaxBy:
5477
+ Description: 'Identifies places where `max_by`/`min_by` can be replaced by `max`/`min`.'
5478
+ Enabled: pending
5479
+ VersionAdded: '1.85'
5480
+
5433
5481
  Style/RedundantParentheses:
5434
5482
  Description: "Checks for parentheses that seem not to serve any purpose."
5435
5483
  Enabled: true
@@ -5507,6 +5555,12 @@ Style/RedundantStringEscape:
5507
5555
  Enabled: pending
5508
5556
  VersionAdded: '1.37'
5509
5557
 
5558
+ Style/RedundantStructKeywordInit:
5559
+ Description: 'Checks for redundant `keyword_init` option for `Struct.new`.'
5560
+ Enabled: pending
5561
+ SafeAutoCorrect: false
5562
+ VersionAdded: '1.85'
5563
+
5510
5564
  Style/RegexpLiteral:
5511
5565
  Description: 'Use / or %r around regular expressions.'
5512
5566
  StyleGuide: '#percent-r'
@@ -5613,8 +5667,20 @@ Style/Sample:
5613
5667
  Enabled: true
5614
5668
  VersionAdded: '0.30'
5615
5669
 
5670
+ Style/SelectByKind:
5671
+ Description: 'Prefer grep/grep_v to select/reject/find/detect with a kind check.'
5672
+ Enabled: pending
5673
+ SafeAutoCorrect: false
5674
+ VersionAdded: '1.85'
5675
+
5676
+ Style/SelectByRange:
5677
+ Description: 'Prefer grep/grep_v to select/reject/find/detect with a range check.'
5678
+ Enabled: pending
5679
+ SafeAutoCorrect: false
5680
+ VersionAdded: '1.85'
5681
+
5616
5682
  Style/SelectByRegexp:
5617
- Description: 'Prefer grep/grep_v to select/reject with a regexp match.'
5683
+ Description: 'Prefer grep/grep_v to select/reject/find/detect with a regexp match.'
5618
5684
  Enabled: pending
5619
5685
  SafeAutoCorrect: false
5620
5686
  VersionAdded: '1.22'
@@ -5873,6 +5939,12 @@ Style/SymbolProc:
5873
5939
  AllowedPatterns: []
5874
5940
  AllowComments: false
5875
5941
 
5942
+ Style/TallyMethod:
5943
+ Description: 'Prefer `Enumerable#tally` over manual counting patterns.'
5944
+ Enabled: pending
5945
+ Safe: false
5946
+ VersionAdded: '1.85'
5947
+
5876
5948
  Style/TernaryParentheses:
5877
5949
  Description: 'Checks for use of parentheses around ternary conditions.'
5878
5950
  Enabled: true
@@ -245,3 +245,8 @@ changed_enforced_styles:
245
245
  parameters: EnforcedStyle
246
246
  value: rails
247
247
  alternative: indented_internal_methods
248
+ - cops: Style/EmptyClassDefinition
249
+ parameters: EnforcedStyle
250
+ value: class_definition
251
+ alternative: class_keyword
252
+ severity: warning
@@ -35,7 +35,7 @@ module RuboCop
35
35
  root_dir do
36
36
  next cache_root_override if cache_root_override
37
37
 
38
- config_path = ConfigFinder.find_config_path(Dir.pwd)
38
+ config_path = ConfigFinder.find_config_path(PathUtil.pwd)
39
39
  file_contents = File.read(config_path)
40
40
 
41
41
  # Returns early if `CacheRootDirectory` is not used before requiring `erb` or `yaml`.
@@ -153,7 +153,7 @@ module RuboCop
153
153
  def relative_path_to_todo_from_options_config
154
154
  return AUTO_GENERATED_FILE unless @options[:config]
155
155
 
156
- base = Pathname.new(Dir.pwd)
156
+ base = Pathname.new(PathUtil.pwd)
157
157
  config_dir = Pathname.new(@options[:config]).realpath.dirname
158
158
 
159
159
  # Don't have the path start with `/`
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ class CLI
5
+ module Command
6
+ # Start Model Context Protocol of RuboCop.
7
+ # @api private
8
+ class MCP < Base
9
+ self.command_name = :mcp
10
+
11
+ def run
12
+ require_relative '../../mcp/server'
13
+
14
+ RuboCop::MCP::Server.new(@config_store).start
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -25,7 +25,7 @@ module RuboCop
25
25
  super
26
26
 
27
27
  # Load the configs so the require()s are done for custom cops
28
- @config = @config_store.for(Dir.pwd)
28
+ @config = @config_store.for(PathUtil.pwd)
29
29
 
30
30
  @cop_matchers = @options[:show_cops].map do |pattern|
31
31
  if pattern.include?('*')
@@ -46,7 +46,7 @@ module RuboCop
46
46
  registry = Cop::Registry.global
47
47
  show_all = @cop_matchers.empty?
48
48
 
49
- puts "# Available cops (#{registry.length}) + config for #{Dir.pwd}: " if show_all
49
+ puts "# Available cops (#{registry.length}) + config for #{PathUtil.pwd}: " if show_all
50
50
 
51
51
  registry.departments.sort!.each do |department|
52
52
  print_cops_of_department(registry, department, show_all)
@@ -12,7 +12,7 @@ module RuboCop
12
12
  def initialize(env)
13
13
  super
14
14
 
15
- @config = @config_store.for(Dir.pwd)
15
+ @config = @config_store.for(PathUtil.pwd)
16
16
  end
17
17
 
18
18
  def run
data/lib/rubocop/cli.rb CHANGED
@@ -76,7 +76,9 @@ module RuboCop
76
76
  STATUS_ERROR
77
77
  ensure
78
78
  elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - time_start
79
- puts "Finished in #{elapsed_time} seconds" if @options[:debug] || @options[:display_time]
79
+ if @options[:debug] || @options[:display_time]
80
+ puts "Finished in #{elapsed_time.round(5)} seconds"
81
+ end
80
82
  end
81
83
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
82
84
 
@@ -198,7 +200,7 @@ module RuboCop
198
200
  RuboCop::LSP.enable if @options[:editor_mode]
199
201
  end
200
202
 
201
- # rubocop:disable Metrics/CyclomaticComplexity
203
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
202
204
  def handle_exiting_options
203
205
  return unless Options::EXITING_OPTIONS.any? { |o| @options.key? o }
204
206
 
@@ -206,9 +208,10 @@ module RuboCop
206
208
  run_command(:show_cops) if @options[:show_cops]
207
209
  run_command(:show_docs_url) if @options[:show_docs_url]
208
210
  run_command(:lsp) if @options[:lsp]
211
+ run_command(:mcp) if @options[:mcp]
209
212
  raise Finished
210
213
  end
211
- # rubocop:enable Metrics/CyclomaticComplexity
214
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
212
215
 
213
216
  def apply_default_formatter
214
217
  # This must be done after the options have already been processed,
@@ -286,7 +286,7 @@ module RuboCop
286
286
  loaded_path != File.join(Dir.home, ConfigLoader::DOTFILE)
287
287
  File.expand_path(File.dirname(loaded_path))
288
288
  else
289
- Dir.pwd
289
+ PathUtil.pwd
290
290
  end
291
291
  end
292
292
 
@@ -30,7 +30,7 @@ module RuboCop
30
30
  private
31
31
 
32
32
  def find_project_root
33
- pwd = Dir.pwd
33
+ pwd = PathUtil.pwd
34
34
  gems_file = find_last_file_upwards('Gemfile', pwd) || find_last_file_upwards('gems.rb', pwd)
35
35
  return unless gems_file
36
36
 
@@ -39,8 +39,10 @@ module RuboCop
39
39
  end
40
40
 
41
41
  def plugin_loaded?
42
- # Plugins loaded via `require` are included in `loaded_features`.
43
- config.loaded_plugins.include?(gem) || config.loaded_features.include?(gem)
42
+ # Plugins loaded via `plugins` are Plugin objects with an `about.name` attribute.
43
+ # Plugins loaded via `require` are included in `loaded_features` as strings.
44
+ config.loaded_plugins.any? { |plugin| plugin.about.name == gem } ||
45
+ config.loaded_features.include?(gem)
44
46
  end
45
47
  end
46
48
  end
@@ -49,7 +49,7 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def for_pwd
52
- for_dir(Dir.pwd)
52
+ for_dir(PathUtil.pwd)
53
53
  end
54
54
 
55
55
  # If type (file/dir) is known beforehand,
@@ -9,7 +9,7 @@ module RuboCop
9
9
 
10
10
  # @api private
11
11
  COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
12
- Enabled Reference References].freeze
12
+ Enabled Reference References Safe SafeAutoCorrect].freeze
13
13
  # @api private
14
14
  INTERNAL_PARAMS = %w[Description StyleGuide
15
15
  VersionAdded VersionChanged VersionRemoved
@@ -16,7 +16,7 @@ module RuboCop
16
16
 
17
17
  def negated_condition(node)
18
18
  condition = node.condition
19
- condition = condition.children.first while condition.begin_type?
19
+ condition = condition.children.last while condition.begin_type?
20
20
  condition
21
21
  end
22
22
  end
@@ -97,8 +97,8 @@ module RuboCop
97
97
  if delimiters.first != delimiters.last
98
98
  # With different delimiters (eg. `[]`, `()`), if there are the same
99
99
  # number of each, escaping is not necessary
100
- delimiter_counts = delimiters.each_with_object({}) do |delimiter, counts|
101
- counts[delimiter] = content.count(delimiter)
100
+ delimiter_counts = delimiters.to_h do |delimiter|
101
+ [delimiter, content.count(delimiter)]
102
102
  end
103
103
 
104
104
  return content if delimiter_counts[delimiters.first] == delimiter_counts[delimiters.last]
@@ -92,7 +92,7 @@ module RuboCop
92
92
  (str "true")
93
93
  PATTERN
94
94
 
95
- def on_block(node) # rubocop:disable Metrics/MethodLength, InternalAffairs/NumblockHandler
95
+ def on_block(node) # rubocop:disable Metrics/MethodLength, InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
96
96
  gem_specification(node) do |block_var|
97
97
  metadata_value = metadata(node)
98
98
  mfa_value = mfa_value(metadata_value)
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Checks for missing `itblock` handlers. The blocks with the `it`
7
+ # parameter introduced in Ruby 3.4 are parsed with a node type of
8
+ # `itblock` instead of block. Cops that define `block` handlers
9
+ # need to define `itblock` handlers or disable this cop for them.
10
+ #
11
+ # @example
12
+ #
13
+ # # bad
14
+ # class BlockRelatedCop < Base
15
+ # def on_block(node)
16
+ # end
17
+ # end
18
+ #
19
+ # # good
20
+ # class BlockRelatedCop < Base
21
+ # def on_block(node)
22
+ # end
23
+ #
24
+ # alias on_itblock on_block
25
+ # end
26
+ #
27
+ # class BlockRelatedCop < Base
28
+ # def on_block(node)
29
+ # end
30
+ #
31
+ # alias_method :on_itblock, :on_block
32
+ # end
33
+ #
34
+ # class BlockRelatedCop < Base
35
+ # def on_block(node)
36
+ # end
37
+ #
38
+ # def on_itblock(node)
39
+ # end
40
+ # end
41
+ class ItblockHandler < Base
42
+ MSG = 'Define on_itblock to handle blocks with the `it` parameter.'
43
+
44
+ def on_def(node)
45
+ return unless block_handler?(node)
46
+ return unless node.parent
47
+
48
+ add_offense(node) unless itblock_handler?(node.parent)
49
+ end
50
+
51
+ private
52
+
53
+ # @!method block_handler?(node)
54
+ def_node_matcher :block_handler?, <<~PATTERN
55
+ (def :on_block (args (arg :node)) ...)
56
+ PATTERN
57
+
58
+ # @!method itblock_handler?(node)
59
+ def_node_matcher :itblock_handler?, <<~PATTERN
60
+ {
61
+ `(def :on_itblock (args (arg :node)) ...)
62
+ `(alias (sym :on_itblock) (sym :on_block))
63
+ `(send nil? :alias_method (sym :on_itblock) (sym :on_block))
64
+ }
65
+ PATTERN
66
+ end
67
+ end
68
+ end
69
+ end
@@ -7,6 +7,7 @@ require_relative 'internal_affairs/empty_line_between_expect_offense_and_correct
7
7
  require_relative 'internal_affairs/example_description'
8
8
  require_relative 'internal_affairs/example_heredoc_delimiter'
9
9
  require_relative 'internal_affairs/inherit_deprecated_cop_class'
10
+ require_relative 'internal_affairs/itblock_handler'
10
11
  require_relative 'internal_affairs/lambda_or_proc'
11
12
  require_relative 'internal_affairs/location_exists'
12
13
  require_relative 'internal_affairs/location_expression'
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Check that the arguments on a multi-line method call are aligned.
6
+ # Checks that the arguments on a multi-line method call are aligned.
7
7
  #
8
8
  # @example EnforcedStyle: with_first_argument (default)
9
9
  # # good
@@ -52,7 +52,7 @@ module RuboCop
52
52
  'following the first line of a multi-line method call.'
53
53
 
54
54
  def on_send(node)
55
- return if !multiple_arguments?(node) || (node.send_type? && node.method?(:[]=)) ||
55
+ return if !multiple_arguments?(node) || (node.call_type? && node.method?(:[]=)) ||
56
56
  autocorrect_incompatible_with_other_cops?
57
57
 
58
58
  items = flattened_arguments(node)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Check that the elements of a multi-line array literal are
6
+ # Checks that the elements of a multi-line array literal are
7
7
  # aligned.
8
8
  #
9
9
  # @example EnforcedStyle: with_first_element (default)
@@ -112,7 +112,7 @@ module RuboCop
112
112
  end
113
113
 
114
114
  def last_heredoc_line(node)
115
- if node.send_type?
115
+ if node.call_type?
116
116
  node.arguments.select { |arg| heredoc?(arg) }.map { |arg| arg.loc.heredoc_end.line }.max
117
117
  elsif heredoc?(node)
118
118
  node.loc.heredoc_end.line
@@ -60,6 +60,11 @@ module RuboCop
60
60
  END_OF_HEREDOC_LINE = 1
61
61
  SIMPLE_DIRECTIVE_COMMENT_PATTERN = /\A# *:nocov:\z/.freeze
62
62
 
63
+ # @!method guard_clause_branch?(node)
64
+ def_node_matcher :guard_clause_branch?, <<~PATTERN
65
+ {(send nil? {:raise :fail} ...) return break next}
66
+ PATTERN
67
+
63
68
  def on_if(node)
64
69
  return if correct_style?(node)
65
70
  return if multiple_statements_on_line?(node)
@@ -97,14 +102,16 @@ module RuboCop
97
102
  end
98
103
 
99
104
  def correct_style?(node)
100
- !contains_guard_clause?(node) ||
105
+ !node.if_branch&.guard_clause? ||
101
106
  next_line_rescue_or_ensure?(node) ||
102
107
  next_sibling_parent_empty_or_else?(node) ||
103
108
  next_sibling_empty_or_guard_clause?(node)
104
109
  end
105
110
 
106
111
  def contains_guard_clause?(node)
107
- node.if_branch&.guard_clause?
112
+ return false unless (branch = node.if_branch)
113
+
114
+ guard_clause_branch?(branch)
108
115
  end
109
116
 
110
117
  def next_line_empty_or_allowed_directive_comment?(line)
@@ -185,7 +185,7 @@ module RuboCop
185
185
  end
186
186
 
187
187
  def empty_line_between_macros
188
- cop_config.fetch('DefLikeMacros', []).map(&:to_sym)
188
+ @empty_line_between_macros ||= cop_config.fetch('DefLikeMacros', []).map(&:to_sym).freeze
189
189
  end
190
190
 
191
191
  def macro_candidate?(node)
@@ -66,6 +66,7 @@ module RuboCop
66
66
  extend AutoCorrector
67
67
 
68
68
  MSG = 'Add an empty line after attribute accessor.'
69
+ RESTRICT_ON_SEND = %i[attr_reader attr_writer attr_accessor attr].freeze
69
70
 
70
71
  def on_send(node)
71
72
  return unless node.attribute_accessor?
@@ -7,15 +7,25 @@ module RuboCop
7
7
  # the configuration.
8
8
  #
9
9
  # @example EnforcedStyle: no_empty_lines (default)
10
- # # good
10
+ # # bad
11
+ # foo do |bar|
12
+ #
13
+ # # ...
14
+ #
15
+ # end
11
16
  #
17
+ # # good
12
18
  # foo do |bar|
13
19
  # # ...
14
20
  # end
15
21
  #
16
22
  # @example EnforcedStyle: empty_lines
17
- # # good
23
+ # # bad
24
+ # foo do |bar|
25
+ # # ...
26
+ # end
18
27
  #
28
+ # # good
19
29
  # foo do |bar|
20
30
  #
21
31
  # # ...