rubocop 0.85.1 → 0.89.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -4
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +227 -26
  5. data/lib/rubocop.rb +33 -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/init_dotfile.rb +1 -1
  11. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  12. data/lib/rubocop/cli/command/version.rb +2 -2
  13. data/lib/rubocop/comment_config.rb +2 -2
  14. data/lib/rubocop/config.rb +20 -3
  15. data/lib/rubocop/config_loader.rb +40 -68
  16. data/lib/rubocop/config_loader_resolver.rb +4 -4
  17. data/lib/rubocop/config_obsoletion.rb +6 -2
  18. data/lib/rubocop/config_store.rb +4 -0
  19. data/lib/rubocop/config_validator.rb +1 -3
  20. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  21. data/lib/rubocop/cop/badge.rb +1 -1
  22. data/lib/rubocop/cop/base.rb +407 -0
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  24. data/lib/rubocop/cop/commissioner.rb +47 -50
  25. data/lib/rubocop/cop/cop.rb +85 -236
  26. data/lib/rubocop/cop/corrector.rb +38 -115
  27. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -3
  28. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  29. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  32. data/lib/rubocop/cop/force.rb +1 -0
  33. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
  34. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  35. data/lib/rubocop/cop/generator.rb +1 -1
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  38. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  39. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  40. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  41. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  42. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  43. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  44. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  45. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  46. data/lib/rubocop/cop/layout/class_structure.rb +2 -37
  47. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
  48. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  49. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  50. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  51. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
  52. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  53. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  54. data/lib/rubocop/cop/layout/extra_spacing.rb +9 -16
  55. data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
  56. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  57. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  58. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
  59. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  60. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  68. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  73. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  74. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  76. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  77. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  79. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  80. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +49 -0
  81. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  82. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  83. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  84. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  85. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  86. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  87. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  88. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  89. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  90. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  91. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  92. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  93. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  94. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  95. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  96. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  97. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  98. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  99. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  100. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  101. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  102. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  103. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  104. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  105. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
  106. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  107. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  108. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  109. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  110. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  113. data/lib/rubocop/cop/lint/loop.rb +23 -2
  114. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  115. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  116. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  117. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  118. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  119. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  120. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  121. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  122. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  123. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  124. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  125. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +61 -0
  126. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  127. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
  128. data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
  129. data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
  130. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  131. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
  132. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  133. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  134. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  135. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  136. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  137. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  138. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
  139. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  140. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  141. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  142. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  143. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  144. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  145. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  146. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  147. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  149. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  150. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  151. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  152. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  153. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  154. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  155. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  156. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  157. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  158. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  159. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  160. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  161. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  162. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  163. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  164. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -31
  165. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  166. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  167. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  168. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  169. data/lib/rubocop/cop/lint/void.rb +3 -7
  170. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  171. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  172. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  173. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  174. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  175. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  176. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  177. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  178. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  179. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
  180. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  181. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  182. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  183. data/lib/rubocop/cop/migration/department_name.rb +13 -15
  184. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  185. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  186. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  187. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  188. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  189. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  190. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  191. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  192. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  193. data/lib/rubocop/cop/mixin/enforce_superclass.rb +5 -1
  194. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  195. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  196. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  197. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  198. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  199. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  200. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  201. data/lib/rubocop/cop/mixin/range_help.rb +1 -1
  202. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
  203. data/lib/rubocop/cop/mixin/statement_modifier.rb +38 -9
  204. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  205. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
  206. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
  207. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
  208. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  209. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  210. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  211. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  212. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
  213. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  214. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  215. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  216. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  217. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  218. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
  219. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  220. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  221. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  222. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  223. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  224. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  225. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  226. data/lib/rubocop/cop/offense.rb +16 -2
  227. data/lib/rubocop/cop/registry.rb +3 -3
  228. data/lib/rubocop/cop/security/eval.rb +2 -2
  229. data/lib/rubocop/cop/security/json_load.rb +6 -8
  230. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  231. data/lib/rubocop/cop/security/open.rb +2 -2
  232. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  233. data/lib/rubocop/cop/style/access_modifier_declarations.rb +11 -1
  234. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  235. data/lib/rubocop/cop/style/alias.rb +7 -3
  236. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  237. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
  238. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  239. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +144 -0
  240. data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
  241. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  242. data/lib/rubocop/cop/style/case_like_if.rb +217 -0
  243. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  244. data/lib/rubocop/cop/style/class_vars.rb +21 -0
  245. data/lib/rubocop/cop/style/colon_method_call.rb +3 -3
  246. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  247. data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
  248. data/lib/rubocop/cop/style/conditional_assignment.rb +11 -2
  249. data/lib/rubocop/cop/style/copyright.rb +3 -3
  250. data/lib/rubocop/cop/style/date_time.rb +1 -1
  251. data/lib/rubocop/cop/style/dir.rb +2 -2
  252. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
  253. data/lib/rubocop/cop/style/documentation.rb +6 -6
  254. data/lib/rubocop/cop/style/each_with_object.rb +0 -2
  255. data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
  256. data/lib/rubocop/cop/style/empty_literal.rb +5 -5
  257. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  258. data/lib/rubocop/cop/style/encoding.rb +1 -1
  259. data/lib/rubocop/cop/style/eval_with_location.rb +4 -0
  260. data/lib/rubocop/cop/style/expand_path_arguments.rb +6 -2
  261. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  262. data/lib/rubocop/cop/style/exponential_notation.rb +8 -10
  263. data/lib/rubocop/cop/style/float_division.rb +7 -10
  264. data/lib/rubocop/cop/style/format_string.rb +4 -0
  265. data/lib/rubocop/cop/style/format_string_token.rb +6 -5
  266. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  267. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  268. data/lib/rubocop/cop/style/guard_clause.rb +2 -2
  269. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  270. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  271. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  272. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  273. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -28
  274. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
  275. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  276. data/lib/rubocop/cop/style/inverse_methods.rb +3 -4
  277. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  278. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -0
  279. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -1
  280. data/lib/rubocop/cop/style/missing_else.rb +1 -11
  281. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +9 -2
  282. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  283. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  284. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  285. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  286. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  287. data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
  288. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
  289. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  290. data/lib/rubocop/cop/style/next.rb +2 -2
  291. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  292. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  293. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  294. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  295. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  296. data/lib/rubocop/cop/style/proc.rb +1 -1
  297. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  298. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  299. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  300. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  301. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  302. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  303. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  304. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
  305. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  306. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
  307. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
  308. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  309. data/lib/rubocop/cop/style/redundant_sort.rb +28 -12
  310. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  311. data/lib/rubocop/cop/style/sample.rb +1 -1
  312. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  313. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  314. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  315. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  316. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  317. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  318. data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
  319. data/lib/rubocop/cop/style/symbol_array.rb +6 -6
  320. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  321. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  322. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  323. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  324. data/lib/rubocop/cop/style/word_array.rb +1 -1
  325. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  326. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  327. data/lib/rubocop/cop/team.rb +98 -82
  328. data/lib/rubocop/cop/tokens_util.rb +84 -0
  329. data/lib/rubocop/cop/util.rb +3 -15
  330. data/lib/rubocop/cop/utils/format_string.rb +2 -3
  331. data/lib/rubocop/cop/variable_force.rb +0 -2
  332. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  333. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  334. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  335. data/lib/rubocop/error.rb +1 -0
  336. data/lib/rubocop/file_finder.rb +12 -12
  337. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  338. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  339. data/lib/rubocop/name_similarity.rb +7 -3
  340. data/lib/rubocop/options.rb +15 -8
  341. data/lib/rubocop/path_util.rb +19 -19
  342. data/lib/rubocop/platform.rb +1 -1
  343. data/lib/rubocop/rake_task.rb +7 -9
  344. data/lib/rubocop/result_cache.rb +12 -8
  345. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  346. data/lib/rubocop/rspec/expect_offense.rb +63 -22
  347. data/lib/rubocop/rspec/shared_contexts.rb +19 -16
  348. data/lib/rubocop/runner.rb +34 -33
  349. data/lib/rubocop/target_finder.rb +14 -11
  350. data/lib/rubocop/target_ruby.rb +2 -2
  351. data/lib/rubocop/version.rb +2 -2
  352. metadata +49 -11
  353. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  354. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  355. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  356. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  357. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -134,7 +134,7 @@ module RuboCop
