rubocop 1.67.0 → 1.82.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 (540) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +23 -19
  4. data/config/default.yml +403 -75
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +12 -3
  7. data/exe/rubocop +1 -8
  8. data/lib/rubocop/cached_data.rb +12 -4
  9. data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
  10. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  11. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  12. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  13. data/lib/rubocop/cli/command/version.rb +2 -2
  14. data/lib/rubocop/cli.rb +21 -5
  15. data/lib/rubocop/comment_config.rb +64 -19
  16. data/lib/rubocop/config.rb +52 -10
  17. data/lib/rubocop/config_loader.rb +58 -49
  18. data/lib/rubocop/config_loader_resolver.rb +43 -16
  19. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  20. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  21. data/lib/rubocop/config_obsoletion.rb +46 -2
  22. data/lib/rubocop/config_store.rb +5 -0
  23. data/lib/rubocop/config_validator.rb +25 -14
  24. data/lib/rubocop/cop/autocorrect_logic.rb +57 -28
  25. data/lib/rubocop/cop/base.rb +7 -1
  26. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  27. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  28. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +9 -19
  32. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
  33. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
  34. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  35. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  36. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  37. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
  38. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
  39. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  40. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  41. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +10 -5
  42. data/lib/rubocop/cop/generator.rb +6 -0
  43. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  44. data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
  45. data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
  46. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  47. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  48. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  49. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
  50. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  51. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  52. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
  53. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  54. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  55. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  56. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  57. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  58. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  59. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  60. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  61. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  62. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  63. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  64. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  65. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  66. data/lib/rubocop/cop/internal_affairs.rb +7 -16
  67. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  68. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  69. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  70. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  71. data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
  72. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  73. data/lib/rubocop/cop/layout/class_structure.rb +45 -10
  74. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  75. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  76. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  77. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  78. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +6 -3
  79. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
  80. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  81. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
  82. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  83. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  84. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  85. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
  86. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  87. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  88. data/lib/rubocop/cop/layout/end_alignment.rb +5 -1
  89. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  90. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
  91. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  92. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  93. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  94. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  95. data/lib/rubocop/cop/layout/hash_alignment.rb +10 -11
  96. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
  97. data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -4
  98. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  99. data/lib/rubocop/cop/layout/indentation_width.rb +20 -8
  100. data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
  101. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  102. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  103. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  104. data/lib/rubocop/cop/layout/line_length.rb +163 -11
  105. data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
  106. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  107. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  108. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  109. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -5
  110. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  111. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  112. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
  113. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  114. data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
  115. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -7
  116. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  117. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  118. data/lib/rubocop/cop/layout/space_after_comma.rb +3 -11
  119. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  120. data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -2
  121. data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -3
  122. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  123. data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
  124. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  125. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  126. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  127. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  128. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
  129. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  130. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
  131. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  132. data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
  133. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  134. data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
  135. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  136. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  137. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  138. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  139. data/lib/rubocop/cop/lint/circular_argument_reference.rb +51 -4
  140. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  141. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
  142. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  143. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
  144. data/lib/rubocop/cop/lint/debugger.rb +3 -5
  145. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  146. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
  147. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  148. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +5 -5
  149. data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
  150. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
  151. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  152. data/lib/rubocop/cop/lint/else_layout.rb +19 -0
  153. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  154. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  155. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  156. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  157. data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
  158. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  159. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  160. data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
  161. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  162. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  163. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  164. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  165. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  166. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  167. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  168. data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -10
  169. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  170. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +25 -7
  171. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
  172. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  173. data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
  174. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  175. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
  176. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  177. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +6 -2
  178. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  179. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  180. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  181. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  182. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  183. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
  184. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  185. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  186. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  187. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  188. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +23 -9
  189. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  190. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
  191. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -23
  192. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
  193. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -8
  194. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  195. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  196. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  197. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  198. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  199. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  200. data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
  201. data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
  202. data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
  203. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  204. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
  205. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
  206. data/lib/rubocop/cop/lint/self_assignment.rb +47 -15
  207. data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
  208. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  209. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
  210. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  211. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  212. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  213. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  214. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  215. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  216. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  217. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  218. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  219. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  220. data/lib/rubocop/cop/lint/unreachable_code.rb +54 -2
  221. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  222. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  223. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
  224. data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
  225. data/lib/rubocop/cop/lint/useless_assignment.rb +47 -17
  226. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  227. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  228. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  229. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  230. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  231. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
  232. data/lib/rubocop/cop/lint/useless_or.rb +111 -0
  233. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  234. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  235. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  236. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  237. data/lib/rubocop/cop/lint/void.rb +23 -12
  238. data/lib/rubocop/cop/message_annotator.rb +7 -3
  239. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  240. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  241. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  242. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  243. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  244. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  245. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  246. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  247. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  248. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +5 -4
  249. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
  250. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  251. data/lib/rubocop/cop/mixin/alignment.rb +3 -3
  252. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  253. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  254. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  255. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +47 -0
  256. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  257. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  258. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  259. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  260. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  261. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
  262. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  263. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  264. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  265. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
  266. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  267. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  268. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  269. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  270. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  271. data/lib/rubocop/cop/mixin/line_length_help.rb +48 -12
  272. data/lib/rubocop/cop/mixin/method_complexity.rb +3 -2
  273. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +8 -10
  274. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
  275. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  276. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  277. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  278. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  279. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
  280. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  281. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -8
  282. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  283. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  284. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  285. data/lib/rubocop/cop/mixin/trailing_comma.rb +28 -9
  286. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  287. data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
  288. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  289. data/lib/rubocop/cop/naming/file_name.rb +2 -4
  290. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
  291. data/lib/rubocop/cop/naming/method_name.rb +187 -15
  292. data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
  293. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
  294. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  295. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  296. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  297. data/lib/rubocop/cop/offense.rb +2 -3
  298. data/lib/rubocop/cop/registry.rb +9 -6
  299. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  300. data/lib/rubocop/cop/security/eval.rb +2 -1
  301. data/lib/rubocop/cop/security/json_load.rb +33 -11
  302. data/lib/rubocop/cop/security/open.rb +1 -0
  303. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  304. data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
  305. data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
  306. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  307. data/lib/rubocop/cop/style/and_or.rb +1 -1
  308. data/lib/rubocop/cop/style/arguments_forwarding.rb +57 -44
  309. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  310. data/lib/rubocop/cop/style/array_intersect.rb +115 -39
  311. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
  312. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -2
  313. data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
  314. data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
  315. data/lib/rubocop/cop/style/case_equality.rb +11 -13
  316. data/lib/rubocop/cop/style/case_like_if.rb +9 -12
  317. data/lib/rubocop/cop/style/class_and_module_children.rb +53 -11
  318. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  319. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  320. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  321. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  322. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  323. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  324. data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
  325. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  326. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  327. data/lib/rubocop/cop/style/conditional_assignment.rb +50 -42
  328. data/lib/rubocop/cop/style/constant_visibility.rb +19 -23
  329. data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
  330. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
  331. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  332. data/lib/rubocop/cop/style/documentation.rb +1 -1
  333. data/lib/rubocop/cop/style/double_negation.rb +5 -5
  334. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  335. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  336. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  337. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  338. data/lib/rubocop/cop/style/empty_method.rb +0 -6
  339. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  340. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  341. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  342. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  343. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  344. data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
  345. data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
  346. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  347. data/lib/rubocop/cop/style/file_null.rb +89 -0
  348. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  349. data/lib/rubocop/cop/style/float_division.rb +23 -5
  350. data/lib/rubocop/cop/style/for.rb +1 -1
  351. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  352. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  353. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  354. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  355. data/lib/rubocop/cop/style/guard_clause.rb +17 -14
  356. data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
  357. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  358. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  359. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  360. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  361. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  362. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  363. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  364. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
  365. data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
  366. data/lib/rubocop/cop/style/if_unless_modifier.rb +39 -12
  367. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  368. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
  369. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  370. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  371. data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
  372. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  373. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  374. data/lib/rubocop/cop/style/it_assignment.rb +93 -0
  375. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  376. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  377. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  378. data/lib/rubocop/cop/style/lambda.rb +1 -0
  379. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  380. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  381. data/lib/rubocop/cop/style/map_into_array.rb +11 -3
  382. data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
  383. data/lib/rubocop/cop/style/map_to_set.rb +4 -5
  384. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
  385. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +12 -1
  386. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +35 -4
  387. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  388. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  389. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  390. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  391. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  392. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  393. data/lib/rubocop/cop/style/module_member_existence_check.rb +74 -0
  394. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  395. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  396. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  397. data/lib/rubocop/cop/style/multiline_method_signature.rb +3 -13
  398. data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
  399. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  400. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  401. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  402. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  403. data/lib/rubocop/cop/style/next.rb +44 -0
  404. data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
  405. data/lib/rubocop/cop/style/not.rb +1 -1
  406. data/lib/rubocop/cop/style/object_then.rb +15 -15
  407. data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
  408. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  409. data/lib/rubocop/cop/style/operator_method_call.rb +16 -8
  410. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  411. data/lib/rubocop/cop/style/parallel_assignment.rb +43 -40
  412. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  413. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  414. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  415. data/lib/rubocop/cop/style/proc.rb +2 -2
  416. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  417. data/lib/rubocop/cop/style/raise_args.rb +15 -13
  418. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  419. data/lib/rubocop/cop/style/redundant_argument.rb +5 -1
  420. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  421. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  422. data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
  423. data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
  424. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  425. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  426. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  427. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  428. data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
  429. data/lib/rubocop/cop/style/redundant_format.rb +283 -0
  430. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
  431. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  432. data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
  433. data/lib/rubocop/cop/style/redundant_line_continuation.rb +55 -19
  434. data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
  435. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  436. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -0
  437. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  438. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
  439. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  440. data/lib/rubocop/cop/style/redundant_self.rb +15 -18
  441. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  442. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  443. data/lib/rubocop/cop/style/redundant_sort.rb +10 -10
  444. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  445. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  446. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  447. data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
  448. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  449. data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
  450. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  451. data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
  452. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  453. data/lib/rubocop/cop/style/semicolon.rb +24 -8
  454. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  455. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  456. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  457. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  458. data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
  459. data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
  460. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  461. data/lib/rubocop/cop/style/sole_nested_conditional.rb +75 -102
  462. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  463. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  464. data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
  465. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  466. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  467. data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
  468. data/lib/rubocop/cop/style/super_arguments.rb +68 -21
  469. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  470. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  471. data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
  472. data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
  473. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  474. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
  475. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  476. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  477. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  478. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +15 -15
  479. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  480. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  481. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  482. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  483. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  484. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  485. data/lib/rubocop/cop/team.rb +1 -1
  486. data/lib/rubocop/cop/util.rb +14 -8
  487. data/lib/rubocop/cop/utils/format_string.rb +20 -5
  488. data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
  489. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  490. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  491. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  492. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  493. data/lib/rubocop/cop/variable_force.rb +30 -19
  494. data/lib/rubocop/cops_documentation_generator.rb +54 -28
  495. data/lib/rubocop/directive_comment.rb +88 -11
  496. data/lib/rubocop/ext/regexp_node.rb +0 -1
  497. data/lib/rubocop/formatter/disabled_config_formatter.rb +21 -6
  498. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  499. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  500. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  501. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  502. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  503. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  504. data/lib/rubocop/lsp/diagnostic.rb +185 -0
  505. data/lib/rubocop/lsp/logger.rb +2 -2
  506. data/lib/rubocop/lsp/routes.rb +37 -24
  507. data/lib/rubocop/lsp/runtime.rb +18 -50
  508. data/lib/rubocop/lsp/server.rb +0 -2
  509. data/lib/rubocop/lsp/stdin_runner.rb +69 -0
  510. data/lib/rubocop/magic_comment.rb +31 -3
  511. data/lib/rubocop/options.rb +28 -12
  512. data/lib/rubocop/path_util.rb +15 -8
  513. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  514. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  515. data/lib/rubocop/plugin/load_error.rb +26 -0
  516. data/lib/rubocop/plugin/loader.rb +100 -0
  517. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  518. data/lib/rubocop/plugin.rb +46 -0
  519. data/lib/rubocop/rake_task.rb +5 -2
  520. data/lib/rubocop/remote_config.rb +7 -8
  521. data/lib/rubocop/result_cache.rb +61 -48
  522. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  523. data/lib/rubocop/rspec/expect_offense.rb +15 -5
  524. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  525. data/lib/rubocop/rspec/support.rb +4 -2
  526. data/lib/rubocop/runner.rb +35 -18
  527. data/lib/rubocop/server/cache.rb +51 -13
  528. data/lib/rubocop/server/cli.rb +2 -2
  529. data/lib/rubocop/server/client_command/base.rb +10 -0
  530. data/lib/rubocop/server/client_command/exec.rb +2 -1
  531. data/lib/rubocop/server/client_command/start.rb +11 -1
  532. data/lib/rubocop/target_finder.rb +14 -9
  533. data/lib/rubocop/target_ruby.rb +27 -3
  534. data/lib/rubocop/version.rb +53 -12
  535. data/lib/rubocop.rb +45 -2
  536. data/lib/ruby_lsp/rubocop/addon.rb +90 -0
  537. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
  538. metadata +92 -21
  539. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  540. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -22,37 +22,40 @@ module RuboCop
