rubocop 1.81.7 → 1.92.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 (621) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +626 -111
  5. data/config/obsoletion.yml +39 -1
  6. data/exe/rubocop +1 -1
  7. data/lib/rubocop/cache_config.rb +29 -0
  8. data/lib/rubocop/cached_data.rb +50 -5
  9. data/lib/rubocop/changed_files.rb +134 -0
  10. data/lib/rubocop/cli/command/auto_generate_config.rb +34 -2
  11. data/lib/rubocop/cli/command/cop_names.rb +57 -0
  12. data/lib/rubocop/cli/command/execute_runner.rb +54 -3
  13. data/lib/rubocop/cli/command/explain.rb +34 -0
  14. data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
  15. data/lib/rubocop/cli/command/lsp.rb +1 -1
  16. data/lib/rubocop/cli/command/mcp.rb +19 -0
  17. data/lib/rubocop/cli/command/show_cops.rb +8 -2
  18. data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
  19. data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
  20. data/lib/rubocop/cli.rb +41 -14
  21. data/lib/rubocop/comment_config/directive_range.rb +34 -0
  22. data/lib/rubocop/comment_config/disable_next.rb +143 -0
  23. data/lib/rubocop/comment_config/push_pop.rb +55 -0
  24. data/lib/rubocop/comment_config.rb +97 -44
  25. data/lib/rubocop/config.rb +100 -15
  26. data/lib/rubocop/config_finder.rb +1 -1
  27. data/lib/rubocop/config_loader.rb +49 -27
  28. data/lib/rubocop/config_loader_resolver.rb +95 -20
  29. data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
  30. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
  31. data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
  32. data/lib/rubocop/config_obsoletion.rb +1 -1
  33. data/lib/rubocop/config_store.rb +2 -2
  34. data/lib/rubocop/config_validator.rb +69 -7
  35. data/lib/rubocop/cop/autocorrect_logic.rb +24 -6
  36. data/lib/rubocop/cop/badge.rb +10 -2
  37. data/lib/rubocop/cop/base.rb +128 -35
  38. data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
  39. data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
  40. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -10
  41. data/lib/rubocop/cop/bundler.rb +19 -0
  42. data/lib/rubocop/cop/commissioner.rb +13 -11
  43. data/lib/rubocop/cop/cop_documentation.rb +81 -0
  44. data/lib/rubocop/cop/cop_explanation.rb +140 -0
  45. data/lib/rubocop/cop/corrector.rb +4 -4
  46. data/lib/rubocop/cop/correctors/alignment_corrector.rb +87 -9
  47. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  48. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
  49. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  50. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +31 -4
  51. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -5
  52. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
  53. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +70 -2
  54. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  55. data/lib/rubocop/cop/correctors.rb +28 -0
  56. data/lib/rubocop/cop/documentation.rb +3 -4
  57. data/lib/rubocop/cop/exclude_limit.rb +31 -5
  58. data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
  59. data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
  60. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +14 -4
  61. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -8
  62. data/lib/rubocop/cop/gemspec/require_mfa.rb +9 -6
  63. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
  64. data/lib/rubocop/cop/gemspec.rb +22 -0
  65. data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
  66. data/lib/rubocop/cop/generator.rb +5 -1
  67. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
  68. data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
  69. data/lib/rubocop/cop/internal_affairs/location_exists.rb +28 -2
  70. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
  71. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +12 -16
  72. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
  73. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
  74. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +0 -7
  75. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
  76. data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
  77. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
  78. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
  79. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
  80. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  81. data/lib/rubocop/cop/layout/argument_alignment.rb +9 -3
  82. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  83. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
  84. data/lib/rubocop/cop/layout/block_alignment.rb +84 -4
  85. data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
  86. data/lib/rubocop/cop/layout/class_structure.rb +156 -41
  87. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
  88. data/lib/rubocop/cop/layout/condition_position.rb +13 -3
  89. data/lib/rubocop/cop/layout/def_end_alignment.rb +4 -0
  90. data/lib/rubocop/cop/layout/dot_position.rb +26 -16
  91. data/lib/rubocop/cop/layout/else_alignment.rb +2 -14
  92. data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
  93. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +25 -7
  94. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
  95. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
  96. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +15 -2
  97. data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
  98. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
  99. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
  100. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +21 -5
  101. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
  102. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
  103. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
  104. data/lib/rubocop/cop/layout/end_alignment.rb +23 -15
  105. data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
  106. data/lib/rubocop/cop/layout/first_argument_indentation.rb +81 -2
  107. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
  108. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +41 -0
  109. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -23
  110. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
  111. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
  112. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
  113. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
  114. data/lib/rubocop/cop/layout/hash_alignment.rb +16 -11
  115. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +8 -4
  116. data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
  117. data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
  118. data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
  119. data/lib/rubocop/cop/layout/indentation_width.rb +158 -12
  120. data/lib/rubocop/cop/layout/leading_comment_space.rb +27 -0
  121. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
  122. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
  123. data/lib/rubocop/cop/layout/line_length.rb +265 -29
  124. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
  125. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
  126. data/lib/rubocop/cop/layout/multiline_block_layout.rb +10 -1
  127. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +65 -56
  128. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
  129. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +268 -38
  130. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  131. data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
  132. data/lib/rubocop/cop/layout/redundant_line_break.rb +102 -2
  133. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +19 -5
  134. data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
  135. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
  136. data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
  137. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  138. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
  139. data/lib/rubocop/cop/layout/space_around_keyword.rb +14 -2
  140. data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
  141. data/lib/rubocop/cop/layout/space_before_block_braces.rb +4 -1
  142. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
  143. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
  144. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +44 -34
  145. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +31 -8
  146. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
  147. data/lib/rubocop/cop/layout.rb +114 -0
  148. data/lib/rubocop/cop/lazy_loader.rb +41 -0
  149. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
  150. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
  151. data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
  152. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
  153. data/lib/rubocop/cop/lint/ambiguous_range.rb +1 -2
  154. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
  155. data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
  156. data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
  157. data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -3
  158. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
  159. data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
  160. data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
  161. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +165 -15
  162. data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
  163. data/lib/rubocop/cop/lint/debugger.rb +13 -2
  164. data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
  165. data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
  166. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
  167. data/lib/rubocop/cop/lint/duplicate_methods.rb +405 -28
  168. data/lib/rubocop/cop/lint/else_layout.rb +19 -0
  169. data/lib/rubocop/cop/lint/empty_block.rb +4 -4
  170. data/lib/rubocop/cop/lint/empty_conditional_body.rb +9 -2
  171. data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
  172. data/lib/rubocop/cop/lint/empty_when.rb +8 -1
  173. data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
  174. data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -2
  175. data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
  176. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
  177. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  178. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
  179. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
  180. data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
  181. data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
  182. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  183. data/lib/rubocop/cop/lint/literal_as_condition.rb +36 -9
  184. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
  185. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
  186. data/lib/rubocop/cop/lint/loop.rb +24 -2
  187. data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
  188. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +46 -18
  189. data/lib/rubocop/cop/lint/missing_super.rb +31 -1
  190. data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
  191. data/lib/rubocop/cop/lint/name_typo.rb +270 -0
  192. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  193. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
  194. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
  195. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
  196. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  197. data/lib/rubocop/cop/lint/number_conversion.rb +22 -11
  198. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  199. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +10 -0
  200. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
  201. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
  202. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
  203. data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
  204. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  205. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
  206. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
  207. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
  208. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -4
  209. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +37 -14
  210. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
  211. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +11 -5
  212. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -3
  213. data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -0
  214. data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
  215. data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
  216. data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
  217. data/lib/rubocop/cop/lint/require_range_parentheses.rb +2 -1
  218. data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
  219. data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
  220. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +24 -0
  221. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +56 -6
  222. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  223. data/lib/rubocop/cop/lint/script_permission.rb +5 -1
  224. data/lib/rubocop/cop/lint/self_assignment.rb +33 -2
  225. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
  226. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  227. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +14 -0
  228. data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -1
  229. data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
  230. data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
  231. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +13 -2
  232. data/lib/rubocop/cop/lint/symbol_conversion.rb +22 -4
  233. data/lib/rubocop/cop/lint/syntax.rb +25 -1
  234. data/lib/rubocop/cop/lint/to_enum_arguments.rb +72 -4
  235. data/lib/rubocop/cop/lint/to_json.rb +20 -17
  236. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  237. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
  238. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +54 -11
  239. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
  240. data/lib/rubocop/cop/lint/unreachable_code.rb +15 -9
  241. data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
  242. data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
  243. data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
  244. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -2
  245. data/lib/rubocop/cop/lint/useless_assignment.rb +61 -27
  246. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +40 -4
  247. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
  248. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  249. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +10 -10
  250. data/lib/rubocop/cop/lint/useless_or.rb +15 -2
  251. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -2
  252. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +10 -4
  253. data/lib/rubocop/cop/lint/useless_setter_call.rb +11 -5
  254. data/lib/rubocop/cop/lint/useless_times.rb +22 -1
  255. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +94 -14
  256. data/lib/rubocop/cop/lint/void.rb +59 -22
  257. data/lib/rubocop/cop/lint.rb +179 -0
  258. data/lib/rubocop/cop/metrics/block_length.rb +1 -1
  259. data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
  260. data/lib/rubocop/cop/metrics/class_length.rb +4 -2
  261. data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
  262. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
  263. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  264. data/lib/rubocop/cop/metrics/module_length.rb +4 -2
  265. data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
  266. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
  267. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  268. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
  269. data/lib/rubocop/cop/metrics.rb +31 -0
  270. data/lib/rubocop/cop/migration/department_name.rb +11 -5
  271. data/lib/rubocop/cop/migration.rb +13 -0
  272. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  273. data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
  274. data/lib/rubocop/cop/mixin/allowed_pattern.rb +5 -1
  275. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
  276. data/lib/rubocop/cop/mixin/check_line_breakable.rb +47 -25
  277. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +12 -8
  278. data/lib/rubocop/cop/mixin/code_length.rb +10 -2
  279. data/lib/rubocop/cop/mixin/comments_help.rb +1 -2
  280. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
  281. data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
  282. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -1
  283. data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
  284. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
  285. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +2 -2
  286. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +5 -1
  287. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +58 -12
  288. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +37 -10
  289. data/lib/rubocop/cop/mixin/hash_subset.rb +9 -2
  290. data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
  291. data/lib/rubocop/cop/mixin/hash_transform_method.rb +14 -60
  292. data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
  293. data/lib/rubocop/cop/mixin/line_length_help.rb +28 -3
  294. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  295. data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
  296. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
  297. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  298. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
  299. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  300. data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
  301. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
  302. data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
  303. data/lib/rubocop/cop/mixin/range_help.rb +1 -2
  304. data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
  305. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
  306. data/lib/rubocop/cop/mixin/statement_modifier.rb +69 -12
  307. data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -6
  308. data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
  309. data/lib/rubocop/cop/mixin.rb +93 -0
  310. data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
  311. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
  312. data/lib/rubocop/cop/naming/block_forwarding.rb +4 -1
  313. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  314. data/lib/rubocop/cop/naming/file_name.rb +4 -3
  315. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
  316. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
  317. data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
  318. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -5
  319. data/lib/rubocop/cop/naming/method_name.rb +6 -3
  320. data/lib/rubocop/cop/naming/predicate_method.rb +13 -2
  321. data/lib/rubocop/cop/naming/predicate_prefix.rb +30 -17
  322. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -7
  323. data/lib/rubocop/cop/naming/variable_number.rb +3 -1
  324. data/lib/rubocop/cop/naming.rb +31 -0
  325. data/lib/rubocop/cop/offense.rb +108 -9
  326. data/lib/rubocop/cop/registry.rb +232 -66
  327. data/lib/rubocop/cop/security/eval.rb +15 -2
  328. data/lib/rubocop/cop/security/io_methods.rb +2 -2
  329. data/lib/rubocop/cop/security/json_load.rb +16 -4
  330. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  331. data/lib/rubocop/cop/security.rb +19 -0
  332. data/lib/rubocop/cop/severity.rb +12 -0
  333. data/lib/rubocop/cop/style/access_modifier_declarations.rb +55 -8
  334. data/lib/rubocop/cop/style/accessor_grouping.rb +16 -5
  335. data/lib/rubocop/cop/style/alias.rb +33 -8
  336. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
  337. data/lib/rubocop/cop/style/and_or.rb +8 -3
  338. data/lib/rubocop/cop/style/arguments_forwarding.rb +61 -17
  339. data/lib/rubocop/cop/style/array_first_last.rb +13 -3
  340. data/lib/rubocop/cop/style/array_intersect.rb +28 -5
  341. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +3 -0
  342. data/lib/rubocop/cop/style/array_join.rb +4 -2
  343. data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
  344. data/lib/rubocop/cop/style/attr.rb +8 -6
  345. data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
  346. data/lib/rubocop/cop/style/begin_block.rb +3 -1
  347. data/lib/rubocop/cop/style/bitwise_predicate.rb +7 -6
  348. data/lib/rubocop/cop/style/block_delimiters.rb +74 -38
  349. data/lib/rubocop/cop/style/case_equality.rb +29 -15
  350. data/lib/rubocop/cop/style/case_like_if.rb +11 -10
  351. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  352. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -35
  353. data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
  354. data/lib/rubocop/cop/style/class_methods_definitions.rb +26 -5
  355. data/lib/rubocop/cop/style/collection_compact.rb +37 -17
  356. data/lib/rubocop/cop/style/collection_querying.rb +79 -46
  357. data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
  358. data/lib/rubocop/cop/style/combinable_loops.rb +91 -9
  359. data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
  360. data/lib/rubocop/cop/style/concat_array_literals.rb +65 -9
  361. data/lib/rubocop/cop/style/conditional_assignment.rb +34 -18
  362. data/lib/rubocop/cop/style/constant_visibility.rb +13 -7
  363. data/lib/rubocop/cop/style/copyright.rb +27 -12
  364. data/lib/rubocop/cop/style/data_inheritance.rb +18 -0
  365. data/lib/rubocop/cop/style/date_time.rb +4 -4
  366. data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -2
  367. data/lib/rubocop/cop/style/dig_chain.rb +5 -0
  368. data/lib/rubocop/cop/style/dir_empty.rb +4 -0
  369. data/lib/rubocop/cop/style/directive_scope.rb +304 -0
  370. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +184 -20
  371. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
  372. data/lib/rubocop/cop/style/documentation.rb +53 -6
  373. data/lib/rubocop/cop/style/documentation_method.rb +8 -12
  374. data/lib/rubocop/cop/style/double_negation.rb +11 -0
  375. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  376. data/lib/rubocop/cop/style/each_with_object.rb +2 -0
  377. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  378. data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
  379. data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
  380. data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
  381. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  382. data/lib/rubocop/cop/style/empty_literal.rb +8 -3
  383. data/lib/rubocop/cop/style/empty_method.rb +15 -9
  384. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +74 -22
  385. data/lib/rubocop/cop/style/encoding.rb +7 -1
  386. data/lib/rubocop/cop/style/end_block.rb +3 -1
  387. data/lib/rubocop/cop/style/endless_method.rb +100 -21
  388. data/lib/rubocop/cop/style/env_home.rb +4 -0
  389. data/lib/rubocop/cop/style/even_odd.rb +11 -1
  390. data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
  391. data/lib/rubocop/cop/style/explicit_block_argument.rb +50 -10
  392. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  393. data/lib/rubocop/cop/style/file_null.rb +6 -4
  394. data/lib/rubocop/cop/style/file_open.rb +84 -0
  395. data/lib/rubocop/cop/style/file_write.rb +21 -16
  396. data/lib/rubocop/cop/style/float_division.rb +28 -14
  397. data/lib/rubocop/cop/style/for.rb +60 -1
  398. data/lib/rubocop/cop/style/format_string.rb +44 -9
  399. data/lib/rubocop/cop/style/format_string_token.rb +50 -7
  400. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
  401. data/lib/rubocop/cop/style/global_vars.rb +5 -2
  402. data/lib/rubocop/cop/style/guard_clause.rb +57 -40
  403. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +31 -9
  404. data/lib/rubocop/cop/style/hash_conversion.rb +39 -11
  405. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  406. data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
  407. data/lib/rubocop/cop/style/hash_slice.rb +16 -0
  408. data/lib/rubocop/cop/style/hash_syntax.rb +19 -5
  409. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
  410. data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
  411. data/lib/rubocop/cop/style/identical_conditional_branches.rb +38 -10
  412. data/lib/rubocop/cop/style/if_inside_else.rb +36 -8
  413. data/lib/rubocop/cop/style/if_unless_modifier.rb +80 -76
  414. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +17 -14
  415. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
  416. data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
  417. data/lib/rubocop/cop/style/inline_comment.rb +5 -2
  418. data/lib/rubocop/cop/style/inverse_methods.rb +24 -2
  419. data/lib/rubocop/cop/style/invertible_unless_condition.rb +25 -5
  420. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  421. data/lib/rubocop/cop/style/it_block_parameter.rb +94 -4
  422. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
  423. data/lib/rubocop/cop/style/keyword_parameters_order.rb +10 -4
  424. data/lib/rubocop/cop/style/lambda.rb +45 -2
  425. data/lib/rubocop/cop/style/lambda_call.rb +24 -8
  426. data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
  427. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
  428. data/lib/rubocop/cop/style/map_into_array.rb +2 -3
  429. data/lib/rubocop/cop/style/map_join.rb +123 -0
  430. data/lib/rubocop/cop/style/map_to_hash.rb +1 -2
  431. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +102 -20
  432. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
  433. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +42 -6
  434. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
  435. data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
  436. data/lib/rubocop/cop/style/min_max_comparison.rb +4 -1
  437. data/lib/rubocop/cop/style/missing_else.rb +7 -1
  438. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
  439. data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
  440. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  441. data/lib/rubocop/cop/style/module_function.rb +4 -2
  442. data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
  443. data/lib/rubocop/cop/style/multiline_if_modifier.rb +45 -5
  444. data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
  445. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
  446. data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
  447. data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -13
  448. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
  449. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
  450. data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
  451. data/lib/rubocop/cop/style/mutable_constant.rb +158 -14
  452. data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
  453. data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
  454. data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
  455. data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
  456. data/lib/rubocop/cop/style/next.rb +24 -10
  457. data/lib/rubocop/cop/style/nil_comparison.rb +50 -12
  458. data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
  459. data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
  460. data/lib/rubocop/cop/style/not.rb +12 -3
  461. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
  462. data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
  463. data/lib/rubocop/cop/style/numeric_predicate.rb +22 -6
  464. data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
  465. data/lib/rubocop/cop/style/one_line_conditional.rb +18 -6
  466. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  467. data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
  468. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  469. data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
  470. data/lib/rubocop/cop/style/parallel_assignment.rb +26 -7
  471. data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -2
  472. data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
  473. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
  474. data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
  475. data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
  476. data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
  477. data/lib/rubocop/cop/style/proc.rb +3 -2
  478. data/lib/rubocop/cop/style/raise_args.rb +20 -10
  479. data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -0
  480. data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
  481. data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
  482. data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
  483. data/lib/rubocop/cop/style/redundant_begin.rb +25 -7
  484. data/lib/rubocop/cop/style/redundant_condition.rb +41 -23
  485. data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
  486. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +13 -1
  487. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
  488. data/lib/rubocop/cop/style/redundant_each.rb +4 -5
  489. data/lib/rubocop/cop/style/redundant_exception.rb +21 -3
  490. data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -2
  491. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
  492. data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
  493. data/lib/rubocop/cop/style/redundant_format.rb +43 -7
  494. data/lib/rubocop/cop/style/redundant_freeze.rb +11 -3
  495. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
  496. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +49 -10
  497. data/lib/rubocop/cop/style/redundant_line_continuation.rb +82 -115
  498. data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
  499. data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -83
  500. data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
  501. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -2
  502. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
  503. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
  504. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -4
  505. data/lib/rubocop/cop/style/redundant_return.rb +4 -3
  506. data/lib/rubocop/cop/style/redundant_self.rb +11 -2
  507. data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -2
  508. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +27 -4
  509. data/lib/rubocop/cop/style/redundant_sort.rb +45 -11
  510. data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
  511. data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
  512. data/lib/rubocop/cop/style/regexp_literal.rb +106 -28
  513. data/lib/rubocop/cop/style/require_order.rb +25 -8
  514. data/lib/rubocop/cop/style/rescue_modifier.rb +15 -14
  515. data/lib/rubocop/cop/style/return_nil.rb +17 -2
  516. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
  517. data/lib/rubocop/cop/style/reverse_find.rb +51 -0
  518. data/lib/rubocop/cop/style/safe_navigation.rb +18 -9
  519. data/lib/rubocop/cop/style/sample.rb +19 -13
  520. data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
  521. data/lib/rubocop/cop/style/select_by_range.rb +197 -0
  522. data/lib/rubocop/cop/style/select_by_regexp.rb +52 -23
  523. data/lib/rubocop/cop/style/self_assignment.rb +13 -16
  524. data/lib/rubocop/cop/style/semicolon.rb +39 -13
  525. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
  526. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  527. data/lib/rubocop/cop/style/single_line_do_end_block.rb +19 -7
  528. data/lib/rubocop/cop/style/single_line_methods.rb +24 -5
  529. data/lib/rubocop/cop/style/sole_nested_conditional.rb +25 -7
  530. data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
  531. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +31 -5
  532. data/lib/rubocop/cop/style/static_class.rb +21 -0
  533. data/lib/rubocop/cop/style/string_concatenation.rb +25 -6
  534. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
  535. data/lib/rubocop/cop/style/struct_inheritance.rb +36 -1
  536. data/lib/rubocop/cop/style/super_arguments.rb +6 -4
  537. data/lib/rubocop/cop/style/symbol_proc.rb +32 -14
  538. data/lib/rubocop/cop/style/tally_method.rb +181 -0
  539. data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
  540. data/lib/rubocop/cop/style/time_now.rb +41 -0
  541. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
  542. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  543. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
  544. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
  545. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  546. data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
  547. data/lib/rubocop/cop/style/while_until_do.rb +7 -0
  548. data/lib/rubocop/cop/style/while_until_modifier.rb +16 -0
  549. data/lib/rubocop/cop/style/word_array.rb +1 -0
  550. data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
  551. data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
  552. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
  553. data/lib/rubocop/cop/style.rb +311 -0
  554. data/lib/rubocop/cop/team.rb +171 -48
  555. data/lib/rubocop/cop/util.rb +5 -8
  556. data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
  557. data/lib/rubocop/cop/variable_force/branch.rb +30 -6
  558. data/lib/rubocop/cop/variable_force/variable.rb +33 -9
  559. data/lib/rubocop/cops_documentation_generator.rb +27 -9
  560. data/lib/rubocop/directive_comment.rb +116 -7
  561. data/lib/rubocop/feature_loader.rb +0 -6
  562. data/lib/rubocop/file_patterns.rb +9 -1
  563. data/lib/rubocop/formatter/base_formatter.rb +22 -0
  564. data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
  565. data/lib/rubocop/formatter/disabled_config_formatter.rb +39 -10
  566. data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
  567. data/lib/rubocop/formatter/formatter_set.rb +7 -2
  568. data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
  569. data/lib/rubocop/formatter/html_formatter.rb +2 -4
  570. data/lib/rubocop/formatter/json_formatter.rb +82 -7
  571. data/lib/rubocop/formatter/junit_formatter.rb +27 -10
  572. data/lib/rubocop/formatter/offense_count_formatter.rb +4 -3
  573. data/lib/rubocop/formatter/pacman_formatter.rb +3 -1
  574. data/lib/rubocop/formatter/sarif_formatter.rb +186 -0
  575. data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
  576. data/lib/rubocop/formatter/tap_formatter.rb +8 -3
  577. data/lib/rubocop/formatter/worst_offenders_formatter.rb +5 -4
  578. data/lib/rubocop/formatter.rb +23 -21
  579. data/lib/rubocop/lockfile.rb +18 -0
  580. data/lib/rubocop/lsp/diagnostic.rb +22 -42
  581. data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
  582. data/lib/rubocop/lsp/routes.rb +130 -83
  583. data/lib/rubocop/lsp/runtime.rb +64 -15
  584. data/lib/rubocop/lsp/server.rb +6 -2
  585. data/lib/rubocop/lsp/stdin_runner.rb +35 -2
  586. data/lib/rubocop/lsp.rb +5 -2
  587. data/lib/rubocop/magic_comment.rb +47 -0
  588. data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
  589. data/lib/rubocop/mcp/explain_tool.rb +68 -0
  590. data/lib/rubocop/mcp/scope.rb +65 -0
  591. data/lib/rubocop/mcp/server.rb +307 -0
  592. data/lib/rubocop/mcp/source_files.rb +35 -0
  593. data/lib/rubocop/offense_limit.rb +30 -0
  594. data/lib/rubocop/options.rb +141 -13
  595. data/lib/rubocop/path_util.rb +16 -5
  596. data/lib/rubocop/pending_cops_reporter.rb +1 -6
  597. data/lib/rubocop/plugin/configuration_integrator.rb +13 -3
  598. data/lib/rubocop/plugin/loader.rb +2 -2
  599. data/lib/rubocop/project_index_loader.rb +82 -0
  600. data/lib/rubocop/rake_task.rb +2 -3
  601. data/lib/rubocop/remote_config.rb +18 -13
  602. data/lib/rubocop/result_cache.rb +102 -59
  603. data/lib/rubocop/rspec/cop_helper.rb +8 -0
  604. data/lib/rubocop/rspec/expect_offense.rb +2 -4
  605. data/lib/rubocop/rspec/shared_contexts.rb +53 -5
  606. data/lib/rubocop/rspec/support.rb +2 -1
  607. data/lib/rubocop/runner.rb +362 -106
  608. data/lib/rubocop/server/cache.rb +21 -40
  609. data/lib/rubocop/server/cli.rb +2 -4
  610. data/lib/rubocop/server/core.rb +8 -0
  611. data/lib/rubocop/server.rb +14 -0
  612. data/lib/rubocop/target_finder.rb +18 -8
  613. data/lib/rubocop/target_ruby.rb +42 -22
  614. data/lib/rubocop/todo_audit.rb +111 -0
  615. data/lib/rubocop/unified_diff.rb +257 -0
  616. data/lib/rubocop/util.rb +69 -0
  617. data/lib/rubocop/version.rb +23 -7
  618. data/lib/rubocop.rb +34 -701
  619. data/lib/ruby_lsp/rubocop/addon.rb +1 -2
  620. metadata +80 -14
  621. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
