rubocop 1.71.2 → 1.75.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 (205) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/config/default.yml +118 -21
  4. data/config/internal_affairs.yml +20 -0
  5. data/config/obsoletion.yml +3 -1
  6. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  7. data/lib/rubocop/cli.rb +1 -1
  8. data/lib/rubocop/comment_config.rb +1 -1
  9. data/lib/rubocop/config.rb +39 -6
  10. data/lib/rubocop/config_loader.rb +48 -9
  11. data/lib/rubocop/config_loader_resolver.rb +24 -9
  12. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  13. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  14. data/lib/rubocop/config_obsoletion.rb +46 -2
  15. data/lib/rubocop/config_validator.rb +2 -1
  16. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
  17. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  18. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -1
  19. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +2 -1
  20. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  21. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  22. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  23. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  24. data/lib/rubocop/cop/internal_affairs.rb +2 -16
  25. data/lib/rubocop/cop/layout/block_alignment.rb +2 -0
  26. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  27. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  28. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  29. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  30. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  31. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +3 -3
  32. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +27 -1
  33. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  34. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  35. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
  36. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  37. data/lib/rubocop/cop/layout/line_length.rb +8 -4
  38. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  39. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -2
  40. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  41. data/lib/rubocop/cop/layout/redundant_line_break.rb +9 -5
  42. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
  43. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  44. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -1
  45. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  46. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  47. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  48. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  49. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  50. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -17
  51. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  52. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  53. data/lib/rubocop/cop/lint/float_comparison.rb +1 -6
  54. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
  55. data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
  56. data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
  57. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  58. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  59. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  60. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  61. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  62. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  63. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  64. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  65. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  66. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
  67. data/lib/rubocop/cop/lint/shared_mutable_default.rb +12 -1
  68. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  69. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  70. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  71. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  72. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
  73. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -0
  74. data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
  75. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -0
  76. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  77. data/lib/rubocop/cop/lint/void.rb +7 -0
  78. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  79. data/lib/rubocop/cop/metrics/method_length.rb +1 -0
  80. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  81. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  82. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  83. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  84. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  85. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  86. data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
  87. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  88. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  89. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  90. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  91. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +0 -1
  92. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +18 -18
  93. data/lib/rubocop/cop/mixin/hash_subset.rb +19 -4
  94. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  95. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -0
  96. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  97. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  98. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  99. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  100. data/lib/rubocop/cop/mixin/trailing_comma.rb +12 -0
  101. data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
  102. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  103. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  104. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  105. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  106. data/lib/rubocop/cop/registry.rb +9 -6
  107. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  108. data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
  109. data/lib/rubocop/cop/style/array_intersect.rb +39 -28
  110. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  111. data/lib/rubocop/cop/style/class_and_module_children.rb +29 -7
  112. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  113. data/lib/rubocop/cop/style/collection_methods.rb +1 -0
  114. data/lib/rubocop/cop/style/combinable_loops.rb +1 -0
  115. data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
  116. data/lib/rubocop/cop/style/comparable_between.rb +75 -0
  117. data/lib/rubocop/cop/style/conditional_assignment.rb +3 -0
  118. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  119. data/lib/rubocop/cop/style/empty_literal.rb +4 -0
  120. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  121. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  122. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
  123. data/lib/rubocop/cop/style/exponential_notation.rb +2 -2
  124. data/lib/rubocop/cop/style/for.rb +1 -0
  125. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  126. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  127. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  128. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  129. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -2
  130. data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
  131. data/lib/rubocop/cop/style/hash_syntax.rb +3 -0
  132. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  133. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
  134. data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
  135. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  136. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  137. data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
  138. data/lib/rubocop/cop/style/keyword_parameters_order.rb +13 -7
  139. data/lib/rubocop/cop/style/lambda.rb +1 -0
  140. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  141. data/lib/rubocop/cop/style/map_into_array.rb +1 -0
  142. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +4 -4
  143. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
  144. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
  145. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  146. data/lib/rubocop/cop/style/next.rb +44 -0
  147. data/lib/rubocop/cop/style/object_then.rb +1 -0
  148. data/lib/rubocop/cop/style/proc.rb +1 -0
  149. data/lib/rubocop/cop/style/raise_args.rb +8 -8
  150. data/lib/rubocop/cop/style/redundant_begin.rb +1 -0
  151. data/lib/rubocop/cop/style/redundant_condition.rb +57 -0
  152. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +14 -4
  153. data/lib/rubocop/cop/style/redundant_format.rb +257 -0
  154. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  155. data/lib/rubocop/cop/style/redundant_parentheses.rb +20 -5
  156. data/lib/rubocop/cop/style/redundant_self.rb +1 -0
  157. data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
  158. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  159. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  160. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  161. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  162. data/lib/rubocop/cop/style/single_line_do_end_block.rb +3 -1
  163. data/lib/rubocop/cop/style/single_line_methods.rb +3 -3
  164. data/lib/rubocop/cop/style/sole_nested_conditional.rb +41 -106
  165. data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
  166. data/lib/rubocop/cop/style/super_arguments.rb +1 -2
  167. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  168. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -0
  169. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  170. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  171. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  172. data/lib/rubocop/cop/util.rb +2 -2
  173. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  174. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  175. data/lib/rubocop/cop/variable_force/variable.rb +2 -7
  176. data/lib/rubocop/cop/variable_force.rb +1 -1
  177. data/lib/rubocop/cops_documentation_generator.rb +12 -1
  178. data/lib/rubocop/directive_comment.rb +36 -3
  179. data/lib/rubocop/ext/regexp_node.rb +0 -1
  180. data/lib/rubocop/lsp/runtime.rb +6 -4
  181. data/lib/rubocop/lsp/server.rb +0 -2
  182. data/lib/rubocop/lsp/stdin_runner.rb +3 -1
  183. data/lib/rubocop/magic_comment.rb +8 -0
  184. data/lib/rubocop/options.rb +26 -11
  185. data/lib/rubocop/path_util.rb +4 -0
  186. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  187. data/lib/rubocop/plugin/load_error.rb +26 -0
  188. data/lib/rubocop/plugin/loader.rb +100 -0
  189. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  190. data/lib/rubocop/plugin.rb +46 -0
  191. data/lib/rubocop/rake_task.rb +4 -1
  192. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  193. data/lib/rubocop/rspec/shared_contexts.rb +35 -0
  194. data/lib/rubocop/rspec/support.rb +3 -0
  195. data/lib/rubocop/runner.rb +5 -1
  196. data/lib/rubocop/server/cache.rb +47 -11
  197. data/lib/rubocop/server/cli.rb +2 -2
  198. data/lib/rubocop/target_finder.rb +1 -1
  199. data/lib/rubocop/target_ruby.rb +1 -1
  200. data/lib/rubocop/version.rb +30 -8
  201. data/lib/rubocop.rb +10 -1
  202. data/lib/ruby_lsp/rubocop/addon.rb +7 -10
  203. data/lib/ruby_lsp/rubocop/{wraps_built_in_lsp_runtime.rb → runtime_adapter.rb} +25 -10
  204. metadata +43 -12
  205. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8d7c6408a777042eced58bec2bc889312b24d8701f5db99da3b471088f589d6f
