rubocop 0.88.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 (320) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +1 -0
  4. data/config/default.yml +96 -16
  5. data/lib/rubocop.rb +16 -4
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
  7. data/lib/rubocop/cli/command/base.rb +1 -0
  8. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/comment_config.rb +5 -7
  12. data/lib/rubocop/config.rb +20 -3
  13. data/lib/rubocop/config_loader.rb +2 -2
  14. data/lib/rubocop/config_loader_resolver.rb +3 -3
  15. data/lib/rubocop/config_obsoletion.rb +6 -1
  16. data/lib/rubocop/config_validator.rb +2 -4
  17. data/lib/rubocop/cop/base.rb +2 -2
  18. data/lib/rubocop/cop/commissioner.rb +0 -1
  19. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  20. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  21. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  23. data/lib/rubocop/cop/force.rb +1 -0
  24. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
  25. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  26. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  27. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  28. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  29. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  30. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  31. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  32. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  33. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  34. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  35. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  36. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  37. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  38. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  39. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  40. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  41. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  42. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  43. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
  44. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  45. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  46. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  47. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  48. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  49. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  50. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  51. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  52. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  53. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  54. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  55. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  56. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  57. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  58. data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -4
  59. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  60. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  61. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  62. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  63. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  64. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  65. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  66. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  67. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  68. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  69. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  70. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  71. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  72. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  73. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  74. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
  75. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  76. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  77. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  78. data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
  79. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  80. data/lib/rubocop/cop/lint/loop.rb +23 -2
  81. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  82. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  83. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  84. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  85. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  86. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  87. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  88. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
  89. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  90. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  91. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  92. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  93. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  94. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  95. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  96. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  97. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  98. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  99. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  100. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  101. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  102. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  103. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  104. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  105. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  106. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  107. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  109. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  110. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  111. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  112. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  113. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  114. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  115. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  116. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  117. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  118. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  119. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  120. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  121. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  122. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  123. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  124. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  125. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  126. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  127. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  128. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  129. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  130. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  131. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  132. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  133. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  134. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  135. data/lib/rubocop/cop/lint/void.rb +3 -7
  136. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  137. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  138. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  139. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  140. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  141. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  142. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  143. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  144. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  145. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  146. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  147. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  148. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  149. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  150. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  151. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  152. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  153. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  154. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  155. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  156. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  157. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  158. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  159. data/lib/rubocop/cop/mixin/statement_modifier.rb +37 -8
  160. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  161. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  162. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  163. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  164. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  165. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  166. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  167. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  168. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  169. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  170. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  171. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  172. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  173. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  174. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  175. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  176. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  177. data/lib/rubocop/cop/registry.rb +3 -3
  178. data/lib/rubocop/cop/security/eval.rb +2 -2
  179. data/lib/rubocop/cop/security/json_load.rb +6 -8
  180. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  181. data/lib/rubocop/cop/security/open.rb +2 -2
  182. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  183. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  184. data/lib/rubocop/cop/style/accessor_grouping.rb +23 -21
  185. data/lib/rubocop/cop/style/alias.rb +41 -36
  186. data/lib/rubocop/cop/style/and_or.rb +9 -11
  187. data/lib/rubocop/cop/style/array_join.rb +6 -8
  188. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  189. data/lib/rubocop/cop/style/attr.rb +11 -9
  190. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  191. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  192. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  193. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -14
  194. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  195. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  196. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  197. data/lib/rubocop/cop/style/case_like_if.rb +19 -16
  198. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  199. data/lib/rubocop/cop/style/class_check.rb +7 -9
  200. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  201. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  202. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  203. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  204. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  205. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  206. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  207. data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
  208. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
  209. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  210. data/lib/rubocop/cop/style/copyright.rb +12 -12
  211. data/lib/rubocop/cop/style/date_time.rb +1 -1
  212. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  213. data/lib/rubocop/cop/style/dir.rb +7 -10
  214. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  215. data/lib/rubocop/cop/style/documentation.rb +6 -8
  216. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  217. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  218. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  219. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  220. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  221. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  222. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  223. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  224. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  225. data/lib/rubocop/cop/style/encoding.rb +5 -9
  226. data/lib/rubocop/cop/style/end_block.rb +4 -6
  227. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  228. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  229. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  230. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  231. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  232. data/lib/rubocop/cop/style/float_division.rb +1 -1
  233. data/lib/rubocop/cop/style/for.rb +11 -15
  234. data/lib/rubocop/cop/style/format_string.rb +21 -19
  235. data/lib/rubocop/cop/style/format_string_token.rb +5 -7
  236. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  237. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  238. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  239. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  240. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +8 -1
  241. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  242. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  243. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  244. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  245. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  246. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  247. data/lib/rubocop/cop/style/if_unless_modifier.rb +10 -32
  248. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  249. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  250. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  251. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  252. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  253. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  254. data/lib/rubocop/cop/style/lambda.rb +7 -12
  255. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  256. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  257. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  258. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  259. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  260. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  261. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  262. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  263. data/lib/rubocop/cop/style/min_max.rb +8 -12
  264. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  265. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  266. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  267. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  268. data/lib/rubocop/cop/style/module_function.rb +10 -13
  269. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  270. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  271. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  272. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  273. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  274. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  275. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  276. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  278. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -0
  279. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  280. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  281. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  282. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  283. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  284. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  285. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  286. data/lib/rubocop/cop/style/redundant_sort.rb +23 -10
  287. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  288. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  289. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  290. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  291. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  292. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  293. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  294. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  295. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  296. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  297. data/lib/rubocop/cop/team.rb +1 -1
  298. data/lib/rubocop/cop/tokens_util.rb +84 -0
  299. data/lib/rubocop/cop/util.rb +3 -13
  300. data/lib/rubocop/cop/variable_force.rb +0 -2
  301. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  302. data/lib/rubocop/cop/variable_force/variable.rb +2 -2
  303. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  304. data/lib/rubocop/error.rb +1 -0
  305. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  306. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  307. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  308. data/lib/rubocop/options.rb +3 -3
  309. data/lib/rubocop/path_util.rb +19 -4
  310. data/lib/rubocop/rake_task.rb +1 -0
  311. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  312. data/lib/rubocop/rspec/shared_contexts.rb +1 -5
  313. data/lib/rubocop/runner.rb +1 -1
  314. data/lib/rubocop/target_finder.rb +12 -9
  315. data/lib/rubocop/version.rb +2 -2
  316. metadata +21 -8
  317. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  318. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  319. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  320. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -21,7 +21,7 @@ module RuboCop