@@ -3,23 +3,25 @@
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
+ # rubocop:disable-next Metrics/ClassLength
7
7
  class ConfigValidator
8
8
  extend SimpleForwardable
9
9
 
10
10
  # @api private
11
11
  COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
12
- Enabled Reference References].freeze
12
+ Enabled Reference References Safe SafeAutoCorrect].freeze
13
13
  # @api private
14
- INTERNAL_PARAMS = %w[Description StyleGuide
14
+ INTERNAL_PARAMS = %w[Description StyleGuide Preview
15
15
  VersionAdded VersionChanged VersionRemoved
16
16
  Reference References Safe SafeAutoCorrect].freeze
17
17
  # @api private
18
18
  NEW_COPS_VALUES = %w[pending disable enable].freeze
19
+ # @api private
20
+ NEW_COPS_VERSION_PATTERN = /\A\d+(\.\d+)*\z/.freeze
19
21
 
20
22
  # @api private
21
23
  CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
22
- CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
24
+ CONFIG_CHECK_DEPARTMENTS = %w[pending preview override_department].freeze
23
25
  CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
24
26
  private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
25
27
 
@@ -46,7 +48,7 @@ module RuboCop
46
48
 
47
49
  check_obsoletions
48
50
  alert_about_unrecognized_cops(invalid_cop_names)
49
- validate_new_cops_parameter
51
+ validate_all_cops_parameters
50
52
  validate_parameter_names(valid_cop_names)
51
53
  validate_enforced_styles(valid_cop_names)
52
54
  validate_syntax_cop
@@ -164,16 +166,74 @@ module RuboCop
164
166
  end
165
167
 
166
168
  def validate_new_cops_parameter
169
+ validate_all_cops_new_cops_parameter
170
+ validate_department_new_cops_parameters
171
+ end
172
+
173
+ def validate_all_cops_parameters
174
+ validate_new_cops_parameter
175
+ validate_fail_level_parameter
176
+ validate_preview_parameter
177
+ end
178
+
179
+ def validate_fail_level_parameter
180
+ fail_level = @config.for_all_cops['FailLevel']
181
+ return if fail_level.nil? || Cop::Severity::NAMES.include?(fail_level.to_sym)
182
+
183
+ message = "invalid #{fail_level} for `FailLevel` found in #{smart_loaded_path}\n" \
184
+ "Valid choices are: #{Cop::Severity::NAMES.join(', ')}"
185
+
186
+ raise ValidationError, message
187
+ end
188
+
189
+ def validate_preview_parameter
190
+ preview = @config.for_all_cops['Preview']
191
+ return if [nil, true, false].include?(preview)
192
+
193
+ message = "invalid #{preview} for `Preview` found in #{smart_loaded_path}\n" \
194
+ 'Valid choices are: true, false'
195
+
196
+ raise ValidationError, message
197
+ end
198
+
199
+ def validate_all_cops_new_cops_parameter
167
200
  new_cop_parameter = @config.for_all_cops['NewCops']
168
201
  return if new_cop_parameter.nil? || NEW_COPS_VALUES.include?(new_cop_parameter)
169
202
 
170
- message = "invalid #{new_cop_parameter} for `NewCops` found in" \
203
+ message = "invalid #{new_cop_parameter} for `NewCops` found in " \
171
204
  "#{smart_loaded_path}\n" \
172
205
  "Valid choices are: #{NEW_COPS_VALUES.join(', ')}"
173
206
 
174
207
  raise ValidationError, message
175
208
  end
176
209
 
210
+ def validate_department_new_cops_parameters
211
+ @config.each do |name, section|
212
+ value = new_cops_value_for_department(name, section)
213
+ next if value.nil? || NEW_COPS_VALUES.include?(value) || new_cops_version_value?(value)
214
+
215
+ raise ValidationError,
216
+ "invalid #{value} for `NewCops` found in #{smart_loaded_path}\n" \
217
+ "Valid choices for a department are: #{NEW_COPS_VALUES.join(', ')}, " \
218
+ "or a version string like '1.50'"
219
+ end
220
+ end
221
+
222
+ def new_cops_value_for_department(name, section)
223
+ return nil if name == 'AllCops' || !section.is_a?(Hash)
224
+ return nil unless Cop::Registry.global.department?(name)
225
+
226
+ section['NewCops']
227
+ end
228
+
229
+ def new_cops_version_value?(value)
230
+ case value
231
+ when Float, Integer then true
232
+ when String then NEW_COPS_VERSION_PATTERN.match?(value)
233
+ else false
234
+ end
235
+ end
236
+
177
237
  def validate_parameter_shape(valid_cop_names)
178
238
  valid_cop_names.each do |name|
179
239
  if @config[name].nil?
@@ -207,6 +267,9 @@ module RuboCop
207
267
 
208
268
  @config[cop_name].each_key do |param|
209
269
  next if COMMON_PARAMS.include?(param) || default_config.key?(param)
270
+ # Departments shipped as top-level sections in an extension's default configuration accept
271
+ # `NewCops`, like any other department.
272
+ next if param == 'NewCops' && Cop::Registry.global.department?(cop_name)
210
273
 
211
274
  supported_params = default_config.keys - INTERNAL_PARAMS
212
275
 
@@ -287,5 +350,4 @@ module RuboCop
287
350
  "is supposed to be #{supposed_values} and #{Rainbow(value).yellow} is not."
288
351
  end
289
352
  end
290
- # rubocop:enable Metrics/ClassLength
291
353
  end
@@ -12,6 +12,14 @@ module RuboCop
12
12
  autocorrect_requested? && disable_uncorrectable? && autocorrect_enabled?
13
13
  end
14
14
 
15
+ # Whether a correction exists but is skipped because it is unsafe in a
16
+ # safe autocorrect run, while `--disable-uncorrectable` asks for a todo
17
+ # comment on everything this run cannot correct.
18
+ def skipped_unsafe_correction_with_disable_uncorrectable?
19
+ autocorrect_requested? && disable_uncorrectable? &&
20
+ @options.fetch(:safe_autocorrect, false) && !safe_autocorrect?
21
+ end
22
+
15
23
  def autocorrect_requested?
16
24
  @options.fetch(:autocorrect, false)
17
25
  end
@@ -32,12 +40,9 @@ module RuboCop
32
40
  # allow turning off autocorrect on a cop by cop basis
33
41
  return true unless cop_config
34
42
 
35
- # `false` is the same as `disabled` for backward compatibility.
36
- return false if ['disabled', false].include?(cop_config['AutoCorrect'])
43
+ return false if disabled_autocorrect?
37
44
 
38
- # When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
39
- # source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
40
- return false if contextual_autocorrect? && LSP.enabled?
45
+ return false if contextual_autocorrect_held_back?
41
46
 
42
47
  # :safe_autocorrect is a derived option based on several command-line
43
48
  # arguments - see RuboCop::Options#add_autocorrection_options
@@ -48,9 +53,18 @@ module RuboCop
48
53
 
49
54
  private
50
55
 
56
+ # When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
57
+ # source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
58
+ # The `editing` option says the same without the rest of LSP mode, which
59
+ # is about showing offenses in an editor.
60
+ def contextual_autocorrect_held_back?
61
+ contextual_autocorrect? && (LSP.enabled? || @options.fetch(:editing, false))
62
+ end
63
+
51
64
  def disable_offense(offense_range)
52
65
  unbreakable_range = multiline_ranges(offense_range)&.find do |range|
53
- eol_comment_would_be_inside_literal?(offense_range, range)
66
+ offense_range.overlaps?(range) &&
67
+ eol_comment_would_be_inside_literal?(offense_range, range)
54
68
  end
55
69
 
56
70
  if unbreakable_range
@@ -90,6 +104,8 @@ module RuboCop
90
104
  end
91
105
 
92
106
  def line_with_eol_comment_too_long?(range)
107
+ return false unless max_line_length
108
+
93
109
  (range.source_line + eol_comment).length > max_line_length
94
110
  end
95
111
 
@@ -133,6 +149,8 @@ module RuboCop
133
149
  end
134
150
 
135
151
  def max_line_length
152
+ return unless config.cop_enabled?('Layout/LineLength')
153
+
136
154
  config.for_cop('Layout/LineLength')['Max'] || 120
137
155
  end
138
156
 
@@ -39,19 +39,27 @@ module RuboCop
39
39
  end
40
40
 
41
41
  def ==(other)
42
- hash == other.hash
42
+ other.is_a?(Badge) && department == other.department && cop_name == other.cop_name
43
43
  end
44
44
  alias eql? ==
45
45
 
46
46
  def hash
47
47
  # Do hashing manually to reduce Array allocations.
48
- department.hash ^ cop_name.hash # rubocop:disable Security/CompoundHash
48
+ department.hash ^ cop_name.hash # rubocop:disable Security/CompoundHash -- hashing manually avoids the Array allocation
49
49
  end
50
50
 
51
51
  def match?(other)
52
52
  cop_name == other.cop_name && (!qualified? || department == other.department)
53
53
  end
54
54
 
55
+ # Returns true if the badge's qualified name or the badge's department
56
+ # matches any of the given names.
57
+ def match_name?(given_names)
58
+ return false unless given_names
59
+
60
+ given_names.include?(to_s) || given_names.include?(department_name)
61
+ end
62
+
55
63
  def to_s
56
64
  @to_s ||= qualified? ? "#{department}/#{cop_name}" : cop_name
57
65
  end
@@ -41,6 +41,7 @@ module RuboCop
41
41
  include AutocorrectLogic
42
42
 
43
43
  attr_reader :config, :processed_source
44
+ attr_accessor :project_index
44
45
 
45
46
  # Reports of an investigation.
46
47
  # Immutable
@@ -48,7 +49,12 @@ module RuboCop
48
49
  InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector)
