rubocop 0.78.0 → 1.13.0

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 (735) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +69 -39
  4. data/assets/output.html.erb +1 -1
  5. data/config/default.yml +1034 -139
  6. data/config/obsoletion.yml +200 -0
  7. data/exe/rubocop +2 -4
  8. data/lib/rubocop.rb +139 -66
  9. data/lib/rubocop/ast_aliases.rb +8 -0
  10. data/lib/rubocop/cached_data.rb +4 -4
  11. data/lib/rubocop/cli.rb +19 -13
  12. data/lib/rubocop/cli/command.rb +1 -0
  13. data/lib/rubocop/cli/command/auto_genenerate_config.rb +46 -19
  14. data/lib/rubocop/cli/command/base.rb +2 -0
  15. data/lib/rubocop/cli/command/execute_runner.rb +36 -12
  16. data/lib/rubocop/cli/command/init_dotfile.rb +3 -4
  17. data/lib/rubocop/cli/command/show_cops.rb +14 -13
  18. data/lib/rubocop/cli/command/suggest_extensions.rb +81 -0
  19. data/lib/rubocop/cli/command/version.rb +3 -2
  20. data/lib/rubocop/cli/environment.rb +1 -0
  21. data/lib/rubocop/comment_config.rb +54 -98
  22. data/lib/rubocop/config.rb +76 -34
  23. data/lib/rubocop/config_loader.rb +118 -114
  24. data/lib/rubocop/config_loader_resolver.rb +99 -28
  25. data/lib/rubocop/config_obsoletion.rb +67 -239
  26. data/lib/rubocop/config_obsoletion/changed_enforced_styles.rb +33 -0
  27. data/lib/rubocop/config_obsoletion/changed_parameter.rb +21 -0
  28. data/lib/rubocop/config_obsoletion/cop_rule.rb +33 -0
  29. data/lib/rubocop/config_obsoletion/extracted_cop.rb +44 -0
  30. data/lib/rubocop/config_obsoletion/parameter_rule.rb +44 -0
  31. data/lib/rubocop/config_obsoletion/removed_cop.rb +41 -0
  32. data/lib/rubocop/config_obsoletion/renamed_cop.rb +34 -0
  33. data/lib/rubocop/config_obsoletion/rule.rb +41 -0
  34. data/lib/rubocop/config_obsoletion/split_cop.rb +27 -0
  35. data/lib/rubocop/config_regeneration.rb +33 -0
  36. data/lib/rubocop/config_store.rb +31 -7
  37. data/lib/rubocop/config_validator.rb +89 -103
  38. data/lib/rubocop/cop/autocorrect_logic.rb +41 -39
  39. data/lib/rubocop/cop/badge.rb +16 -32
  40. data/lib/rubocop/cop/base.rb +450 -0
  41. data/lib/rubocop/cop/bundler/duplicated_gem.rb +30 -6
  42. data/lib/rubocop/cop/bundler/gem_comment.rb +117 -8
  43. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +13 -20
  44. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -4
  45. data/lib/rubocop/cop/commissioner.rb +98 -74
  46. data/lib/rubocop/cop/cop.rb +84 -234
  47. data/lib/rubocop/cop/corrector.rb +63 -117
  48. data/lib/rubocop/cop/correctors/alignment_corrector.rb +13 -23
  49. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -6
  50. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  51. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  52. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  53. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +4 -4
  54. data/lib/rubocop/cop/correctors/line_break_corrector.rb +9 -12
  55. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -6
  56. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  57. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  58. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -21
  59. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  60. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  61. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +6 -8
  62. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  63. data/lib/rubocop/cop/documentation.rb +22 -0
  64. data/lib/rubocop/cop/exclude_limit.rb +26 -0
  65. data/lib/rubocop/cop/force.rb +2 -1
  66. data/lib/rubocop/cop/gemspec/date_assignment.rb +57 -0
  67. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +6 -5
  68. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +4 -8
  69. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +48 -20
  70. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +4 -2
  71. data/lib/rubocop/cop/generator.rb +14 -25
  72. data/lib/rubocop/cop/generator/configuration_injector.rb +5 -6
  73. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  74. data/lib/rubocop/cop/ignored_node.rb +1 -3
  75. data/lib/rubocop/cop/internal_affairs.rb +7 -1
  76. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +68 -0
  77. data/lib/rubocop/cop/internal_affairs/example_description.rb +92 -0
  78. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +8 -17
  79. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +4 -4
  80. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
  81. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  82. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +12 -10
  83. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +62 -0
  84. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +65 -0
  85. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +12 -7
  86. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +11 -8
  87. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +148 -0
  88. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +6 -6
  89. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  90. data/lib/rubocop/cop/layout/argument_alignment.rb +8 -9
  91. data/lib/rubocop/cop/layout/array_alignment.rb +58 -13
  92. data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
  93. data/lib/rubocop/cop/layout/begin_end_alignment.rb +74 -0
  94. data/lib/rubocop/cop/layout/block_alignment.rb +35 -43
  95. data/lib/rubocop/cop/layout/block_end_newline.rb +9 -11
  96. data/lib/rubocop/cop/layout/case_indentation.rb +22 -28
  97. data/lib/rubocop/cop/layout/class_structure.rb +58 -74
  98. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  99. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
  100. data/lib/rubocop/cop/layout/comment_indentation.rb +21 -25
  101. data/lib/rubocop/cop/layout/condition_position.rb +16 -8
  102. data/lib/rubocop/cop/layout/def_end_alignment.rb +9 -10
  103. data/lib/rubocop/cop/layout/dot_position.rb +20 -21
  104. data/lib/rubocop/cop/layout/else_alignment.rb +28 -6
  105. data/lib/rubocop/cop/layout/empty_comment.rb +29 -29
  106. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +39 -22
  107. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  108. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  109. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +140 -39
  110. data/lib/rubocop/cop/layout/empty_lines.rb +7 -12
  111. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +29 -38
  112. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +13 -9
  113. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +118 -0
  114. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  115. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  116. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  117. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -14
  118. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  119. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  120. data/lib/rubocop/cop/layout/end_alignment.rb +18 -24
  121. data/lib/rubocop/cop/layout/end_of_line.rb +8 -8
  122. data/lib/rubocop/cop/layout/extra_spacing.rb +23 -42
  123. data/lib/rubocop/cop/layout/first_argument_indentation.rb +40 -13
  124. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +24 -18
  125. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +4 -8
  126. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +25 -21
  127. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +3 -7
  128. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -13
  129. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -7
  130. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +8 -7
  131. data/lib/rubocop/cop/layout/hash_alignment.rb +37 -40
  132. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +46 -30
  133. data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -117
  134. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  135. data/lib/rubocop/cop/layout/indentation_style.rb +110 -0
  136. data/lib/rubocop/cop/layout/indentation_width.rb +22 -14
  137. data/lib/rubocop/cop/layout/initial_indentation.rb +7 -11
  138. data/lib/rubocop/cop/layout/leading_comment_space.rb +46 -13
  139. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  140. data/lib/rubocop/cop/layout/line_length.rb +61 -42
  141. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  142. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +3 -7
  143. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +36 -14
  144. data/lib/rubocop/cop/layout/multiline_block_layout.rb +51 -38
  145. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -9
  146. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +3 -7
  147. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +6 -13
  148. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  149. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +30 -19
  150. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  151. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +23 -9
  152. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  153. data/lib/rubocop/cop/layout/redundant_line_break.rb +125 -0
  154. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +37 -30
  155. data/lib/rubocop/cop/layout/space_after_colon.rb +10 -8
  156. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  157. data/lib/rubocop/cop/layout/space_after_method_name.rb +7 -10
  158. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  159. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  160. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +45 -52
  161. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +19 -23
  162. data/lib/rubocop/cop/layout/space_around_keyword.rb +22 -26
  163. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +98 -0
  164. data/lib/rubocop/cop/layout/space_around_operators.rb +59 -25
  165. data/lib/rubocop/cop/layout/space_before_block_braces.rb +41 -25
  166. data/lib/rubocop/cop/layout/space_before_brackets.rb +65 -0
  167. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  168. data/lib/rubocop/cop/layout/space_before_comment.rb +8 -9
  169. data/lib/rubocop/cop/layout/space_before_first_arg.rb +17 -15
  170. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  171. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +11 -21
  172. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +30 -39
  173. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +5 -15
  174. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +34 -39
  175. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +22 -48
  176. data/lib/rubocop/cop/layout/space_inside_parens.rb +39 -22
  177. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  178. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +9 -18
  179. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +18 -29
  180. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  181. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  182. data/lib/rubocop/cop/layout/trailing_whitespace.rb +42 -18
  183. data/lib/rubocop/cop/legacy/corrections_proxy.rb +43 -0
  184. data/lib/rubocop/cop/legacy/corrector.rb +27 -0
  185. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +54 -0
  186. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +21 -9
  187. data/lib/rubocop/cop/lint/ambiguous_operator.rb +53 -5
  188. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +36 -6
  189. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  190. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  191. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +55 -0
  192. data/lib/rubocop/cop/lint/boolean_symbol.rb +24 -4
  193. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  194. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +100 -0
  195. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  196. data/lib/rubocop/cop/lint/debugger.rb +61 -21
  197. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -14
  198. data/lib/rubocop/cop/lint/deprecated_constants.rb +80 -0
  199. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +148 -0
  200. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  201. data/lib/rubocop/cop/lint/duplicate_branch.rb +154 -0
  202. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -13
  203. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  204. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -4
  205. data/lib/rubocop/cop/lint/duplicate_methods.rb +12 -16
  206. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +77 -0
  207. data/lib/rubocop/cop/lint/duplicate_require.rb +47 -0
  208. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +47 -0
  209. data/lib/rubocop/cop/lint/each_with_object_argument.rb +3 -1
  210. data/lib/rubocop/cop/lint/else_layout.rb +29 -5
  211. data/lib/rubocop/cop/lint/empty_block.rb +82 -0
  212. data/lib/rubocop/cop/lint/empty_class.rb +93 -0
  213. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  214. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -7
  215. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  216. data/lib/rubocop/cop/lint/empty_file.rb +48 -0
  217. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -7
  218. data/lib/rubocop/cop/lint/empty_when.rb +31 -8
  219. data/lib/rubocop/cop/lint/ensure_return.rb +29 -16
  220. data/lib/rubocop/cop/lint/erb_new_arguments.rb +19 -21
  221. data/lib/rubocop/cop/lint/flip_flop.rb +9 -3
  222. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  223. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -3
  224. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +45 -10
  225. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +38 -0
  226. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +14 -16
  227. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  228. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +7 -7
  229. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +14 -20
  230. data/lib/rubocop/cop/lint/inherit_exception.rb +14 -9
  231. data/lib/rubocop/cop/lint/interpolation_check.rb +20 -7
  232. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +44 -0
  233. data/lib/rubocop/cop/lint/literal_as_condition.rb +24 -15
  234. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +44 -15
  235. data/lib/rubocop/cop/lint/loop.rb +31 -9
  236. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +9 -12
  237. data/lib/rubocop/cop/lint/missing_super.rb +101 -0
  238. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +36 -0
  239. data/lib/rubocop/cop/lint/multiple_comparison.rb +15 -15
  240. data/lib/rubocop/cop/lint/nested_method_definition.rb +21 -25
  241. data/lib/rubocop/cop/lint/nested_percent_literal.rb +17 -5
  242. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -1
  243. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +58 -0
  244. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +95 -15
  245. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +12 -9
  246. data/lib/rubocop/cop/lint/number_conversion.rb +97 -23
  247. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +47 -0
  248. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +39 -0
  249. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +12 -15
  250. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +96 -0
  251. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +31 -12
  252. data/lib/rubocop/cop/lint/percent_string_array.rb +6 -11
  253. data/lib/rubocop/cop/lint/percent_symbol_array.rb +12 -13
  254. data/lib/rubocop/cop/lint/raise_exception.rb +87 -0
  255. data/lib/rubocop/cop/lint/rand_one.rb +5 -4
  256. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +71 -75
  257. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +51 -37
  258. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +50 -0
  259. data/lib/rubocop/cop/lint/redundant_require_statement.rb +9 -10
  260. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +77 -0
  261. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +72 -35
  262. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +8 -15
  263. data/lib/rubocop/cop/lint/redundant_with_index.rb +13 -18
  264. data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -18
  265. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -2
  266. data/lib/rubocop/cop/lint/require_parentheses.rb +4 -6
  267. data/lib/rubocop/cop/lint/rescue_exception.rb +3 -4
  268. data/lib/rubocop/cop/lint/rescue_type.rb +10 -16
  269. data/lib/rubocop/cop/lint/return_in_void_context.rb +3 -6
  270. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +6 -9
  271. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +15 -17
  272. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +12 -4
  273. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  274. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  275. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +11 -19
  276. data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -14
  277. data/lib/rubocop/cop/lint/shadowed_exception.rb +18 -30
  278. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +21 -7
  279. data/lib/rubocop/cop/lint/struct_new_override.rb +59 -0
  280. data/lib/rubocop/cop/lint/suppressed_exception.rb +55 -18
  281. data/lib/rubocop/cop/lint/symbol_conversion.rb +188 -0
  282. data/lib/rubocop/cop/lint/syntax.rb +11 -30
  283. data/lib/rubocop/cop/lint/to_enum_arguments.rb +89 -0
  284. data/lib/rubocop/cop/lint/to_json.rb +21 -13
  285. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  286. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +55 -0
  287. data/lib/rubocop/cop/lint/triple_quotes.rb +71 -0
  288. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +5 -7
  289. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +85 -0
  290. data/lib/rubocop/cop/lint/unified_integer.rb +5 -8
  291. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +204 -0
  292. data/lib/rubocop/cop/lint/unreachable_code.rb +5 -7
  293. data/lib/rubocop/cop/lint/unreachable_loop.rb +186 -0
  294. data/lib/rubocop/cop/lint/unused_block_argument.rb +12 -11
  295. data/lib/rubocop/cop/lint/unused_method_argument.rb +42 -11
  296. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +5 -2
  297. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  298. data/lib/rubocop/cop/lint/useless_access_modifier.rb +38 -22
  299. data/lib/rubocop/cop/lint/useless_assignment.rb +9 -13
  300. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +7 -11
  301. data/lib/rubocop/cop/lint/useless_method_definition.rb +68 -0
  302. data/lib/rubocop/cop/lint/useless_setter_call.rb +15 -9
  303. data/lib/rubocop/cop/lint/useless_times.rb +109 -0
  304. data/lib/rubocop/cop/lint/void.rb +7 -18
  305. data/lib/rubocop/cop/message_annotator.rb +5 -4
  306. data/lib/rubocop/cop/metrics/abc_size.rb +26 -2
  307. data/lib/rubocop/cop/metrics/block_length.rb +40 -10
  308. data/lib/rubocop/cop/metrics/block_nesting.rb +5 -10
  309. data/lib/rubocop/cop/metrics/class_length.rb +40 -11
  310. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +38 -6
  311. data/lib/rubocop/cop/metrics/method_length.rb +32 -4
  312. data/lib/rubocop/cop/metrics/module_length.rb +29 -9
  313. data/lib/rubocop/cop/metrics/parameter_lists.rb +74 -11
  314. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -9
  315. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +76 -15
  316. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +160 -0
  317. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  318. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +143 -0
  319. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +42 -0
  320. data/lib/rubocop/cop/migration/department_name.rb +51 -16
  321. data/lib/rubocop/cop/mixin/alignment.rb +18 -11
  322. data/lib/rubocop/cop/mixin/allowed_identifiers.rb +18 -0
  323. data/lib/rubocop/cop/mixin/allowed_methods.rb +21 -0
  324. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  325. data/lib/rubocop/cop/mixin/array_min_size.rb +2 -4
  326. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  327. data/lib/rubocop/cop/mixin/check_line_breakable.rb +26 -18
  328. data/lib/rubocop/cop/mixin/code_length.rb +29 -8
  329. data/lib/rubocop/cop/mixin/comments_help.rb +42 -0
  330. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +7 -5
  331. data/lib/rubocop/cop/mixin/configurable_formatting.rb +4 -11
  332. data/lib/rubocop/cop/mixin/configurable_max.rb +1 -0
  333. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  334. data/lib/rubocop/cop/mixin/configurable_numbering.rb +4 -3
  335. data/lib/rubocop/cop/mixin/def_node.rb +3 -5
  336. data/lib/rubocop/cop/mixin/documentation_comment.rb +4 -7
  337. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +14 -14
  338. data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -1
  339. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +16 -2
  340. data/lib/rubocop/cop/mixin/enforce_superclass.rb +16 -8
  341. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -3
  342. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +12 -9
  343. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  344. data/lib/rubocop/cop/mixin/hash_transform_method.rb +183 -0
  345. data/lib/rubocop/cop/mixin/ignored_methods.rb +36 -3
  346. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  347. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  348. data/lib/rubocop/cop/mixin/line_length_help.rb +17 -15
  349. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  350. data/lib/rubocop/cop/mixin/method_complexity.rb +26 -6
  351. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  352. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  353. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -1
  354. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +13 -42
  355. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +14 -14
  356. data/lib/rubocop/cop/mixin/negative_conditional.rb +6 -4
  357. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  358. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +7 -5
  359. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  360. data/lib/rubocop/cop/mixin/percent_array.rb +14 -9
  361. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  362. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -12
  363. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +6 -9
  364. data/lib/rubocop/cop/mixin/range_help.rb +24 -13
  365. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  366. data/lib/rubocop/cop/mixin/rescue_node.rb +13 -7
  367. data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
  368. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +6 -7
  369. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +5 -5
  370. data/lib/rubocop/cop/mixin/statement_modifier.rb +45 -22
  371. data/lib/rubocop/cop/mixin/string_help.rb +4 -1
  372. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  373. data/lib/rubocop/cop/mixin/surrounding_space.rb +15 -31
  374. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  375. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  376. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -27
  377. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +25 -32
  378. data/lib/rubocop/cop/mixin/unused_argument.rb +5 -9
  379. data/lib/rubocop/cop/mixin/visibility_help.rb +37 -0
  380. data/lib/rubocop/cop/naming/accessor_method_name.rb +19 -3
  381. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -8
  382. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -7
  383. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  384. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +13 -3
  385. data/lib/rubocop/cop/naming/constant_name.rb +5 -2
  386. data/lib/rubocop/cop/naming/file_name.rb +36 -34
  387. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +12 -6
  388. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +4 -4
  389. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +132 -24
  390. data/lib/rubocop/cop/naming/method_name.rb +31 -3
  391. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  392. data/lib/rubocop/cop/naming/predicate_name.rb +10 -13
  393. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +59 -15
  394. data/lib/rubocop/cop/naming/variable_name.rb +3 -1
  395. data/lib/rubocop/cop/naming/variable_number.rb +94 -9
  396. data/lib/rubocop/cop/offense.rb +35 -12
  397. data/lib/rubocop/cop/registry.rb +100 -24
  398. data/lib/rubocop/cop/security/eval.rb +4 -2
  399. data/lib/rubocop/cop/security/json_load.rb +8 -8
  400. data/lib/rubocop/cop/security/marshal_load.rb +4 -4
  401. data/lib/rubocop/cop/security/open.rb +15 -11
  402. data/lib/rubocop/cop/security/yaml_load.rb +8 -6
  403. data/lib/rubocop/cop/severity.rb +4 -14
  404. data/lib/rubocop/cop/style/access_modifier_declarations.rb +37 -13
  405. data/lib/rubocop/cop/style/accessor_grouping.rb +150 -0
  406. data/lib/rubocop/cop/style/alias.rb +46 -45
  407. data/lib/rubocop/cop/style/and_or.rb +30 -23
  408. data/lib/rubocop/cop/style/arguments_forwarding.rb +143 -0
  409. data/lib/rubocop/cop/style/array_coercion.rb +69 -0
  410. data/lib/rubocop/cop/style/array_join.rb +9 -9
  411. data/lib/rubocop/cop/style/ascii_comments.rb +6 -7
  412. data/lib/rubocop/cop/style/attr.rb +15 -15
  413. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +9 -12
  414. data/lib/rubocop/cop/style/bare_percent_literals.rb +12 -14
  415. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  416. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +125 -0
  417. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  418. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  419. data/lib/rubocop/cop/style/block_delimiters.rb +77 -26
  420. data/lib/rubocop/cop/style/case_equality.rb +55 -4
  421. data/lib/rubocop/cop/style/case_like_if.rb +258 -0
  422. data/lib/rubocop/cop/style/character_literal.rb +12 -15
  423. data/lib/rubocop/cop/style/class_and_module_children.rb +28 -21
  424. data/lib/rubocop/cop/style/class_check.rb +6 -11
  425. data/lib/rubocop/cop/style/class_equality_comparison.rb +67 -0
  426. data/lib/rubocop/cop/style/class_methods.rb +8 -14
  427. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  428. data/lib/rubocop/cop/style/class_vars.rb +23 -7
  429. data/lib/rubocop/cop/style/collection_compact.rb +91 -0
  430. data/lib/rubocop/cop/style/collection_methods.rb +24 -15
  431. data/lib/rubocop/cop/style/colon_method_call.rb +7 -9
  432. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  433. data/lib/rubocop/cop/style/combinable_loops.rb +92 -0
  434. data/lib/rubocop/cop/style/command_literal.rb +22 -28
  435. data/lib/rubocop/cop/style/comment_annotation.rb +24 -21
  436. data/lib/rubocop/cop/style/commented_keyword.rb +34 -21
  437. data/lib/rubocop/cop/style/conditional_assignment.rb +75 -91
  438. data/lib/rubocop/cop/style/constant_visibility.rb +31 -2
  439. data/lib/rubocop/cop/style/copyright.rb +21 -24
  440. data/lib/rubocop/cop/style/date_time.rb +16 -5
  441. data/lib/rubocop/cop/style/def_with_parentheses.rb +9 -12
  442. data/lib/rubocop/cop/style/dir.rb +11 -12
  443. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +87 -0
  444. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +169 -0
  445. data/lib/rubocop/cop/style/documentation.rb +92 -18
  446. data/lib/rubocop/cop/style/documentation_method.rb +2 -1
  447. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  448. data/lib/rubocop/cop/style/double_negation.rb +50 -6
  449. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -10
  450. data/lib/rubocop/cop/style/each_with_object.rb +17 -19
  451. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  452. data/lib/rubocop/cop/style/empty_case_condition.rb +22 -26
  453. data/lib/rubocop/cop/style/empty_else.rb +14 -22
  454. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  455. data/lib/rubocop/cop/style/empty_literal.rb +39 -31
  456. data/lib/rubocop/cop/style/empty_method.rb +12 -23
  457. data/lib/rubocop/cop/style/encoding.rb +6 -10
  458. data/lib/rubocop/cop/style/end_block.rb +7 -4
  459. data/lib/rubocop/cop/style/endless_method.rb +101 -0
  460. data/lib/rubocop/cop/style/eval_with_location.rb +143 -54
  461. data/lib/rubocop/cop/style/even_odd.rb +9 -11
  462. data/lib/rubocop/cop/style/expand_path_arguments.rb +27 -25
  463. data/lib/rubocop/cop/style/explicit_block_argument.rb +114 -0
  464. data/lib/rubocop/cop/style/exponential_notation.rb +116 -0
  465. data/lib/rubocop/cop/style/float_division.rb +60 -11
  466. data/lib/rubocop/cop/style/for.rb +7 -13
  467. data/lib/rubocop/cop/style/format_string.rb +30 -24
  468. data/lib/rubocop/cop/style/format_string_token.rb +78 -22
  469. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +83 -38
  470. data/lib/rubocop/cop/style/global_std_stream.rb +66 -0
  471. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  472. data/lib/rubocop/cop/style/guard_clause.rb +32 -13
  473. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +88 -0
  474. data/lib/rubocop/cop/style/hash_conversion.rb +133 -0
  475. data/lib/rubocop/cop/style/hash_each_methods.rb +86 -0
  476. data/lib/rubocop/cop/style/hash_except.rb +96 -0
  477. data/lib/rubocop/cop/style/hash_like_case.rb +77 -0
  478. data/lib/rubocop/cop/style/hash_syntax.rb +50 -45
  479. data/lib/rubocop/cop/style/hash_transform_keys.rb +95 -0
  480. data/lib/rubocop/cop/style/hash_transform_values.rb +92 -0
  481. data/lib/rubocop/cop/style/identical_conditional_branches.rb +10 -7
  482. data/lib/rubocop/cop/style/if_inside_else.rb +50 -2
  483. data/lib/rubocop/cop/style/if_unless_modifier.rb +76 -46
  484. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  485. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +122 -0
  486. data/lib/rubocop/cop/style/if_with_semicolon.rb +51 -3
  487. data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -1
  488. data/lib/rubocop/cop/style/infinite_loop.rb +27 -26
  489. data/lib/rubocop/cop/style/inline_comment.rb +4 -4
  490. data/lib/rubocop/cop/style/inverse_methods.rb +34 -42
  491. data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
  492. data/lib/rubocop/cop/style/keyword_parameters_order.rb +75 -0
  493. data/lib/rubocop/cop/style/lambda.rb +11 -17
  494. data/lib/rubocop/cop/style/lambda_call.rb +18 -35
  495. data/lib/rubocop/cop/style/line_end_concatenation.rb +21 -25
  496. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +58 -207
  497. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +189 -0
  498. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +44 -0
  499. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +19 -12
  500. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +14 -7
  501. data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -24
  502. data/lib/rubocop/cop/style/min_max.rb +10 -14
  503. data/lib/rubocop/cop/style/missing_else.rb +13 -25
  504. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +11 -5
  505. data/lib/rubocop/cop/style/mixin_grouping.rb +27 -40
  506. data/lib/rubocop/cop/style/mixin_usage.rb +12 -30
  507. data/lib/rubocop/cop/style/module_function.rb +70 -25
  508. data/lib/rubocop/cop/style/multiline_block_chain.rb +13 -5
  509. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -11
  510. data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
  511. data/lib/rubocop/cop/style/multiline_memoization.rb +15 -13
  512. data/lib/rubocop/cop/style/multiline_method_signature.rb +33 -3
  513. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +32 -11
  514. data/lib/rubocop/cop/style/multiline_when_then.rb +31 -11
  515. data/lib/rubocop/cop/style/multiple_comparison.rb +76 -11
  516. data/lib/rubocop/cop/style/mutable_constant.rb +41 -33
  517. data/lib/rubocop/cop/style/negated_if.rb +10 -11
  518. data/lib/rubocop/cop/style/negated_if_else_condition.rb +120 -0
  519. data/lib/rubocop/cop/style/negated_unless.rb +10 -11
  520. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  521. data/lib/rubocop/cop/style/nested_modifier.rb +10 -17
  522. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +23 -20
  523. data/lib/rubocop/cop/style/nested_ternary_operator.rb +30 -4
  524. data/lib/rubocop/cop/style/next.rb +18 -27
  525. data/lib/rubocop/cop/style/nil_comparison.rb +19 -11
  526. data/lib/rubocop/cop/style/nil_lambda.rb +53 -0
  527. data/lib/rubocop/cop/style/non_nil_check.rb +56 -34
  528. data/lib/rubocop/cop/style/not.rb +20 -26
  529. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -11
  530. data/lib/rubocop/cop/style/numeric_literals.rb +19 -27
  531. data/lib/rubocop/cop/style/numeric_predicate.rb +17 -24
  532. data/lib/rubocop/cop/style/one_line_conditional.rb +75 -29
  533. data/lib/rubocop/cop/style/option_hash.rb +3 -4
  534. data/lib/rubocop/cop/style/optional_arguments.rb +4 -7
  535. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +53 -0
  536. data/lib/rubocop/cop/style/or_assignment.rb +14 -12
  537. data/lib/rubocop/cop/style/parallel_assignment.rb +27 -24
  538. data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -6
  539. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +22 -30
  540. data/lib/rubocop/cop/style/percent_q_literals.rb +9 -12
  541. data/lib/rubocop/cop/style/perl_backrefs.rb +84 -16
  542. data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -18
  543. data/lib/rubocop/cop/style/proc.rb +8 -8
  544. data/lib/rubocop/cop/style/raise_args.rb +39 -37
  545. data/lib/rubocop/cop/style/random_with_offset.rb +30 -35
  546. data/lib/rubocop/cop/style/redundant_argument.rb +85 -0
  547. data/lib/rubocop/cop/style/redundant_assignment.rb +106 -0
  548. data/lib/rubocop/cop/style/redundant_begin.rb +79 -13
  549. data/lib/rubocop/cop/style/redundant_capital_w.rb +7 -11
  550. data/lib/rubocop/cop/style/redundant_condition.rb +43 -18
  551. data/lib/rubocop/cop/style/redundant_conditional.rb +14 -15
  552. data/lib/rubocop/cop/style/redundant_exception.rb +22 -17
  553. data/lib/rubocop/cop/style/redundant_fetch_block.rb +115 -0
  554. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +52 -0
  555. data/lib/rubocop/cop/style/redundant_freeze.rb +16 -14
  556. data/lib/rubocop/cop/style/redundant_interpolation.rb +32 -27
  557. data/lib/rubocop/cop/style/redundant_parentheses.rb +51 -38
  558. data/lib/rubocop/cop/style/redundant_percent_q.rb +14 -17
  559. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +104 -0
  560. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +118 -0
  561. data/lib/rubocop/cop/style/redundant_return.rb +29 -29
  562. data/lib/rubocop/cop/style/redundant_self.rb +27 -29
  563. data/lib/rubocop/cop/style/redundant_self_assignment.rb +118 -0
  564. data/lib/rubocop/cop/style/redundant_sort.rb +32 -37
  565. data/lib/rubocop/cop/style/redundant_sort_by.rb +6 -9
  566. data/lib/rubocop/cop/style/regexp_literal.rb +14 -29
  567. data/lib/rubocop/cop/style/rescue_modifier.rb +39 -12
  568. data/lib/rubocop/cop/style/rescue_standard_error.rb +25 -23
  569. data/lib/rubocop/cop/style/return_nil.rb +13 -8
  570. data/lib/rubocop/cop/style/safe_navigation.rb +44 -39
  571. data/lib/rubocop/cop/style/sample.rb +14 -15
  572. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  573. data/lib/rubocop/cop/style/semicolon.rb +10 -10
  574. data/lib/rubocop/cop/style/send.rb +5 -7
  575. data/lib/rubocop/cop/style/signal_exception.rb +32 -27
  576. data/lib/rubocop/cop/style/single_argument_dig.rb +55 -0
  577. data/lib/rubocop/cop/style/single_line_block_params.rb +34 -12
  578. data/lib/rubocop/cop/style/single_line_methods.rb +65 -18
  579. data/lib/rubocop/cop/style/slicing_with_range.rb +38 -0
  580. data/lib/rubocop/cop/style/sole_nested_conditional.rb +167 -0
  581. data/lib/rubocop/cop/style/special_global_vars.rb +18 -51
  582. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +18 -25
  583. data/lib/rubocop/cop/style/static_class.rb +97 -0
  584. data/lib/rubocop/cop/style/stderr_puts.rb +9 -13
  585. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  586. data/lib/rubocop/cop/style/string_concatenation.rb +142 -0
  587. data/lib/rubocop/cop/style/string_hash_keys.rb +8 -7
  588. data/lib/rubocop/cop/style/string_literals.rb +16 -13
  589. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +4 -3
  590. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  591. data/lib/rubocop/cop/style/strip.rb +10 -14
  592. data/lib/rubocop/cop/style/struct_inheritance.rb +33 -4
  593. data/lib/rubocop/cop/style/swap_values.rb +108 -0
  594. data/lib/rubocop/cop/style/symbol_array.rb +13 -24
  595. data/lib/rubocop/cop/style/symbol_literal.rb +5 -9
  596. data/lib/rubocop/cop/style/symbol_proc.rb +50 -32
  597. data/lib/rubocop/cop/style/ternary_parentheses.rb +30 -35
  598. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  599. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +10 -9
  600. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  601. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +37 -27
  602. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +43 -5
  603. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +86 -0
  604. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +46 -5
  605. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +12 -38
  606. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +16 -31
  607. data/lib/rubocop/cop/style/trivial_accessors.rb +36 -40
  608. data/lib/rubocop/cop/style/unless_else.rb +7 -11
  609. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  610. data/lib/rubocop/cop/style/unpack_first.rb +5 -11
  611. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -11
  612. data/lib/rubocop/cop/style/when_then.rb +5 -9
  613. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  614. data/lib/rubocop/cop/style/while_until_modifier.rb +16 -24
  615. data/lib/rubocop/cop/style/word_array.rb +6 -25
  616. data/lib/rubocop/cop/style/yoda_condition.rb +33 -19
  617. data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -23
  618. data/lib/rubocop/cop/team.rb +147 -84
  619. data/lib/rubocop/cop/util.rb +43 -27
  620. data/lib/rubocop/cop/utils/format_string.rb +22 -9
  621. data/lib/rubocop/cop/variable_force.rb +15 -27
  622. data/lib/rubocop/cop/variable_force/assignment.rb +2 -2
  623. data/lib/rubocop/cop/variable_force/branch.rb +3 -9
  624. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  625. data/lib/rubocop/cop/variable_force/scope.rb +6 -9
  626. data/lib/rubocop/cop/variable_force/variable.rb +9 -12
  627. data/lib/rubocop/cops_documentation_generator.rb +270 -0
  628. data/lib/rubocop/core_ext/string.rb +2 -2
  629. data/lib/rubocop/directive_comment.rb +92 -0
  630. data/lib/rubocop/error.rb +1 -0
  631. data/lib/rubocop/ext/processed_source.rb +18 -0
  632. data/lib/rubocop/ext/regexp_node.rb +87 -0
  633. data/lib/rubocop/ext/regexp_parser.rb +92 -0
  634. data/lib/rubocop/file_finder.rb +12 -13
  635. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  636. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  637. data/lib/rubocop/formatter/clang_style_formatter.rb +5 -3
  638. data/lib/rubocop/formatter/disabled_config_formatter.rb +39 -30
  639. data/lib/rubocop/formatter/emacs_style_formatter.rb +2 -0
  640. data/lib/rubocop/formatter/formatter_set.rb +6 -6
  641. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +44 -0
  642. data/lib/rubocop/formatter/html_formatter.rb +6 -10
  643. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  644. data/lib/rubocop/formatter/junit_formatter.rb +78 -0
  645. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -2
  646. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  647. data/lib/rubocop/formatter/progress_formatter.rb +3 -4
  648. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  649. data/lib/rubocop/formatter/simple_text_formatter.rb +40 -7
  650. data/lib/rubocop/formatter/tap_formatter.rb +7 -3
  651. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -2
  652. data/lib/rubocop/lockfile.rb +40 -0
  653. data/lib/rubocop/magic_comment.rb +33 -4
  654. data/lib/rubocop/name_similarity.rb +18 -10
  655. data/lib/rubocop/options.rb +124 -77
  656. data/lib/rubocop/path_util.rb +20 -22
  657. data/lib/rubocop/platform.rb +1 -1
  658. data/lib/rubocop/rake_task.rb +12 -11
  659. data/lib/rubocop/remote_config.rb +6 -10
  660. data/lib/rubocop/result_cache.rb +50 -31
  661. data/lib/rubocop/rspec/cop_helper.rb +11 -35
  662. data/lib/rubocop/rspec/expect_offense.rb +129 -40
  663. data/lib/rubocop/rspec/shared_contexts.rb +78 -35
  664. data/lib/rubocop/runner.rb +112 -75
  665. data/lib/rubocop/string_interpreter.rb +3 -0
  666. data/lib/rubocop/target_finder.rb +53 -50
  667. data/lib/rubocop/target_ruby.rb +264 -0
  668. data/lib/rubocop/util.rb +16 -0
  669. data/lib/rubocop/version.rb +71 -7
  670. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  671. metadata +208 -94
  672. data/bin/console +0 -10
  673. data/bin/setup +0 -7
  674. data/lib/rubocop/ast/builder.rb +0 -82
  675. data/lib/rubocop/ast/node.rb +0 -644
  676. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  677. data/lib/rubocop/ast/node/and_node.rb +0 -29
  678. data/lib/rubocop/ast/node/args_node.rb +0 -29
  679. data/lib/rubocop/ast/node/array_node.rb +0 -57
  680. data/lib/rubocop/ast/node/block_node.rb +0 -117
  681. data/lib/rubocop/ast/node/break_node.rb +0 -17
  682. data/lib/rubocop/ast/node/case_node.rb +0 -56
  683. data/lib/rubocop/ast/node/class_node.rb +0 -31
  684. data/lib/rubocop/ast/node/def_node.rb +0 -71
  685. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  686. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  687. data/lib/rubocop/ast/node/float_node.rb +0 -12
  688. data/lib/rubocop/ast/node/for_node.rb +0 -53
  689. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  690. data/lib/rubocop/ast/node/if_node.rb +0 -175
  691. data/lib/rubocop/ast/node/int_node.rb +0 -12
  692. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  693. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  694. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  695. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  696. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  697. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  698. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  699. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  700. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  701. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  702. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  703. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  704. data/lib/rubocop/ast/node/module_node.rb +0 -24
  705. data/lib/rubocop/ast/node/or_node.rb +0 -29
  706. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  707. data/lib/rubocop/ast/node/range_node.rb +0 -18
  708. data/lib/rubocop/ast/node/regexp_node.rb +0 -35
  709. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  710. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  711. data/lib/rubocop/ast/node/return_node.rb +0 -24
  712. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  713. data/lib/rubocop/ast/node/send_node.rb +0 -13
  714. data/lib/rubocop/ast/node/str_node.rb +0 -16
  715. data/lib/rubocop/ast/node/super_node.rb +0 -21
  716. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  717. data/lib/rubocop/ast/node/until_node.rb +0 -35
  718. data/lib/rubocop/ast/node/when_node.rb +0 -53
  719. data/lib/rubocop/ast/node/while_node.rb +0 -35
  720. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  721. data/lib/rubocop/ast/sexp.rb +0 -16
  722. data/lib/rubocop/ast/traversal.rb +0 -183
  723. data/lib/rubocop/cop/layout/tab.rb +0 -75
  724. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  725. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  726. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  727. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  728. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  729. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
  730. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
  731. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  732. data/lib/rubocop/node_pattern.rb +0 -801
  733. data/lib/rubocop/processed_source.rb +0 -216
  734. data/lib/rubocop/string_util.rb +0 -14
  735. data/lib/rubocop/token.rb +0 -114
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ class ConfigObsoletion
5
+ # Base class for ConfigObsoletion rules relating to parameters
6
+ # @api private
7
+ class ParameterRule < Rule
8
+ attr_reader :cop, :parameter, :metadata
9
+
10
+ def initialize(config, cop, parameter, metadata)
11
+ super(config)
12
+ @cop = cop
13
+ @parameter = parameter
14
+ @metadata = metadata
15
+ end
16
+
17
+ def parameter_rule?
18
+ true
19
+ end
20
+
21
+ def violated?
22
+ config[cop]&.key?(parameter)
23
+ end
24
+
25
+ def warning?
26
+ severity == 'warning'
27
+ end
28
+
29
+ private
30
+
31
+ def alternative
32
+ metadata['alternative']
33
+ end
34
+
35
+ def reason
36
+ metadata['reason']
37
+ end
38
+
39
+ def severity
40
+ metadata['severity']
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ class ConfigObsoletion
5
+ # Encapsulation of a ConfigObsoletion rule for removing
6
+ # a previously defined cop.
7
+ # @api private
8
+ class RemovedCop < CopRule
9
+ attr_reader :old_name, :metadata
10
+
11
+ BASE_MESSAGE = 'The `%<old_name>s` cop has been removed'
12
+
13
+ def initialize(config, old_name, metadata)
14
+ super(config, old_name)
15
+ @metadata = metadata.is_a?(Hash) ? metadata : {}
16
+ end
17
+
18
+ def rule_message
19
+ base = format(BASE_MESSAGE, old_name: old_name)
20
+
21
+ if reason
22
+ "#{base} since #{reason.chomp}."
23
+ elsif alternatives
24
+ "#{base}. Please use #{to_sentence(alternatives, connector: 'and/or')} instead."
25
+ else
26
+ "#{base}."
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def reason
33
+ metadata['reason']
34
+ end
35
+
36
+ def alternatives
37
+ Array(metadata['alternatives']).map { |name| "`#{name}`" }
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ class ConfigObsoletion
5
+ # Encapsulation of a ConfigObsoletion rule for renaming
6
+ # a cop or moving it to a new department.
7
+ # @api private
8
+ class RenamedCop < CopRule
9
+ attr_reader :new_name
10
+
11
+ def initialize(config, old_name, new_name)
12
+ super(config, old_name)
13
+ @new_name = new_name
14
+ end
15
+
16
+ def rule_message
17
+ "The `#{old_name}` cop has been #{verb} to `#{new_name}`."
18
+ end
19
+
20
+ private
21
+
22
+ def moved?
23
+ old_badge = Cop::Badge.parse(old_name)
24
+ new_badge = Cop::Badge.parse(new_name)
25
+
26
+ old_badge.department != new_badge.department && old_badge.cop_name == new_badge.cop_name
27
+ end
28
+
29
+ def verb
30
+ moved? ? 'moved' : 'renamed'
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ class ConfigObsoletion
5
+ # Abstract base class for ConfigObsoletion rules
6
+ # @api private
7
+ class Rule
8
+ def initialize(config)
9
+ @config = config
10
+ end
11
+
12
+ # Does this rule relate to cops?
13
+ def cop_rule?
14
+ false
15
+ end
16
+
17
+ # Does this rule relate to parameters?
18
+ def parameter_rule?
19
+ false
20
+ end
21
+
22
+ def violated?
23
+ raise NotImplementedError
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :config
29
+
30
+ def to_sentence(collection, connector: 'and')
31
+ return collection.first if collection.size == 1
32
+
33
+ [collection[0..-2].join(', '), collection[-1]].join(" #{connector} ")
34
+ end
35
+
36
+ def smart_loaded_path
37
+ PathUtil.smart_path(config.loaded_path)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ class ConfigObsoletion
5
+ # Encapsulation of a ConfigObsoletion rule for splitting a cop's
6
+ # functionality into multiple new cops.
7
+ # @api private
8
+ class SplitCop < CopRule
9
+ attr_reader :metadata
10
+
11
+ def initialize(config, old_name, metadata)
12
+ super(config, old_name)
13
+ @metadata = metadata
14
+ end
15
+
16
+ def rule_message
17
+ "The `#{old_name}` cop has been split into #{to_sentence(alternatives)}."
18
+ end
19
+
20
+ private
21
+
22
+ def alternatives
23
+ Array(metadata['alternatives']).map { |name| "`#{name}`" }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # This class handles collecting the options for regenerating a TODO file.
5
+ # @api private
6
+ class ConfigRegeneration
7
+ AUTO_GENERATED_FILE = RuboCop::CLI::Command::AutoGenerateConfig::AUTO_GENERATED_FILE
8
+ COMMAND_REGEX = /(?<=`rubocop )(.*?)(?=`)/.freeze
9
+ DEFAULT_OPTIONS = { auto_gen_config: true }.freeze
10
+
11
+ # Get options from the comment in the TODO file, and parse them as options
12
+ def options
13
+ # If there's no existing TODO file, generate one
14
+ return DEFAULT_OPTIONS unless todo_exists?
15
+
16
+ match = generation_command.match(COMMAND_REGEX)
17
+ return DEFAULT_OPTIONS unless match
18
+
19
+ options = match[1].split
20
+ Options.new.parse(options).first
21
+ end
22
+
23
+ private
24
+
25
+ def todo_exists?
26
+ File.exist?(AUTO_GENERATED_FILE) && !File.empty?(AUTO_GENERATED_FILE)
27
+ end
28
+
29
+ def generation_command
30
+ File.foreach(AUTO_GENERATED_FILE).take(2).last
31
+ end
32
+ end
33
+ end
@@ -4,6 +4,9 @@ module RuboCop
4
4
  # Handles caching of configurations and association of inspected