21
21
  #
22
22
  # num = 0
23
23
  # sum = numbers.each_with_object(num) { |e, a| a += e }
24
- class EachWithObjectArgument < Cop
24
+ class EachWithObjectArgument < Base
25
25
  MSG = 'The argument to each_with_object cannot be immutable.'
26
26
 
27
27
  def_node_matcher :each_with_object?, <<~PATTERN
@@ -27,7 +27,7 @@ module RuboCop
27
27
  # do_this
28
28
  # do_that
29
29
  # end
30
- class ElseLayout < Cop
30
+ class ElseLayout < Base
31
31
  MSG = 'Odd `else` layout detected. Did you mean to use `elsif`?'
32
32
 
33
33
  def on_if(node)
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for the presence of `if`, `elsif` and `unless` branches without a body.
7
+ # @example
8
+ # # bad
9
+ # if condition
10
+ # end
11
+ #
12
+ # # bad
13
+ # unless condition
14
+ # end
15
+ #
16
+ # # bad
17
+ # if condition
18
+ # do_something
19
+ # elsif other_condition
20
+ # end
21
+ #
22
+ # # good
23
+ # if condition
24
+ # do_something
25
+ # end
26
+ #
27
+ # # good
28
+ # unless condition
29
+ # do_something
30
+ # end
31
+ #
32
+ # # good
33
+ # if condition
34
+ # do_something
35
+ # elsif other_condition
36
+ # do_something_else
37
+ # end
38
+ #
39
+ # @example AllowComments: true (default)
40
+ # # good
41
+ # if condition
42
+ # do_something
43
+ # elsif other_condition
44
+ # # noop
45
+ # end
46
+ #
47
+ # @example AllowComments: false
48
+ # # bad
49
+ # if condition
50
+ # do_something
51
+ # elsif other_condition
52
+ # # noop
53
+ # end
54
+ #
55
+ class EmptyConditionalBody < Base
56
+ MSG = 'Avoid `%<keyword>s` branches without a body.'
57
+
58
+ def on_if(node)
59
+ return if node.body
60
+ return if cop_config['AllowComments'] && comment_lines?(node)
61
+
62
+ add_offense(node, message: format(MSG, keyword: node.keyword))
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -42,15 +42,15 @@ module RuboCop
42
42
  # ensure
