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
@@ -21,25 +21,27 @@ module RuboCop
21
21
  #
22
22
  # # With parentheses, there's no ambiguity.
23
23
  # do_something(/pattern/i)
24
- class AmbiguousRegexpLiteral < Cop
25
- include ParserDiagnostic
24
+ class AmbiguousRegexpLiteral < Base
25
+ extend AutoCorrector
26
26
 
27
27
  MSG = 'Ambiguous regexp literal. Parenthesize the method arguments ' \
28
28
  "if it's surely a regexp literal, or add a whitespace to the " \
29
29
  'right of the `/` if it should be a division.'
30
30
 
31
- def autocorrect(node)
32
- lambda do |corrector|
33
- add_parentheses(node, corrector)
31
+ def on_new_investigation
32
+ processed_source.diagnostics.each do |diagnostic|
33
+ next unless diagnostic.reason == :ambiguous_literal
34
+
35
+ offense_node = find_offense_node_by(diagnostic)
36
+
37
+ add_offense(diagnostic.location, severity: diagnostic.level) do |corrector|
38
+ add_parentheses(offense_node, corrector)
39
+ end
34
40
  end
35
41
  end
36
42
 
37
43
  private
38
44
 
39
- def relevant_diagnostic?(diagnostic)
40
- diagnostic.reason == :ambiguous_literal
41
- end
42
-
43
45
  def find_offense_node_by(diagnostic)
44
46
  node = processed_source.ast.each_node(:regexp).find do |regexp_node|
45
47
  regexp_node.source_range.begin_pos == diagnostic.location.begin_pos
@@ -47,10 +49,6 @@ module RuboCop
47
49
 
48
50
  node.parent
49
51
  end
50
-
51
- def alternative_message(_diagnostic)
52
- MSG
53
- end
54
52
  end
55
53
  end
56
54
  end
@@ -34,7 +34,7 @@ module RuboCop
34
34
  # do_something
35
35
  # end
36
36
  #
37
- class AssignmentInCondition < Cop
37
+ class AssignmentInCondition < Base
38
38
  include SafeAssignment
39
39
 
40
40
  MSG_WITH_SAFE_ASSIGNMENT_ALLOWED =
@@ -53,7 +53,7 @@ module RuboCop
53
53
  next :skip_children if skip_children?(asgn_node)
54
54
  next if allowed_construct?(asgn_node)
55
55
 
56
- add_offense(asgn_node, location: :operator)
56
+ add_offense(asgn_node.loc.operator)
57
57
  end
58
58
  end
59
59
  alias on_while on_if
@@ -14,7 +14,9 @@ module RuboCop
14
14
  # # good
15
15
  # BigDecimal(123.456, 3)
16
16
  #
17
- class BigDecimalNew < Cop
17
+ class BigDecimalNew < Base
18
+ extend AutoCorrector
19
+
18
20
  MSG = '`%<double_colon>sBigDecimal.new()` is deprecated. ' \
19
21
  'Use `%<double_colon>sBigDecimal()` instead.'
20
22
 
@@ -24,18 +26,16 @@ module RuboCop
24
26
  PATTERN
25
27
 
26
28
  def on_send(node)
27
- return unless big_decimal_new(node) do |captured_value|
29
+ return unless node.method?(:new)
30
+
31
+ big_decimal_new(node) do |captured_value|
28
32
  double_colon = captured_value ? '::' : ''
29
33
  message = format(MSG, double_colon: double_colon)
30
34
 
31
- add_offense(node, location: :selector, message: message)
32
- end
33
- end
34
-
35
- def autocorrect(node)
36
- lambda do |corrector|
37
- corrector.remove(node.loc.selector)
38
- corrector.remove(node.loc.dot)
35
+ add_offense(node.loc.selector, message: message) do |corrector|
36
+ corrector.remove(node.loc.selector)
37
+ corrector.remove(node.loc.dot)
38
+ end
39
39
  end
40
40
  end
41
41
  end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for places where binary operator has identical operands.
