rubocop 1.69.2 → 1.73.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +90 -13
  5. data/config/internal_affairs.yml +16 -0
  6. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  7. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  8. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  9. data/lib/rubocop/comment_config.rb +2 -2
  10. data/lib/rubocop/config.rb +17 -4
  11. data/lib/rubocop/config_loader.rb +48 -8
  12. data/lib/rubocop/config_loader_resolver.rb +35 -10
  13. data/lib/rubocop/config_validator.rb +19 -9
  14. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  15. data/lib/rubocop/cop/base.rb +6 -0
  16. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  17. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  18. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  19. data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
  20. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  21. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  22. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  23. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  24. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  25. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  26. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  27. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  28. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  29. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  30. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  31. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  32. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  33. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  34. data/lib/rubocop/cop/internal_affairs.rb +5 -16
  35. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  36. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  37. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  38. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  39. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  40. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  41. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  42. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  43. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  44. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +27 -1
  45. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  46. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  47. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  48. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  49. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  50. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  51. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  52. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  54. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  55. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  56. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  57. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  58. data/lib/rubocop/cop/layout/line_length.rb +4 -3
  59. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  60. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  61. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  62. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  63. data/lib/rubocop/cop/layout/redundant_line_break.rb +7 -6
  64. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  65. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  66. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  68. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  70. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  71. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -3
  73. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  74. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  75. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  76. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  77. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  79. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  80. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  81. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  82. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  83. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  84. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  85. data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
  86. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  87. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  88. data/lib/rubocop/cop/lint/empty_conditional_body.rb +10 -5
  89. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  90. data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
  91. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  92. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  93. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  94. data/lib/rubocop/cop/lint/literal_as_condition.rb +99 -9
  95. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  96. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  97. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  98. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  99. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
  100. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  101. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  102. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  103. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  104. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  105. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  106. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  107. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  108. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  109. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +252 -0
  110. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  111. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  112. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  113. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  114. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  115. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  116. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  117. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  118. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  119. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  120. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  121. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  122. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  123. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  124. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -0
  125. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  126. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  127. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  128. data/lib/rubocop/cop/lint/void.rb +11 -9
  129. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  130. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  131. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  132. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  133. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  134. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  135. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  136. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  137. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  138. data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
  139. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  140. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  141. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  142. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  143. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  144. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  145. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  146. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  147. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  148. data/lib/rubocop/cop/mixin/range_help.rb +3 -3
  149. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  150. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  151. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  152. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  153. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  154. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  155. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  156. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  157. data/lib/rubocop/cop/naming/variable_name.rb +64 -6
  158. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  159. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  160. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  161. data/lib/rubocop/cop/style/and_or.rb +1 -1
  162. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  163. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  164. data/lib/rubocop/cop/style/block_delimiters.rb +7 -20
  165. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  166. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  167. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  168. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  169. data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
  170. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  171. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
  172. data/lib/rubocop/cop/style/documentation.rb +1 -1
  173. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  174. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  175. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  176. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  177. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  178. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  179. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  180. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  181. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  182. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  183. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  184. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  185. data/lib/rubocop/cop/style/float_division.rb +8 -4
  186. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  187. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  188. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  189. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  190. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  191. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  192. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  193. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  194. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  195. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  196. data/lib/rubocop/cop/style/inverse_methods.rb +6 -6
  197. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  198. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  199. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  200. data/lib/rubocop/cop/style/map_into_array.rb +1 -1
  201. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  202. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  203. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -12
  204. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  205. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  206. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  207. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  208. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  209. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  210. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  211. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  212. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  213. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  214. data/lib/rubocop/cop/style/object_then.rb +13 -15
  215. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  216. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  217. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  218. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  219. data/lib/rubocop/cop/style/proc.rb +1 -2
  220. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  221. data/lib/rubocop/cop/style/raise_args.rb +6 -4
  222. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  223. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  224. data/lib/rubocop/cop/style/redundant_condition.rb +48 -2
  225. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  226. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  227. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  228. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  229. data/lib/rubocop/cop/style/redundant_format.rb +250 -0
  230. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  231. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  232. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  233. data/lib/rubocop/cop/style/redundant_parentheses.rb +28 -14
  234. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  235. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  236. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  237. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  238. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  239. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  240. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  241. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  242. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  243. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  244. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  245. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -2
  246. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  247. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  248. data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
  249. data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
  250. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  251. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  252. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  253. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  254. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  255. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  256. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  257. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  258. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  259. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  260. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  261. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  262. data/lib/rubocop/cop/util.rb +12 -5
  263. data/lib/rubocop/cop/utils/format_string.rb +7 -5
  264. data/lib/rubocop/cop/variable_force/variable.rb +14 -2
  265. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  266. data/lib/rubocop/cops_documentation_generator.rb +25 -14
  267. data/lib/rubocop/directive_comment.rb +44 -10
  268. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  269. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  270. data/lib/rubocop/lsp/logger.rb +2 -2
  271. data/lib/rubocop/lsp/routes.rb +7 -23
  272. data/lib/rubocop/lsp/runtime.rb +17 -49
  273. data/lib/rubocop/lsp/server.rb +0 -2
  274. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  275. data/lib/rubocop/options.rb +28 -12
  276. data/lib/rubocop/path_util.rb +15 -8
  277. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  278. data/lib/rubocop/plugin/load_error.rb +26 -0
  279. data/lib/rubocop/plugin/loader.rb +100 -0
  280. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  281. data/lib/rubocop/plugin.rb +46 -0
  282. data/lib/rubocop/rake_task.rb +4 -1
  283. data/lib/rubocop/result_cache.rb +13 -13
  284. data/lib/rubocop/rspec/cop_helper.rb +9 -0
  285. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  286. data/lib/rubocop/rspec/shared_contexts.rb +19 -1
  287. data/lib/rubocop/rspec/support.rb +2 -2
  288. data/lib/rubocop/runner.rb +5 -6
  289. data/lib/rubocop/server/cache.rb +35 -2
  290. data/lib/rubocop/server/cli.rb +2 -2
  291. data/lib/rubocop/target_finder.rb +1 -0
  292. data/lib/rubocop/target_ruby.rb +15 -0
  293. data/lib/rubocop/version.rb +17 -2
  294. data/lib/rubocop.rb +11 -1
  295. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  296. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
  297. metadata +53 -16
  298. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  299. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45af4a986637b8c3dacb16d942870c2138501ae834e79c0875b81bbf09644b54