5
5
  # ruby files to configurations.
6
6
  class ConfigStore
7
+ attr_reader :validated
8
+ alias validated? validated
9
+
7
10
  def initialize
8
11
  # @options_config stores a config that is specified in the command line.
9
12
  # This takes precedence over configs located in any directories
@@ -17,32 +20,53 @@ module RuboCop
17
20
  # @object_cache maps configuration file paths to
18
21
  # configuration objects so we only need to load them once.
19
22
  @object_cache = {}
23
+
24
+ # By default the config is validated before it can be used.
25
+ @validated = true
20
26
  end
21
27
 
22
28
  def options_config=(options_config)
23
29
  loaded_config = ConfigLoader.load_file(options_config)
24
- @options_config = ConfigLoader.merge_with_default(loaded_config,
25
- options_config)
30
+ @options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
26
31
  end
27
32
 
28
33
  def force_default_config!
29
34
  @options_config = ConfigLoader.default_configuration
30
35
  end
31
36
 
32
- def for(file_or_dir)
33
- return @options_config if @options_config
37
+ def unvalidated
38
+ @validated = false
39
+ self
40
+ end
41
+
42
+ def for_file(file)
43
+ for_dir(File.dirname(file))
44
+ end
34
45
 
46
+ def for_pwd
47
+ for_dir(Dir.pwd)
48
+ end
49
+
50
+ # If type (file/dir) is known beforehand,
51
+ # prefer using #for_file or #for_dir for improved performance
52
+ def for(file_or_dir)
35
53
  dir = if File.directory?(file_or_dir)