7
+ #
8
+ # It covers arithmetic operators: `+`, `-`, `*`, `/`, `%`, `**`;
9
+ # comparison operators: `==`, `===`, `=~`, `>`, `>=`, `<`, `<=`;
10
+ # bitwise operators: `|`, `^`, `&`, `<<`, `>>`;
11
+ # boolean operators: `&&`, `||`
12
+ # and "spaceship" operator - `<=>`.
13
+ #
14
+ # This cop is marked as unsafe as it does not consider side effects when calling methods
15
+ # and thus can generate false positives:
16
+ # if wr.take_char == '\0' && wr.take_char == '\0'
17
+ #
18
+ # @example
19
+ # # bad
20
+ # x.top >= x.top
21
+ #
22
+ # if a.x != 0 && a.x != 0
23
+ # do_something
24
+ # end
25
+ #
26
+ # def childs?
27
+ # left_child || left_child
28
+ # end
29
+ #
30
+ class BinaryOperatorWithIdenticalOperands < Base
31
+ MSG = 'Binary operator `%<op>s` has identical operands.'
32
+ MATH_OPERATORS = %i[+ - * / % ** << >> | ^].to_set.freeze
33
+
34
+ def on_send(node)
35
+ return unless node.binary_operation?
36
+
37
+ lhs, operation, rhs = *node
38
+ return if MATH_OPERATORS.include?(node.method_name) && rhs.basic_literal?
39
+
40
+ add_offense(node, message: format(MSG, op: operation)) if lhs == rhs
41
+ end
42
+
43
+ def on_and(node)
44
+ add_offense(node, message: format(MSG, op: node.operator)) if node.lhs == node.rhs
45
+ end
46
+ alias on_or on_and
47
+ end
48
+ end
49
+ end
50
+ end
@@ -21,7 +21,9 @@ module RuboCop
21
21
  #
22
22
  # # good
23
23
  # false
24
- class BooleanSymbol < Cop
24
+ class BooleanSymbol < Base
25
+ extend AutoCorrector
26
+
25
27
  MSG = 'Symbol with a boolean name - ' \
26
28
  'you probably meant to use `%<boolean>s`.'
27
29
 
@@ -30,19 +32,22 @@ module RuboCop
30
32
  def on_sym(node)
31
33
  return unless boolean_symbol?(node)
32
34
 
33
- add_offense(node, message: format(MSG, boolean: node.value))
35
+ add_offense(node, message: format(MSG, boolean: node.value)) do |corrector|
36
+ autocorrect(corrector, node)
37
+ end
34
38
  end
35
39
 
36
- def autocorrect(node)
37
- lambda do |corrector|
38
- boolean_literal = node.source.delete(':')
39
- parent = node.parent
40
- if parent&.pair_type? && node.equal?(parent.children[0])
41
- corrector.remove(parent.loc.operator)
42
- boolean_literal = "#{node.source} =>"
43
- end
44
- corrector.replace(node, boolean_literal)
40
+ private
41
+
42
+ def autocorrect(corrector, node)
43
+ boolean_literal = node.source.delete(':')
44
+ parent = node.parent
45
+ if parent&.pair_type? && node.equal?(parent.children[0])
46
+ corrector.remove(parent.loc.operator)
47
+ boolean_literal = "#{node.source} =>"
45
48
  end
49
+
50
+ corrector.replace(node, boolean_literal)
46
51
  end
47
52
  end
48
53
  end
@@ -47,7 +47,7 @@ module RuboCop
47
47
  # def cook(dry_ingredients = self.dry_ingredients)
48
48
  # dry_ingredients.combine
49
49
  # end
50
- class CircularArgumentReference < Cop
50
+ class CircularArgumentReference < Base
51
51
  MSG = 'Circular argument reference - `%<arg_name>s`.'
52
52
 
53
53
  def on_kwoptarg(node)
@@ -55,7 +55,7 @@ module RuboCop
55
55
  # # good
56
56
  # Login
57
57
  #
58
- class ConstantResolution < Cop
58
+ class ConstantResolution < Base
59
59
  MSG = 'Fully qualify this constant to avoid possibly ambiguous resolution.'
60
60
 
61
61
  def_node_matcher :unqualified_const?, <<~PATTERN
@@ -32,9 +32,14 @@ module RuboCop
32
32
  # def some_method
33
33
  # do_something
34
34
  # end
35
- class Debugger < Cop
35
+ class Debugger < Base
36
36
  MSG = 'Remove debugger entry point `%<source>s`.'
37
37
 