43
43
  # do_something_else
44
44
  # end
45
- class EmptyEnsure < Cop
45
+ class EmptyEnsure < Base
46
+ extend AutoCorrector
47
+
46
48
  MSG = 'Empty `ensure` block detected.'
47
49
 
48
50
  def on_ensure(node)
49
- add_offense(node, location: :keyword) unless node.body
50
- end
51
+ return if node.body
51
52
 
52
- def autocorrect(node)
53
- lambda do |corrector|
53
+ add_offense(node.loc.keyword) do |corrector|
54
54
  corrector.remove(node.loc.keyword)
55
55
  end
56
56
  end
@@ -22,13 +22,13 @@ module RuboCop
22
22
  # if (some_expression)
23
23
  # bar
24
24
  # end
25
- class EmptyExpression < Cop
25
+ class EmptyExpression < Base
26
26
  MSG = 'Avoid empty expressions.'
27
27
 
28
28
  def on_begin(node)
29
29
  return unless empty_expression?(node)
30
30
 
31
- add_offense(node, location: node.source_range)
31
+ add_offense(node)
32
32
  end
33
33
 
34
34
  private
@@ -16,18 +16,17 @@ module RuboCop
16
16
  # # good
17
17
  #
18
18
  # "result is #{some_result}"
19
- class EmptyInterpolation < Cop
19
+ class EmptyInterpolation < Base
20
20
  include Interpolation
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Empty interpolation detected.'
23
24
 
24
25
  def on_interpolation(begin_node)
25
- add_offense(begin_node) if begin_node.children.empty?
26
- end
26
+ return unless begin_node.children.empty?
27
27
 
28
- def autocorrect(node)
29
- lambda do |collector|
30
- collector.remove(node.loc.expression)
28
+ add_offense(begin_node) do |corrector|
29
+ corrector.remove(begin_node.loc.expression)
31
30
  end
32
31
  end
33
32
  end
@@ -44,7 +44,7 @@ module RuboCop
44
44
  # # do nothing
45
45
  # end
46
46
  #
47
- class EmptyWhen < Cop
47
+ class EmptyWhen < Base
48
48
  MSG = 'Avoid `when` branches without a body.'
49
49
 
50
50
  def on_case(node)
@@ -52,7 +52,7 @@ module RuboCop
52
52
  next if when_node.body
53
53
  next if cop_config['AllowComments'] && comment_lines?(node)
54
54
 
55
- add_offense(when_node, location: when_node.source_range)
55
+ add_offense(when_node)
56
56
  end
57
57
  end
58
58
  end
@@ -4,57 +4,55 @@ module RuboCop
4
4
  module Cop
5
5
  module Lint
6
6
  # This cop checks for `return` from an `ensure` block.
7
- # Explicit return from an ensure block alters the control flow
8
- # as the return will take precedence over any exception being raised,
7
+ # `return` from an ensure block is a dangerous code smell as it
8
+ # will take precedence over any exception being raised,
9
9
  # and the exception will be silently thrown away as if it were rescued.
10
10
  #
11
+ # If you want to rescue some (or all) exceptions, best to do it explicitly
12
+ #
11
13
  # @example
12
14
  #
13
15
  # # bad
14
16
  #
15
- # begin
17
+ # def foo
16
18
  # do_something
17
19
  # ensure
18
- # do_something_else
19
- # return
20
+ # cleanup
21
+ # return self
20
22
  # end
21
23
  #
22
24
  # @example
23
25
  #
24
26
  # # good
25
27
  #