134
134
 
135
135
  def autocorrect(range)
136
136
  lambda do |corrector|
137
- if range.source =~ /\*\*/ && !space_around_exponent_operator?
137
+ if /\*\*/.match?(range.source) && !space_around_exponent_operator?
138
138
  corrector.replace(range, '**')
139
139
  elsif range.source.end_with?("\n")
140
140
  corrector.replace(range, " #{range.source.strip}\n")
@@ -27,6 +27,20 @@ module RuboCop
27
27
  # foo.map{ |a|
28
28
  # a.bar.to_s
29
29
  # }
30
+ #
31
+ # @example EnforcedStyleForEmptyBraces: space (default)
32
+ # # bad
33
+ # 7.times{}
34
+ #
35
+ # # good
36
+ # 7.times {}
37
+ #
38
+ # @example EnforcedStyleForEmptyBraces: no_space
39
+ # # bad
40
+ # 7.times {}
41
+ #
42
+ # # good
43
+ # 7.times{}
30
44
  class SpaceBeforeBlockBraces < Cop
31
45
  include ConfigurableEnforcedStyle
32
46
  include RangeHelp
@@ -130,7 +130,7 @@ module RuboCop
130
130
  line, col = line_and_column_for(token)
131
131
  return true if col == -1
132
132
 