38
+ DEBUGGER_METHODS = %i[
39
+ debugger byebug remote_byebug pry remote_pry pry_remote console rescue
40
+ save_and_open_page save_and_open_screenshot save_screenshot irb
41
+ ].to_set.freeze
42
+
38
43
  def_node_matcher :kernel?, <<~PATTERN
39
44
  {
40
45
  (const nil? :Kernel)
@@ -57,6 +62,7 @@ module RuboCop
57
62
  PATTERN
58
63
 
59
64
  def on_send(node)
65
+ return unless DEBUGGER_METHODS.include?(node.method_name)
60
66
  return unless debugger_call?(node) || binding_irb?(node)
61
67
 
62
68
  add_offense(node)
@@ -20,7 +20,9 @@ module RuboCop
20
20
  # File.exist?(some_path)
21
21
  # Dir.exist?(some_path)
22
22
  # block_given?
23
- class DeprecatedClassMethods < Cop
23
+ class DeprecatedClassMethods < Base
24
+ extend AutoCorrector
25
+
24
26
  # Inner class to DeprecatedClassMethods.
25
27
  # This class exists to add abstraction and clean naming to the
26
28
  # objects that are going to be operated on.
@@ -60,20 +62,17 @@ module RuboCop
60
62
  replacement: :block_given?)
61
63
  ].freeze
62
64
 
65
+ DEPRECATED_METHODS = DEPRECATED_METHODS_OBJECT.map(&:deprecated_method).freeze
66
+
63
67
  def on_send(node)
68
+ return unless DEPRECATED_METHODS.include?(node.method_name)
69
+
64
70
  check(node) do |data|
65
71
  message = format(MSG, current: deprecated_method(data),
66
72
  prefer: replacement_method(data))
67
73
 
68
- add_offense(node, location: :selector, message: message)
69
- end
70
- end
71
-
72
- def autocorrect(node)
73
- lambda do |corrector|
74
- check(node) do |data|
75
- corrector.replace(node.loc.selector,
76
- data.replacement_method.to_s)
74
+ add_offense(node.loc.selector, message: message) do |corrector|
75
+ corrector.replace(node.loc.selector, data.replacement_method.to_s)
77
76
  end
78
77
  end
79
78
  end
@@ -37,8 +37,9 @@ module RuboCop
37
37
  # # good
38
38
  # OpenSSL::Digest.digest('SHA256', 'foo')
39
39
  #
40
- class DeprecatedOpenSSLConstant < Cop
40
+ class DeprecatedOpenSSLConstant < Base
41
41
  include RangeHelp
42
+ extend AutoCorrector
42
43
 
43
44
  MSG = 'Use `%<constant>s.%<method>s(%<replacement_args>s)`' \
44
45
  ' instead of `%<original>s`.'
@@ -54,26 +55,29 @@ module RuboCop
54
55
 
55
56
  def on_send(node)
56
57
  return if node.arguments.any? { |arg| arg.variable? || arg.send_type? || arg.const_type? }
58
+ return unless algorithm_const(node)
57
59
 
58
- add_offense(node) if algorithm_const(node)
60
+ message = message(node)
61
+
62
+ add_offense(node, message: message) do |corrector|
63
+ autocorrect(corrector, node)
64
+ end
59
65
  end
60
66
 
61
- def autocorrect(node)
67
+ private
68
+
69
+ def autocorrect(corrector, node)
62
70
  algorithm_constant, = algorithm_const(node)
63
71
 
64
- lambda do |corrector|
65
- corrector.remove(algorithm_constant.loc.double_colon)
66
- corrector.remove(algorithm_constant.loc.name)
72
+ corrector.remove(algorithm_constant.loc.double_colon)
73
+ corrector.remove(algorithm_constant.loc.name)
67
74
 
68
- corrector.replace(
69
- correction_range(node),
70
- "#{node.loc.selector.source}(#{replacement_args(node)})"
71
- )
72
- end
75
+ corrector.replace(
76
+ correction_range(node),
77
+ "#{node.loc.selector.source}(#{replacement_args(node)})"
78
+ )
73
79
  end
74
80
 
75
- private
76
-
77
81
  def message(node)
78
82
  algorithm_constant, = algorithm_const(node)
79
83
  parent_constant = openssl_class(algorithm_constant)
@@ -22,7 +22,9 @@ module RuboCop
22
22
  # def initialize