22
22
  class << self
23
23
  include FileFinder
24
24
 
25
- PENDING_BANNER = <<~BANNER
26
- The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
27
-
28
- Please also note that you can opt-in to new cops by default by adding this to your config:
29
- AllCops:
30
- NewCops: enable
31
- BANNER
32
-
33
25
  attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
34
- :ignore_unrecognized_cops
26
+ :ignore_unrecognized_cops, :cache_root
35
27
  attr_writer :default_configuration
36
- attr_reader :loaded_features
28
+ attr_reader :loaded_plugins, :loaded_features
37
29
 
38
30
  alias debug? debug
39
31
  alias ignore_parent_exclusion? ignore_parent_exclusion
40
32
 
41
33
  def clear_options
42
34
  @debug = nil
35
+ @loaded_plugins = Set.new
43
36
  @loaded_features = Set.new
37
+ @disable_pending_cops = nil
38
+ @enable_pending_cops = nil
39
+ @ignore_parent_exclusion = nil
40
+ @ignore_unrecognized_cops = nil
41
+ @cache_root = nil
44
42
  FileFinder.root_level = nil
45
43
  end
46
44
 
45
+ # rubocop:disable Metrics/AbcSize
47
46
  def load_file(file, check: true)
48
47
  path = file_path(file)
