rubocop 1.57.1 → 1.81.6

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 (638) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +92 -89
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +1 -160
  6. data/config/default.yml +540 -86
  7. data/config/internal_affairs.yml +31 -0
  8. data/config/obsoletion.yml +8 -3
  9. data/exe/rubocop +1 -7
  10. data/lib/rubocop/cached_data.rb +21 -5
  11. data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
  12. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  13. data/lib/rubocop/cli/command/lsp.rb +4 -4
  14. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  15. data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
  16. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  17. data/lib/rubocop/cli/command/version.rb +2 -2
  18. data/lib/rubocop/cli.rb +28 -4
  19. data/lib/rubocop/comment_config.rb +3 -3
  20. data/lib/rubocop/config.rb +92 -22
  21. data/lib/rubocop/config_finder.rb +12 -2
  22. data/lib/rubocop/config_loader.rb +71 -58
  23. data/lib/rubocop/config_loader_resolver.rb +48 -17
  24. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  25. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  26. data/lib/rubocop/config_obsoletion.rb +56 -9
  27. data/lib/rubocop/config_store.rb +5 -0
  28. data/lib/rubocop/config_validator.rb +39 -20
  29. data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
  30. data/lib/rubocop/cop/base.rb +79 -18
  31. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  32. data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
  33. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  34. data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
  35. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  36. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  37. data/lib/rubocop/cop/cop.rb +30 -4
  38. data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
  39. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
  40. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
  41. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
  42. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
  43. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  44. data/lib/rubocop/cop/documentation.rb +32 -5
  45. data/lib/rubocop/cop/exclude_limit.rb +1 -1
  46. data/lib/rubocop/cop/force.rb +12 -0
  47. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  48. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  49. data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
  50. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
  51. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
  52. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  53. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  54. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
  55. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
  56. data/lib/rubocop/cop/generator.rb +6 -0
  57. data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
  58. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  59. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
  60. data/lib/rubocop/cop/internal_affairs/example_description.rb +13 -8
  61. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  62. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  63. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  64. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
  65. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
  66. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
  67. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +124 -30
  68. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  69. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  70. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
  71. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  72. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  73. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  74. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  75. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  76. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  77. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  78. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  79. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  80. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
  81. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
  82. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  83. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  84. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
  85. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
  86. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  87. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  88. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
  89. data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
  90. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  91. data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
  92. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  93. data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
  94. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  95. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  96. data/lib/rubocop/cop/layout/class_structure.rb +45 -10
  97. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  98. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  99. data/lib/rubocop/cop/layout/condition_position.rb +0 -4
  100. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
  101. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  102. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  103. data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
  104. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
  105. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  106. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  107. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -21
  108. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  109. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
  110. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  111. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  112. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  113. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
  114. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
  115. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  116. data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
  117. data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
  118. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
  119. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
  120. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  121. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  122. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
  123. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
  124. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
  125. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
  126. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  127. data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
  128. data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
  129. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
  130. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  131. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  132. data/lib/rubocop/cop/layout/line_length.rb +177 -29
  133. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  134. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  135. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  136. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  137. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  138. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  139. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  140. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
  141. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  142. data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
  143. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -9
  144. data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
  145. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  146. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  147. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  148. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  149. data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
  150. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  151. data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
  152. data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
  153. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  154. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  155. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  156. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
  157. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  158. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
  159. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
  160. data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
  161. data/lib/rubocop/cop/legacy/corrector.rb +12 -2
  162. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
  163. data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
  164. data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
  165. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
  166. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  167. data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
  168. data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
  169. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
  170. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
  171. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
  172. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  173. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
  174. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  175. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
  176. data/lib/rubocop/cop/lint/debugger.rb +30 -8
  177. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
  178. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
  179. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  180. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
  181. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
  182. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  183. data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
  184. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
  185. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  186. data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
  187. data/lib/rubocop/cop/lint/else_layout.rb +0 -2
  188. data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
  189. data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
  190. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  191. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  192. data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
  193. data/lib/rubocop/cop/lint/empty_when.rb +1 -3
  194. data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
  195. data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
  196. data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
  197. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
  198. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
  199. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
  200. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  201. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  202. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
  203. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
  204. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
  205. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
  206. data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
  207. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
  208. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
  209. data/lib/rubocop/cop/lint/loop.rb +6 -12
  210. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
  211. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  212. data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
  213. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  214. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
  215. data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
  216. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
  217. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  218. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
  219. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  220. data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
  221. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  222. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
  223. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  224. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  225. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
  226. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
  227. data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
  228. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  229. data/lib/rubocop/cop/lint/rand_one.rb +0 -4
  230. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
  231. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
  232. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  233. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
  234. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
  235. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
  236. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  237. data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
  238. data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
  239. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  240. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  241. data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
  242. data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
  243. data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
  244. data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
  245. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
  246. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
  247. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
  248. data/lib/rubocop/cop/lint/script_permission.rb +3 -3
  249. data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
  250. data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
  251. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  252. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
  253. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  254. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  255. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  256. data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
  257. data/lib/rubocop/cop/lint/syntax.rb +10 -4
  258. data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
  259. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  260. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
  261. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  262. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  263. data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
  264. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
  265. data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
  266. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
  267. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  268. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
  269. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  270. data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
  271. data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
  272. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  273. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  274. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  275. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
  276. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  277. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
  278. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  279. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  280. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  281. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
  282. data/lib/rubocop/cop/lint/useless_times.rb +2 -2
  283. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  284. data/lib/rubocop/cop/lint/void.rb +92 -18
  285. data/lib/rubocop/cop/message_annotator.rb +7 -3
  286. data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
  287. data/lib/rubocop/cop/metrics/block_length.rb +7 -5
  288. data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
  289. data/lib/rubocop/cop/metrics/class_length.rb +21 -15
  290. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  291. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  292. data/lib/rubocop/cop/metrics/method_length.rb +15 -6
  293. data/lib/rubocop/cop/metrics/module_length.rb +7 -6
  294. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  295. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  296. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
  297. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  298. data/lib/rubocop/cop/mixin/alignment.rb +8 -4
  299. data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
  300. data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
  301. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
  302. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  303. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  304. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  305. data/lib/rubocop/cop/mixin/code_length.rb +12 -1
  306. data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
  307. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  308. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
  309. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  310. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  311. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  312. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
  313. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  314. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  315. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  316. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
  317. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  318. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  319. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
  320. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  321. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  322. data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
  323. data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
  324. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
  325. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  326. data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
  327. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  328. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  329. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  330. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
  331. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
  332. data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
  333. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  334. data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
  335. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  336. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  337. data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
  338. data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
  339. data/lib/rubocop/cop/naming/constant_name.rb +7 -9
  340. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  341. data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
  342. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
  343. data/lib/rubocop/cop/naming/method_name.rb +185 -15
  344. data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
  345. data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
  346. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
  347. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  348. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  349. data/lib/rubocop/cop/offense.rb +4 -5
  350. data/lib/rubocop/cop/registry.rb +9 -6
  351. data/lib/rubocop/cop/security/compound_hash.rb +4 -2
  352. data/lib/rubocop/cop/security/eval.rb +2 -1
  353. data/lib/rubocop/cop/security/json_load.rb +33 -11
  354. data/lib/rubocop/cop/security/open.rb +3 -2
  355. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  356. data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
  357. data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
  358. data/lib/rubocop/cop/style/alias.rb +2 -1
  359. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  360. data/lib/rubocop/cop/style/and_or.rb +1 -1
  361. data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
  362. data/lib/rubocop/cop/style/array_first_last.rb +80 -0
  363. data/lib/rubocop/cop/style/array_intersect.rb +115 -39
  364. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
  365. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
  366. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
  367. data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
  368. data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
  369. data/lib/rubocop/cop/style/case_like_if.rb +14 -17
  370. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  371. data/lib/rubocop/cop/style/class_check.rb +1 -0
  372. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  373. data/lib/rubocop/cop/style/class_vars.rb +3 -3
  374. data/lib/rubocop/cop/style/collection_compact.rb +25 -15
  375. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  376. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  377. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  378. data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
  379. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  380. data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
  381. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  382. data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
  383. data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
  384. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  385. data/lib/rubocop/cop/style/copyright.rb +31 -21
  386. data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
  387. data/lib/rubocop/cop/style/date_time.rb +5 -4
  388. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
  389. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  390. data/lib/rubocop/cop/style/documentation.rb +25 -25
  391. data/lib/rubocop/cop/style/documentation_method.rb +20 -0
  392. data/lib/rubocop/cop/style/double_negation.rb +5 -5
  393. data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
  394. data/lib/rubocop/cop/style/each_with_object.rb +3 -4
  395. data/lib/rubocop/cop/style/empty_else.rb +10 -7
  396. data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
  397. data/lib/rubocop/cop/style/empty_literal.rb +36 -23
  398. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  399. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  400. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  401. data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
  402. data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
  403. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  404. data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
  405. data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
  406. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  407. data/lib/rubocop/cop/style/file_null.rb +89 -0
  408. data/lib/rubocop/cop/style/file_read.rb +2 -5
  409. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  410. data/lib/rubocop/cop/style/file_write.rb +2 -5
  411. data/lib/rubocop/cop/style/float_division.rb +8 -4
  412. data/lib/rubocop/cop/style/for.rb +3 -1
  413. data/lib/rubocop/cop/style/format_string.rb +9 -9
  414. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  415. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  416. data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
  417. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  418. data/lib/rubocop/cop/style/guard_clause.rb +20 -4
  419. data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
  420. data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
  421. data/lib/rubocop/cop/style/hash_except.rb +38 -146
  422. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  423. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  424. data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
  425. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  426. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  427. data/lib/rubocop/cop/style/identical_conditional_branches.rb +37 -7
  428. data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
  429. data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
  430. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  431. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
  432. data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
  433. data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
  434. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  435. data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
  436. data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
  437. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  438. data/lib/rubocop/cop/style/it_assignment.rb +93 -0
  439. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  440. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  441. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  442. data/lib/rubocop/cop/style/lambda.rb +2 -1
  443. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  444. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  445. data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
  446. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
  447. data/lib/rubocop/cop/style/map_into_array.rb +236 -0
  448. data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
  449. data/lib/rubocop/cop/style/map_to_set.rb +4 -5
  450. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +52 -25
  451. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
  452. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
  453. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  454. data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
  455. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  456. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  457. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
  458. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  459. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  460. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  461. data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
  462. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
  463. data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
  464. data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
  465. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  466. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  467. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  468. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  469. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  470. data/lib/rubocop/cop/style/next.rb +45 -1
  471. data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
  472. data/lib/rubocop/cop/style/not.rb +1 -1
  473. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  474. data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
  475. data/lib/rubocop/cop/style/object_then.rb +16 -14
  476. data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
  477. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  478. data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
  479. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  480. data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
  481. data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
  482. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  483. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  484. data/lib/rubocop/cop/style/proc.rb +2 -2
  485. data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
  486. data/lib/rubocop/cop/style/raise_args.rb +19 -14
  487. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  488. data/lib/rubocop/cop/style/redundant_argument.rb +29 -3
  489. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  490. data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
  491. data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
  492. data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
  493. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
  494. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
  495. data/lib/rubocop/cop/style/redundant_each.rb +7 -4
  496. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  497. data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
  498. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  499. data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
  500. data/lib/rubocop/cop/style/redundant_format.rb +283 -0
  501. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
  502. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  503. data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
  504. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
  505. data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
  506. data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
  507. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  508. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
  509. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  510. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
  511. data/lib/rubocop/cop/style/redundant_return.rb +9 -3
  512. data/lib/rubocop/cop/style/redundant_self.rb +32 -20
  513. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  514. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  515. data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
  516. data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
  517. data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
  518. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  519. data/lib/rubocop/cop/style/require_order.rb +2 -2
  520. data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
  521. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  522. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
  523. data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
  524. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  525. data/lib/rubocop/cop/style/sample.rb +3 -4
  526. data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
  527. data/lib/rubocop/cop/style/self_assignment.rb +12 -18
  528. data/lib/rubocop/cop/style/semicolon.rb +30 -7
  529. data/lib/rubocop/cop/style/send.rb +4 -4
  530. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
  531. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  532. data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
  533. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  534. data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
  535. data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
  536. data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
  537. data/lib/rubocop/cop/style/sole_nested_conditional.rb +72 -87
  538. data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
  539. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  540. data/lib/rubocop/cop/style/string_chars.rb +1 -0
  541. data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
  542. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  543. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  544. data/lib/rubocop/cop/style/strip.rb +7 -4
  545. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
  546. data/lib/rubocop/cop/style/super_arguments.rb +221 -0
  547. data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
  548. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  549. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  550. data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
  551. data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
  552. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  553. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
  554. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  555. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  556. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  557. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  558. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
  559. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  560. data/lib/rubocop/cop/style/unpack_first.rb +11 -14
  561. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  562. data/lib/rubocop/cop/style/while_until_do.rb +0 -2
  563. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
  564. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  565. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  566. data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
  567. data/lib/rubocop/cop/team.rb +28 -4
  568. data/lib/rubocop/cop/util.rb +19 -6
  569. data/lib/rubocop/cop/utils/format_string.rb +20 -5
  570. data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
  571. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  572. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  573. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  574. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  575. data/lib/rubocop/cop/variable_force.rb +43 -20
  576. data/lib/rubocop/cops_documentation_generator.rb +135 -58
  577. data/lib/rubocop/core_ext/string.rb +2 -6
  578. data/lib/rubocop/directive_comment.rb +54 -18
  579. data/lib/rubocop/ext/regexp_node.rb +17 -35
  580. data/lib/rubocop/ext/regexp_parser.rb +4 -21
  581. data/lib/rubocop/file_finder.rb +9 -4
  582. data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
  583. data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
  584. data/lib/rubocop/formatter/formatter_set.rb +8 -2
  585. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  586. data/lib/rubocop/formatter/html_formatter.rb +38 -15
  587. data/lib/rubocop/formatter/json_formatter.rb +0 -1
  588. data/lib/rubocop/formatter/junit_formatter.rb +70 -23
  589. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  590. data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
  591. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  592. data/lib/rubocop/formatter/tap_formatter.rb +3 -7
  593. data/lib/rubocop/formatter.rb +1 -1
  594. data/lib/rubocop/lockfile.rb +58 -7
  595. data/lib/rubocop/lsp/diagnostic.rb +190 -0
  596. data/lib/rubocop/lsp/logger.rb +3 -3
  597. data/lib/rubocop/lsp/routes.rb +77 -40
  598. data/lib/rubocop/lsp/runtime.rb +20 -50
  599. data/lib/rubocop/lsp/server.rb +6 -4
  600. data/lib/rubocop/lsp/severity.rb +1 -1
  601. data/lib/rubocop/lsp/stdin_runner.rb +69 -0
  602. data/lib/rubocop/lsp.rb +36 -0
  603. data/lib/rubocop/magic_comment.rb +12 -4
  604. data/lib/rubocop/options.rb +43 -22
  605. data/lib/rubocop/path_util.rb +21 -10
  606. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  607. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  608. data/lib/rubocop/plugin/load_error.rb +26 -0
  609. data/lib/rubocop/plugin/loader.rb +100 -0
  610. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  611. data/lib/rubocop/plugin.rb +46 -0
  612. data/lib/rubocop/rake_task.rb +5 -2
  613. data/lib/rubocop/remote_config.rb +5 -1
  614. data/lib/rubocop/result_cache.rb +29 -34
  615. data/lib/rubocop/rspec/cop_helper.rb +20 -2
  616. data/lib/rubocop/rspec/expect_offense.rb +31 -12
  617. data/lib/rubocop/rspec/shared_contexts.rb +112 -18
  618. data/lib/rubocop/rspec/support.rb +7 -2
  619. data/lib/rubocop/runner.rb +40 -13
  620. data/lib/rubocop/server/cache.rb +63 -11
  621. data/lib/rubocop/server/cli.rb +2 -2
  622. data/lib/rubocop/server/client_command/base.rb +10 -0
  623. data/lib/rubocop/server/client_command/exec.rb +3 -3
  624. data/lib/rubocop/server/client_command/start.rb +11 -1
  625. data/lib/rubocop/server/core.rb +5 -0
  626. data/lib/rubocop/server/server_command/exec.rb +0 -1
  627. data/lib/rubocop/target_finder.rb +93 -82
  628. data/lib/rubocop/target_ruby.rb +111 -81
  629. data/lib/rubocop/version.rb +67 -9
  630. data/lib/rubocop/yaml_duplication_checker.rb +20 -26
  631. data/lib/rubocop.rb +61 -3
  632. data/lib/ruby_lsp/rubocop/addon.rb +90 -0
  633. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
  634. metadata +103 -51
  635. data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
  636. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  637. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
  638. /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -15,49 +15,24 @@ module RuboCop