4
- data.tar.gz: 27423e682d55f04840a3bf3d5e0301556e4a1c419857e3422ced38ec423c0003
3
+ metadata.gz: 707ab6b769b30dc2f2c34c7e879fde41cab6dd694820d8f071db17a1ef0ef48f
4
+ data.tar.gz: abafc2d95cd2c358b4699211ce58e544852707630c55ec2950a3fd01899b8dd4
5
5
  SHA512:
6
- metadata.gz: 8729a8ea3adae11fcb2501bfea338821a8f9894209ea6fb482b62ebfae87019e07ded7bf02d3371c18726b28c2491c79952e7b86c193388a045f886a833b427c
7
- data.tar.gz: 44251afbbbc2aa7c121033ea05f25e1b3447afba7487d04a81f9463347ba28bcea05bdc2e434248f15cd235d9e452cb3f9f378f94adb5507eeb6d5ce58ba4119
6
+ metadata.gz: 290274c929ba840ebf66f9e2978f5853e04732ef05bfaee7dd45ab445ae4cc41e7913bc6204ef1e11618ec9bfb8fe1c234bc6febbcb3e65e7c651f73f31936ba
7
+ data.tar.gz: 56f21668db3004f7a6846319911b3c7fe37d71a1d0ee43c9eee0f032ba324fc4745693fc4996907efd81975b23e1926c65f8129182e1f57e1b4c2e910af32984
data/README.md CHANGED
@@ -52,7 +52,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
52
52
  in your `Gemfile`:
53
53
 
54
54
  ```rb
55
- gem 'rubocop', '~> 1.71', require: false
55
+ gem 'rubocop', '~> 1.75', require: false
56
56
  ```
57
57
 
58
58
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
@@ -241,9 +241,9 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s
241
241
  <a href="https://opencollective.com/rubocop/organization/28/website" target="_blank"><img src="https://opencollective.com/rubocop/organization/28/avatar.svg"></a>
242
242
  <a href="https://opencollective.com/rubocop/organization/29/website" target="_blank"><img src="https://opencollective.com/rubocop/organization/29/avatar.svg"></a>
243
243
 
244
- ## Changelog
244
+ ## Release Notes
245
245
 
246
- RuboCop's changelog is available [here](CHANGELOG.md).
246
+ RuboCop's release notes are available [here](https://github.com/rubocop/rubocop/releases).
247
247
 
248
248
  ## Copyright
249
249
 
data/config/default.yml CHANGED
@@ -146,12 +146,14 @@ AllCops:
146
146
  # Ruby version is still unresolved, RuboCop will use the oldest officially
147
147
  # supported Ruby version (currently Ruby 2.7).