49
48
 
50
49
  hash = load_yaml_configuration(path)
51
50
 
51
+ rubocop_config = Config.create(hash, path, check: false)
52
+ plugins = hash.delete('plugins')
53
+ loaded_plugins = resolver.resolve_plugins(rubocop_config, plugins)
54
+ add_loaded_plugins(loaded_plugins)
55
+
52
56
  loaded_features = resolver.resolve_requires(path, hash)
53
57
  add_loaded_features(loaded_features)
54
58
 
55
- resolver.override_department_setting_for_cops({}, hash)
56
59
  resolver.resolve_inheritance_from_gems(hash)
57
60
  resolver.resolve_inheritance(path, hash, file, debug?)
58
61
  hash.delete('inherit_from')
@@ -63,6 +66,7 @@ module RuboCop
63
66
 
64
67
  Config.create(hash, path, check: check)
65
68
  end
69
+ # rubocop:enable Metrics/AbcSize
66
70
 
67
71
  def load_yaml_configuration(absolute_path)
68
72
  file_contents = read_file(absolute_path)
@@ -72,7 +76,9 @@ module RuboCop
72
76
 
73
77
  puts "configuration from #{absolute_path}" if debug?
74
78
 
75
- raise(TypeError, "Malformed configuration in #{absolute_path}") unless hash.is_a?(Hash)
79
+ unless hash.is_a?(Hash)
80
+ raise(ValidationError, "Malformed configuration in #{absolute_path}")
81
+ end
76
82
 