15
15
  # see `ext/regexp_parser`.
16
16
  attr_reader :parsed_tree
17
17
 
18
- if Gem::Version.new(Regexp::Parser::VERSION) >= Gem::Version.new('2.0')
19
- def assign_properties(*)
20
- super
18
+ def assign_properties(*)
19
+ super
21
20
 
22
- str = with_interpolations_blanked
23
- @parsed_tree = begin
24
- Regexp::Parser.parse(str, options: options)
25
- rescue StandardError
26
- nil
27
- end
28
- origin = loc.begin.end
29
- @parsed_tree&.each_expression(true) { |e| e.origin = origin }
30
- end
31
- # Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
32
- # It's for compatibility with regexp_parser 1.8 and will never be maintained.
33
- else
34
- def assign_properties(*)
35
- super
36
-
37
- str = with_interpolations_blanked
38
- begin
39
- @parsed_tree = Regexp::Parser.parse(str, options: options)
40
- rescue StandardError
41
- @parsed_tree = nil
42
- else
43
- origin = loc.begin.end
44
- source = @parsed_tree.to_s
45
- @parsed_tree.each_expression(true) do |e|
46
- e.origin = origin
47
- e.source = source
48
- end
49
- end
21
+ str = with_interpolations_blanked
22
+ @parsed_tree = begin
23
+ Regexp::Parser.parse(str, options: options)
24
+ rescue StandardError
25
+ nil
50
26
  end
