rubocop 0.86.0 → 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 (377) 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 +198 -25
  5. data/lib/rubocop.rb +30 -5
  6. data/lib/rubocop/cli.rb +2 -4
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  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 +3 -3
  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 +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -2
  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 +14 -24
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +407 -0
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  23. data/lib/rubocop/cop/commissioner.rb +47 -50
  24. data/lib/rubocop/cop/cop.rb +85 -236
  25. data/lib/rubocop/cop/corrector.rb +38 -115
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  31. data/lib/rubocop/cop/force.rb +1 -0
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator.rb +1 -1
  35. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  36. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  44. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  45. data/lib/rubocop/cop/layout/class_structure.rb +5 -44
  46. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -8
  50. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  52. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
  53. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  54. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
  55. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  56. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  58. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -6
  59. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  60. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  61. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  62. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  63. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  64. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  65. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  66. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  67. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  68. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  69. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  70. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  71. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  72. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  73. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  74. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  75. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  76. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  77. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  78. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  79. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  80. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  81. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  82. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  83. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  84. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  85. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  86. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  87. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  88. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  89. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  90. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  91. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  92. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  93. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  94. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  95. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  96. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  97. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  98. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  99. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  100. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  101. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  102. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  103. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  104. data/lib/rubocop/cop/lint/loop.rb +23 -2
  105. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  106. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  107. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  108. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  109. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  110. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  111. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  112. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  113. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  114. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  115. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  116. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  117. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  118. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  119. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  120. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  121. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  122. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +41 -40
  123. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  124. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  125. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  126. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  127. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  128. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  129. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  130. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  131. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  132. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  133. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  134. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  135. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  136. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  137. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  138. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  139. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  140. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  141. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  142. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  143. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  144. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  145. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  146. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  147. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  148. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  149. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  150. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  151. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  152. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  153. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  154. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  155. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  156. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  157. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  158. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  159. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  160. data/lib/rubocop/cop/lint/void.rb +3 -7
  161. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  162. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  163. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  164. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  165. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  166. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  167. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  168. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  169. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  170. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  171. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  172. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  173. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  174. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  175. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  176. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  177. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  178. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  179. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  180. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  181. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  182. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  183. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  184. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  185. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  186. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  187. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  188. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  189. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  190. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  191. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -24
  192. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  193. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +10 -15
  194. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  195. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  196. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  197. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  198. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
  199. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  200. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  201. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  202. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  203. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  204. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  205. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  206. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  207. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  208. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  209. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  210. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  211. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  212. data/lib/rubocop/cop/offense.rb +16 -2
  213. data/lib/rubocop/cop/registry.rb +3 -3
  214. data/lib/rubocop/cop/security/eval.rb +2 -2
  215. data/lib/rubocop/cop/security/json_load.rb +6 -8
  216. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  217. data/lib/rubocop/cop/security/open.rb +2 -2
  218. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  219. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  220. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  221. data/lib/rubocop/cop/style/alias.rb +41 -36
  222. data/lib/rubocop/cop/style/and_or.rb +9 -11
  223. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  224. data/lib/rubocop/cop/style/array_join.rb +6 -8
  225. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  226. data/lib/rubocop/cop/style/attr.rb +11 -9
  227. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  228. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  229. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  230. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  231. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  232. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  233. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  234. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  235. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  236. data/lib/rubocop/cop/style/class_check.rb +7 -9
  237. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  238. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  239. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  240. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  241. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  242. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  243. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  244. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  245. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  246. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  247. data/lib/rubocop/cop/style/copyright.rb +12 -12
  248. data/lib/rubocop/cop/style/date_time.rb +2 -2
  249. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  250. data/lib/rubocop/cop/style/dir.rb +9 -12
  251. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  252. data/lib/rubocop/cop/style/documentation.rb +6 -8
  253. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  254. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  255. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  256. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  257. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  258. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  259. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  260. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  261. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  262. data/lib/rubocop/cop/style/encoding.rb +5 -9
  263. data/lib/rubocop/cop/style/end_block.rb +4 -6
  264. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  265. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  266. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  267. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  268. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  269. data/lib/rubocop/cop/style/float_division.rb +8 -11
  270. data/lib/rubocop/cop/style/for.rb +11 -15
  271. data/lib/rubocop/cop/style/format_string.rb +21 -19
  272. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  273. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  274. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  275. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  276. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  277. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  278. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  279. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  280. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  281. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  282. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  283. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  284. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  285. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  286. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  287. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  288. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  289. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  290. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  291. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  292. data/lib/rubocop/cop/style/lambda.rb +7 -12
  293. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  294. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  295. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  296. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  297. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  298. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  299. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  300. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  301. data/lib/rubocop/cop/style/min_max.rb +8 -12
  302. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  303. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  304. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  305. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  306. data/lib/rubocop/cop/style/module_function.rb +10 -13
  307. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  308. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  309. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  310. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  311. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  312. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  313. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  315. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  316. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  317. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  318. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  319. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  320. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  321. data/lib/rubocop/cop/style/proc.rb +1 -1
  322. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  323. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  324. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  325. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  326. data/lib/rubocop/cop/style/redundant_fetch_block.rb +26 -7
  327. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  328. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  329. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
  330. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
  331. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +11 -11
  332. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  333. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  334. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  335. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  336. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  337. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  338. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  339. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  340. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  341. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  342. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  343. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  344. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  345. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  346. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  347. data/lib/rubocop/cop/team.rb +98 -82
  348. data/lib/rubocop/cop/tokens_util.rb +84 -0
  349. data/lib/rubocop/cop/util.rb +3 -13
  350. data/lib/rubocop/cop/utils/format_string.rb +1 -2
  351. data/lib/rubocop/cop/variable_force.rb +0 -2
  352. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  353. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  354. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  355. data/lib/rubocop/error.rb +1 -0
  356. data/lib/rubocop/file_finder.rb +12 -12
  357. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  358. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  359. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  360. data/lib/rubocop/name_similarity.rb +1 -3
  361. data/lib/rubocop/options.rb +18 -11
  362. data/lib/rubocop/path_util.rb +17 -17
  363. data/lib/rubocop/rake_task.rb +7 -9
  364. data/lib/rubocop/result_cache.rb +12 -8
  365. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  366. data/lib/rubocop/rspec/expect_offense.rb +53 -22
  367. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  368. data/lib/rubocop/runner.rb +35 -34
  369. data/lib/rubocop/target_finder.rb +13 -10
  370. data/lib/rubocop/target_ruby.rb +1 -1
  371. data/lib/rubocop/version.rb +2 -2
  372. metadata +40 -11
  373. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  374. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  375. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  376. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  377. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -14,7 +14,7 @@ module RuboCop