77
83
  hash
78
84
  end
@@ -80,8 +86,12 @@ module RuboCop
80
86
  def add_missing_namespaces(path, hash)
81
87
  # Using `hash.each_key` will cause the
82
88
  # `can't add a new key into hash during iteration` error
89
+ obsoletion = ConfigObsoletion.new(hash)
90
+
83
91
  hash_keys = hash.keys
84
92
  hash_keys.each do |key|
93
+ next if obsoletion.deprecated_cop_name?(key)
94
+
85
95
  q = Cop::Registry.qualified_cop_name(key, path)
86
96
  next if q == key
87
97
 
@@ -117,21 +127,7 @@ module RuboCop
117
127
  add_excludes_from_files(config, config_file)
118
128
  end
119
129
 
120
- merge_with_default(config, config_file).tap do |merged_config|
121
- unless possible_new_cops?(merged_config)
122
- pending_cops = pending_cops_only_qualified(merged_config.pending_cops)
123
- warn_on_pending_cops(pending_cops) unless pending_cops.empty?
124
- end
125
- end
126
- end
127
-
128
- def pending_cops_only_qualified(pending_cops)
129
- pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
130
- end
131
-
132
- def possible_new_cops?(config)
133
- disable_pending_cops || enable_pending_cops ||
134
- config.disabled_new_cops? || config.enabled_new_cops?
130
+ merge_with_default(config, config_file)
135
131
  end
136
132
 
137
133
  def add_excludes_from_files(config, config_file)
@@ -151,14 +147,35 @@ module RuboCop
151
147
  end
152
148
  end