27
+ origin = loc.begin.end
28
+ @parsed_tree&.each_expression(true) { |e| e.origin = origin }
51
29
  end
52
30
 
53
31
  def each_capture(named: ANY)
54
32
  return enum_for(__method__, named: named) unless block_given?
55
33
 
56
34
  parsed_tree&.traverse do |event, exp, _index|
57
- yield(exp) if event == :enter &&
58
- named == exp.respond_to?(:name) &&
59
- exp.respond_to?(:capturing?) &&
60
- exp.capturing?
35
+ yield(exp) if named_capturing?(exp, event, named)
61
36
  end
62
37
 
63
38
  self
@@ -65,6 +40,13 @@ module RuboCop
65
40
 
66
41
  private
67
42
 
43
+ def named_capturing?(exp, event, named)
44
+ event == :enter &&
45
+ named == exp.respond_to?(:name) &&
46
+ exp.respond_to?(:capturing?) &&
47
+ exp.capturing?
48
+ end
49
+
68
50
  def with_interpolations_blanked
69
51
  # Ignore the trailing regopt node
70
52
  children[0...-1].map do |child|
@@ -22,26 +22,9 @@ module RuboCop
22
22
  module Base
23
23
  attr_accessor :origin
24
24
 
25
- if Gem::Version.new(Regexp::Parser::VERSION) >= Gem::Version.new('2.0')
26
- # Shortcut to `loc.expression`
27
- def expression
28
- @expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length)
29
- end
30
- # Please remove this `else` branch when support for regexp_parser 1.8 will be dropped.
31
- # It's for compatibility with regexp_parser 1.8 and will never be maintained.
32
- else
33
- attr_accessor :source
34
-
35
- def start_index
36
- # ts is a byte index; convert it to a character index
37
- @start_index ||= source.byteslice(0, ts).length
38
- end
39
-
40
- # Shortcut to `loc.expression`
41
- def expression
42
- end_pos = start_index + full_length
43
- @expression ||= origin.adjust(begin_pos: start_index, end_pos: end_pos)
44
- end
25
+ # Shortcut to `loc.expression`
26
+ def expression
27
+ @expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length)
45
28
  end