4
- data.tar.gz: 65961fc4cb25730ad9528201e22a82427def59f6ad5f048cd01a0ca89a437c3c
3
+ metadata.gz: a4215b7d095dfd177a36af3bdf5d5aecd786877a6feca3480078d9cb1a5917ad
4
+ data.tar.gz: fc20be6f63f1a0e3c06cd2fc13f8619f872e9a81642dfa833f90f88f70997857
5
5
  SHA512:
6
- metadata.gz: aa6eb7a2cbf39d99cbda0faff3dfe690a61e9665847c21669bc9a005f9ac316e9404a8babc8cadf7f033bf82afcf317c8c503ede2306e8b3a8c211abaa878cb9
7
- data.tar.gz: 126f20d27ebf2e0098d0a1039230fea4178d2a196693db8c75326a7f3fdc797b1f030af3d116f2d74f69bb70cc033372ede6836962b2c47632a9ecf4f524dd56
6
+ metadata.gz: aee7de1fa54b8b7108f5ad7f29c3fbc1818547f28507010dca91adc0f648b02ce519c96846d2ad98407d8f8847047cd8f88547e7d5c81028d0f54cfafb44500b
7
+ data.tar.gz: afc90ab7e887e183ddfac0bf49e9f644c04564e7fd605423d29f2848f6cc509f2394fd642eccd8870d105b21055a5cb4d0dea051b92ba47ef3befbf5b7d3dad5
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-24 Bozhidar Batsov
1
+ Copyright (c) 2012-25 Bozhidar Batsov
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
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.69', require: false
55
+ gem 'rubocop', '~> 1.73', require: false
56
56
  ```
57
57
 
58
58
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
@@ -241,11 +241,11 @@ 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
 
250
- Copyright (c) 2012-2024 Bozhidar Batsov. See [LICENSE.txt](LICENSE.txt) for
250
+ Copyright (c) 2012-2025 Bozhidar Batsov. See [LICENSE.txt](LICENSE.txt) for
251
251
  further details.
data/config/default.yml CHANGED
@@ -1616,6 +1616,12 @@ Lint/AmbiguousRegexpLiteral:
1616
1616
  VersionAdded: '0.17'
1617
1617
  VersionChanged: '0.83'
1618
1618
 
1619
+ Lint/ArrayLiteralInRegexp:
1620
+ Description: 'Checks for an array literal interpolated inside a regexp.'
1621
+ Enabled: pending
1622
+ VersionAdded: '1.71'
1623
+ SafeAutoCorrect: false
1624
+
1619
1625
  Lint/AssignmentInCondition:
1620
1626
  Description: "Don't use assignment in conditions."
1621
1627
  StyleGuide: '#safe-assignment-in-condition'
@@ -1665,6 +1671,11 @@ Lint/ConstantOverwrittenInRescue:
1665
1671
  Enabled: pending
1666
1672
  VersionAdded: '1.31'
1667
1673
 
1674
+ Lint/ConstantReassignment:
1675
+ Description: 'Checks for constant reassignments.'
1676
+ Enabled: pending
1677
+ VersionAdded: '1.70'
1678
+
1668
1679
  Lint/ConstantResolution:
1669
1680
  Description: 'Check that constants are fully qualified with `::`.'
1670
1681
  Enabled: false
@@ -1674,6 +1685,11 @@ Lint/ConstantResolution:
1674
1685
  # Restrict this cop from only looking at certain names
1675
1686
  Ignore: []
1676
1687
 
1688
+ Lint/CopDirectiveSyntax:
1689
+ Description: 'Checks that `# rubocop:` directives are strictly formatted.'
1690
+ Enabled: pending
1691
+ VersionAdded: '1.72'
1692
+
1677
1693
  Lint/Debugger:
1678
1694
  Description: 'Check for debugger calls.'
1679
1695
  Enabled: true
@@ -2030,6 +2046,7 @@ Lint/LambdaWithoutLiteralBlock:
2030
2046
  Lint/LiteralAsCondition:
2031
2047
  Description: 'Checks of literals used in conditions.'
2032
2048
  Enabled: true
2049
+ AutoCorrect: contextual
2033
2050
  VersionAdded: '0.51'
2034
2051
 
2035
2052
  Lint/LiteralAssignmentInCondition:
@@ -2243,9 +2260,8 @@ Lint/RedundantRegexpQuantifiers:
2243
2260
  Lint/RedundantRequireStatement:
2244
2261
  Description: 'Checks for unnecessary `require` statement.'
2245
2262
  Enabled: true
2246
- SafeAutoCorrect: false
2247
2263
  VersionAdded: '0.76'
2248
- VersionChanged: '1.57'
2264
+ VersionChanged: '1.73'
2249
2265
 
2250
2266
  Lint/RedundantSafeNavigation:
2251
2267
  Description: 'Checks for redundant safe navigation calls.'
@@ -2274,6 +2290,11 @@ Lint/RedundantStringCoercion:
2274
2290
  VersionAdded: '0.19'
2275
2291
  VersionChanged: '0.77'
2276
2292
 
2293
+ Lint/RedundantTypeConversion:
2294
+ Description: 'Checks for redundantly converting a literal to the same type.'
2295
+ Enabled: pending
2296
+ VersionAdded: '1.72'
2297
+
2277
2298
  Lint/RedundantWithIndex:
2278
2299
  Description: 'Checks for redundant `with_index`.'
2279
2300
  Enabled: true
@@ -2402,6 +2423,12 @@ Lint/ShadowingOuterLocalVariable:
2402
2423
  Enabled: true
2403
2424
  VersionAdded: '0.9'
2404
2425
 
2426
+ Lint/SharedMutableDefault:
2427
+ Description: 'Checks for mutable literals used as default arguments during Hash initialization.'
2428
+ StyleGuide: '#no-mutable-defaults'
2429
+ Enabled: pending
2430
+ VersionAdded: '1.70'
2431
+
2405
2432
  Lint/StructNewOverride:
2406
2433
  Description: 'Disallow overriding the `Struct` built-in methods via `Struct.new`.'
2407
2434
  Enabled: true
@@ -2416,6 +2443,12 @@ Lint/SuppressedException:
2416
2443
  VersionAdded: '0.9'
2417
2444
  VersionChanged: '1.12'
2418
2445
 
2446
+ Lint/SuppressedExceptionInNumberConversion:
2447
+ Description: 'Checks for cases where exceptions unrelated to the numeric constructors may be unintentionally swallowed.'
2448
+ Enabled: pending
2449
+ SafeAutoCorrect: false
2450
+ VersionAdded: '1.72'
2451
+
2419
2452
  Lint/SymbolConversion:
2420
2453
  Description: 'Checks for unnecessary symbol conversions.'
2421
2454
  Enabled: pending
@@ -2571,6 +2604,11 @@ Lint/UselessAssignment:
2571
2604
  VersionAdded: '0.11'
2572
2605
  VersionChanged: '1.66'
2573
2606
 
2607
+ Lint/UselessConstantScoping:
2608
+ Description: 'Checks for useless constant scoping.'
2609
+ Enabled: pending
2610
+ VersionAdded: '1.72'
2611
+
2574
2612
  Lint/UselessDefined:
2575
2613
  Description: 'Checks for calls to `defined?` with strings and symbols. The result of such a call will always be truthy.'
2576
2614
  Enabled: pending
@@ -3024,6 +3062,8 @@ Naming/PredicateName:
3024
3062
  MethodDefinitionMacros:
3025
3063
  - define_method
3026
3064
  - define_singleton_method
3065
+ # Use Sorbet's T::Boolean return type to detect predicate methods.
3066
+ UseSorbetSigs: false
3027
3067
  # Exclude Rspec specs because there is a strong convention to write spec
3028
3068
  # helpers in the form of `have_something` or `be_something`.
3029
3069
  Exclude:
@@ -3041,13 +3081,15 @@ Naming/VariableName:
3041
3081
  StyleGuide: '#snake-case-symbols-methods-vars'
3042
3082
  Enabled: true
3043
3083
  VersionAdded: '0.50'
3044
- VersionChanged: '1.8'
3084
+ VersionChanged: '1.73'
3045
3085
  EnforcedStyle: snake_case
3046
3086
  SupportedStyles:
3047
3087
  - snake_case
3048
3088
  - camelCase
3049
3089
  AllowedIdentifiers: []
3050
3090
  AllowedPatterns: []
3091
+ ForbiddenIdentifiers: []
3092
+ ForbiddenPatterns: []
3051
3093
 
3052
3094
  Naming/VariableNumber:
3053
3095
  Description: 'Use the configured style when numbering symbols, methods and variables.'
@@ -3136,13 +3178,14 @@ Style/AccessModifierDeclarations:
3136
3178
  Description: 'Checks style of how access modifiers are used.'
3137
3179
  Enabled: true
3138
3180
  VersionAdded: '0.57'
3139
- VersionChanged: '0.81'
3181
+ VersionChanged: '1.70'
3140
3182
  EnforcedStyle: group
3141
3183
  SupportedStyles:
3142
3184
  - inline
3143
3185
  - group
3144
3186
  AllowModifiersOnSymbols: true