36
54
  file_or_dir
37
55
  else
38
56
  File.dirname(file_or_dir)
39
57
  end
58
+ for_dir(dir)
59
+ end
60
+
61
+ def for_dir(dir)
62
+ return @options_config if @options_config
63
+
40
64
  @path_cache[dir] ||= ConfigLoader.configuration_file_for(dir)
41
65
  path = @path_cache[dir]
42
66
  @object_cache[path] ||= begin
43
- print "For #{dir}: " if ConfigLoader.debug?
44
- ConfigLoader.configuration_from_file(path)
45
- end
67
+ print "For #{dir}: " if ConfigLoader.debug?
68
+ ConfigLoader.configuration_from_file(path, check: validated?)
69
+ end
46
70
  end
47
71
  end
48
72
  end
@@ -8,41 +8,44 @@ module RuboCop
8
8
  class ConfigValidator
9
9
  extend Forwardable
10
10
 
11
- COMMON_PARAMS = %w[Exclude Include Severity inherit_mode
12
- AutoCorrect StyleGuide Details].freeze
11
+ # @api private
12
+ COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details].freeze
13
+ # @api private
13
14
  INTERNAL_PARAMS = %w[Description StyleGuide
14
15
  VersionAdded VersionChanged VersionRemoved
15
16
  Reference Safe SafeAutoCorrect].freeze
