rubocop 0.87.1 → 0.89.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +153 -22
  5. data/lib/rubocop.rb +22 -4
  6. data/lib/rubocop/cli.rb +2 -2
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +3 -3
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +20 -3
  14. data/lib/rubocop/config_loader.rb +22 -9
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -1
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +14 -6
  22. data/lib/rubocop/cop/commissioner.rb +0 -1
  23. data/lib/rubocop/cop/cop.rb +1 -1
  24. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  25. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  26. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  27. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  28. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  29. data/lib/rubocop/cop/force.rb +1 -0
  30. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  31. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  32. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  33. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  35. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  36. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  37. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  38. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  39. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  40. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  41. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  42. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  43. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  44. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  45. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  46. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  47. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  48. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  49. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -5
  50. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  51. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  52. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  53. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  54. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  55. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  56. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  57. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  58. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  59. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  60. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  61. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  62. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  63. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  64. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  65. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  66. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  67. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  68. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  69. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  70. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  71. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  72. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  73. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  74. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  75. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  76. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  77. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  78. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  79. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  80. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  82. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  83. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  84. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  85. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  86. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  87. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  88. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  89. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  90. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  91. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  92. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  93. data/lib/rubocop/cop/lint/loop.rb +23 -2
  94. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  95. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  96. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  97. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  98. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  99. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  100. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  101. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  102. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  103. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  104. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  105. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  106. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  107. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  108. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  109. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  110. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  111. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  112. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  113. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  114. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  115. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  116. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  117. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  118. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  119. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  120. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  121. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  122. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  123. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  124. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  125. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  126. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  127. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  128. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  129. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  130. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  131. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  132. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  133. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  134. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  135. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  136. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  137. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  138. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  139. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  140. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  141. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  142. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  143. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  144. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  145. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  146. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  147. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  148. data/lib/rubocop/cop/lint/void.rb +3 -7
  149. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  150. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  151. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  152. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  153. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  154. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  155. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  156. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  157. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  158. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  159. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  160. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  161. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  162. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  163. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  164. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  165. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  166. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  167. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  168. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  169. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  170. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  171. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  172. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  173. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  174. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  175. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  176. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  177. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  178. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  179. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  180. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  181. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  182. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  183. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  184. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  185. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  186. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  187. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  188. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  189. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  190. data/lib/rubocop/cop/registry.rb +3 -3
  191. data/lib/rubocop/cop/security/eval.rb +2 -2
  192. data/lib/rubocop/cop/security/json_load.rb +6 -8
  193. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  194. data/lib/rubocop/cop/security/open.rb +2 -2
  195. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  196. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  197. data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
  198. data/lib/rubocop/cop/style/alias.rb +41 -36
  199. data/lib/rubocop/cop/style/and_or.rb +9 -11
  200. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  201. data/lib/rubocop/cop/style/array_join.rb +6 -8
  202. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  203. data/lib/rubocop/cop/style/attr.rb +11 -9
  204. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  205. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  206. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  207. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
  208. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  209. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  210. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  211. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  212. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  213. data/lib/rubocop/cop/style/class_check.rb +7 -9
  214. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  215. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  216. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  217. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  218. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  219. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  220. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  221. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  222. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  223. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  224. data/lib/rubocop/cop/style/copyright.rb +12 -12
  225. data/lib/rubocop/cop/style/date_time.rb +1 -1
  226. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  227. data/lib/rubocop/cop/style/dir.rb +7 -10
  228. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  229. data/lib/rubocop/cop/style/documentation.rb +6 -8
  230. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  231. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  232. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  233. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  234. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  235. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  236. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  237. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  238. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  239. data/lib/rubocop/cop/style/encoding.rb +5 -9
  240. data/lib/rubocop/cop/style/end_block.rb +4 -6
  241. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  242. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  243. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  244. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  245. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  246. data/lib/rubocop/cop/style/float_division.rb +8 -11
  247. data/lib/rubocop/cop/style/for.rb +11 -15
  248. data/lib/rubocop/cop/style/format_string.rb +21 -19
  249. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  250. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  251. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  252. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  253. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  254. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  255. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  256. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  257. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  258. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  259. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  260. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  261. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  262. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  263. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  264. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  265. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  266. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  267. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  268. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  269. data/lib/rubocop/cop/style/lambda.rb +7 -12
  270. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  271. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  272. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  273. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  274. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  275. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  276. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  277. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  278. data/lib/rubocop/cop/style/min_max.rb +8 -12
  279. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  280. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  281. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  282. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  283. data/lib/rubocop/cop/style/module_function.rb +10 -13
  284. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  285. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  286. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  287. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  288. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  289. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  290. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  291. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  292. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  293. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  294. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  295. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  296. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  297. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  298. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  299. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  300. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  301. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  302. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  303. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  304. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  305. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  306. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  307. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  308. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  309. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  310. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  311. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  312. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  313. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  314. data/lib/rubocop/cop/team.rb +1 -1
  315. data/lib/rubocop/cop/tokens_util.rb +84 -0
  316. data/lib/rubocop/cop/util.rb +3 -13
  317. data/lib/rubocop/cop/variable_force.rb +0 -2
  318. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  319. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  320. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  321. data/lib/rubocop/error.rb +1 -0
  322. data/lib/rubocop/file_finder.rb +12 -12
  323. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  324. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  325. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  326. data/lib/rubocop/options.rb +3 -3
  327. data/lib/rubocop/path_util.rb +17 -17
  328. data/lib/rubocop/rake_task.rb +1 -0
  329. data/lib/rubocop/result_cache.rb +12 -8
  330. data/lib/rubocop/rspec/expect_offense.rb +31 -5
  331. data/lib/rubocop/rspec/shared_contexts.rb +13 -14
  332. data/lib/rubocop/runner.rb +6 -7
  333. data/lib/rubocop/target_finder.rb +13 -10
  334. data/lib/rubocop/version.rb +2 -2
  335. metadata +28 -8
  336. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  337. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  338. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  339. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -62,9 +62,11 @@ module RuboCop