3145
3187
  AllowModifiersOnAttrs: true
3188
+ AllowModifiersOnAliasMethod: true
3146
3189
  SafeAutoCorrect: false
3147
3190
 
3148
3191
  Style/AccessorGrouping:
@@ -3881,6 +3924,8 @@ Style/EndlessMethod:
3881
3924
  - allow_single_line
3882
3925
  - allow_always
3883
3926
  - disallow
3927
+ - require_single_line
3928
+ - require_always
3884
3929
 
3885
3930
  Style/EnvHome:
3886
3931
  Description: "Checks for consistent usage of `ENV['HOME']`."
@@ -4051,6 +4096,9 @@ Style/FrozenStringLiteralComment:
4051
4096
  # exist in a file.
4052
4097
  - never
4053
4098
  SafeAutoCorrect: false
4099
+ Exclude:
4100
+ # Prevent the Ruby warning: `'frozen_string_literal' is ignored after any tokens` when using Active Admin.
4101
+ - '**/*.arb'
4054
4102
 
4055
4103
  Style/GlobalStdStream:
4056
4104
  Description: 'Enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`.'
@@ -4129,6 +4177,14 @@ Style/HashLikeCase:
4129
4177
  # to trigger this cop
4130
4178
  MinBranchesCount: 3
4131
4179
 
4180
+ Style/HashSlice:
4181
+ Description: >-
4182
+ Checks for usages of `Hash#reject`, `Hash#select`, and `Hash#filter` methods
4183
+ that can be replaced with `Hash#slice` method.
4184
+ Enabled: pending
4185
+ Safe: false
4186
+ VersionAdded: '1.71'
4187
+
4132
4188
  Style/HashSyntax:
4133
4189
  Description: >-
4134
4190
  Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax
@@ -4316,6 +4372,11 @@ Style/IpAddresses:
4316
4372
  - '**/gems.rb'
4317
4373
  - '**/*.gemspec'
4318
4374
 
4375
+ Style/ItAssignment:
4376
+ Description: 'Checks for assignment to `it` inside a block.'
4377
+ Enabled: pending
4378
+ VersionAdded: '1.70'
4379
+
4319
4380
  Style/KeywordArgumentsMerging:
4320
4381
  Description: >-
4321
4382
  When passing an existing hash as keyword arguments, provide additional arguments
@@ -5047,6 +5108,9 @@ Style/RedundantCondition:
5047
5108
  Description: 'Checks for unnecessary conditional expressions.'
5048
5109
  Enabled: true
5049
5110
  VersionAdded: '0.76'
5111
+ VersionChanged: '1.73'
5112
+ AllowedMethods:
5113
+ - nonzero?
5050
5114
 
5051
5115
  Style/RedundantConditional:
5052
5116
  Description: "Don't return true/false from a conditional."
@@ -5059,7 +5123,7 @@ Style/RedundantConstantBase:
5059
5123
  VersionAdded: '1.40'
5060
5124
 
5061
5125
  Style/RedundantCurrentDirectoryInPath:
5062
- Description: 'Checks for uses a redundant current directory in path.'
5126
+ Description: 'Checks for a redundant current directory in a path given to `require_relative`.'
5063
5127
  Enabled: pending
5064
5128
  VersionAdded: '1.53'
5065
5129
 
@@ -5111,6 +5175,13 @@ Style/RedundantFilterChain:
5111
5175
  VersionAdded: '1.52'
5112
5176
  VersionChanged: '1.57'
5113
5177
 
5178
+ Style/RedundantFormat:
5179
+ Description: 'Checks for usages of `Kernel#format` or `Kernel#sprintf` with only a single argument.'
5180
+ Enabled: pending
5181
+ SafeAutoCorrect: false
5182
+ VersionAdded: '1.72'
5183
+ VersionChanged: '1.72'
5184
+
5114
5185
  Style/RedundantFreeze:
5115
5186
  Description: "Checks usages of Object#freeze on immutable objects."