14
14
  # # good
15
15
  # a = 'a'
16
16
  # foo if ['a', 'b', 'c'].include?(a)
17
- class MultipleComparison < Cop
17
+ class MultipleComparison < Base
18
18
  MSG = 'Avoid comparing a variable with multiple items ' \
19
19
  'in a conditional, use `Array#include?` instead.'
20
20
 
@@ -50,9 +50,10 @@ module RuboCop
50
50
  # puts 1
51
51
  # end
52
52
  # end.freeze
53
- class MutableConstant < Cop
53
+ class MutableConstant < Base
54
54
  include FrozenStringLiteral
55
55
  include ConfigurableEnforcedStyle
56
+ extend AutoCorrector
56
57
 
57
58
  MSG = 'Freeze mutable objects assigned to constants.'
58
59
 
@@ -69,23 +70,6 @@ module RuboCop
69
70
  on_assignment(value)
70
71
  end
71
72
 
72
- def autocorrect(node)
73
- expr = node.source_range
74
-
75
- lambda do |corrector|
76
- splat_value = splat_value(node)
77
- if splat_value
78
- correct_splat_expansion(corrector, expr, splat_value)
79
- elsif node.array_type? && !node.bracketed?
80
- corrector.wrap(expr, '[', ']')
81
- elsif requires_parentheses?(node)
82
- corrector.wrap(expr, '(', ')')
83
- end
84
-
85
- corrector.insert_after(expr, '.freeze')
86
- end
87
- end
88
-
89
73
  private
90
74
 
91
75
  def on_assignment(value)
@@ -101,7 +85,9 @@ module RuboCop
101
85
  return if operation_produces_immutable_object?(value)
102
86
  return if frozen_string_literal?(value)
103
87
 
104
- add_offense(value)
88
+ add_offense(value) do |corrector|
89
+ autocorrect(corrector, value)
90
+ end
105
91
  end
106
92
 
107
93
  def check(value)
@@ -112,7 +98,24 @@ module RuboCop
112
98
  return if FROZEN_STRING_LITERAL_TYPES.include?(value.type) &&