148
148
  TargetRubyVersion: ~
149
- # You can specify the parser engine. There are two options available:
149
+ # RuboCop choses the parser engine automatically but you can also specify it yourself.
150
+ # These options are available:
151
+ # - `default`
150
152
  # - `parser_whitequark` ... https://github.com/whitequark/parser
151
153
  # - `parser_prism` ... https://github.com/ruby/prism (`Prism::Translation::Parser`)
152
- # By default, `parser` is used. For the `TargetRubyVersion` value, `parser` can be specified for versions `2.0` and above.
153
- # `parser_prism` can be specified for versions `3.3` and above. `parser_prism` is faster but still considered experimental.
154
- ParserEngine: parser_whitequark
154
+ # Not every parser engine can handle every `TargetRubyVersion`. `parser_whitequark`
155
+ # only works with versions 3.4 and below, `parser_prism` with versions 3.3 and above.
156
+ ParserEngine: default
155
157
  # Determines if a notification for extension libraries should be shown when
156
158
  # rubocop is run. Keys are the name of the extension, and values are an array
157
159
  # of gems in the Gemfile that the extension is suggested for, if not already
@@ -1685,6 +1687,11 @@ Lint/ConstantResolution:
1685
1687
  # Restrict this cop from only looking at certain names
1686
1688
  Ignore: []
1687
1689
 
1690
+ Lint/CopDirectiveSyntax:
1691
+ Description: 'Checks that `# rubocop:` directives are strictly formatted.'
1692
+ Enabled: pending
1693
+ VersionAdded: '1.72'
1694
+
1688
1695
  Lint/Debugger:
1689
1696
  Description: 'Check for debugger calls.'
1690
1697
  Enabled: true
@@ -1882,10 +1889,9 @@ Lint/EmptyConditionalBody:
1882
1889
  Description: 'Checks for the presence of `if`, `elsif` and `unless` branches without a body.'
1883
1890
  Enabled: true
1884
1891
  AutoCorrect: contextual
1885
- SafeAutoCorrect: false
1886
1892
  AllowComments: true
1887
1893
  VersionAdded: '0.89'
1888
- VersionChanged: '1.61'
1894
+ VersionChanged: '1.73'
1889
1895
 
1890
1896
  Lint/EmptyEnsure:
1891
1897
  Description: 'Checks for empty ensure block.'
@@ -2041,6 +2047,7 @@ Lint/LambdaWithoutLiteralBlock:
2041
2047
  Lint/LiteralAsCondition:
2042
2048
  Description: 'Checks of literals used in conditions.'
2043
2049
  Enabled: true
2050
+ AutoCorrect: contextual
2044
2051
  VersionAdded: '0.51'
2045
2052
 
2046
2053
  Lint/LiteralAssignmentInCondition:
@@ -2254,9 +2261,8 @@ Lint/RedundantRegexpQuantifiers:
2254
2261
  Lint/RedundantRequireStatement:
2255
2262
  Description: 'Checks for unnecessary `require` statement.'
2256
2263
  Enabled: true
2257
- SafeAutoCorrect: false
2258
2264
  VersionAdded: '0.76'
2259
- VersionChanged: '1.57'
2265
+ VersionChanged: '1.73'
2260
2266
 
2261
2267
  Lint/RedundantSafeNavigation:
2262
2268
  Description: 'Checks for redundant safe navigation calls.'
@@ -2285,6 +2291,11 @@ Lint/RedundantStringCoercion:
2285
2291
  VersionAdded: '0.19'
2286
2292
  VersionChanged: '0.77'
2287
2293
 
2294
+ Lint/RedundantTypeConversion:
2295
+ Description: 'Checks for redundantly converting a literal to the same type.'
2296
+ Enabled: pending
2297
+ VersionAdded: '1.72'
2298
+
2288
2299
  Lint/RedundantWithIndex:
2289
2300
  Description: 'Checks for redundant `with_index`.'
2290
2301
  Enabled: true
@@ -2433,6 +2444,12 @@ Lint/SuppressedException:
2433
2444
  VersionAdded: '0.9'
2434
2445
  VersionChanged: '1.12'
2435
2446
 
2447
+ Lint/SuppressedExceptionInNumberConversion:
2448
+ Description: 'Checks for cases where exceptions unrelated to the numeric constructors may be unintentionally swallowed.'
2449
+ Enabled: pending
2450
+ SafeAutoCorrect: false
2451
+ VersionAdded: '1.72'
2452
+
2436
2453
  Lint/SymbolConversion:
2437
2454
  Description: 'Checks for unnecessary symbol conversions.'
2438
2455
  Enabled: pending
@@ -2588,6 +2605,11 @@ Lint/UselessAssignment:
2588
2605
  VersionAdded: '0.11'
2589
2606
  VersionChanged: '1.66'
2590
2607
 