23
23
  # @x = 1
24
24
  # end
25
- class DisjunctiveAssignmentInConstructor < Cop
25
+ class DisjunctiveAssignmentInConstructor < Base
26
+ extend AutoCorrector
27
+
26
28
  MSG = 'Unnecessary disjunctive assignment. Use plain assignment.'
27
29
 
28
30
  def on_def(node)
@@ -73,7 +75,11 @@ module RuboCop
73
75
  # @param [Node] node a disjunctive assignment
74
76
  def check_disjunctive_assignment(node)
75
77
  lhs = node.child_nodes.first
76
- add_offense(node, location: :operator) if lhs.ivasgn_type?
78
+ return unless lhs.ivasgn_type?
79
+
80
+ add_offense(node.loc.operator) do |corrector|
81
+ corrector.replace(node.loc.operator, '=')
82
+ end
77
83
  end
78
84
  end
79
85
  end
@@ -27,7 +27,7 @@ module RuboCop
27
27
  # when 'second'
28
28
  # do_something_else
29
29
  # end
30
- class DuplicateCaseCondition < Cop
30
+ class DuplicateCaseCondition < Base
31
31
  MSG = 'Duplicate `when` condition detected.'
32
32
 
33
33
  def on_case(case_node)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks that there are no repeated conditions used in if 'elsif'.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # if x == 1
11
+ # do_something
12
+ # elsif x == 1
13
+ # do_something_else
14
+ # end
15
+ #
16
+ # # good
17
+ # if x == 1
18
+ # do_something
19
+ # elsif x == 2
20
+ # do_something_else
21
+ # end
22
+ #
23
+ class DuplicateElsifCondition < Base
24
+ MSG = 'Duplicate `elsif` condition detected.'
25
+
26
+ def on_if(node)
27
+ previous = []
28
+ while node.if? || node.elsif?
29
+ condition = node.condition
30
+ add_offense(condition) if previous.include?(condition)
31
+ previous << condition
32
+ node = node.else_branch
33
+ break unless node&.if_type?
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -18,7 +18,7 @@ module RuboCop
18
18
  # # good
19
19
  #
20
20
  # hash = { food: 'apple', other_food: 'orange' }
21
- class DuplicateHashKey < Cop
21
+ class DuplicateHashKey < Base
22
22
  include Duplication
23
23
 
24
24
  MSG = 'Duplicated key in hash literal.'
@@ -49,10 +49,13 @@ module RuboCop
49
49
  # end
50
50
  #
51
51
  # alias bar foo
52
- class DuplicateMethods < Cop
52
+ class DuplicateMethods < Base
53
53
  MSG = 'Method `%<method>s` is defined at both %<defined>s and ' \
54
54
  '%<current>s.'
55
55
 
56
+ METHOD_DEF_METHODS = %i[alias_method attr_reader attr_writer
57
+ attr_accessor attr].to_set.freeze
58
+
56
59
  def initialize(config = nil, options = nil)
57
60
  super
58
61
  @definitions = {}
@@ -96,10 +99,10 @@ module RuboCop
96
99
  PATTERN
97
100
 
98
101
  def_node_matcher :sym_name, '(sym $_name)'
99
-
100
102
  def on_send(node)
103
+ return unless METHOD_DEF_METHODS.include?(node.method_name)
104
+
101
105
  if (name = alias_method?(node))
102
- return unless name
103
106
  return if node.ancestors.any?(&:if_type?)
104
107
  return if possible_dsl?(node)
105
108
 
@@ -126,7 +129,7 @@ module RuboCop
126
129
  end
127
130
 
128
131
  def message_for_dup(node, method_name)
129
- format(MSG, method: method_name, defined: @definitions[method_name],
132
+ format(MSG, method: method_name, defined: source_location(@definitions[method_name]),
130
133
  current: source_location(node))
131
134
  end
132
135
 
@@ -150,9 +153,9 @@ module RuboCop
150
153
  end
151
154
  message = message_for_dup(node, method_name)
152
155
 
153
- add_offense(node, location: loc, message: message)
156
+ add_offense(loc, message: message)
154
157
  else
155
- @definitions[method_name] = source_location(node)
158
+ @definitions[method_name] = node
156
159
  end
157
160
  end
158
161