133
- processed_source.lines[line][0..col] !~ /\S/
133
+ !/\S/.match?(processed_source.lines[line][0..col])
134
134
  end
135
135
 
136
136
  def index_for(node, token)
@@ -142,11 +142,12 @@ module RuboCop
142
142
  end
143
143
 
144
144
  def issue_offenses(node, left, right, start_ok, end_ok)
145
- if style == :no_space
145
+ case style
146
+ when :no_space
146
147
  start_ok = next_to_comment?(node, left)
147
148
  no_space_offenses(node, left, right, MSG, start_ok: start_ok,
148
149
  end_ok: end_ok)
149
- elsif style == :space
150
+ when :space
150
151
  space_offenses(node, left, right, MSG, start_ok: start_ok,
151
152
  end_ok: end_ok)
152
153
  else
@@ -150,7 +150,7 @@ module RuboCop
150
150
  end
151
151
 
152
152
  def check_right_brace(inner, left_brace, right_brace, single_line)
153
- if single_line && inner =~ /\S$/
153
+ if single_line && /\S$/.match?(inner)
154
154
  no_space(right_brace.begin_pos, right_brace.end_pos,
155
155
  'Space missing inside }.')
156
156
  else
@@ -182,7 +182,7 @@ module RuboCop
182
182
  def range_of_space_to_the_right(range)
183
183
  src = range.source_buffer.source
184
184
  end_pos = range.end_pos
185
- end_pos += 1 while src[end_pos] =~ /[ \t]/
185
+ end_pos += 1 while /[ \t]/.match?(src[end_pos])
186
186
 
187
187
  range_between(range.begin_pos + 1, end_pos)
188
188
  end
@@ -190,7 +190,7 @@ module RuboCop
190
190
  def range_of_space_to_the_left(range)
191
191
  src = range.source_buffer.source
192
192
  begin_pos = range.begin_pos
193
- begin_pos -= 1 while src[begin_pos - 1] =~ /[ \t]/
193
+ begin_pos -= 1 while /[ \t]/.match?(src[begin_pos - 1])
194
194
 
195
195
  range_between(begin_pos, range.end_pos - 1)
196
196
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Legacy
6
+ # Legacy support for Corrector#corrections
7
+ # See https://docs.rubocop.org/rubocop/cop_api_v1_changelog.html
8
+ class CorrectionsProxy
9
+ def initialize(corrector)
10
+ @corrector = corrector
11
+ end
12
+
13
+ def <<(callable)
14
+ suppress_clobbering do
15
+ @corrector.transaction do
16
+ callable.call(@corrector)
17
+ end
18
+ end
19
+ end
20
+
21
+ def empty?
22
+ @corrector.empty?
23
+ end
24
+
25
+ def concat(corrections)
26
+ if corrections.is_a?(CorrectionsProxy)
27
+ suppress_clobbering do
28
+ corrector.merge!(corrections.corrector)
29
+ end
30
+ else
31
+ corrections.each { |correction| self << correction }
32
+ end
33
+ end
34
+
35
+ protected
36
+
37
+ attr_reader :corrector
38
+
39
+ private
40
+
41
+ def suppress_clobbering
42
+ yield
43
+ rescue ::Parser::ClobberingError
44
+ # ignore Clobbering errors
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Legacy
6
+ # Legacy Corrector for v0 API support.
7
+ # See https://docs.rubocop.org/rubocop/cop_api_v1_changelog.html
8
+ class Corrector < RuboCop::Cop::Corrector
9
+ # Support legacy second argument
10
+ def initialize(source, corr = [])
11
+ super(source)
12
+ if corr.is_a?(CorrectionsProxy)
13
+ merge!(corr.send(:corrector))
14
+ else
15
+ # warn "Corrector.new with corrections is deprecated." unless corr.empty? TODO
16
+ corr.each do |c|
17
+ corrections << c
18
+ end
19
+ end
20
+ end
21
+
22
+ def corrections
23
+ # warn "#corrections is deprecated. Open an issue if you have a valid usecase." TODO
24
+ CorrectionsProxy.new(self)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -24,18 +24,21 @@ module RuboCop
24
24
  # # good