46
29
 
47
30
  # @returns a location map like `parser` does, with:
@@ -69,8 +52,8 @@ module RuboCop
69
52
 
70
53
  body = expression.adjust(end_pos: -q.text.length)
71
54
  q.origin = origin
72
- q.source = source if q.respond_to?(:source=) # for regexp_parser 1.8
73
55
  q_loc = q.expression
56
+
74
57
  { body: body, quantifier: q_loc }
75
58
  end
76
59
  end
@@ -23,15 +23,20 @@ module RuboCop
23
23
  last_file
24
24
  end
25
25
 
26
+ def traverse_directories_upwards(start_dir, stop_dir = nil)
27
+ Pathname.new(start_dir).expand_path.ascend do |dir|
28
+ yield(dir)
29
+ dir = dir.to_s
30
+ break if dir == stop_dir || dir == FileFinder.root_level
31
+ end
32
+ end
33
+
26
34
  private
27
35
 
28
36
  def traverse_files_upwards(filename, start_dir, stop_dir)
29
- Pathname.new(start_dir).expand_path.ascend do |dir|
37
+ traverse_directories_upwards(start_dir, stop_dir) do |dir|
30
38
  file = dir + filename
31
39
  yield(file.to_s) if file.exist?
32
-
33
- dir = dir.to_s
34
- break if dir == stop_dir || dir == FileFinder.root_level
35
40
  end