5116
5187
  Enabled: true
@@ -5637,14 +5708,17 @@ Style/TrailingCommaInArrayLiteral:
5637
5708
  StyleGuide: '#no-trailing-array-commas'
5638
5709
  Enabled: true
5639
5710
  VersionAdded: '0.53'
5640
- # If `comma`, the cop requires a comma after the last item in an array,
5641
- # but only when each item is on its own line.
5642
- # If `consistent_comma`, the cop requires a comma after the last item of all
5643
- # non-empty, multiline array literals.
5711
+ # If `comma`, the cop requires a comma after the last item in an array, but only when each item is
5712
+ # on its own line.
5713
+ # If `consistent_comma`, the cop requires a comma after the last item of all non-empty, multiline
5714
+ # array literals.
5715
+ # If `diff_comma`, the cop requires a comma after the last item of all non-empty, multiline array
5716
+ # literals, but only when that last item immediately precedes a newline.
5644
5717
  EnforcedStyleForMultiline: no_comma
5645
5718
  SupportedStylesForMultiline:
5646
5719
  - comma
5647
5720
  - consistent_comma
5721
+ - diff_comma
5648
5722
  - no_comma
5649
5723
 
5650
5724
  Style/TrailingCommaInBlockArgs:
@@ -5656,14 +5730,17 @@ Style/TrailingCommaInBlockArgs:
5656
5730
  Style/TrailingCommaInHashLiteral:
5657
5731
  Description: 'Checks for trailing comma in hash literals.'
5658
5732
  Enabled: true
5659
- # If `comma`, the cop requires a comma after the last item in a hash,
5660
- # but only when each item is on its own line.
5661
- # If `consistent_comma`, the cop requires a comma after the last item of all
5662
- # non-empty, multiline hash literals.
5733
+ # If `comma`, the cop requires a comma after the last item in a hash, but only when each item is
5734
+ # on its own line.
5735
+ # If `consistent_comma`, the cop requires a comma after the last item of all non-empty, multiline
5736
+ # hash literals.
5737
+ # If `diff_comma`, the cop requires a comma after the last item of all non-empty, multiline hash
5738
+ # literals, but only when that last item immediately precedes a newline.
5663
5739
  EnforcedStyleForMultiline: no_comma
5664
5740
  SupportedStylesForMultiline:
5665
5741
  - comma
5666
5742
  - consistent_comma
5743
+ - diff_comma
5667
5744
  - no_comma
5668
5745
  VersionAdded: '0.53'
5669
5746
 
@@ -6,6 +6,22 @@ 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/OnSendWithoutOnCSend:
18
+ Include:
19
+ - 'lib/rubocop/cop/**/*.rb'
20
+
21
+ InternalAffairs/UndefinedConfig:
22
+ Include:
23
+ - 'lib/rubocop/cop/**/*.rb'
24
+
9
25
  InternalAffairs/UselessMessageAssertion:
10
26
  Include:
11
27
  - '**/*_spec.rb'
@@ -71,11 +71,11 @@ module RuboCop
71
71
 
72
72
  warn Rainbow("\n#{pluralize(errors.size, 'error')} occurred:").red
73
73
 
74
- errors.each { |error| warn error }
74
+ errors.each { |error| warn Rainbow(error).red }
75
75
 
76
- warn <<~WARNING
76
+ warn Rainbow(<<~WARNING.strip).yellow
77
77
  Errors are usually caused by RuboCop bugs.
78
- Please, report your problems to RuboCop's issue tracker.
78
+ Please, update to the latest RuboCop version if not already in use, and report a bug if the issue still occurs on this version.
79
79
  #{bug_tracker_uri}
80
80
  Mention the following information in the issue report:
81
81
  #{RuboCop::Version.verbose}
@@ -9,11 +9,31 @@ module RuboCop
9
9
  class ShowCops < Base
10
10
  self.command_name = :show_cops
11
11
 