153
149
 
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
150
+ # This API is primarily intended for testing and documenting plugins.
151
+ # When testing a plugin using `rubocop/rspec/support`, the plugin is loaded automatically,
152
+ # so this API is usually not needed. It is intended to be used only when implementing tests
153
+ # that do not use `rubocop/rspec/support`.
154
+ # rubocop:disable Metrics/MethodLength
155
+ def inject_defaults!(config_yml_path)
156
+ if Pathname(config_yml_path).directory?
157
+ # TODO: Since the warning noise is expected to be high until some time after the release,
158
+ # warnings will only be issued when `RUBYOPT=-w` is specified.
159
+ # To proceed step by step, the next step is to remove `$VERBOSE` and always issue warning.
160
+ # Eventually, `project_root` will no longer be accepted.
161
+ if $VERBOSE
162
+ warn Rainbow(<<~MESSAGE).yellow, uplevel: 1
163
+ Use config YAML file path instead of project root directory.
164
+ e.g., `path/to/config/default.yml`
165
+ MESSAGE
166
+ end
167
+ # NOTE: For compatibility.
168
+ project_root = config_yml_path
169
+ path = File.join(project_root, 'config', 'default.yml')
170
+ config = load_file(path)
171
+ else
172
+ hash = ConfigLoader.load_yaml_configuration(config_yml_path.to_s)
173
+ config = Config.new(hash, config_yml_path).tap(&:make_excludes_absolute)
174
+ end
175
+
176
+ @default_configuration = ConfigLoader.merge_with_default(config, path)
161
177
  end
178
+ # rubocop:enable Metrics/MethodLength
162
179
 
163
180
  # Returns the path RuboCop inferred as the root of the project. No file
164
181
  # searches will go past this directory.
@@ -172,26 +189,18 @@ module RuboCop
172
189
  ConfigFinder.project_root
173
190
  end
174
191
 
175
- def warn_on_pending_cops(pending_cops)
176
- warn Rainbow(PENDING_BANNER).yellow
177
-
178
- pending_cops.each { |cop| warn_pending_cop cop }
179
-
180
- warn Rainbow('For more information: https://docs.rubocop.org/rubocop/versioning.html').yellow
181
- end
182
-
183
- def warn_pending_cop(cop)
184
- version = cop.metadata['VersionAdded'] || 'N/A'
185
-
186
- warn Rainbow("#{cop.name}: # new in #{version}").yellow
187
- warn Rainbow(' Enabled: true').yellow
188
- end
189
-
190
192
  # Merges the given configuration with the default one.
191
193
  def merge_with_default(config, config_file, unset_nil: true)
192
194
  resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
193
195
  end
194
196
 
197
+ # @api private
198
+ # Used to add plugins that were required inside a config or from
199
+ # the CLI using `--plugin`.
200
+ def add_loaded_plugins(loaded_plugins)
201
+ @loaded_plugins.merge(Array(loaded_plugins))
202
+ end
203
+
195
204
  # @api private
196
205
  # Used to add features that were required inside a config or from
197
206
  # the CLI using `--require`.
@@ -2,16 +2,35 @@
2
2
 
3
3
  require 'pathname'
4
4
  require 'yaml'
5
+ require_relative 'plugin'
5
6
 
6
7
  module RuboCop
7
8
  # A help class for ConfigLoader that handles configuration resolution.
8
9
  # @api private
9
10
  class ConfigLoaderResolver # rubocop:disable Metrics/ClassLength
11
+ def resolve_plugins(rubocop_config, plugins)
12
+ plugins = Array(plugins) - ConfigLoader.loaded_plugins.map { |plugin| plugin.about.name }
13
+ return if plugins.empty?
14
+
15
+ Plugin.integrate_plugins(rubocop_config, plugins)
16
+ end
17
+
10
18
  def resolve_requires(path, hash)
11
19
  config_dir = File.dirname(path)
12
20
  hash.delete('require').tap do |loaded_features|
13
21
  Array(loaded_features).each do |feature|
14
- FeatureLoader.load(config_directory_path: config_dir, feature: feature)
22
+ if Plugin.plugin_capable?(feature)
23
+ # NOTE: Compatibility for before plugins style.
24
+ warn Rainbow(<<~MESSAGE).yellow
25
+ #{feature} extension supports plugin, specify `plugins: #{feature}` instead of `require: #{feature}` in #{path}.
26
+ For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
27
+ MESSAGE
28
+ rubocop_config = Config.create(hash, path, check: false)
29
+
30
+ resolve_plugins(rubocop_config, feature)
31
+ else
32
+ FeatureLoader.load(config_directory_path: config_dir, feature: feature)
33
+ end
15
34
  end
16
35
  end
17
36
  end
@@ -105,7 +124,7 @@ module RuboCop
105
124
  elsif merge_hashes?(base_hash, derived_hash, key)
106
125
  result[key] = merge(base_hash[key], derived_hash[key], **opts)
107
126
  elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
108
- result[key] = base_hash[key] | derived_hash[key]
127
+ result[key] = Array(base_hash[key]) | Array(derived_hash[key])
109
128
  elsif opts[:debug]
110
129
  warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
111
130
  end
@@ -157,20 +176,27 @@ module RuboCop
157
176
  return false if inherited_file.nil? # Not inheritance resolving merge
158
177
  return false if inherited_file.start_with?('..') # Legitimate override