62
62
  # private :bar, :baz
63
63
  #
64
64
  # end
65
- class AccessModifierDeclarations < Cop
65
+ class AccessModifierDeclarations < Base
66
66
  include ConfigurableEnforcedStyle
67
67
 
68
+ ACCESS_MODIFIERS = %i[private protected public module_function].to_set.freeze
69
+
68
70
  GROUP_STYLE_MESSAGE = [
69
71
  '`%<access_modifier>s` should not be',
70
72
  'inlined in method definitions.'
@@ -80,15 +82,12 @@ module RuboCop
80
82
  PATTERN
81
83
 
82
84
  def on_send(node)
83
- return unless node.access_modifier?
85
+ return unless access_modifier?(node)
84
86
  return if node.parent.pair_type?
85
- return if cop_config['AllowModifiersOnSymbols'] &&
86
- access_modifier_with_symbol?(node)
87
+ return if cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node)
87
88
 
88
89
  if offense?(node)
89
- add_offense(node, location: :selector) do
90
- opposite_style_detected
91
- end
90
+ add_offense(node.loc.selector) if opposite_style_detected
92
91
  else
93
92
  correct_style_detected
94
93
  end
@@ -96,6 +95,14 @@ module RuboCop
96
95
 
97
96
  private
98
97
 
98
+ def access_modifier?(node)
99
+ maybe_access_modifier?(node) && node.access_modifier?
100
+ end
101
+
102
+ def maybe_access_modifier?(node)
103
+ !node.receiver && ACCESS_MODIFIERS.include?(node.method_name)
104
+ end
105
+
99
106
  def offense?(node)
100
107
  (group_style? && access_modifier_is_inlined?(node)) ||
101
108
  (inline_style? && access_modifier_is_not_inlined?(node))
@@ -117,8 +124,8 @@ module RuboCop
117
124
  !access_modifier_is_inlined?(node)
118
125
  end
119
126
 
120
- def message(node)
121
- access_modifier = node.loc.selector.source
127
+ def message(range)
128
+ access_modifier = range.source
122
129
 