26
- # begin
28
+ # def foo
27
29
  # do_something
30
+ # self
31
+ # ensure
32
+ # cleanup
33
+ # end
34
+ #
35
+ # # also good
36
+ #
37
+ # def foo
38
+ # begin
39
+ # do_something
40
+ # rescue SomeException
41
+ # # Let's ignore this exception
42
+ # end
43
+ # self
28
44
  # ensure
29
- # do_something_else
45
+ # cleanup
30
46
  # end
31
- class EnsureReturn < Cop
47
+ class EnsureReturn < Base
48
+ extend AutoCorrector
32
49
  include RangeHelp
33
50
 
34
51
  MSG = 'Do not return from an `ensure` block.'
35
52
 
36
53
  def on_ensure(node)
37
- ensure_body = node.body
38
-
39
- return unless ensure_body
40
-
41
- ensure_body.each_node(:return) do |return_node|
42
- next if return_node.arguments.size >= 2
43
-
44
- add_offense(return_node, location: :keyword)
45
- end
46
- end
47
-
48
- def autocorrect(node)
49
- lambda do |corrector|
50
- if node.arguments?
51
- corrector.replace(node, node.source.gsub(/return\s*/, ''))
52
- else
53
- range = range_by_whole_lines(
54
- node.loc.expression, include_final_newline: true
55
- )
56
- corrector.remove(range)
57
- end
54
+ node.body&.each_node(:return) do |return_node|
55
+ add_offense(return_node)
58
56
  end
59
57
  end
60
58
  end
@@ -59,9 +59,10 @@ module RuboCop
59
59
  # ERB.new(str, nil, '-', '@output_buffer')
60
60
  # end
61
61
  #
62
- class ErbNewArguments < Cop
63
- extend TargetRubyVersion
62
+ class ErbNewArguments < Base
64
63
  include RangeHelp
64
+ extend TargetRubyVersion
65
+ extend AutoCorrector
65
66
 
66
67
  minimum_target_ruby_version 2.6
67
68
 
@@ -92,13 +93,17 @@ module RuboCop
92
93
  message = format(MESSAGES[i], arg_value: argument.source)
93
94
 
94
95
  add_offense(
95
- node, location: argument.source_range, message: message
96
- )
96
+ argument.source_range, message: message
97
+ ) do |corrector|
98
+ autocorrect(corrector, node)
99
+ end
97
100
  end
98
101
  end
99
102
  end
100
103
 
101
- def autocorrect(node)
104
+ private
105
+
106
+ def autocorrect(corrector, node)
102
107
  str_arg = node.arguments[0].source
103
108
 
104
109
  kwargs = build_kwargs(node)
@@ -108,13 +113,9 @@ module RuboCop
108
113
  str_arg, overridden_kwargs
109
114
  ].flatten.compact.join(', ')
110
115
 
111
- lambda do |corrector|
112
- corrector.replace(arguments_range(node), good_arguments)
113
- end
116
+ corrector.replace(arguments_range(node), good_arguments)
114
117
  end
115
118
 
116
- private
117
-
118
119
  def correct_arguments?(arguments)
119
120
  arguments.size == 1 ||
120
121
  arguments.size == 2 && arguments[1].hash_type?
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # (1..20).each do |x|
17
17
  # puts x if (x >= 5) && (x <= 10)
18
18
  # end
19
- class FlipFlop < Cop
19
+ class FlipFlop < Base
20
20
  MSG = 'Avoid the use of flip-flop operators.'
21
21
 