49
50
 
50
51
  # List of methods names to restrict calls for `on_send` / `on_csend`
51
- RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend
52
+ RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend -- the base class default, which cops override
53
+
54
+ # Departments whose cops report above `convention` unless a cop says
55
+ # otherwise. The exceptions live in `config/default.yml` as an explicit
56
+ # `Severity`, such as the lint-like cops in `Bundler` and `Gemspec`.
57
+ DEPARTMENT_SEVERITIES = { Lint: :warning, Security: :warning, Metrics: :refactor }.freeze
52
58
 
53
59
  # List of cops that should not try to autocorrect at the same
54
60
  # time as this cop
@@ -126,6 +132,8 @@ module RuboCop
126
132
  # in the `on_new_investigation` callback.
127
133
  # If your cop does autocorrections, be aware that your instance may be called
128
134
  # multiple times with the same `processed_source.path` but different content.
135
+ # Note that under `--parallel` each worker process has its own cop
136
+ # instances, so state persists only within a worker's share of the files.
129
137
  def self.support_multiple_source?
130
138
  false
131
139
  end
@@ -207,13 +215,9 @@ module RuboCop
207
215
  severity = find_severity(range_to_pass, severity)
208
216
  message = find_message(range_to_pass, message)
209
217
 
210
- status, corrector = enabled_line?(range.line) ? correct(range, &block) : :disabled
211
-
212
- # Since this range may be generated from Ruby code embedded in some
213
- # template file, we convert it to location info in the original file.
214
- range = range_for_original(range)
218
+ status, corrector = enabled_lines?(range) ? correct(range, &block) : :disabled
215
219
 