17
+ # @api private
18
+ NEW_COPS_VALUES = %w[pending disable enable].freeze
16
19
 
17
- # 2.3 is the oldest officially supported Ruby version.
18
- DEFAULT_RUBY_VERSION = 2.3
19
- KNOWN_RUBIES = [2.3, 2.4, 2.5, 2.6, 2.7].freeze
20
- OBSOLETE_RUBIES = {
21
- 1.9 => '0.50', 2.0 => '0.50', 2.1 => '0.58', 2.2 => '0.69'
22
- }.freeze
23
- RUBY_VERSION_FILENAME = '.ruby-version'
20
+ # @api private
21
+ CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
22
+ CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
23
+ private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
24
24
 
25
- def_delegators :@config,
26
- :smart_loaded_path, :for_all_cops, :find_file_upwards,
27
- :base_dir_for_path_parameters, :bundler_lock_file_path
25
+ def_delegators :@config, :smart_loaded_path, :for_all_cops
28
26
 
29
27
  def initialize(config)
30
28
  @config = config
31
29
  @config_obsoletion = ConfigObsoletion.new(config)
30
+ @target_ruby = TargetRuby.new(config)
32
31
  end
33
32
 
34
33
  def validate
35
- # Don't validate RuboCop's own files. Avoids infinite recursion.
34
+ check_cop_config_value(@config)
35
+ reject_conflicting_safe_settings
36
+
37
+ # Don't validate RuboCop's own files further. Avoids infinite recursion.
36
38
  return if @config.internal?