123
130
  if group_style?
124
131
  format(GROUP_STYLE_MESSAGE, access_modifier: access_modifier)
@@ -31,9 +31,11 @@ module RuboCop
31
31
  # attr_reader :baz
32
32
  # end
33
33
  #
34
- class AccessorGrouping < Cop
34
+ class AccessorGrouping < Base
35
35
  include ConfigurableEnforcedStyle
36
+ include RangeHelp
36
37
  include VisibilityHelp
38
+ extend AutoCorrector
37
39
 
38
40
  GROUPED_MSG = 'Group together all `%<accessor>s` attributes.'
39
41
  SEPARATED_MSG = 'Use one attribute per `%<accessor>s`.'
@@ -50,13 +52,31 @@ module RuboCop
50
52
  alias on_sclass on_class
51
53
  alias on_module on_class
52
54
 
53
- def autocorrect(node)
54
- lambda do |corrector|
55
- corrector.replace(node, correction(node))
55
+ private
56
+
57
+ def check(send_node)
58
+ return if previous_line_comment?(send_node)
59
+ return unless grouped_style? && sibling_accessors(send_node).size > 1 ||
60
+ separated_style? && send_node.arguments.size > 1
61
+
62
+ message = message(send_node)
63
+ add_offense(send_node, message: message) do |corrector|
64
+ autocorrect(corrector, send_node)
56
65
  end
57
66
  end
58
67
 
59
- private
68
+ def autocorrect(corrector, node)
69
+ if (preferred_accessors = preferred_accessors(node))
70
+ corrector.replace(node, preferred_accessors)
71
+ else
72
+ range = range_with_surrounding_space(range: node.loc.expression, side: :left)
73
+ corrector.remove(range)
74
+ end
75
+ end
76
+
77
+ def previous_line_comment?(node)
78
+ comment_line?(processed_source[node.first_line - 2])
79
+ end
60
80
 
61
81
  def class_send_elements(class_node)
62
82
  class_def = class_node.body
@@ -74,14 +94,6 @@ module RuboCop
74
94
  send_node.macro? && ACCESSOR_METHODS.include?(send_node.method_name)
75
95
  end
76
96
 
77
- def check(send_node)
78
- if grouped_style? && sibling_accessors(send_node).size > 1
79
- add_offense(send_node)
80
- elsif separated_style? && send_node.arguments.size > 1
81
- add_offense(send_node)
82
- end
83
- end
84
-
85
97
  def grouped_style?
86
98
  style == :grouped
87
99
  end
@@ -94,7 +106,8 @@ module RuboCop
94
106
  send_node.parent.each_child_node(:send).select do |sibling|
95
107
  accessor?(sibling) &&
96
108
  sibling.method?(send_node.method_name) &&
97
- node_visibility(sibling) == node_visibility(send_node)
109
+ node_visibility(sibling) == node_visibility(send_node) &&
110
+ !previous_line_comment?(sibling)
98
111
  end
99
112
  end
100
113
 
@@ -103,14 +116,10 @@ module RuboCop
103
116
  format(msg, accessor: send_node.method_name)
104
117
  end
105
118
 
106
- def correction(node)
119
+ def preferred_accessors(node)
107
120
  if grouped_style?
108
121
  accessors = sibling_accessors(node)
109
- if node == accessors.first
110
- group_accessors(node, accessors)
111
- else
112
- ''
113
- end
122
+ group_accessors(node, accessors) if node == accessors.first
114
123
  else
115
124
  separate_accessors(node)
116
125
  end
@@ -22,8 +22,9 @@ module RuboCop
22
22
  #
23
23
  # # good
24
24
  # alias_method :bar, :foo
25
- class Alias < Cop
25
+ class Alias < Base
26
26
  include ConfigurableEnforcedStyle
27
+ extend AutoCorrector
27
28
 
28
29
  MSG_ALIAS = 'Use `alias_method` instead of `alias`.'