159
178
  return false if base_hash[key] == derived_hash[key] # Same value
160
- return false if remote_file?(inherited_file) # Can't change
179
+ return false if PathUtil.remote_file?(inherited_file) # Can't change
161
180
 
162
181
  Gem.path.none? { |dir| inherited_file.start_with?(dir) } # Can change?
163
182
  end
164
183
 
165
184
  def warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
185
+ # If the file being considered is remote, don't bother checking for duplicates
186
+ return if remote_config?(opts[:file])
187
+
166
188
  return unless duplicate_setting?(base_hash, derived_hash, key, opts[:inherited_file])
167
189
 
168
190
  inherit_mode = opts[:inherit_mode]['merge'] || opts[:inherit_mode]['override']
169
191
  return if base_hash[key].is_a?(Array) && inherit_mode&.include?(key)
170
192
 
171
- puts "#{PathUtil.smart_path(opts[:file])}: " \
172
- "#{opts[:cop_name]}:#{key} overrides " \
173
- "the same parameter in #{opts[:inherited_file]}"
193
+ puts duplicate_setting_warning(opts, key)
194
+ end
195
+
196
+ def duplicate_setting_warning(opts, key)
197
+ "#{PathUtil.smart_path(opts[:file])}: " \
198
+ "#{opts[:cop_name]}:#{key} overrides " \
199
+ "the same parameter in #{opts[:inherited_file]}"
174
200
  end
175
201
 
176
202
  def determine_inherit_mode(hash, key)
@@ -180,7 +206,7 @@ module RuboCop
180
206
  end
181
207
 
182
208
  def should_union?(derived_hash, base_hash, root_mode, key)
183
- return false unless base_hash[key].is_a?(Array)
209
+ return false unless base_hash[key].is_a?(Array) || derived_hash[key].is_a?(Array)
184
210
 
185
211
  derived_mode = derived_hash['inherit_mode']
186
212
  return false if should_override?(derived_mode, key)
@@ -218,9 +244,9 @@ module RuboCop
218
244
  end
219
245
 
220
246
  def inherited_file(path, inherit_from, file)
221
- if remote_file?(inherit_from)
247
+ if PathUtil.remote_file?(inherit_from)
222
248
  # A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
223
- RemoteConfig.new(inherit_from, File.dirname(path))
249
+ RemoteConfig.new(inherit_from, ConfigLoader.cache_root)
224
250
  elsif Pathname.new(inherit_from).absolute?
225
251
  # An absolute path to a config, e.g. `inherit_from: /Users/me/rubocop.yml`.
226
252
  # The path may come from `inherit_gem` option, where a gem name is expanded
@@ -230,7 +256,7 @@ module RuboCop
230
256
  elsif file.is_a?(RemoteConfig)
231
257
  # A path relative to a URL, e.g. `inherit_from: configs/default.yml`
232
258
  # in a config included with `inherit_from: http://example.com/rubocop.yml`
233
- file.inherit_from_remote(inherit_from, path)
259
+ file.inherit_from_remote(inherit_from)
234
260
  else
235
261
  # A local relative path, e.g. `inherit_from: default.yml`
236
262
  print 'Inheriting ' if ConfigLoader.debug?
@@ -238,8 +264,8 @@ module RuboCop
238
264
  end
239
265
  end
240
266
 
241
- def remote_file?(uri)
242
- uri.start_with?('http://', 'https://')
267
+ def remote_config?(file)
268
+ file.is_a?(RemoteConfig)
243
269
  end
244
270
 
245
271
  def handle_disabled_by_default(config, new_default_configuration)
@@ -269,10 +295,11 @@ module RuboCop
269
295
  begin
270
296
  gem = Bundler.load.specs[gem_name].first
271
297
  gem_path = gem.full_gem_path if gem
272
- rescue Bundler::GemfileNotFound
273
- # No Gemfile found. Bundler may be loaded manually
274
- rescue Bundler::GitError
275
- # The Gemfile exists but contains an uninstalled git source
298
+ rescue StandardError
299
+ # The Gemfile has a problem, which could be one of:
300
+ # - No Gemfile found. Bundler may be loaded manually
301
+ # - The Gemfile exists but contains an uninstalled git source
302
+ # - The Gemfile exists but cannot be loaded for some other reason
276
303
  end
277
304
  end
278
305
 
@@ -15,7 +15,7 @@ module RuboCop
15
15
  end
16
16
 
17
17
  def violated?
18
- return false if feature_loaded?
18
+ return false if plugin_loaded?
19
19
 
20
20
  affected_cops.any?
21
21
  end
@@ -38,8 +38,9 @@ module RuboCop
38
38
  end
39
39
  end