12
+ ExactMatcher = Struct.new(:pattern) do
13
+ def match?(name)
14
+ name == pattern
15
+ end
16
+ end
17
+
18
+ WildcardMatcher = Struct.new(:pattern) do
19
+ def match?(name)
20
+ File.fnmatch(pattern, name, File::FNM_PATHNAME)
21
+ end
22
+ end
23
+
12
24
  def initialize(env)
13
25
  super
14
26
 
15
27
  # Load the configs so the require()s are done for custom cops
16
28
  @config = @config_store.for(Dir.pwd)
29
+
30
+ @cop_matchers = @options[:show_cops].map do |pattern|
31
+ if pattern.include?('*')
32
+ WildcardMatcher.new(pattern)
33
+ else
34
+ ExactMatcher.new(pattern)
35
+ end
36
+ end
17
37
  end
18
38
 
19
39
  def run
@@ -24,7 +44,7 @@ module RuboCop
24
44
 
25
45
  def print_available_cops
26
46
  registry = Cop::Registry.global
27
- show_all = @options[:show_cops].empty?
47
+ show_all = @cop_matchers.empty?
28
48
 
29
49
  puts "# Available cops (#{registry.length}) + config for #{Dir.pwd}: " if show_all
30
50
 
@@ -56,7 +76,9 @@ module RuboCop
56
76
 
57
77
  def selected_cops_of_department(cops, department)
58
78
  cops_of_department(cops, department).select do |cop|
59
- @options[:show_cops].include?(cop.cop_name)
79
+ @cop_matchers.any? do |matcher|
80
+ matcher.match?(cop.cop_name)
81
+ end
60
82
  end
61
83
  end
62
84
 
@@ -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
@@ -87,7 +87,7 @@ module RuboCop
87
87
  next unless directive.enabled?
88
88
  next if directive.all_cops?
89
89
 
90
- cops.merge(directive.cop_names)
90
+ cops.merge(directive.raw_cop_names)
91
91
  end
92
92
  cops
93
93
  end
@@ -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
@@ -16,6 +16,7 @@ module RuboCop
16
16
 
17
17
  CopConfig = Struct.new(:name, :metadata)
18
18
 
19
+ EMPTY_CONFIG = {}.freeze
19
20
  DEFAULT_RAILS_VERSION = 5.0
20
21
  attr_reader :loaded_path
21
22
 
@@ -44,6 +45,10 @@ module RuboCop
44
45
  end
45
46
  # rubocop:enable Metrics/AbcSize
46
47
 
48
+ def loaded_plugins
49
+ @loaded_plugins ||= ConfigLoader.loaded_plugins
50
+ end
51
+
47
52
  def loaded_features
48
53
  @loaded_features ||= ConfigLoader.loaded_features
49
54
  end
@@ -80,10 +85,7 @@ module RuboCop
80
85
 
81
86
  def make_excludes_absolute
82
87
  each_key do |key|
83
- @validator.validate_section_presence(key)
84
- next unless self[key]['Exclude']
85
-
86
- self[key]['Exclude'].map! do |exclude_elem|
88
+ dig(key, 'Exclude')&.map! do |exclude_elem|
87
89
  if exclude_elem.is_a?(String) && !absolute?(exclude_elem)
88
90
  File.expand_path(File.join(base_dir_for_path_parameters, exclude_elem))
89
91
  else
@@ -123,6 +125,13 @@ module RuboCop
123
125
  @for_cop[cop]
124
126
  end
125
127
 
128
+ # @return [Config, Hash] for the given cop / cop name.
129
+ # If the given cop is enabled, returns its configuration hash.
130
+ # Otherwise, returns an empty hash.
131
+ def for_enabled_cop(cop)
132
+ cop_enabled?(cop) ? for_cop(cop) : EMPTY_CONFIG
133
+ end
134
+
126
135
  # @return [Config] for the given cop merged with that of its department (if any)
127
136
  # Note: the 'Enabled' attribute is same as that returned by `for_cop`