216
- current_offenses << Offense.new(severity, range, message, name, status, corrector)
220
+ current_offenses << new_offense(range, severity, message, status, corrector)
217
221
  end
218
222
 
219
223
  # This method should be overridden when a cop's behavior depends
@@ -261,10 +265,21 @@ module RuboCop
261
265
  @config.target_ruby_version
262
266
  end
263
267
 
264
- # Returns a gems locked versions (i.e. from Gemfile.lock or gems.locked)
265
- # @returns [Gem::Version | nil] The locked gem version, or nil if the gem is not present.
268
+ # Returns the version of a gem in the target, by default its locked version
269
+ # (i.e. from Gemfile.lock or gems.locked).
270
+ #
271
+ # The requirements declared with `requires_gem` are checked against the version
272
+ # this method returns, so an extension that lets users state the version of its
273
+ # gem in `AllCops` (e.g. `TargetFrameworkVersion`) can override it for that gem,
274
+ # returning a `Gem::Version`, and fall back to `super` for any other gem.
275
+ #
276
+ # @param [String] gem_name
277
+ # @return [Gem::Version, nil] The gem version, or nil if the gem is not present.
278
+ #
279
+ # @api public
266
280
  def target_gem_version(gem_name)
267
- @config.gem_versions_in_target && @config.gem_versions_in_target[gem_name]
281
+ gem_versions = @config.gem_versions_in_target
282
+ gem_versions && gem_versions[gem_name]
268
283
  end