2608
+ Lint/UselessConstantScoping:
2609
+ Description: 'Checks for useless constant scoping.'
2610
+ Enabled: pending
2611
+ VersionAdded: '1.72'
2612
+
2591
2613
  Lint/UselessDefined:
2592
2614
  Description: 'Checks for calls to `defined?` with strings and symbols. The result of such a call will always be truthy.'
2593
2615
  Enabled: pending
@@ -2975,6 +2997,7 @@ Naming/MethodName:
2975
2997
  StyleGuide: '#snake-case-symbols-methods-vars'
2976
2998
  Enabled: true
2977
2999
  VersionAdded: '0.50'
3000
+ VersionChanged: '1.75'
2978
3001
  EnforcedStyle: snake_case
2979
3002
  SupportedStyles:
2980
3003
  - snake_case
@@ -2986,6 +3009,10 @@ Naming/MethodName:
2986
3009
  # - '\A\s*onSelectionCleared\s*'
2987
3010
  #
2988
3011
  AllowedPatterns: []
3012
+ ForbiddenIdentifiers:
3013
+ - __id__
3014
+ - __send__
3015
+ ForbiddenPatterns: []
2989
3016
 
2990
3017
  Naming/MethodParameterName:
2991
3018
  Description: >-
@@ -3022,17 +3049,19 @@ Naming/PredicateName:
3022
3049
  StyleGuide: '#bool-methods-qmark'
3023
3050
  Enabled: true
3024
3051
  VersionAdded: '0.50'
3025
- VersionChanged: '0.77'
3052
+ VersionChanged: '1.75'
3026
3053
  # Predicate name prefixes.
3027
3054
  NamePrefix:
3028
3055
  - is_
3029
3056
  - has_
3030
3057
  - have_
3058
+ - does_
3031
3059
  # Predicate name prefixes that should be removed.
3032
3060
  ForbiddenPrefixes:
3033
3061
  - is_
3034
3062
  - has_
3035
3063
  - have_
3064
+ - does_
3036
3065
  # Predicate names which, despite having a forbidden prefix, or no `?`,
3037
3066
  # should still be accepted
3038
3067
  AllowedMethods:
@@ -3041,6 +3070,8 @@ Naming/PredicateName:
3041
3070
  MethodDefinitionMacros:
3042
3071
  - define_method
3043
3072
  - define_singleton_method
3073
+ # Use Sorbet's T::Boolean return type to detect predicate methods.
3074
+ UseSorbetSigs: false
3044
3075
  # Exclude Rspec specs because there is a strong convention to write spec
3045
3076
  # helpers in the form of `have_something` or `be_something`.
3046
3077
  Exclude:
@@ -3058,13 +3089,15 @@ Naming/VariableName:
3058
3089
  StyleGuide: '#snake-case-symbols-methods-vars'
3059
3090
  Enabled: true
3060
3091
  VersionAdded: '0.50'
3061
- VersionChanged: '1.8'
3092
+ VersionChanged: '1.73'
3062
3093
  EnforcedStyle: snake_case
3063
3094
  SupportedStyles:
3064
3095
  - snake_case
3065
3096
  - camelCase
3066
3097
  AllowedIdentifiers: []
3067
3098
  AllowedPatterns: []
3099
+ ForbiddenIdentifiers: []
3100
+ ForbiddenPatterns: []
3068
3101
 
3069
3102
  Naming/VariableNumber:
3070
3103
  Description: 'Use the configured style when numbering symbols, methods and variables.'
@@ -3080,6 +3113,8 @@ Naming/VariableNumber:
3080
3113
  CheckMethodNames: true
3081
3114
  CheckSymbols: true
3082
3115
  AllowedIdentifiers:
3116
+ - TLS1_1 # OpenSSL::SSL::TLS1_1_VERSION
3117
+ - TLS1_2 # OpenSSL::SSL::TLS1_2_VERSION
3083
3118
  - capture3 # Open3.capture3
3084
3119
  - iso8601 # Time#iso8601
3085
3120
  - rfc1123_date # CGI.rfc1123_date
@@ -3475,6 +3510,7 @@ Style/ClassAndModuleChildren:
3475
3510
  SafeAutoCorrect: false
3476
3511
  Enabled: true
3477
3512
  VersionAdded: '0.19'
3513
+ VersionChanged: '1.74'
3478
3514
  #
3479
3515
  # Basically there are two different styles:
3480
3516
  #
@@ -3490,7 +3526,21 @@ Style/ClassAndModuleChildren:
3490
3526
  #
3491
3527
  # The compact style is only forced, for classes or modules with one child.
3492
3528
  EnforcedStyle: nested
3493
- SupportedStyles:
3529
+ SupportedStyles: &supported_styles
3530
+ - nested
3531
+ - compact
3532
+ # Configure classes separately, if desired. If not set, or set to `nil`,
3533
+ # the `EnforcedStyle` value will be used.
3534
+ EnforcedStyleForClasses: ~
3535
+ SupportedStylesForClasses:
3536
+ - ~
3537
+ - nested
3538
+ - compact
3539
+ # Configure modules separately, if desired. If not set, or set to `nil`,
3540
+ # the `EnforcedStyle` value will be used.
3541
+ EnforcedStyleForModules: ~
3542
+ SupportedStylesForModules:
3543
+ - ~
3494
3544
  - nested