113
99
  frozen_string_literals_enabled?
114
100
 
115
- add_offense(value)
101
+ add_offense(value) do |corrector|
102
+ autocorrect(corrector, value)
103
+ end
104
+ end
105
+
106
+ def autocorrect(corrector, node)
107
+ expr = node.source_range
108
+
109
+ splat_value = splat_value(node)
110
+ if splat_value
111
+ correct_splat_expansion(corrector, expr, splat_value)
112
+ elsif node.array_type? && !node.bracketed?
113
+ corrector.wrap(expr, '[', ']')
114
+ elsif requires_parentheses?(node)
115
+ corrector.wrap(expr, '(', ')')
116
+ end
117
+
118
+ corrector.insert_after(expr, '.freeze')
116
119
  end
117
120
 
118
121
  def mutable_literal?(value)
@@ -150,14 +153,14 @@ module RuboCop
150
153
  def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
151
154
  {
152
155
  (const _ _)
153
- (send (const nil? :Struct) :new ...)
154
- (block (send (const nil? :Struct) :new ...) ...)
156
+ (send (const {nil? cbase} :Struct) :new ...)
157
+ (block (send (const {nil? cbase} :Struct) :new ...) ...)
155
158
  (send _ :freeze)
156
159
  (send {float int} {:+ :- :* :** :/ :% :<<} _)
157
160
  (send _ {:+ :- :* :** :/ :%} {float int})
158
161
  (send _ {:== :=== :!= :<= :>= :< :>} _)
159
- (send (const nil? :ENV) :[] _)
160
- (or (send (const nil? :ENV) :[] _) _)
162
+ (send (const {nil? cbase} :ENV) :[] _)
163
+ (or (send (const {nil? cbase} :ENV) :[] _) _)
161
164
  (send _ {:count :length :size} ...)
162
165
  (block (send _ {:count :length :size} ...) ...)
163
166
  }
@@ -14,6 +14,7 @@ module RuboCop
14
14
  # method1(method2 arg)
15
15
  class NestedParenthesizedCalls < Cop
16
16
  include RangeHelp
17
+ include AllowedMethods
17
18
 
18
19
  MSG = 'Add parentheses to nested method call `%<source>s`.'
19
20
 
@@ -36,7 +37,9 @@ module RuboCop
36
37
 
37
38
  leading_space =
38
39
  range_with_surrounding_space(range: first_arg.begin,
39
- side: :left)
40
+ side: :left,
41
+ whitespace: true,
42
+ continuations: true)
40
43
 
41
44
  lambda do |corrector|
42
45
  corrector.replace(leading_space, '(')
@@ -54,13 +57,9 @@ module RuboCop
54
57
 
55
58
  def allowed?(send_node)
56
59
  send_node.parent.arguments.one? &&
57
- allowed_methods.include?(send_node.method_name.to_s) &&
60
+ allowed_method?(send_node.method_name) &&
58
61
  send_node.arguments.one?
59
62
  end
60
-
61
- def allowed_methods
62
- cop_config['AllowedMethods'] || []
63
- end
64
63
  end
65
64
  end
66
65
  end
@@ -53,16 +53,19 @@ module RuboCop
53
53
  'negative?' => '<'
54
54
  }.freeze
55
55
 
56
+ COMPARISON_METHODS = %i[== > < positive? negative? zero?].to_set.freeze
57
+
56
58
  def on_send(node)
59
+ return unless COMPARISON_METHODS.include?(node.method_name)
60
+
61
+ numeric, replacement = check(node)
62
+ return unless numeric
63
+
57
64
  return if ignored_method?(node.method_name) ||
58
65
  node.each_ancestor(:send, :block).any? do |ancestor|
59
66
  ignored_method?(ancestor.method_name)
60
67
  end
61
68
 