36
41
  end
37
42
  end
@@ -24,14 +24,10 @@ module RuboCop
24
24
  message: message(offense)
25
25
  )
26
26
 
27
- begin
28
- return unless valid_line?(offense)
27
+ return unless valid_line?(offense)
29
28
 
30
- report_line(offense.location)
31
- report_highlighted_area(offense.highlighted_area)
32
- rescue IndexError
33
- # range is not on a valid line; perhaps the source file is empty
34
- end
29
+ report_line(offense.location)
30
+ report_highlighted_area(offense.highlighted_area)
35
31
  end
36
32
 
37
33
  def valid_line?(offense)
@@ -4,19 +4,35 @@ module RuboCop
4
4
  module Formatter
5
5
  # This formatter displays a YAML configuration file where all cops that
6
6
  # detected any offenses are configured to not detect the offense.
7
- class DisabledConfigFormatter < BaseFormatter
7
+ class DisabledConfigFormatter < BaseFormatter # rubocop:disable Metrics/ClassLength
8
8
  include PathUtil
9
9
 
10
10
  HEADING = <<~COMMENTS
11
11
  # This configuration was generated by
12
12
  # `%<command>s`
13
- # %<timestamp>susing RuboCop version #{Version.version}.
13
+ # %<timestamp>susing RuboCop version #{Version::STRING}.
14
14
  # The point is for the user to remove these configuration records
15
15
  # one by one as the offenses are removed from the code base.
16
16
  # Note that changes in the inspected code, or installation of new
17
17
  # versions of RuboCop, may require this file to be generated again.
18
18
  COMMENTS
19
19
 
20
+ EXCLUDED_CONFIG_KEYS = %w[
21
+ AutoCorrect
22
+ Description
23
+ Enabled
24
+ Exclude
25
+ Include
26
+ Reference
27
+ References
28
+ Safe
29
+ SafeAutoCorrect
30
+ StyleGuide
31
+ VersionAdded
32
+ VersionChanged
33
+ VersionRemoved
34
+ ].freeze
35
+
20
36
  @config_to_allow_offenses = {}
21
37
  @detected_styles = {}
22
38
 
@@ -30,7 +46,8 @@ module RuboCop
30
46
  @files_with_offenses ||= {}
31
47
  end
32
48
 
33
- def file_started(_file, _file_info)
49
+ def file_started(_file, options)
50
+ @config_for_pwd = options[:config_store].for_pwd
34
51
  @exclude_limit_option = @options[:exclude_limit]
35
52
  @exclude_limit = Integer(@exclude_limit_option ||
36
53
  RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS)
@@ -115,16 +132,24 @@ module RuboCop
115
132
  def set_max(cfg, cop_name)
116
133
  return unless cfg[:exclude_limit]
117
134
 
118
- # In case auto_gen_only_exclude is set, only modify the maximum if the
119
- # files are not excluded one by one.
120
- if !@options[:auto_gen_only_exclude] || @files_with_offenses[cop_name].size > @exclude_limit
121
- cfg.merge!(cfg[:exclude_limit])
122
- end
135
+ cfg.merge!(cfg[:exclude_limit]) if should_set_max?(cop_name)
123
136
 
124
137
  # Remove already used exclude_limit.
125
138
  cfg.reject! { |key| key == :exclude_limit }
126
139
  end
127
140
 
141
+ def should_set_max?(cop_name)
142
+ max_set_in_user_config =
143
+ @config_for_pwd.for_cop(cop_name)['Max'] != default_config(cop_name)['Max']
144
+
145
+ max_allowed = !max_set_in_user_config && !no_exclude_limit?
146
+ return false unless max_allowed
147
+
148
+ # In case auto_gen_only_exclude is set, only modify the maximum if the files are not
149
+ # excluded one by one.
150
+ !@options[:auto_gen_only_exclude] || @files_with_offenses[cop_name].size > @exclude_limit
151
+ end
152
+
128
153
  def output_cop_comments(output_buffer, cfg, cop_name, offense_count)
129
154
  output_buffer.puts "# Offense count: #{offense_count}" if show_offense_counts?
130
155
 
@@ -154,10 +179,7 @@ module RuboCop
154
179
  end
155
180
 
156
181
  def cop_config_params(default_cfg, cfg)
157
- default_cfg.keys -
158
- %w[Description StyleGuide Reference Enabled Exclude Safe
159
- SafeAutoCorrect VersionAdded VersionChanged VersionRemoved] -
160
- cfg.keys
182
+ default_cfg.keys - EXCLUDED_CONFIG_KEYS - cfg.keys
161
183
  end
162
184
 
163
185
  def output_cop_param_comments(output_buffer, params, default_cfg)
@@ -169,6 +191,7 @@ module RuboCop
169
191
  next unless value.is_a?(Array)
170
192
  next if value.empty?
171
193
 
194
+ value.map! { |v| v.nil? ? '~' : v } # Change nil back to ~ as in the YAML file.
172
195
  output_buffer.puts "# #{param}: #{value.uniq.join(', ')}"
173
196
  end
174
197
  end
@@ -192,8 +215,8 @@ module RuboCop
192
215
  # 'Enabled' option will be put into file only if exclude
193
216
  # limit is exceeded.
194
217
  rejected_keys = ['Enabled']