37
39
 
38
40
  valid_cop_names, invalid_cop_names = @config.keys.partition do |key|
39
41
  ConfigLoader.default_configuration.key?(key)
40
42
  end
41
43
 
42
- @config_obsoletion.reject_obsolete_cops_and_parameters
44
+ check_obsoletions
43
45
 
44
46
  alert_about_unrecognized_cops(invalid_cop_names)
45
47
  check_target_ruby
48
+ validate_new_cops_parameter
46
49
  validate_parameter_names(valid_cop_names)
47
50
  validate_enforced_styles(valid_cop_names)
48
51
  validate_syntax_cop
@@ -50,48 +53,42 @@ module RuboCop
50
53
  end
51
54
 
52
55
  def target_ruby_version
53
- @target_ruby_version ||= begin
54
- if for_all_cops['TargetRubyVersion']
55
- @target_ruby_version_source = :rubocop_yml
56
-
57
- for_all_cops['TargetRubyVersion'].to_f
58
- elsif target_ruby_version_from_version_file
59
- @target_ruby_version_source = :ruby_version_file
60
-
61
- target_ruby_version_from_version_file
62
- elsif target_ruby_version_from_bundler_lock_file
63
- @target_ruby_version_source = :bundler_lock_file
64
-
65
- target_ruby_version_from_bundler_lock_file
66
- else
67
- DEFAULT_RUBY_VERSION
68
- end
69
- end
56
+ target_ruby.version
70
57
  end