62
- numeric, replacement = check(node)
63
-
64
- return unless numeric
65
-
66
69
  add_offense(node,
67
70
  message: format(MSG,
68
71
  prefer: replacement,
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where keyword arguments can be used instead of
7
+ # boolean arguments when defining methods.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # def some_method(bar = false)
12
+ # puts bar
13
+ # end
14
+ #
15
+ # # bad - common hack before keyword args were introduced
16
+ # def some_method(options = {})
17
+ # bar = options.fetch(:bar, false)
18
+ # puts bar
19
+ # end
20
+ #
21
+ # # good
22
+ # def some_method(bar: false)
23
+ # puts bar
24
+ # end
25
+ #
26
+ class OptionalBooleanParameter < Base
27
+ MSG = 'Use keyword arguments when defining method with boolean argument.'
28
+ BOOLEAN_TYPES = %i[true false].freeze
29
+
30
+ def on_def(node)
31
+ node.arguments.each do |arg|
32
+ next unless arg.optarg_type?
33
+
34
+ _name, value = *arg
35
+ add_offense(arg) if BOOLEAN_TYPES.include?(value.type)
36
+ end
37
+ end
38
+ alias on_defs on_def
39
+ end
40
+ end
41
+ end
42
+ end
@@ -30,7 +30,7 @@ module RuboCop
30
30
  def on_masgn(node)
31
31
  lhs, rhs = *node
32
32
  lhs_elements = *lhs
33
- rhs_elements = [*rhs].compact # edge case for one constant
33
+ rhs_elements = Array(rhs).compact # edge case for one constant
34
34
 
35
35
  return if allowed_lhs?(lhs) || allowed_rhs?(rhs) ||
36
36
  allowed_masign?(lhs_elements, rhs_elements)
@@ -42,7 +42,7 @@ module RuboCop
42
42
  lambda do |corrector|
43
43
  left, right = *node
44
44
  left_elements = *left
45
- right_elements = [*right].compact
45
+ right_elements = Array(right).compact
46
46
  order = find_valid_order(left_elements, right_elements)
47
47
  correction = assignment_corrector(node, order)
48
48
 
@@ -69,7 +69,7 @@ module RuboCop
69
69
 
70
70
  def allowed_rhs?(node)
71
71
  # Edge case for one constant
72
- elements = [*node].compact
72
+ elements = Array(node).compact
73
73
 
74
74
  # Account for edge case of `Constant::CONSTANT`
75
75
  !node.array_type? ||
@@ -131,8 +131,8 @@ module RuboCop
131
131
  @assignments = assignments
132
132
  end
133
133
 
134
- def tsort_each_node
135
- @assignments.each { |a| yield a }
134
+ def tsort_each_node(&block)
135
+ @assignments.each(&block)
136
136
  end
137
137
 
138
138
  def tsort_each_child(assignment)
@@ -107,7 +107,7 @@ module RuboCop
107
107
 
108
108
  def string_source(node)
109
109
  if node.is_a?(String)
110
- node
110
+ node.scrub
111
111
  elsif node.respond_to?(:type) && (node.str_type? || node.sym_type?)
112
112
  node.source
113
113
  end
@@ -17,7 +17,7 @@ module RuboCop
17
17
  MSG = 'Use `proc` instead of `Proc.new`.'
18
18
 
19
19
  def_node_matcher :proc_new?,
20
- '(block $(send (const nil? :Proc) :new) ...)'
20
+ '(block $(send (const {nil? cbase} :Proc) :new) ...)'
21
21
 
22
22
  def on_block(node)
23
23
  proc_new?(node) do |block_method|
@@ -31,7 +31,7 @@ module RuboCop
31
31
  (send
32
32
  int {:+ :-}
33
33
  (send
34
- {nil? (const nil? :Random) (const nil? :Kernel)}
34
+ {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
35
35
  :rand
36
36
  {int irange erange}))
37
37
  PATTERN
@@ -39,7 +39,7 @@ module RuboCop
39
39
  def_node_matcher :rand_op_integer?, <<~PATTERN
40
40
  (send
41
41
  (send
42
- {nil? (const nil? :Random) (const nil? :Kernel)}
42
+ {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
43
43
  :rand
44
44
  {int irange erange})
45
45
  {:+ :-}
@@ -49,13 +49,14 @@ module RuboCop
49
49
  def_node_matcher :rand_modified?, <<~PATTERN
50
50
  (send
51
51
  (send
52
- {nil? (const nil? :Random) (const nil? :Kernel)}
52
+ {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
53
53
  :rand
54
54
  {int irange erange})
55
55
  {:succ :pred :next})
56
56
  PATTERN
57
57
 
58
58
  def on_send(node)
59
+ return unless node.receiver
59
60
  return unless integer_op_rand?(node) ||
60
61
  rand_op_integer?(node) ||
61
62
  rand_modified?(node)
@@ -128,14 +129,8 @@ module RuboCop
128
129
  end
129
130
  end
130
131
 
131
- def_node_matcher :namespace, <<~PATTERN
132
- {$nil? (const nil? $_)}
133
- PATTERN
134
-
135
132
  def prefix_from_prefix_node(node)
136
- namespace(node) do |namespace|
137
- [namespace, 'rand'].compact.join('.')
138
- end
133
+ [node&.source, 'rand'].compact.join('.')
139
134
  end
140
135
 
141
136
  def boundaries_from_random_node(random_node)
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for redundant assignment before returning.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # def test
11
+ # x = foo
12
+ # x
13
+ # end
14
+ #
15
+ # # bad
16
+ # def test
17
+ # if x
18
+ # z = foo
19
+ # z
20
+ # elsif y
21
+ # z = bar
22
+ # z
23
+ # end
24
+ # end
25
+ #
26
+ # # good
27
+ # def test
28
+ # foo
29
+ # end
30
+ #
31
+ # # good
32
+ # def test
33
+ # if x
34
+ # foo
35
+ # elsif y
36
+ # bar
37
+ # end
38
+ # end
39
+ #
40
+ class RedundantAssignment < Cop
41
+ MSG = 'Redundant assignment before returning detected.'
42
+
43
+ def_node_matcher :redundant_assignment?, <<~PATTERN
44
+ (... $(lvasgn _name _expression) (lvar _name))
45
+ PATTERN
46
+
47
+ def on_def(node)
48
+ check_branch(node.body)
49
+ end
50
+ alias on_defs on_def
51
+
52
+ def autocorrect(node)
53
+ lambda do |corrector|
54
+ expression = node.children[1]
55
+ corrector.replace(node, expression.source)
56
+ corrector.remove(right_sibling_of(node))
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def check_branch(node)
63
+ return unless node
64
+
65
+ case node.type
66
+ when :case then check_case_node(node)
67
+ when :if then check_if_node(node)
68
+ when :rescue, :resbody
69
+ check_rescue_node(node)
70
+ when :ensure then check_ensure_node(node)
71
+ when :begin, :kwbegin
72
+ check_begin_node(node)
73
+ end
74
+ end
75
+
76
+ def check_case_node(node)
77
+ node.when_branches.each { |when_node| check_branch(when_node.body) }
78
+ check_branch(node.else_branch)
79
+ end
80
+
81
+ def check_if_node(node)
82
+ return if node.modifier_form? || node.ternary?
83
+
84
+ check_branch(node.if_branch)
85
+ check_branch(node.else_branch)
86
+ end
87
+
88
+ def check_rescue_node(node)
89
+ node.child_nodes.each do |child_node|
90
+ check_branch(child_node)
91
+ end
92
+ end
93
+
94
+ def check_ensure_node(node)
95
+ check_branch(node.body)
96
+ end
97
+
98
+ def check_begin_node(node)
99
+ if (assignment = redundant_assignment?(node))
100
+ add_offense(assignment)
101
+ else
102
+ last_expr = node.children.last
103
+ check_branch(last_expr)
104
+ end
105
+ end
106
+
107
+ def right_sibling_of(node)
108
+ siblings_of(node)[node.sibling_index + 1]
109
+ end
110
+
111
+ def siblings_of(node)
112
+ node.parent.children
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -90,10 +90,10 @@ module RuboCop
90
90
  end
91
91
 
92
92
  def else_source(else_branch)
93
- if else_branch.basic_conditional? &&
94
- else_branch.modifier_form? ||
95
- else_branch.range_type?
93
+ if require_parentheses?(else_branch)
96
94
  "(#{else_branch.source})"
95
+ elsif without_argument_parentheses_method?(else_branch)
96
+ "#{else_branch.method_name}(#{else_branch.arguments.map(&:source).join(', ')})"
97
97
  else
98
98
  else_branch.source
99
99
  end
@@ -118,6 +118,18 @@ module RuboCop
118
118
 
119
119
  corrector.wrap(node.else_branch, '(', ')')
120
120
  end
121
+
122
+ def require_parentheses?(node)
123
+ node.basic_conditional? &&
124
+ node.modifier_form? ||
125
+ node.range_type? ||
126
+ node.rescue_type? ||
127
+ node.respond_to?(:semantic_operator?) && node.semantic_operator?
128
+ end
129
+
130
+ def without_argument_parentheses_method?(node)
131
+ node.send_type? && !node.arguments.empty? && !node.parenthesized?
132
+ end
121
133
  end
122
134
  end
123
135
  end