195
- rejected_keys << 'EnforcedStyle' unless auto_gen_enforced_style?
196
- cfg.reject { |key| rejected_keys.include?(key) }
218
+ rejected_keys << /\AEnforcedStyle\w*/ unless auto_gen_enforced_style?
219
+ cfg.reject { |key| include_or_match?(rejected_keys, key) }
197
220
  end
198
221
 
199
222
  def output_offending_files(output_buffer, cfg, cop_name)
@@ -262,6 +285,12 @@ module RuboCop
262
285
  def no_exclude_limit?
263
286
  @options[:no_exclude_limit] == false
264
287
  end
288
+
289
+ # Returns true if the given arr include the given elm or if any of the
290
+ # given arr is a regexp that matches the given elm.
291
+ def include_or_match?(arr, elm)
292
+ arr.include?(elm) || arr.any? { |x| x.is_a?(Regexp) && x.match?(elm) }
293
+ end
265
294
  end
266
295
  end
267
296
  end
@@ -27,6 +27,7 @@ module RuboCop
27
27
  '[t]ap' => 'TapFormatter',
28
28
  '[w]orst' => 'WorstOffendersFormatter'
29
29
  }.freeze
30
+ BUILTIN_FORMATTER_NAMES = BUILTIN_FORMATTERS_FOR_KEYS.keys.map { |key| key.delete('[]') }
30
31
 
31
32
  FORMATTER_APIS = %i[started finished].freeze
32
33
 
@@ -76,7 +77,7 @@ module RuboCop
76
77
  case formatter_type
77
78
  when Class
78
79
  formatter_type
79
- when /\A[A-Z]/
80
+ when /\A(::)?[A-Z]/
80
81
  custom_formatter_class(formatter_type)
81
82
  else
82
83
  builtin_formatter_class(formatter_type)