71
58
 
72
59
  def validate_section_presence(name)
73
60
  return unless @config.key?(name) && @config[name].nil?
74
61
 
75
- raise ValidationError,
76
- "empty section #{name} found in #{smart_loaded_path}"
62
+ raise ValidationError, "empty section #{name} found in #{smart_loaded_path}"
77
63
  end
78
64
 
79
65
  private
80
66
 
67
+ attr_reader :target_ruby
68
+
69
+ def check_obsoletions
70
+ @config_obsoletion.reject_obsolete!
71
+ return unless @config_obsoletion.warnings.any?
72
+
73
+ warn Rainbow("Warning: #{@config_obsoletion.warnings.join("\n")}").yellow
74
+ end
75
+
81
76
  def check_target_ruby
82
- return if KNOWN_RUBIES.include?(target_ruby_version)
77
+ return if target_ruby.supported?
78
+
79
+ source = target_ruby.source
80
+ last_version = target_ruby.rubocop_version_with_support
83
81
 
84
- msg = if OBSOLETE_RUBIES.include?(target_ruby_version)
82
+ msg = if last_version
85
83
  "RuboCop found unsupported Ruby version #{target_ruby_version} " \
86
- "in #{target_ruby_source}. #{target_ruby_version}-compatible " \
87
- 'analysis was dropped after version ' \
88
- "#{OBSOLETE_RUBIES[target_ruby_version]}."
84
+ "in #{source}. #{target_ruby_version}-compatible " \
85
+ "analysis was dropped after version #{last_version}."
89
86
  else