40
40
 
41
- def feature_loaded?
42
- config.loaded_features.include?(gem)
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)
43
44
  end
44
45
  end
45
46
  end
@@ -6,17 +6,28 @@ module RuboCop
6
6
  # a cop or moving it to a new department.
7
7
  # @api private
8
8
  class RenamedCop < CopRule
9
- attr_reader :new_name
9
+ attr_reader :new_name, :metadata
10
10
 
11
- def initialize(config, old_name, new_name)
11
+ def initialize(config, old_name, name_or_hash)
12
12
  super(config, old_name)
13
- @new_name = new_name
13
+
14
+ if name_or_hash.is_a?(Hash)
15
+ @metadata = name_or_hash
16
+ @new_name = name_or_hash['new_name']
17
+ else
18
+ @metadata = {}
19
+ @new_name = name_or_hash
20
+ end
14
21
  end
15
22
 
16
23
  def rule_message
17
24
  "The `#{old_name}` cop has been #{verb} to `#{new_name}`."
18
25
  end
19
26
 
27
+ def warning?
28
+ severity == 'warning'
29
+ end
30
+
20
31
  private
21
32
 
22
33
  def moved?
@@ -29,6 +40,10 @@ module RuboCop
29
40
  def verb
30
41
  moved? ? 'moved' : 'renamed'
31
42
  end
43
+
44
+ def severity
45
+ metadata['severity']
46
+ end
32
47
  end
33
48
  end
34
49
  end
@@ -23,9 +23,40 @@ module RuboCop
23
23
  class << self
24
24
  attr_accessor :files
25
25
 
26
+ def global
27
+ @global ||= new(Config.new)
28
+ end
29
+
30
+ def reset!
31
+ @global = nil
32
+ @deprecated_names = {}
33
+ LOAD_RULES_CACHE[rules_cache_key] = nil
34
+ end
35
+
36
+ def rules_cache_key
37
+ files.hash
38
+ end
39
+
26
40
  def legacy_cop_names
27
41
  # Used by DepartmentName#qualified_legacy_cop_name
28
- new(Config.new).rules.select(&:cop_rule?).map(&:old_name)
42
+ global.legacy_cop_names
43
+ end
44
+
45
+ def deprecated_cop_name?(name)
46
+ global.deprecated_cop_name?(name)
47
+ end
48
+
49
+ def deprecated_names_for(cop)
50
+ @deprecated_names ||= {}
51
+ return @deprecated_names[cop] if @deprecated_names.key?(cop)
52
+
53
+ @deprecated_names[cop] = global.rules.filter_map do |rule|
54
+ next unless rule.cop_rule?
55
+ next unless rule.respond_to?(:new_name)
56
+ next unless rule.new_name == cop
57
+
58
+ rule.old_name
59
+ end
29
60
  end
30
61
  end
31
62
 
@@ -45,12 +76,21 @@ module RuboCop
45
76
  raise ValidationError, messages.join("\n")
46
77
  end
47
78
 
79
+ def legacy_cop_names
80
+ # Used by DepartmentName#qualified_legacy_cop_name
81
+ cop_rules.map(&:old_name)
82
+ end
83
+
84
+ def deprecated_cop_name?(name)
85
+ legacy_cop_names.include?(name)
86
+ end
87
+
48
88
  private
49
89
 
50
90
  # Default rules for obsoletions are in config/obsoletion.yml
51
91
  # Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename`
52
92
  def load_rules # rubocop:disable Metrics/AbcSize
53
- rules = LOAD_RULES_CACHE[self.class.files] ||=
93
+ rules = LOAD_RULES_CACHE[self.class.rules_cache_key] ||=
54
94
  self.class.files.each_with_object({}) do |filename, hash|
55
95
  hash.merge!(YAML.safe_load(File.read(filename)) || {}) do |_key, first, second|
56
96
  case first
@@ -107,5 +147,9 @@ module RuboCop
107
147
  rule.message
108
148
  end
109
149
  end
150
+
151
+ def cop_rules
152
+ rules.select(&:cop_rule?)
153
+ end
110
154
  end
111
155
  end
@@ -25,6 +25,11 @@ module RuboCop
25
25
  @validated = true
26
26
  end
27
27
 
28
+ def apply_options!(options)
29
+ self.options_config = options[:config] if options[:config]
30
+ force_default_config! if options[:force_default_config]
31
+ end
32
+
28
33
  def options_config=(options_config)
29
34
  loaded_config = ConfigLoader.load_file(options_config)
30
35
  @options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
@@ -3,21 +3,22 @@
3
3
  module RuboCop
4
4
  # Handles validation of configuration, for example cop names, parameter