29
30
  MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` ' \
@@ -36,31 +37,37 @@ module RuboCop
36
37
  return unless style == :prefer_alias && alias_keyword_possible?(node)
37
38
 
38
39
  msg = format(MSG_ALIAS_METHOD, current: lexical_scope_type(node))
39
- add_offense(node, location: :selector, message: msg)
40
+ add_offense(node.loc.selector, message: msg) do |corrector|
41
+ autocorrect(corrector, node)
42
+ end
40
43
  end
41
44
 
42
45
  def on_alias(node)
43
46
  return unless alias_method_possible?(node)
44
47
 
45
48
  if scope_type(node) == :dynamic || style == :prefer_alias_method
46
- add_offense(node, location: :keyword, message: MSG_ALIAS)
49
+ add_offense(node.loc.keyword, message: MSG_ALIAS) do |corrector|
50
+ autocorrect(corrector, node)
51
+ end
47
52
  elsif node.children.none? { |arg| bareword?(arg) }
48
- add_offense_for_args(node)
53
+ add_offense_for_args(node) do |corrector|
54
+ autocorrect(corrector, node)
55
+ end
49
56
  end
50
57
  end
51
58
 
52
- def autocorrect(node)
59
+ private
60
+
61
+ def autocorrect(corrector, node)
53
62
  if node.send_type?
54
- correct_alias_method_to_alias(node)
63
+ correct_alias_method_to_alias(corrector, node)
55
64
  elsif scope_type(node) == :dynamic || style == :prefer_alias_method
56
- correct_alias_to_alias_method(node)
65
+ correct_alias_to_alias_method(corrector, node)
57
66
  else
58
- correct_alias_with_symbol_args(node)
67
+ correct_alias_with_symbol_args(corrector, node)
59
68
  end
60
69
  end
61
70
 
62
- private
63
-
64
71
  def alias_keyword_possible?(node)
65
72
  scope_type(node) != :dynamic && node.arguments.all?(&:sym_type?)
66
73
  end
@@ -70,14 +77,14 @@ module RuboCop
70
77
  node.children.none?(&:gvar_type?)
71
78
  end
72
79
 
73
- def add_offense_for_args(node)
80
+ def add_offense_for_args(node, &block)
74
81
  existing_args = node.children.map(&:source).join(' ')
75
82
  preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
76
83
  arg_ranges = node.children.map(&:source_range)
77
84
  msg = format(MSG_SYMBOL_ARGS,
78
85
  prefer: preferred_args,
79
86
  current: existing_args)
80
- add_offense(node, location: arg_ranges.reduce(&:join), message: msg)
87
+ add_offense(arg_ranges.reduce(&:join), message: msg, &block)
81
88
  end
82
89
 
83
90
  # In this expression, will `self` be the same as the innermost enclosing
@@ -101,41 +108,39 @@ module RuboCop
101
108
  end
102
109
 
103
110
  def lexical_scope_type(node)
104
- node.each_ancestor(:class, :module) do |ancestor|
105
- return ancestor.class_type? ? 'in a class body' : 'in a module body'
111
+ ancestor = node.each_ancestor(:class, :module).first
112
+ if ancestor.nil?
113
+ 'at the top level'
114
+ elsif ancestor.class_type?
115
+ 'in a class body'
116
+ else
117
+ 'in a module body'
106
118
  end
107
- 'at the top level'
108
119
  end
109
120
 
110
121
  def bareword?(sym_node)
111
122
  !sym_node.source.start_with?(':')
112
123
  end
113
124
 
114
- def correct_alias_method_to_alias(send_node)
115
- lambda do |corrector|
116
- new, old = *send_node.arguments
117
- replacement = "alias #{identifier(new)} #{identifier(old)}"
118
- corrector.replace(send_node, replacement)
119
- end
125
+ def correct_alias_method_to_alias(corrector, send_node)
126
+ new, old = *send_node.arguments
127
+ replacement = "alias #{identifier(new)} #{identifier(old)}"
128
+
129
+ corrector.replace(send_node, replacement)
120
130
  end
121
131
 
122
- def correct_alias_to_alias_method(node)
123
- lambda do |corrector|
124
- replacement =
125
- 'alias_method ' \
126
- ":#{identifier(node.new_identifier)}, " \
127
- ":#{identifier(node.old_identifier)}"
128
- corrector.replace(node, replacement)
129
- end
132
+ def correct_alias_to_alias_method(corrector, node)
133
+ replacement =
134
+ 'alias_method ' \
135
+ ":#{identifier(node.new_identifier)}, " \
136
+ ":#{identifier(node.old_identifier)}"
137
+
138
+ corrector.replace(node, replacement)
130
139
  end
131
140
 
132
- def correct_alias_with_symbol_args(node)
133
- lambda do |corrector|
134
- corrector.replace(node.new_identifier,
135
- node.new_identifier.source[1..-1])
136
- corrector.replace(node.old_identifier,
137
- node.old_identifier.source[1..-1])
138
- end
141
+ def correct_alias_with_symbol_args(corrector, node)
142
+ corrector.replace(node.new_identifier, node.new_identifier.source[1..-1])
143
+ corrector.replace(node.old_identifier, node.old_identifier.source[1..-1])
139
144
  end
140
145
 
141
146
  def_node_matcher :identifier, <<~PATTERN
@@ -36,9 +36,10 @@ module RuboCop
36
36
  # # good
37
37
  # if foo && bar
38
38
  # end
39
- class AndOr < Cop
39
+ class AndOr < Base
40
40
  include ConfigurableEnforcedStyle
41
41
  include RangeHelp
42
+ extend AutoCorrector
42
43
 
43
44
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
44
45
 
@@ -55,8 +56,13 @@ module RuboCop
55
56
  alias on_until on_if
56
57
  alias on_until_post on_if
57
58
 
58
- def autocorrect(node)
59
- lambda do |corrector|
59
+ private
60
+
61
+ def process_logical_operator(node)
62
+ return if node.logical_operator?
63
+
64
+ message = message(node)
65
+ add_offense(node.loc.operator, message: message) do |corrector|
60
66
  node.each_child_node do |expr|
61
67
  if expr.send_type?
62
68
  correct_send(expr, corrector)
@@ -71,20 +77,12 @@ module RuboCop
71
77
  end
72
78
  end
73
79
 
74
- private
75
-
76
80
  def on_conditionals(node)
77
81
  node.condition.each_node(*AST::Node::OPERATOR_KEYWORDS) do |operator|
78
82
  process_logical_operator(operator)
79
83
  end
80
84
  end
81
85
 
82
- def process_logical_operator(node)
83
- return if node.logical_operator?
84
-
85
- add_offense(node, location: :operator)
86
- end
87
-
88
86
  def message(node)
89
87
  format(MSG, prefer: node.alternate_operator, current: node.operator)
90
88
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop enforces the use of `Array()` instead of explicit `Array` check or `[*var]`.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # paths = [paths] unless paths.is_a?(Array)
11
+ # paths.each { |path| do_something(path) }
12
+ #
13
+ # # bad (always creates a new Array instance)
14
+ # [*paths].each { |path| do_something(path) }
15
+ #
16
+ # # good (and a bit more readable)
17
+ # Array(paths).each { |path| do_something(path) }
18
+ #
19
+ class ArrayCoercion < Base
20
+ extend AutoCorrector
21
+
22
+ SPLAT_MSG = 'Use `Array(%<arg>s)` instead of `[*%<arg>s]`.'
23
+ CHECK_MSG = 'Use `Array(%<arg>s)` instead of explicit `Array` check.'
24
+
25
+ def_node_matcher :array_splat?, <<~PATTERN
26
+ (array (splat $_))
27
+ PATTERN
28
+
29
+ def_node_matcher :unless_array?, <<~PATTERN
30
+ (if
31
+ (send
32
+ (lvar $_) :is_a?
33
+ (const nil? :Array)) nil?
34
+ (lvasgn $_
35
+ (array
36
+ (lvar $_))))
37
+ PATTERN
38
+
39
+ def on_array(node)
40
+ return unless node.square_brackets?
41
+
42
+ array_splat?(node) do |arg_node|
43
+ message = format(SPLAT_MSG, arg: arg_node.source)
44
+ add_offense(node, message: message) do |corrector|
45
+ corrector.replace(node, "Array(#{arg_node.source})")
46
+ end
47
+ end
48
+ end
49
+
50
+ def on_if(node)
51
+ unless_array?(node) do |var_a, var_b, var_c|
52
+ if var_a == var_b && var_c == var_b
53
+ message = format(CHECK_MSG, arg: var_a)
54
+ add_offense(node, message: message) do |corrector|
55
+ corrector.replace(node, "#{var_a} = Array(#{var_a})")
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -17,20 +17,18 @@ module RuboCop
17
17
  # # good
18
18
  # %w(foo bar baz).join(",")
19
19
  #
20
- class ArrayJoin < Cop
20
+ class ArrayJoin < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Favor `Array#join` over `Array#*`.'
22
24
 