@@ -88,7 +89,12 @@ module RuboCop
88
89
  /^\[#{specified_key}\]/.match?(key) || specified_key == key.delete('[]')
89
90
  end
90
91
 
91
- raise %(No formatter for "#{specified_key}") if matching_keys.empty?
92
+ if matching_keys.empty?
93
+ similar_name = NameSimilarity.find_similar_name(specified_key, BUILTIN_FORMATTER_NAMES)
94
+ suggestion = %( Did you mean? "#{similar_name}") if similar_name
95
+
96
+ raise Rainbow(%(Formatter "#{specified_key}" not found.#{suggestion})).red
97
+ end
92
98
 
93
99
  raise %(Cannot determine formatter for "#{specified_key}") if matching_keys.size > 1
94
100
 
@@ -22,7 +22,7 @@ module RuboCop
22
22
 
23
23
  @severest_offense = nil
24
24
 
25
- file_phrase = target_files.count == 1 ? 'file' : 'files'
25
+ file_phrase = target_files.one? ? 'file' : 'files'
26
26
 
27
27
  # 185/407 files |====== 45 ======> | ETA: 00:00:04
28
28
  # %c / %C | %w > %i | %e
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'base64'
4
- require 'cgi'
3
+ require 'cgi/escape'
5
4
  require 'erb'
6
- require 'ostruct'
7
5
 
8
6
  module RuboCop
9
7
  module Formatter
@@ -11,6 +9,7 @@ module RuboCop
11
9
  class HTMLFormatter < BaseFormatter
12
10
  ELLIPSES = '<span class="extra-code">...</span>'
13
11
  TEMPLATE_PATH = File.expand_path('../../../assets/output.html.erb', __dir__)
12
+ CSS_PATH = File.expand_path('../../../assets/output.css.erb', __dir__)
14
13
 
15
14
  Color = Struct.new(:red, :green, :blue, :alpha) do
16
15
  def to_s
@@ -52,8 +51,10 @@ module RuboCop
52
51
  context = ERBContext.new(files, summary)
53
52
 
54
53
  template = File.read(TEMPLATE_PATH, encoding: Encoding::UTF_8)
55
- erb = ERB.new(template, trim_mode: '-')
56
- html = erb.result(context.binding)
54
+ erb = ERB.new(template)
55
+ html = erb.result(context.binding).lines.map do |line|
56
+ line.match?(/\A\s*\z/) ? "\n" : line
57
+ end.join
57
58
 
58
59
  output.write html
59
60
  end
@@ -63,14 +64,6 @@ module RuboCop
63
64
  include PathUtil
64
65
  include TextUtil
65
66
 
66
- SEVERITY_COLORS = {
67
- refactor: Color.new(0xED, 0x9C, 0x28, 1.0),
68
- convention: Color.new(0xED, 0x9C, 0x28, 1.0),
69
- warning: Color.new(0x96, 0x28, 0xEF, 1.0),
70
- error: Color.new(0xD2, 0x32, 0x2D, 1.0),
71
- fatal: Color.new(0xD2, 0x32, 0x2D, 1.0)
72
- }.freeze
73
-
74
67
  LOGO_IMAGE_PATH = File.expand_path('../../../assets/logo.png', __dir__)
75
68
 
76
69
  attr_reader :files, :summary
@@ -88,7 +81,7 @@ module RuboCop
88
81
  # rubocop:enable Lint/UselessMethodDefinition
89
82
 
90
83
  def decorated_message(offense)
91
- offense.message.gsub(/`(.+?)`/) { "<code>#{Regexp.last_match(1)}</code>" }
84
+ offense.message.gsub(/`(.+?)`/) { "<code>#{escape(Regexp.last_match(1))}</code>" }
92
85
  end
93
86
 
94
87
  def highlighted_source_line(offense)
@@ -124,9 +117,39 @@ module RuboCop
124
117
 
125
118
  def base64_encoded_logo_image
126
119
  image = File.read(LOGO_IMAGE_PATH, binmode: true)
127
- Base64.encode64(image)
120
+
121
+ # `Base64.encode64` compatible:
122
+ # https://github.com/ruby/base64/blob/v0.1.1/lib/base64.rb#L27-L40
123
+ [image].pack('m')
124
+ end
125
+
126
+ def render_css
127
+ context = CSSContext.new
128
+ template = File.read(CSS_PATH, encoding: Encoding::UTF_8)
129
+ erb = ERB.new(template, trim_mode: '-')
130
+ erb.result(context.binding).lines.map do |line|
131
+ line == "\n" ? line : " #{line}"
132
+ end.join
128
133
  end
129
134
  end
135
+
136
+ # This class provides helper methods used in the ERB CSS template.
137
+ class CSSContext
138
+ SEVERITY_COLORS = {
139
+ refactor: Color.new(0xED, 0x9C, 0x28, 1.0),
140
+ convention: Color.new(0xED, 0x9C, 0x28, 1.0),
141
+ warning: Color.new(0x96, 0x28, 0xEF, 1.0),
142
+ error: Color.new(0xD2, 0x32, 0x2D, 1.0),
143
+ fatal: Color.new(0xD2, 0x32, 0x2D, 1.0)
144
+ }.freeze
145
+
146
+ # Make Kernel#binding public.
147
+ # rubocop:disable Lint/UselessMethodDefinition
148
+ def binding
149
+ super
150
+ end
151
+ # rubocop:enable Lint/UselessMethodDefinition
152
+ end
130
153
  end
131
154
  end
132
155
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'json'
4
- require 'pathname'
5
4
 
6
5
  module RuboCop
7
6
  module Formatter
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rexml/document'
4
-
5
3
  #
6
4
  # This code is based on https://github.com/mikian/rubocop-junit-formatter.
7
5
  #
@@ -15,13 +13,18 @@ module RuboCop
15
13
  module Formatter
16
14
  # This formatter formats the report data in JUnit format.
17
15
  class JUnitFormatter < BaseFormatter
16
+ ESCAPE_MAP = {
17
+ '"' => '&quot;',
18
+ "'" => '&apos;',
19
+ '<' => '&lt;',
20
+ '>' => '&gt;',
21
+ '&' => '&amp;'
22
+ }.freeze
23
+
18
24
  def initialize(output, options = {})
19
25
  super
20
26
 
21
- @document = REXML::Document.new.tap { |document| document << REXML::XMLDecl.new }
22
- testsuites = REXML::Element.new('testsuites', @document)
23
- testsuite = REXML::Element.new('testsuite', testsuites)
24
- @testsuite = testsuite.tap { |element| element.add_attributes('name' => 'rubocop') }
27
+ @test_case_elements = []
25
28
 
26
29
  reset_count
27
30
  end
@@ -44,6 +47,33 @@ module RuboCop
44
47
  end
45
48
  end
46
49
 
50
+ # rubocop:disable Layout/LineLength,Metrics/AbcSize,Metrics/MethodLength
51
+ def finished(_inspected_files)
52
+ output.puts %(<?xml version='1.0'?>)
53
+ output.puts %(<testsuites>)
54
+ output.puts %( <testsuite name='rubocop' tests='#{@inspected_file_count}' failures='#{@offense_count}'>)
55
+
56
+ @test_case_elements.each do |test_case_element|
57
+ if test_case_element.failures.empty?
58
+ output.puts %( <testcase classname='#{xml_escape test_case_element.classname}' name='#{test_case_element.name}'/>)
59
+ else
60
+ output.puts %( <testcase classname='#{xml_escape test_case_element.classname}' name='#{test_case_element.name}'>)
61
+ test_case_element.failures.each do |failure_element|
62
+ output.puts %( <failure type='#{failure_element.type}' message='#{xml_escape failure_element.message}'>)
63
+ output.puts %( #{xml_escape failure_element.text})
64
+ output.puts %( </failure>)
65
+ end
66
+ output.puts %( </testcase>)
67
+ end
68
+ end
69
+
70
+ output.puts %( </testsuite>)
71
+ output.puts %(</testsuites>)
72
+ end
73
+ # rubocop:enable Layout/LineLength,Metrics/AbcSize,Metrics/MethodLength
74
+
75
+ private
76
+
47
77
  def relevant_for_output?(options, target_offenses)
48
78
  !options[:display_only_failed] || target_offenses.any?
49
79
  end
@@ -53,11 +83,11 @@ module RuboCop
53
83
  end
54
84
 
55
85
  def add_testcase_element_to_testsuite_element(file, target_offenses, cop)
56
- REXML::Element.new('testcase', @testsuite).tap do |testcase|
57
- testcase.attributes['classname'] = classname_attribute_value(file)
58
- testcase.attributes['name'] = cop.cop_name
59
-
60
- add_failure_to(testcase, target_offenses, cop.cop_name)
86
+ @test_case_elements << TestCaseElement.new(
87
+ classname: classname_attribute_value(file),
88
+ name: cop.cop_name
89
+ ).tap do |test_case_element|
90
+ add_failure_to(test_case_element, target_offenses, cop.cop_name)
61
91
  end
62
92
  end
63
93
 
@@ -68,13 +98,6 @@ module RuboCop
68
98
  @classname_attribute_value_cache[file]
69
99
  end
70
100
 
71
- def finished(_inspected_files)
72
- @testsuite.add_attributes('tests' => @inspected_file_count, 'failures' => @offense_count)
73
- @document.write(output, 2)
74
- end
75
-
76
- private
77
-
78
101
  def reset_count
79
102
  @inspected_file_count = 0
80
103
  @offense_count = 0
@@ -84,11 +107,35 @@ module RuboCop
84
107
  # One failure per offense. Zero failures is a passing test case,
85
108
  # for most surefire/nUnit parsers.
86
109
  offenses.each do |offense|
87
- REXML::Element.new('failure', testcase).tap do |failure|
88
- failure.attributes['type'] = cop_name
89
- failure.attributes['message'] = offense.message
90
- failure.add_text(offense.location.to_s)
91
- end
110
+ testcase.failures << FailureElement.new(
111
+ type: cop_name,
112
+ message: offense.message,
113
+ text: offense.location.to_s
114
+ )
115
+ end
116
+ end
117
+
118
+ def xml_escape(string)
119
+ string.gsub(Regexp.union(ESCAPE_MAP.keys), ESCAPE_MAP)
120
+ end
121
+
122
+ class TestCaseElement # :nodoc:
123
+ attr_reader :classname, :name, :failures
124
+
125
+ def initialize(classname:, name:)
126
+ @classname = classname
127
+ @name = name
128
+ @failures = []
129
+ end
130
+ end
131
+
132
+ class FailureElement # :nodoc:
133
+ attr_reader :type, :message, :text
134
+
135
+ def initialize(type:, message:, text:)
136
+ @type = type
137
+ @message = message
138
+ @text = text
92
139
  end
93
140
  end
94
141
  end
@@ -6,6 +6,7 @@ module RuboCop
6
6
  class MarkdownFormatter < BaseFormatter
7
7
  include TextUtil
8
8
  include PathUtil
9
+
9
10
  attr_reader :files, :summary
10
11
 
11
12
  def initialize(output, options = {})
@@ -24,7 +24,7 @@ module RuboCop
24
24
 
25
25
  return unless output.tty?
26
26
 
27
- file_phrase = target_files.count == 1 ? 'file' : 'files'
27
+ file_phrase = target_files.one? ? 'file' : 'files'
28
28
 
29
29
  # 185/407 files |====== 45 ======> | ETA: 00:00:04
30
30
  # %c / %C | %w > %i | %e
@@ -61,8 +61,7 @@ module RuboCop
61
61
 
62
62
  column_width = total_count.to_s.length + 2
63
63
  per_cop_counts.each do |cop_name, count|
64
- output.puts "#{count.to_s.ljust(column_width)}#{cop_name}" \
65
- "#{@style_guide_links[cop_name]}\n"
64
+ output.puts "#{count.to_s.ljust(column_width)}#{cop_information(cop_name)}"
66
65
  end
67
66
  output.puts '--'
68
67
  output.puts "#{total_count} Total in #{offending_files_count} files"
@@ -78,6 +77,17 @@ module RuboCop
78
77
  def total_offense_count(offense_counts)
79
78
  offense_counts.values.sum
80
79
  end
80
+
81
+ def cop_information(cop_name)
82
+ cop = RuboCop::Cop::Registry.global.find_by_cop_name(cop_name).new
83
+
84
+ if cop.correctable?
85
+ safety = cop.safe_autocorrect? ? 'Safe' : 'Unsafe'
86
+ correctable = Rainbow(" [#{safety} Correctable]").yellow
87
+ end
88
+
89
+ "#{cop_name}#{correctable}#{@style_guide_links[cop_name]}"
90
+ end
81
91
  end
82
92
  end
83
93
  end
@@ -9,6 +9,7 @@ module RuboCop
9
9
  # https://github.com/go-labs/rspec_pacman_formatter
10
10
  class PacmanFormatter < ClangStyleFormatter
11
11
  include TextUtil
12
+
12
13
  attr_accessor :progress_line
13
14
 
14
15
  FALLBACK_TERMINAL_WIDTH = 80
@@ -58,7 +59,7 @@ module RuboCop
58
59
  return pacdots(@total_files) unless @total_files > cols
59
60
  return pacdots(cols) unless (@total_files / cols).eql?(@repetitions)
60
61
 
61
- pacdots((@total_files - (cols * @repetitions)))
62
+ pacdots(@total_files - (cols * @repetitions))
62
63
  end
63
64
 
64
65
  def pacdots(number)
@@ -53,14 +53,10 @@ module RuboCop
53
53
  message: message(offense)
54
54
  )
55
55
 
56
- begin
57
- return unless valid_line?(offense)
56
+ return unless valid_line?(offense)
58
57
 
59
- report_line(offense.location)
60
- report_highlighted_area(offense.highlighted_area)
61
- rescue IndexError
62
- # range is not on a valid line; perhaps the source file is empty
63
- end
58
+ report_line(offense.location)
59
+ report_highlighted_area(offense.highlighted_area)
64
60
  end
65
61
 
66
62
  def annotate_message(msg)
@@ -14,7 +14,7 @@ module RuboCop
14
14
  require_relative 'formatter/emacs_style_formatter'
15
15
  require_relative 'formatter/file_list_formatter'
16
16
  require_relative 'formatter/fuubar_style_formatter'
17
- require_relative 'formatter/git_hub_actions_formatter'
17
+ require_relative 'formatter/github_actions_formatter'
18
18
  require_relative 'formatter/html_formatter'
19
19
  require_relative 'formatter/json_formatter'
20
20
  require_relative 'formatter/junit_formatter'