22
22
  def on_iflipflop(node)
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for the presence of precise comparison of floating point numbers.
7
+ #
8
+ # Floating point values are inherently inaccurate, and comparing them for exact equality
9
+ # is almost never the desired semantics. Comparison via the `==/!=` operators checks
10
+ # floating-point value representation to be exactly the same, which is very unlikely
11
+ # if you perform any arithmetic operations involving precision loss.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # x == 0.1
16
+ # x != 0.1
17
+ #
18
+ # # good - using BigDecimal
19
+ # x.to_d == 0.1.to_d
20
+ #
21
+ # # good
22
+ # (x - 0.1).abs < Float::EPSILON
23
+ #
24
+ # # good
25
+ # tolerance = 0.0001
26
+ # (x - 0.1).abs < tolerance
27
+ #
28
+ # # Or some other epsilon based type of comparison:
29
+ # # https://www.embeddeduse.com/2019/08/26/qt-compare-two-floats/
30
+ #
31
+ class FloatComparison < Base
32
+ MSG = 'Avoid (in)equality comparisons of floats as they are unreliable.'
33
+
34
+ EQUALITY_METHODS = %i[== != eql? equal?].freeze
35
+ FLOAT_RETURNING_METHODS = %i[to_f Float fdiv].freeze
36
+ FLOAT_INSTANCE_METHODS = %i[@- abs magnitude modulo next_float prev_float quo].to_set.freeze
37
+
38
+ def on_send(node)
39
+ return unless EQUALITY_METHODS.include?(node.method_name)
40
+
41
+ lhs, _method, rhs = *node
42
+ add_offense(node) if float?(lhs) || float?(rhs)
43
+ end
44
+
45
+ private
46
+
47
+ def float?(node)
48
+ return false unless node
49
+
50
+ case node.type
51
+ when :float
52
+ true
53
+ when :send
54
+ check_send(node)
55
+ when :begin
56
+ float?(node.children.first)
57
+ else
58
+ false
59
+ end
60
+ end
61
+
62
+ # rubocop:disable Metrics/PerceivedComplexity
63
+ def check_send(node)
64
+ if node.arithmetic_operation?
65
+ lhs, _operation, rhs = *node
66
+ float?(lhs) || float?(rhs)
67
+ elsif FLOAT_RETURNING_METHODS.include?(node.method_name)
68
+ true
69
+ elsif node.receiver&.float_type?
70
+ if FLOAT_INSTANCE_METHODS.include?(node.method_name)
71
+ true
72
+ else
73
+ check_numeric_returning_method(node)
74
+ end
75
+ end
76
+ end
77
+ # rubocop:enable Metrics/PerceivedComplexity
78
+
79
+ def check_numeric_returning_method(node)
80
+ return false unless node.receiver
81
+
82
+ case node.method_name
83
+ when :angle, :arg, :phase
84
+ Float(node.receiver.source).negative?
85
+ when :ceil, :floor, :round, :truncate
86
+ precision = node.first_argument
87
+ precision&.int_type? && Integer(precision.source).positive?
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -18,7 +18,7 @@ module RuboCop
18
18
  # # good
19
19
  #
20
20
  # float = 42.9
21
- class FloatOutOfRange < Cop
21
+ class FloatOutOfRange < Base
22
22
  MSG = 'Float out of range.'
23
23
 
24
24
  def on_float(node)
@@ -34,7 +34,7 @@ module RuboCop
34
34
  # # good
35
35
  #
36
36
  # format('Numbered format: %1$s and numbered %2$s', a_value, another)
37
- class FormatParameterMismatch < Cop
37
+ class FormatParameterMismatch < Base
38
38
  # http://rubular.com/r/CvpbxkcTzy
39
39
  MSG = "Number of arguments (%<arg_num>i) to `%<method>s` doesn't " \
40
40
  'match the number of fields (%<field_num>i).'
@@ -44,18 +44,19 @@ module RuboCop
44
44
  KERNEL = 'Kernel'
45
45
  SHOVEL = '<<'
46
46
  STRING_TYPES = %i[str dstr].freeze
47
+ FORMAT_METHODS = %i[format sprintf %].freeze
47
48
 
48
49
  def on_send(node)
49
- return unless format_string?(node)
50
+ return unless FORMAT_METHODS.include?(node.method_name) && format_string?(node)
50
51
 
51
52
  if invalid_format_string?(node)
52
- add_offense(node, location: :selector, message: MSG_INVALID)
53
+ add_offense(node.loc.selector, message: MSG_INVALID)
53
54
  return
54
55
  end
55
56
 
56
57
  return unless offending_node?(node)
57
58
 
58
- add_offense(node, location: :selector)
59
+ add_offense(node.loc.selector, message: message(node))
59
60
  end
60
61
 
61
62
  private