3495
3545
  - compact
3496
3546
 
@@ -3643,6 +3693,12 @@ Style/CommentedKeyword:
3643
3693
  VersionAdded: '0.51'
3644
3694
  VersionChanged: '1.19'
3645
3695
 
3696
+ Style/ComparableBetween:
3697
+ Description: 'Enforces the use of `Comparable#between?` instead of logical comparison.'
3698
+ Enabled: pending
3699
+ VersionAdded: '1.74'
3700
+ StyleGuide: '#ranges-or-between'
3701
+
3646
3702
  Style/ComparableClamp:
3647
3703
  Description: 'Enforces the use of `Comparable#clamp` instead of comparison by minimum and maximum.'
3648
3704
  Enabled: pending
@@ -3899,6 +3955,8 @@ Style/EndlessMethod:
3899
3955
  - allow_single_line
3900
3956
  - allow_always
3901
3957
  - disallow
3958
+ - require_single_line
3959
+ - require_always
3902
3960
 
3903
3961
  Style/EnvHome:
3904
3962
  Description: "Checks for consistent usage of `ENV['HOME']`."
@@ -4043,8 +4101,14 @@ Style/FormatStringToken:
4043
4101
  # style token in a format string to be allowed when enforced style is not
4044
4102
  # `unannotated`.
4045
4103
  MaxUnannotatedPlaceholdersAllowed: 1
4104
+ # The mode the cop operates in. Two values are allowed:
4105
+ # * aggressive (default): all strings are considered
4106
+ # * conservative:
4107
+ # only register offenses for strings given to `printf`, `sprintf`,
4108
+ # format` and `%` methods. Other strings are not considered.
4109
+ Mode: aggressive
4046
4110
  VersionAdded: '0.49'
4047
- VersionChanged: '1.0'
4111
+ VersionChanged: '1.74'
4048
4112
  AllowedMethods: []
4049
4113
  AllowedPatterns: []
4050
4114
 
@@ -4140,6 +4204,12 @@ Style/HashExcept:
4140
4204
  VersionAdded: '1.7'
4141
4205
  VersionChanged: '1.39'
4142
4206
 
4207
+ Style/HashFetchChain:
4208
+ Description: 'Use `Hash#dig` instead of chained `fetch` calls.'
4209
+ Enabled: pending
4210
+ Safe: false
4211
+ VersionAdded: '1.75'
4212
+
4143
4213
  Style/HashLikeCase:
4144
4214
  Description: >-
4145
4215
  Checks for places where `case-when` represents a simple 1:1
@@ -4350,6 +4420,16 @@ Style/ItAssignment:
4350
4420
  Enabled: pending
4351
4421
  VersionAdded: '1.70'
4352
4422
 
4423
+ Style/ItBlockParameter:
4424
+ Description: 'Checks for blocks with one argument where `it` block parameter can be used.'
4425
+ Enabled: pending
4426
+ EnforcedStyle: only_numbered_parameters
4427
+ SupportedStyles:
4428
+ - only_numbered_parameters
4429
+ - always
4430
+ - disallow
4431
+ VersionAdded: '1.75'
4432
+
4353
4433
  Style/KeywordArgumentsMerging:
4354
4434
  Description: >-
4355
4435
  When passing an existing hash as keyword arguments, provide additional arguments
@@ -4738,7 +4818,7 @@ Style/Next:
4738
4818
  StyleGuide: '#no-nested-conditionals'
4739
4819
  Enabled: true
4740
4820
  VersionAdded: '0.22'
4741
- VersionChanged: '0.35'
4821
+ VersionChanged: '1.75'
4742
4822
  # With `always` all conditions at the end of an iteration needs to be
4743
4823
  # replaced by next - with `skip_modifier_ifs` the modifier if like this one
4744
4824
  # are ignored: [1, 2].each { |a| return 'yes' if a == 1 }
@@ -4746,6 +4826,7 @@ Style/Next:
4746
4826
  # `MinBodyLength` defines the number of lines of the a body of an `if` or `unless`
4747
4827
  # needs to have to trigger this cop
4748
4828
  MinBodyLength: 3
4829
+ AllowConsecutiveConditionals: false
4749
4830
  SupportedStyles:
4750
4831
  - skip_modifier_ifs
4751
4832
  - always
@@ -5081,6 +5162,9 @@ Style/RedundantCondition:
5081
5162
  Description: 'Checks for unnecessary conditional expressions.'
5082
5163
  Enabled: true
5083
5164
  VersionAdded: '0.76'
5165
+ VersionChanged: '1.73'
5166
+ AllowedMethods:
5167
+ - nonzero?
5084
5168
 
5085
5169
  Style/RedundantConditional:
5086
5170
  Description: "Don't return true/false from a conditional."
@@ -5145,6 +5229,13 @@ Style/RedundantFilterChain:
5145
5229
  VersionAdded: '1.52'
5146
5230
  VersionChanged: '1.57'
5147
5231
 
5232
+ Style/RedundantFormat:
5233
+ Description: 'Checks for usages of `Kernel#format` or `Kernel#sprintf` with only a single argument.'
5234
+ Enabled: pending
5235
+ SafeAutoCorrect: false
5236
+ VersionAdded: '1.72'
5237
+ VersionChanged: '1.72'
5238
+
5148
5239
  Style/RedundantFreeze:
5149
5240
  Description: "Checks usages of Object#freeze on immutable objects."
5150
5241
  Enabled: true
@@ -5671,14 +5762,17 @@ Style/TrailingCommaInArrayLiteral:
5671
5762
  StyleGuide: '#no-trailing-array-commas'
5672
5763
  Enabled: true
5673
5764
  VersionAdded: '0.53'
5674
- # If `comma`, the cop requires a comma after the last item in an array,
5675
- # but only when each item is on its own line.
5676
- # If `consistent_comma`, the cop requires a comma after the last item of all
5677
- # non-empty, multiline array literals.
5765
+ # If `comma`, the cop requires a comma after the last item in an array, but only when each item is
5766
+ # on its own line.
5767
+ # If `consistent_comma`, the cop requires a comma after the last item of all non-empty, multiline
5768
+ # array literals.
5769
+ # If `diff_comma`, the cop requires a comma after the last item of all non-empty, multiline array
5770
+ # literals, but only when that last item immediately precedes a newline.
5678
5771
  EnforcedStyleForMultiline: no_comma
5679
5772
  SupportedStylesForMultiline:
5680
5773
  - comma
5681
5774
  - consistent_comma
5775
+ - diff_comma
5682
5776
  - no_comma
5683
5777
 
5684
5778
  Style/TrailingCommaInBlockArgs:
@@ -5690,14 +5784,17 @@ Style/TrailingCommaInBlockArgs:
5690
5784
  Style/TrailingCommaInHashLiteral:
5691
5785
  Description: 'Checks for trailing comma in hash literals.'
5692
5786
  Enabled: true
5693
- # If `comma`, the cop requires a comma after the last item in a hash,
5694
- # but only when each item is on its own line.
5695
- # If `consistent_comma`, the cop requires a comma after the last item of all
5696
- # non-empty, multiline hash literals.
5787
+ # If `comma`, the cop requires a comma after the last item in a hash, but only when each item is
5788
+ # on its own line.
5789
+ # If `consistent_comma`, the cop requires a comma after the last item of all non-empty, multiline
5790
+ # hash literals.
5791
+ # If `diff_comma`, the cop requires a comma after the last item of all non-empty, multiline hash
5792
+ # literals, but only when that last item immediately precedes a newline.
5697
5793
  EnforcedStyleForMultiline: no_comma
5698
5794
  SupportedStylesForMultiline:
5699
5795
  - comma
5700
5796
  - consistent_comma
5797
+ - diff_comma
5701
5798
  - no_comma
5702
5799
  VersionAdded: '0.53'
5703
5800
 
@@ -6,6 +6,26 @@ InternalAffairs/CopDescription:
6
6
  Include:
7
7
  - 'lib/rubocop/cop/**/*.rb'
8
8
 
9
+ InternalAffairs/ExampleHeredocDelimiter:
10
+ Include:
11
+ - 'spec/rubocop/cop/**/*.rb'
12
+
13
+ InternalAffairs/ExampleDescription:
14
+ Include:
15
+ - 'spec/rubocop/cop/**/*.rb'
16
+
17
+ InternalAffairs/NodeTypeGroup:
18
+ Include:
19
+ - 'lib/rubocop/cop/**/*.rb'
20
+
21
+ InternalAffairs/OnSendWithoutOnCSend:
22
+ Include:
23
+ - 'lib/rubocop/cop/**/*.rb'
24
+
25
+ InternalAffairs/UndefinedConfig:
26
+ Include:
27
+ - 'lib/rubocop/cop/**/*.rb'
28
+
9
29
  InternalAffairs/UselessMessageAssertion:
10
30
  Include:
11
31
  - '**/*_spec.rb'
@@ -43,7 +43,9 @@ renamed:
43
43
  Style/MethodCallParentheses: Style/MethodCallWithoutArgsParentheses
44
44
  Style/MethodName: Naming/MethodName
45
45
  Style/OpMethod: Naming/BinaryOperatorParameterName
46
- Style/PredicateName: Naming/PredicateName
46
+ Style/PredicateName:
47
+ new_name: Naming/PredicateName
48
+ severity: warning
47
49
  Style/SingleSpaceBeforeFirstArg: Layout/SpaceBeforeFirstArg
48
50
  Style/UnneededCapitalW: Style/RedundantCapitalW