90
87
  'RuboCop found unknown Ruby version ' \
91
- "#{target_ruby_version.inspect} in #{target_ruby_source}."
88
+ "#{target_ruby_version.inspect} in #{source}."
92
89
  end
93
90
 
94
- msg += "\nSupported versions: #{KNOWN_RUBIES.join(', ')}"
91
+ msg += "\nSupported versions: #{TargetRuby.supported_versions.join(', ')}"
95
92
 
96
93
  raise ValidationError, msg
97
94
  end
@@ -100,31 +97,48 @@ module RuboCop
100
97
  unknown_cops = []
101
98
  invalid_cop_names.each do |name|
102
99
  # There could be a custom cop with this name. If so, don't warn
103
- next if Cop::Cop.registry.contains_cop_matching?([name])
100
+ next if Cop::Registry.global.contains_cop_matching?([name])
104
101
 
105
102
  # Special case for inherit_mode, which is a directive that we keep in
106
103
  # the configuration (even though it's not a cop), because it's easier
107
104
  # to do so than to pass the value around to various methods.
108
105
  next if name == 'inherit_mode'
109
106
 
110
- unknown_cops << "unrecognized cop #{name} found in " \
111
- "#{smart_loaded_path}"
107
+ suggestions = NameSimilarity.find_similar_names(name, Cop::Registry.global.map(&:cop_name))
108
+ suggestion = "Did you mean `#{suggestions.join('`, `')}`?" if suggestions.any?
109
+
110
+ message = <<~MESSAGE.rstrip
111
+ unrecognized cop #{name} found in #{smart_loaded_path}
112
+ #{suggestion}
113
+ MESSAGE
114
+
115
+ unknown_cops << message
112
116
  end