5
5
  # names, and Ruby versions.
6
+ # rubocop:disable Metrics/ClassLength
6
7
  class ConfigValidator
7
8
  extend SimpleForwardable
8
9
 
9
10
  # @api private
10
11
  COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
11
- Enabled].freeze
12
+ Enabled Reference References].freeze
12
13
  # @api private
13
14
  INTERNAL_PARAMS = %w[Description StyleGuide
14
15
  VersionAdded VersionChanged VersionRemoved
15
- Reference Safe SafeAutoCorrect].freeze
16
+ Reference References Safe SafeAutoCorrect].freeze
16
17
  # @api private
17
18
  NEW_COPS_VALUES = %w[pending disable enable].freeze
18
19
 
19
20
  # @api private
20
- CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
21
+ CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
21
22
  CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
22
23
  CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
23
24
  private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
@@ -41,8 +42,9 @@ module RuboCop
41
42
  ConfigLoader.default_configuration.key?(key)
42
43
  end
43
44
 
44
- check_obsoletions
45
+ validate_parameter_shape(valid_cop_names)
45
46
 
47
+ check_obsoletions
46
48
  alert_about_unrecognized_cops(invalid_cop_names)
47
49
  validate_new_cops_parameter
48
50
  validate_parameter_names(valid_cop_names)
@@ -64,12 +66,6 @@ module RuboCop
64
66
  target_ruby.version
65
67
  end
66
68
 
67
- def validate_section_presence(name)
68
- return unless @config.key?(name) && @config[name].nil?
69
-
70
- raise ValidationError, "empty section #{name} found in #{smart_loaded_path}"
71
- end
72
-
73
69
  private
74
70
 
75
71
  attr_reader :target_ruby
@@ -122,6 +118,7 @@ module RuboCop
122
118
  invalid_cop_names.each do |name|
123
119
  # There could be a custom cop with this name. If so, don't warn
124
120
  next if Cop::Registry.global.contains_cop_matching?([name])
121
+ next if ConfigObsoletion.deprecated_cop_name?(name)
125
122
 
126
123
  # Special case for inherit_mode, which is a directive that we keep in
127
124
  # the configuration (even though it's not a cop), because it's easier
@@ -177,9 +174,22 @@ module RuboCop
177
174
  raise ValidationError, message
178
175
  end
179
176
 
177
+ def validate_parameter_shape(valid_cop_names)
178
+ valid_cop_names.each do |name|
179
+ if @config[name].nil?
180
+ raise ValidationError, "empty section #{name.inspect} found in #{smart_loaded_path}"
181
+ elsif !@config[name].is_a?(Hash)
182
+ raise ValidationError, <<~MESSAGE
183
+ The configuration for #{name.inspect} in #{smart_loaded_path} is not a Hash.
184
+
185
+ Found: #{@config[name].inspect}
186
+ MESSAGE
187
+ end
188
+ end
189
+ end
190
+
180
191
  def validate_parameter_names(valid_cop_names)
181
192
  valid_cop_names.each do |name|
182
- validate_section_presence(name)
183
193
  each_invalid_parameter(name) do |param, supported_params|
184
194
  warn Rainbow(<<~MESSAGE).yellow
185
195
  Warning: #{name} does not support #{param} parameter.
@@ -250,8 +260,7 @@ module RuboCop
250
260
  end
251
261
  end
252
262
 
253
- # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
254
- def check_cop_config_value(hash, parent = nil)
263
+ def check_cop_config_value(hash, parent = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
255
264
  hash.each do |key, value|
256
265
  check_cop_config_value(value, key) if value.is_a?(Hash)
257
266
 
@@ -261,6 +270,8 @@ module RuboCop
261
270
  supposed_values = 'a boolean'
262
271
  elsif key == 'AutoCorrect' && !CONFIG_CHECK_AUTOCORRECTS.include?(value)
263
272
  supposed_values = '`always`, `contextual`, `disabled`, or a boolean'
273
+ elsif key == 'References'
274
+ supposed_values = 'an array of strings'
264
275
  else
265
276
  next
266
277
  end
@@ -268,7 +279,6 @@ module RuboCop
268
279
  raise ValidationError, param_error_message(parent, key, value, supposed_values)
269
280
  end
270
281
  end
271
- # rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
272
282
 
273
283
  # FIXME: Handling colors in exception messages like this is ugly.
274
284
  def param_error_message(parent, key, value, supposed_values)
@@ -277,4 +287,5 @@ module RuboCop
277
287
  "is supposed to be #{supposed_values} and #{Rainbow(value).yellow} is not."
278
288
  end
279
289
  end
290
+ # rubocop:enable Metrics/ClassLength
280
291
  end