49
51
  Style/UnneededCondition: Style/RedundantCondition
@@ -97,7 +97,13 @@ module RuboCop
97
97
  end
98
98
 
99
99
  def loaded_extensions
100
- @config_store.for_pwd.loaded_features.to_a
100
+ rubocop_config = @config_store.for_pwd
101
+
102
+ plugin_names = rubocop_config.loaded_plugins.map do |plugin|
103
+ plugin.about.name
104
+ end
105
+
106
+ plugin_names + rubocop_config.loaded_features.to_a
101
107
  end
102
108
 
103
109
  def installed_and_not_loaded_extensions
data/lib/rubocop/cli.rb CHANGED
@@ -52,7 +52,7 @@ module RuboCop
52
52
  end
53
53
  end
54
54
  rescue ConfigNotFoundError, IncorrectCopNameError, OptionArgumentError => e
55
- warn e.message
55
+ warn Rainbow(e.message).red
56
56
  STATUS_ERROR
57
57
  rescue RuboCop::Error => e
58
58
  warn Rainbow("Error: #{e.message}").red
@@ -205,7 +205,7 @@ module RuboCop
205
205
  directive.cop_names.each do |name|
206
206
  if directive.disabled?
207
207
  names[name] += 1
208
- elsif (names[name]).positive?
208
+ elsif names[name].positive?
209
209
  names[name] -= 1
210
210
  else
211
211
  extras[directive.comment] << name
@@ -27,14 +27,43 @@ module RuboCop
27
27
  config
28
28
  end
29
29
 
30
- # rubocop:disable Metrics/AbcSize
30
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
31
31
  def initialize(hash = RuboCop::ConfigLoader.default_configuration, loaded_path = nil)
32
32
  @loaded_path = loaded_path
33
33
  @for_cop = Hash.new do |h, cop|
34
34
  cop_name = cop.respond_to?(:cop_name) ? cop.cop_name : cop
35
- qualified_cop_name = Cop::Registry.qualified_cop_name(cop_name, loaded_path)
36
- cop_options = self[qualified_cop_name].dup || {}
37
- cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
35
+
36
+ if ConfigObsoletion.deprecated_cop_name?(cop)
37
+ # Since a deprecated cop will no longer have a qualified name (as the badge is no
38
+ # longer valid), and since we do not want to automatically enable the cop, we just
39
+ # set the configuration to an empty hash if it is unset.
40
+ # This is necessary to allow a renamed cop have its old configuration merged in
41
+ # before being used (which is necessary to allow it to be disabled via config).
42
+ cop_options = self[cop_name].dup || {}
43
+ else
44
+ qualified_cop_name = Cop::Registry.qualified_cop_name(cop_name, loaded_path, warn: false)
45
+ cop_options = self[qualified_cop_name].dup || {}
46
+ cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
47
+
48
+ # If the cop has deprecated names (ie. it has been renamed), it is possible that
49
+ # users will still have old configuration for the cop's old name. In this case,
50
+ # if `ConfigObsoletion` is configured to warn rather than error (and therefore
51
+ # RuboCop runs), we want to respect the old configuration, so merge it in.
52
+ #
53
+ # NOTE: If there is configuration for both the cop and a deprecated names, the old
54
+ # configuration will be merged on top of the new configuration!
55
+ ConfigObsoletion.deprecated_names_for(cop).each do |deprecated_cop_name|
56
+ deprecated_config = @for_cop[deprecated_cop_name]
57
+ next if deprecated_config.empty?
58
+
59
+ warn Rainbow(<<~WARNING).yellow
60
+ Warning: Using `#{deprecated_cop_name}` configuration in #{loaded_path} for `#{cop}`.
61
+ WARNING
62
+
63
+ cop_options.merge!(@for_cop[deprecated_cop_name])
64
+ end
65
+ end
66
+
38
67
  h[cop] = h[cop_name] = cop_options
39
68
  end
40
69
  @hash = hash
@@ -43,7 +72,11 @@ module RuboCop
43
72
  @badge_config_cache = {}.compare_by_identity
44
73
  @clusivity_config_exists_cache = {}
45
74
  end
46
- # rubocop:enable Metrics/AbcSize
75
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
76
+
77
+ def loaded_plugins
78
+ @loaded_plugins ||= ConfigLoader.loaded_plugins
79
+ end
47
80
 
48
81
  def loaded_features
49
82
  @loaded_features ||= ConfigLoader.loaded_features
@@ -258,7 +291,7 @@ module RuboCop
258
291
  end
259
292
 
260
293
  def parser_engine
261
- @parser_engine ||= for_all_cops.fetch('ParserEngine', :parser_whitequark).to_sym
294
+ @parser_engine ||= for_all_cops.fetch('ParserEngine', :default).to_sym
262
295
  end
263
296
 
264
297
  def target_rails_version
@@ -33,13 +33,14 @@ module RuboCop
33
33
  attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
34
34
  :ignore_unrecognized_cops