128
137
  def for_badge(badge)
@@ -159,6 +168,10 @@ module RuboCop
159
168
  @for_all_cops ||= self['AllCops'] || {}
160
169
  end
161
170
 
171
+ def cop_enabled?(name)
172
+ !!for_cop(name)['Enabled']
173
+ end
174
+
162
175
  def disabled_new_cops?
163
176
  for_all_cops['NewCops'] == 'disable'
164
177
  end
@@ -33,22 +33,33 @@ 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
45
+ @disable_pending_cops = nil
46
+ @enable_pending_cops = nil
47
+ @ignore_parent_exclusion = nil
48
+ @ignore_unrecognized_cops = nil
44
49
  FileFinder.root_level = nil
45
50
  end
46
51
 
52
+ # rubocop:disable Metrics/AbcSize
47
53
  def load_file(file, check: true)
48
54
  path = file_path(file)
49
55
 
50
56
  hash = load_yaml_configuration(path)
51
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
+
52
63
  loaded_features = resolver.resolve_requires(path, hash)
53
64
  add_loaded_features(loaded_features)
54
65
 
@@ -63,6 +74,7 @@ module RuboCop
63
74
 
64
75
  Config.create(hash, path, check: check)
65
76
  end
77
+ # rubocop:enable Metrics/AbcSize
66
78
 
67
79
  def load_yaml_configuration(absolute_path)
68
80
  file_contents = read_file(absolute_path)
@@ -151,14 +163,35 @@ module RuboCop
151
163
  end
152
164
  end
153
165
 
154
- # @api private
155
- def inject_defaults!(project_root)
156
- path = File.join(project_root, 'config', 'default.yml')
157
- config = load_file(path)
158
- new_config = ConfigLoader.merge_with_default(config, path)
159
- puts "configuration from #{path}" if debug?
160
- @default_configuration = new_config
166
+ # This API is primarily intended for testing and documenting plugins.
167
+ # When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
168
+ # so this API is usually not needed. It is intended to be used only when implementing tests
169
+ # that do not use `rubocop/rspec/support`.
170
+ # rubocop:disable Metrics/MethodLength
171
+ def inject_defaults!(config_yml_path)
172
+ if Pathname(config_yml_path).directory?
173
+ # TODO: Since the warning noise is expected to be high until some time after the release,
174
+ # warnings will only be issued when `RUBYOPT=-w` is specified.
175
+ # To proceed step by step, the next step is to remove `$VERBOSE` and always issue warning.
176
+ # Eventually, `project_root` will no longer be accepted.
177
+ if $VERBOSE
178
+ warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
179
+ Use config YAML file path instead of project root directory.
180
+ e.g., `path/to/config/default.yml`
181
+ MESSAGE
182
+ end
183
+ # NOTE: For compatibility.
184
+ project_root = config_yml_path
185
+ path = File.join(project_root, 'config', 'default.yml')
186
+ config = load_file(path)
187
+ else
188
+ hash = ConfigLoader.load_yaml_configuration(config_yml_path.to_s)
189
+ config = Config.new(hash, config_yml_path).tap(&:make_excludes_absolute)
190
+ end
191
+
192
+ @default_configuration = ConfigLoader.merge_with_default(config, path)
161
193
  end
194
+ # rubocop:enable Metrics/MethodLength
162
195
 
163
196
  # Returns the path RuboCop inferred as the root of the project. No file
164
197
  # searches will go past this directory.
@@ -192,6 +225,13 @@ module RuboCop
192
225
  resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
193
226
  end
194
227
 
228
+ # @api private
229
+ # Used to add plugins that were required inside a config or from
230
+ # the CLI using `--plugin`.
231
+ def add_loaded_plugins(loaded_plugins)
232
+ @loaded_plugins.merge(Array(loaded_plugins))
233
+ end
234
+
195
235
  # @api private
196
236
  # Used to add features that were required inside a config or from
197
237
  # the CLI using `--require`.