23
25
  def_node_matcher :join_candidate?, '(send $array :* $str)'
24
26
 
25
27
  def on_send(node)
26
- join_candidate?(node) { add_offense(node, location: :selector) }
27
- end
28
-
29
- def autocorrect(node)
30
- array, join_arg = join_candidate?(node).map(&:source)
28
+ return unless (array, join_arg = join_candidate?(node))
31
29
 
32
- lambda do |corrector|
33
- corrector.replace(node, "#{array}.join(#{join_arg})")
30
+ add_offense(node.loc.selector) do |corrector|
31
+ corrector.replace(node, "#{array.source}.join(#{join_arg.source})")
34
32
  end
35
33
  end
36
34
  end
@@ -15,17 +15,17 @@ module RuboCop
15
15
  #
16
16
  # # good
17
17
  # # Translates from English to Japanese
18
- class AsciiComments < Cop
18
+ class AsciiComments < Base
19
19
  include RangeHelp
20
20
 
21
21
  MSG = 'Use only ascii symbols in comments.'
22
22
 
23
- def investigate(processed_source)
24
- processed_source.each_comment do |comment|
23
+ def on_new_investigation
24
+ processed_source.comments.each do |comment|
25
25
  next if comment.text.ascii_only?
26
26
  next if only_allowed_non_ascii_chars?(comment.text)