25
25
  # # Lambda arguments require no disambiguation
26
26
  # foo = ->(bar) { bar.baz }
27
- class AmbiguousBlockAssociation < Cop
27
+ class AmbiguousBlockAssociation < Base
28
28
  MSG = 'Parenthesize the param `%<param>s` to make sure that the ' \
29
29
  'block will be associated with the `%<method>s` method ' \
30
30
  'call.'
31
31
 
32
32
  def on_send(node)
33
- return if !node.arguments? || node.parenthesized? ||
34
- node.last_argument.lambda? || allowed_method?(node)
33
+ return unless node.arguments?
35
34
 
36
35
  return unless ambiguous_block_association?(node)
36
+ return if node.parenthesized? ||
37
+ node.last_argument.lambda? || allowed_method?(node)
38
+
39
+ message = message(node)
37
40
 
38
- add_offense(node)
41
+ add_offense(node, message: message)
39
42
  end
40
43
  alias on_csend on_send
41
44
 
@@ -20,8 +20,8 @@ module RuboCop
20
20
  #
21
21
  # # With parentheses, there's no ambiguity.
22
22
  # do_something(*some_array)
23
- class AmbiguousOperator < Cop
24
- include ParserDiagnostic
23
+ class AmbiguousOperator < Base
24
+ extend AutoCorrector
25
25
 
26
26
  AMBIGUITIES = {
27
27
  '+' => { actual: 'positive number', possible: 'addition' },
@@ -38,18 +38,23 @@ module RuboCop
38
38
  'a whitespace to the right of the `%<operator>s` if it ' \
39
39
  'should be a %<possible>s.'
40
40
 
41
- def autocorrect(node)
42
- lambda do |corrector|
43
- add_parentheses(node, corrector)
41
+ def on_new_investigation
42
+ processed_source.diagnostics.each do |diagnostic|
43
+ next unless diagnostic.reason == :ambiguous_prefix
44
+
45
+ offense_node = find_offense_node_by(diagnostic)
46
+ message = message(diagnostic)
47
+
48
+ add_offense(
49
+ diagnostic.location, message: message, severity: diagnostic.level
50
+ ) do |corrector|
51
+ add_parentheses(offense_node, corrector)
52
+ end
44
53
  end
45
54
  end
46
55
 
47
56
  private
48
57
 
49
- def relevant_diagnostic?(diagnostic)
50
- diagnostic.reason == :ambiguous_prefix
51
- end
52
-
53
58
  def find_offense_node_by(diagnostic)
54
59
  ast = processed_source.ast
55
60
  ast.each_node(:splat, :block_pass, :kwsplat) do |node|
@@ -68,7 +73,7 @@ module RuboCop
68
73
  end
69
74
  end
70
75
 
71
- def alternative_message(diagnostic)
76
+ def message(diagnostic)
72
77
  operator = diagnostic.location.source
73
78
  hash = AMBIGUITIES[operator]
74
79
  format(MSG_FORMAT, hash)
@@ -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,49 @@
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
+
33
+ def on_send(node)
34
+ return unless node.binary_operation?
35
+
36
+ lhs, operation, rhs = *node
37
+ return if node.arithmetic_operation? && lhs.basic_literal? && rhs.basic_literal?
38
+
39
+ add_offense(node, message: format(MSG, op: operation)) if lhs == rhs
40
+ end
41
+
42
+ def on_and(node)
43
+ add_offense(node, message: format(MSG, op: node.operator)) if node.lhs == node.rhs
44
+ end
45
+ alias on_or on_and
46
+ end
47
+ end
48
+ end
49
+ 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)