35
35
  attr_writer :default_configuration
36
- attr_reader :loaded_features
36
+ attr_reader :loaded_plugins, :loaded_features
37
37
 
38
38
  alias debug? debug
39
39
  alias ignore_parent_exclusion? ignore_parent_exclusion
40
40
 
41
41
  def clear_options
42
42
  @debug = nil
43
+ @loaded_plugins = Set.new
43
44
  @loaded_features = Set.new
44
45
  @disable_pending_cops = nil
45
46
  @enable_pending_cops = nil
@@ -48,15 +49,20 @@ module RuboCop
48
49
  FileFinder.root_level = nil
49
50
  end
50
51
 
52
+ # rubocop:disable Metrics/AbcSize
51
53
  def load_file(file, check: true)
52
54
  path = file_path(file)
53
55
 
54
56
  hash = load_yaml_configuration(path)
55
57
 
58
+ rubocop_config = Config.create(hash, path, check: false)
59
+ plugins = hash.delete('plugins')
60
+ loaded_plugins = resolver.resolve_plugins(rubocop_config, plugins)
61
+ add_loaded_plugins(loaded_plugins)
62
+
56
63
  loaded_features = resolver.resolve_requires(path, hash)
57
64
  add_loaded_features(loaded_features)
58
65
 
59
- resolver.override_department_setting_for_cops({}, hash)
60
66
  resolver.resolve_inheritance_from_gems(hash)
61
67
  resolver.resolve_inheritance(path, hash, file, debug?)
62
68
  hash.delete('inherit_from')
@@ -67,6 +73,7 @@ module RuboCop
67
73
 
68
74
  Config.create(hash, path, check: check)
69
75
  end
76
+ # rubocop:enable Metrics/AbcSize
70
77
 
71
78
  def load_yaml_configuration(absolute_path)
72
79
  file_contents = read_file(absolute_path)
@@ -84,8 +91,12 @@ module RuboCop
84
91
  def add_missing_namespaces(path, hash)
85
92
  # Using `hash.each_key` will cause the
86
93
  # `can't add a new key into hash during iteration` error
94
+ obsoletion = ConfigObsoletion.new(hash)
95
+
87
96
  hash_keys = hash.keys
88
97
  hash_keys.each do |key|
98
+ next if obsoletion.deprecated_cop_name?(key)
99
+
89
100
  q = Cop::Registry.qualified_cop_name(key, path)
90
101
  next if q == key
91
102
 
@@ -155,14 +166,35 @@ module RuboCop
155
166
  end
156
167
  end
157
168
 
158
- # @api private
159
- def inject_defaults!(project_root)
160
- path = File.join(project_root, 'config', 'default.yml')
161
- config = load_file(path)
162
- new_config = ConfigLoader.merge_with_default(config, path)
163
- puts "configuration from #{path}" if debug?
164
- @default_configuration = new_config
169
+ # This API is primarily intended for testing and documenting plugins.
170
+ # When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
171
+ # so this API is usually not needed. It is intended to be used only when implementing tests
172
+ # that do not use `rubocop/rspec/support`.
173
+ # rubocop:disable Metrics/MethodLength
174
+ def inject_defaults!(config_yml_path)
175
+ if Pathname(config_yml_path).directory?
176
+ # TODO: Since the warning noise is expected to be high until some time after the release,
177
+ # warnings will only be issued when `RUBYOPT=-w` is specified.
178
+ # To proceed step by step, the next step is to remove `$VERBOSE` and always issue warning.
179
+ # Eventually, `project_root` will no longer be accepted.
180
+ if $VERBOSE
181
+ warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
182
+ Use config YAML file path instead of project root directory.
183
+ e.g., `path/to/config/default.yml`
184
+ MESSAGE
185
+ end
186
+ # NOTE: For compatibility.
187
+ project_root = config_yml_path
188
+ path = File.join(project_root, 'config', 'default.yml')
189
+ config = load_file(path)
190
+ else
191
+ hash = ConfigLoader.load_yaml_configuration(config_yml_path.to_s)
192
+ config = Config.new(hash, config_yml_path).tap(&:make_excludes_absolute)
193
+ end
194
+
195
+ @default_configuration = ConfigLoader.merge_with_default(config, path)
165
196
  end
197
+ # rubocop:enable Metrics/MethodLength
166
198
 
167
199
  # Returns the path RuboCop inferred as the root of the project. No file
168
200
  # searches will go past this directory.
@@ -196,6 +228,13 @@ module RuboCop
196
228
  resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
197
229
  end
198
230
 
231
+ # @api private
232
+ # Used to add plugins that were required inside a config or from
233
+ # the CLI using `--plugin`.
234
+ def add_loaded_plugins(loaded_plugins)
235
+ @loaded_plugins.merge(Array(loaded_plugins))
236
+ end
237
+
199
238
  # @api private
200
239
  # Used to add features that were required inside a config or from
201
240
  # the CLI using `--require`.