269
284
 
270
285
  def parser_engine
@@ -283,6 +298,13 @@ module RuboCop
283
298
  @config.string_literals_frozen_by_default?
284
299
  end
285
300
 
301
+ # Whether the user opted in to unstable behavior, with `--preview` or
302
+ # `AllCops: Preview`. Cops branch on this to ship a change that is not
303
+ # ready to be the default yet.
304
+ def preview?
305
+ @config.preview?(@options)
306
+ end
307
+
286
308
  def relevant_file?(file)
287
309
  return false unless target_satisfies_all_gem_version_requirements?
288
310
  return true unless @config.clusivity_config_for_badge?(self.class.badge)
@@ -306,7 +328,9 @@ module RuboCop
306
328
  def ready
307
329
  return self if self.class.support_multiple_source?
308
330
 
309
- self.class.new(@config, @options)
331
+ self.class.new(@config, @options).tap do |fresh|
332
+ fresh.project_index = @project_index
333
+ end
310
334
  end
311
335
 
312
336
  ### Reserved for Cop::Cop
@@ -319,7 +343,7 @@ module RuboCop
319
343
 
320
344
  ### Reserved for Commissioner
321
345
 
322
- # rubocop:disable Layout/ClassStructure
346
+ # rubocop:disable Layout/ClassStructure -- grouped under the Commissioner heading above
323
347
  # @api private