27
27
 
28
- add_offense(comment, location: first_offense_range(comment))
28
+ add_offense(first_offense_range(comment))
29
29
  end
30
30
  end
31
31
 
@@ -14,8 +14,9 @@ module RuboCop
14
14
  # attr_accessor :something
15
15
  # attr_reader :one, :two, :three
16
16
  #
17
- class Attr < Cop
17
+ class Attr < Base
18
18
  include RangeHelp
19
+ extend AutoCorrector
19
20
 
20
21
  MSG = 'Do not use `attr`. Use `%<replacement>s` instead.'
21
22
 
@@ -26,10 +27,15 @@ module RuboCop
26
27
  !node.parent.class_type? &&
27
28
  !class_eval?(node.parent)
28
29
 
29
- add_offense(node, location: :selector)
30
+ message = message(node)
31
+ add_offense(node.loc.selector, message: message) do |corrector|
32
+ autocorrect(corrector, node)
33
+ end
30
34
  end
31
35
 
32
- def autocorrect(node)
36
+ private
37
+
38
+ def autocorrect(corrector, node)
33
39
  attr_name, setter = *node.arguments
34
40
 
35
41
  node_expr = node.source_range
@@ -37,14 +43,10 @@ module RuboCop
37
43
 
38
44
  remove = range_between(attr_expr.end_pos, node_expr.end_pos) if setter&.boolean_type?
39
45
 
40
- lambda do |corrector|
41
- corrector.replace(node.loc.selector, replacement_method(node))
42
- corrector.remove(remove) if remove
43
- end
46
+ corrector.replace(node.loc.selector, replacement_method(node))
47
+ corrector.remove(remove) if remove
44
48
  end
45
49
 
46
- private
47
-
48
50
  def message(node)
49
51
  format(MSG, replacement: replacement_method(node))
50
52
  end