113
- raise ValidationError, unknown_cops.join(', ') if unknown_cops.any?
117
+ raise ValidationError, unknown_cops.join("\n") if unknown_cops.any?
114
118
  end
115
119
 
116
120
  def validate_syntax_cop
117
121
  syntax_config = @config['Lint/Syntax']
118
122
  default_config = ConfigLoader.default_configuration['Lint/Syntax']
119
123
 
120
- return unless syntax_config &&
121
- default_config.merge(syntax_config) != default_config
124
+ return unless syntax_config && default_config.merge(syntax_config) != default_config
122
125
 
123
126
  raise ValidationError,
124
127
  "configuration for Syntax cop found in #{smart_loaded_path}\n" \
125
128
  'It\'s not possible to disable this cop.'
126
129
  end
127
130
 
131
+ def validate_new_cops_parameter
132
+ new_cop_parameter = @config.for_all_cops['NewCops']
133
+ return if new_cop_parameter.nil? || NEW_COPS_VALUES.include?(new_cop_parameter)
134
+
135
+ message = "invalid #{new_cop_parameter} for `NewCops` found in" \
136
+ "#{smart_loaded_path}\n" \
137
+ "Valid choices are: #{NEW_COPS_VALUES.join(', ')}"
138
+
139
+ raise ValidationError, message
140
+ end
141
+
128
142
  def validate_parameter_names(valid_cop_names)
129
143
  valid_cop_names.each do |name|
130
144
  validate_section_presence(name)
@@ -152,7 +166,7 @@ module RuboCop
152
166
  end
153
167
  end
154
168
 
155
- def validate_enforced_styles(valid_cop_names)
169
+ def validate_enforced_styles(valid_cop_names) # rubocop:todo Metrics/AbcSize
156
170
  valid_cop_names.each do |name|
157
171
  styles = @config[name].select { |key, _| key.start_with?('Enforced') }
158
172
 
@@ -178,71 +192,43 @@ module RuboCop
178
192
  formats.all? { |format| valid.include?(format) }
179
193
  end
180
194
 
181
- def target_ruby_source
182
- case @target_ruby_version_source
183
- when :ruby_version_file
184
- "`#{RUBY_VERSION_FILENAME}`"
185
- when :bundler_lock_file
186
- "`#{bundler_lock_file_path}`"
187
- when :rubocop_yml
188
- "`TargetRubyVersion` parameter (in #{smart_loaded_path})"
189
- end
190
- end
195
+ def reject_mutually_exclusive_defaults
196
+ disabled_by_default = for_all_cops['DisabledByDefault']
197
+ enabled_by_default = for_all_cops['EnabledByDefault']
198
+ return unless disabled_by_default && enabled_by_default
191
199
 
192
- def ruby_version_file
193
- @ruby_version_file ||=
194
- find_file_upwards(RUBY_VERSION_FILENAME, base_dir_for_path_parameters)
200
+ msg = 'Cops cannot be both enabled by default and disabled by default'
201
+ raise ValidationError, msg
195
202
  end
196
203
 
197
- def target_ruby_version_from_version_file
198
- file = ruby_version_file
199
- return unless file && File.file?(file)
204
+ def reject_conflicting_safe_settings
205
+ @config.each do |name, cop_config|
206
+ next unless cop_config.is_a?(Hash)
207
+ next unless cop_config['Safe'] == false && cop_config['SafeAutoCorrect'] == true
200
208
 
201
- @target_ruby_version_from_version_file ||=
202
- File.read(file).match(/\A(ruby-)?(?<version>\d+\.\d+)/) do |md|
203
- md[:version].to_f
204
- end
209
+ msg = 'Unsafe cops cannot have a safe auto-correction ' \
210
+ "(section #{name} in #{smart_loaded_path})"
211
+ raise ValidationError, msg
212
+ end
205
213
  end
206
214
 
207
- def target_ruby_version_from_bundler_lock_file
208
- @target_ruby_version_from_bundler_lock_file ||=
209
- read_ruby_version_from_bundler_lock_file
210
- end
211
-
212
- def read_ruby_version_from_bundler_lock_file
213
- lock_file_path = bundler_lock_file_path
214
- return nil unless lock_file_path
215
-
216
- in_ruby_section = false
217
- File.foreach(lock_file_path) do |line|
218
- # If ruby is in Gemfile.lock or gems.lock, there should be two lines
219
- # towards the bottom of the file that look like:
220
- # RUBY VERSION
221
- # ruby W.X.YpZ
222
- # We ultimately want to match the "ruby W.X.Y.pZ" line, but there's
223
- # extra logic to make sure we only start looking once we've seen the
224
- # "RUBY VERSION" line.
225
- in_ruby_section ||= line.match(/^\s*RUBY\s*VERSION\s*$/)
226
- next unless in_ruby_section
227
-
228
- # We currently only allow this feature to work with MRI ruby. If jruby
229
- # (or something else) is used by the project, it's lock file will have a
230
- # line that looks like:
231
- # RUBY VERSION
232
- # ruby W.X.YpZ (jruby x.x.x.x)
233
- # The regex won't match in this situation.
234
- result = line.match(/^\s*ruby\s+(\d+\.\d+)[p.\d]*\s*$/)
235
- return result.captures.first.to_f if result
215
+ def check_cop_config_value(hash, parent = nil)
216
+ hash.each do |key, value|
217
+ check_cop_config_value(value, key) if value.is_a?(Hash)
218
+
219
+ next unless CONFIG_CHECK_KEYS.include?(key) && value.is_a?(String)
220
+
221
+ next if key == 'Enabled' && CONFIG_CHECK_DEPARTMENTS.include?(value)
222
+
223
+ raise ValidationError, msg_not_boolean(parent, key, value)
236
224
  end
237
225
  end
238
226
 
239
- def reject_mutually_exclusive_defaults
240
- disabled_by_default = for_all_cops['DisabledByDefault']
241
- enabled_by_default = for_all_cops['EnabledByDefault']
242
- return unless disabled_by_default && enabled_by_default
243
-
244
- msg = 'Cops cannot be both enabled by default and disabled by default'
245
- raise ValidationError, msg
227
+ # FIXME: Handling colors in exception messages like this is ugly.
228
+ def msg_not_boolean(parent, key, value)
229
+ "#{Rainbow('').reset}" \
230
+ "Property #{Rainbow(key).yellow} of cop #{Rainbow(parent).yellow}" \
231
+ " is supposed to be a boolean and #{Rainbow(value).yellow} is not."
246
232
  end
247
233
  end
248
234
  end