324
348
  def callbacks_needed
325
349
  self.class.callbacks_needed
@@ -328,12 +352,11 @@ module RuboCop
328
352
  # @api private
329
353
  def self.callbacks_needed
330
354
  @callbacks_needed ||= public_instance_methods.select do |m|
331
- # OPTIMIZE: Check method existence first to make fewer `start_with?` calls.
332
- # At the time of writing this comment, this excludes 98 of ~104 methods.
333
- # `start_with?` with two string arguments instead of a regex is faster
334
- # in this specific case as well.
335
- !Base.method_defined?(m) && # exclude standard "callbacks" like 'on_begin_investigation'
336
- m.start_with?('on_', 'after_')
355
+ # OPTIMIZE: `start_with?` with two string arguments instead of a regex
356
+ # is faster in this specific case.
357
+ m.start_with?('on_', 'after_') &&
358
+ # exclude standard "callbacks" like 'on_new_investigation' unless refined
359
+ instance_method(m).owner != Base
337
360
  end
338
361
  end
339
362
  # rubocop:enable Layout/ClassStructure
@@ -364,12 +387,40 @@ module RuboCop
364
387
  cop_config.fetch('AutoCorrect', 'always') == 'contextual'
365
388
  end
366
389
 
390
+ # @api private
391
+ def disabled_autocorrect?
392
+ # `false` is the same as `'disabled'` for backward compatibility.
393
+ ['disabled', false].include?(cop_config['AutoCorrect'])
394
+ end
395
+
367
396
  def inspect # :nodoc:
368
397
  "#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
369
398
  end
370
399
 
371
400
  private
372
401
 
402
+ ### Reserved for Commissioner
403
+
404
+ private_class_method def self.restrict_on_send
405
+ @restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
406
+ end
407
+
408
+ # @return [Offense]
409
+ def new_offense(range, severity, message, status, corrector)
410
+ justification = suppression_reason(range) if status == :disabled
411
+
412
+ # Since this range may be generated from Ruby code embedded in some
413
+ # template file, we convert it to location info in the original file.
414
+ # A cop configured with `AutoCorrect: false` reports no edits, since
415
+ # nothing that honors the configuration applies them. The corrector
416
+ # stays, so an editor can still offer it as a quick fix to choose.
417
+ corrections = [] if corrector && disabled_autocorrect?
418
+
419
+ Offense.new(severity, range_for_original(range), message, name, status, corrector,
420
+ justification: justification, correction_safe: safe_autocorrect?,
421
+ corrections: corrections)
422
+ end
423
+
373
424
  ### Reserved for Cop::Cop
374
425
 
375
426
  def callback_argument(range)
@@ -398,10 +449,6 @@ module RuboCop
398
449
  @current_offenses ||= []
399
450
  end
400
451
 
401
- private_class_method def self.restrict_on_send
402
- @restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
403
- end
404
-
405
452
  EMPTY_OFFENSES = [].freeze
406
453
  private_constant :EMPTY_OFFENSES
407
454
  # Called to complete an investigation
@@ -416,7 +463,10 @@ module RuboCop
416
463
  ### Actually private methods
417
464
 
418
465
  def reset_investigation
419
- @currently_disabled_lines = @current_offenses = @processed_source = @current_corrector = nil
466
+ @currently_disabled_lines = nil
467
+ @current_offenses = nil
468
+ @processed_source = nil
469
+ @current_corrector = nil
420
470
  end
421
471
 
422
472
  # @return [Symbol, Corrector] offense status
@@ -438,7 +488,12 @@ module RuboCop
438
488
  def use_corrector(range, corrector)
439
489
  if autocorrect?
440
490
  attempt_correction(range, corrector)
441
- elsif corrector && (always_autocorrect? || (contextual_autocorrect? && !LSP.enabled?))
491
+ elsif skipped_unsafe_correction_with_disable_uncorrectable?
492
+ # The unsafe correction will not run, so the offense is
493
+ # uncorrectable for this run and gets a todo comment.
494
+ attempt_correction(range, nil)
495
+ elsif corrector && (always_autocorrect? ||
496
+ (contextual_autocorrect? && !contextual_autocorrect_held_back?))
442
497
  :uncorrected
443
498
  else
444
499
  :unsupported
@@ -492,8 +547,23 @@ module RuboCop
492
547
  patterns = cop_config[parameter]
493
548
  return default_result unless patterns
494
549
 
495
- patterns = FilePatterns.from(patterns)
496
- patterns.match?(config.path_relative_to_config(file)) || patterns.match?(file)
550
+ file_patterns = FilePatterns.from(patterns)
551
+ relative_file_path = config.path_relative_to_config(file)
552
+ return true if file_patterns.match?(relative_file_path)
553
+
554
+ if parameter == 'Include' && !relative_file_path.start_with?('..')
555
+ matches_absolute_include_pattern?(patterns, file)
556
+ else
557
+ file_patterns.match?(file)
558
+ end
559
+ end
560
+
561
+ def matches_absolute_include_pattern?(patterns, file)
562
+ absolute_file_path = absolute?(file) ? file : File.expand_path(file)
563
+ patterns.any? do |pattern|
564
+ (absolute?(pattern.to_s) || pattern.to_s.start_with?('..')) &&
565
+ match_path?(pattern, absolute_file_path)
566
+ end
497
567
  end
498
568
 
499
569
  def enabled_line?(line_number)
@@ -502,12 +572,36 @@ module RuboCop
502
572
  @processed_source.comment_config.cop_enabled_at_line?(self, line_number)
503
573
  end
504
574
 
575
+ # A multi-line offense is suppressed by a directive on any line of its
576
+ # range, not only its first line, matching the intuition that the
577
+ # directive is attached to the offending code.
578
+ def enabled_lines?(range)
579
+ return true if @options[:ignore_disable_comments] || !@processed_source
580
+
581
+ comment_config = @processed_source.comment_config
582
+ comment_config.cop_enabled_at_lines?(self, range.first_line, range.last_line)
583
+ end
584
+
585
+ # The `--` reason on the directive that suppresses offenses on this
586
+ # range, or `nil` when the directive carries none.
587
+ def suppression_reason(range)
588
+ covering = covering_disabled_range(range)
589
+ covering.directive.reason if covering.respond_to?(:directive)
590
+ end
591
+
592
+ def covering_disabled_range(range)
593
+ disabled_ranges = @processed_source.comment_config.cop_disabled_line_ranges[cop_name]
594
+ disabled_ranges&.find do |disabled_range|
595
+ disabled_range.end >= range.first_line && disabled_range.begin <= range.last_line
596
+ end
597
+ end
598
+
505
599
  def find_severity(_range, severity)
506
600
  custom_severity || severity || default_severity
507
601
  end
508
602
 
509
603
  def default_severity
510
- self.class.lint? ? :warning : :convention
604
+ DEPARTMENT_SEVERITIES.fetch(self.class.department, :convention)
511
605
  end
512
606
 
513
607
  def custom_severity
@@ -524,22 +618,21 @@ module RuboCop
524
618
  end
525
619
 
526
620
  def range_for_original(range)
621
+ buffer = @current_original.buffer
622
+ return range if @current_offset.zero? && range.source_buffer.equal?(buffer)
623
+
527
624
  ::Parser::Source::Range.new(
528
- @current_original.buffer,
625
+ buffer,
529
626
  range.begin_pos + @current_offset,
530
627
  range.end_pos + @current_offset
531
628
  )
532
629
  end
533
630
 
534
631
  def target_satisfies_all_gem_version_requirements?
535
- self.class.gem_requirements.all? do |gem_name, version_req|
536
- all_gem_versions_in_target = @config.gem_versions_in_target
537
- next false unless all_gem_versions_in_target
538
-
539
- gem_version_in_target = all_gem_versions_in_target[gem_name]
540
- next false unless gem_version_in_target
632
+ self.class.gem_requirements.all? do |gem_name, version_requirement|
633
+ gem_version = target_gem_version(gem_name)
541
634
 
542
- version_req.satisfied_by?(gem_version_in_target)
635
+ gem_version && version_requirement.satisfied_by?(gem_version)
543
636
  end
544
637
  end
545
638
  end
@@ -81,7 +81,6 @@ module RuboCop
81
81
  # gem 'bar', '< 2.1'
82
82
  #
83
83
  class GemComment < Base
84
- include DefNode
85
84
  include GemDeclaration
86
85
 
87
86
  MSG = 'Missing gem description comment.'
@@ -128,8 +127,8 @@ module RuboCop
128
127
  end
129
128
 
130
129
  def ignored_gem?(node)
131
- ignored_gems = Array(cop_config['IgnoredGems'])
132
- ignored_gems.include?(node.first_argument.value)
130
+ allowed_gems = Array(cop_config['AllowedGems'])
131
+ allowed_gems.include?(node.first_argument.value)
133
132
  end
134
133
 
135
134
  def checked_options_present?(node)
@@ -163,7 +162,9 @@ module RuboCop
163
162
  def gem_options(node)
164
163
  return [] unless node.last_argument&.hash_type?
165
164
 
166
- node.last_argument.keys.map(&:value)
165
+ # Only literal keys carry an option name to check; a non-literal key
166
+ # (e.g. a variable or method call) has no `value` and must be skipped.
167
+ node.last_argument.keys.filter_map { |key| key.value if key.type?(:sym, :str) }
167
168
  end
168
169
  end
169
170
  end
@@ -7,48 +7,48 @@ module RuboCop
7
7
  # ref, or tag) are either required or forbidden.
8
8
  #
9
9
  # @example EnforcedStyle: required (default)
10
- # # bad
11
- # gem 'rubocop'
10
+ # # bad
11
+ # gem 'rubocop'
12
12
  #
13
- # # good
14
- # gem 'rubocop', '~> 1.12'
13
+ # # good
14
+ # gem 'rubocop', '~> 1.12'
15
15
  #
16
- # # good
17
- # gem 'rubocop', '>= 1.10.0'
16
+ # # good
17
+ # gem 'rubocop', '>= 1.10.0'
18
18
  #
19
- # # good
20
- # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
19
+ # # good
20
+ # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
21
21
  #
22
- # # good
23
- # gem 'rubocop', branch: 'feature-branch'
22
+ # # good
23
+ # gem 'rubocop', branch: 'feature-branch'
24
24
  #
25
- # # good
26
- # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
25
+ # # good
26
+ # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
27
27
  #
28
- # # good
29
- # gem 'rubocop', tag: 'v1.17.0'
28
+ # # good
29
+ # gem 'rubocop', tag: 'v1.17.0'
30
30
  #
31
31
  # @example EnforcedStyle: forbidden
32
- # # good
33
- # gem 'rubocop'
32
+ # # good
33
+ # gem 'rubocop'
34
34
  #
35
- # # bad
36
- # gem 'rubocop', '~> 1.12'
35
+ # # bad
36
+ # gem 'rubocop', '~> 1.12'
37
37
  #
38
- # # bad
39
- # gem 'rubocop', '>= 1.10.0'
38
+ # # bad
39
+ # gem 'rubocop', '>= 1.10.0'
40
40
  #
41
- # # bad
42
- # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
41
+ # # bad
42
+ # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
43
43
  #
44
- # # bad
45
- # gem 'rubocop', branch: 'feature-branch'
44
+ # # bad
45
+ # gem 'rubocop', branch: 'feature-branch'
46
46
  #
47
- # # bad
48
- # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
47
+ # # bad
48
+ # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
49
49
  #
50
- # # bad
51
- # gem 'rubocop', tag: 'v1.17.0'
50
+ # # bad
51
+ # gem 'rubocop', tag: 'v1.17.0'
52
52
  #
53
53
  class GemVersion < Base
54
54
  include ConfigurableEnforcedStyle
@@ -43,8 +43,7 @@ module RuboCop
43
43
  def on_new_investigation
44
44
  return if processed_source.blank?
45
45
 
46
- gem_declarations(processed_source.ast)
47
- .each_cons(2) do |previous, current|
46
+ gem_declarations(processed_source.ast).each_cons(2) do |previous, current|
48
47
  next unless consecutive_lines?(previous, current)
49
48
  next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
50
49
 
@@ -52,14 +51,6 @@ module RuboCop
52
51
  end
53
52
  end
54
53
 
55
- private
56
-
57
- def previous_declaration(node)
58
- declarations = gem_declarations(processed_source.ast)
59
- node_index = declarations.map(&:location).find_index(node.location)
60
- declarations.to_a[node_index - 1]
61
- end
62
-
63
54
  # @!method gem_declarations(node)
64
55
  def_node_search :gem_declarations, <<~PATTERN
65
56
  (:send nil? :gem str ...)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Cops for the `Bundler` department. The department's cops are registered for lazy loading
6
+ # and their files are loaded on demand.
7
+ module Bundler
8
+ extend LazyLoader
9
+
10
+ register_cop :DuplicatedGem, "#{__dir__}/bundler/duplicated_gem"
11
+ register_cop :DuplicatedGroup, "#{__dir__}/bundler/duplicated_group"
12
+ register_cop :GemComment, "#{__dir__}/bundler/gem_comment"
13
+ register_cop :GemFilename, "#{__dir__}/bundler/gem_filename"
14
+ register_cop :GemVersion, "#{__dir__}/bundler/gem_version"
15
+ register_cop :InsecureProtocolSource, "#{__dir__}/bundler/insecure_protocol_source"
16
+ register_cop :OrderedGems, "#{__dir__}/bundler/ordered_gems"
17
+ end
18
+ end
19
+ end