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
@@ -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
@@ -16,21 +16,26 @@ module RuboCop
16
16
  #
17
17
  # # Good
18
18
  # raise 'message'
19
- class RedundantException < Cop
19
+ class RedundantException < Base
20
+ extend AutoCorrector
21
+
20
22
  MSG_1 = 'Redundant `RuntimeError` argument can be removed.'
21
23
  MSG_2 = 'Redundant `RuntimeError.new` call can be replaced with ' \
22
24
  'just the message.'
23
25
 
24
- def on_send(node)
25
- exploded?(node) { return add_offense(node, message: MSG_1) }
26
- compact?(node) { add_offense(node, message: MSG_2) }
27
- end
26
+ RAISE_METHODS = %i[raise fail].freeze
28
27
 
29
28
  # Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
30
29
  # `raise RuntimeError.new('message')` to `raise 'message'`.
31
- def autocorrect(node) # rubocop:disable Metrics/MethodLength
30
+ def on_send(node)
31
+ return unless RAISE_METHODS.include?(node.method_name)
32
+
33
+ fix_exploded(node) || fix_compact(node)
34
+ end
35
+
36
+ def fix_exploded(node)
32
37
  exploded?(node) do |command, message|
33
- return lambda do |corrector|
38
+ add_offense(node, message: MSG_1) do |corrector|
34
39
  if node.parenthesized?
35
40
  corrector.replace(node,
36
41
  "#{command}(#{message.source})")
@@ -40,19 +45,22 @@ module RuboCop
40
45
  end
41
46
  end
42
47
  end
48
+ end
49
+
50
+ def fix_compact(node)
43
51
  compact?(node) do |new_call, message|
44
- lambda do |corrector|
52
+ add_offense(node, message: MSG_2) do |corrector|
45
53
  corrector.replace(new_call, message.source)
46
54
  end
47
55
  end
48
56
  end
49
57
 
50
58
  def_node_matcher :exploded?, <<~PATTERN
51
- (send nil? ${:raise :fail} (const nil? :RuntimeError) $_)
59
+ (send nil? ${:raise :fail} (const {nil? cbase} :RuntimeError) $_)
52
60
  PATTERN
53
61
 
54
62
  def_node_matcher :compact?, <<~PATTERN
55
- (send nil? {:raise :fail} $(send (const nil? :RuntimeError) :new $_))
63
+ (send nil? {:raise :fail} $(send (const {nil? cbase} :RuntimeError) :new $_))
56
64
  PATTERN
57
65
  end
58
66
  end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop identifies places where `fetch(key) { value }`
7
+ # can be replaced by `fetch(key, value)`.
8
+ #
9
+ # In such cases `fetch(key, value)` method is faster
10
+ # than `fetch(key) { value }`.
11
+ #
12
+ # @example SafeForConstants: false (default)
13
+ # # bad
14
+ # hash.fetch(:key) { 5 }
15
+ # hash.fetch(:key) { true }
16
+ # hash.fetch(:key) { nil }
17
+ # array.fetch(5) { :value }
18
+ # ENV.fetch(:key) { 'value' }
19
+ #
20
+ # # good
21
+ # hash.fetch(:key, 5)
22
+ # hash.fetch(:key, true)
23
+ # hash.fetch(:key, nil)
24
+ # array.fetch(5, :value)
25
+ # ENV.fetch(:key, 'value')
26
+ #
27
+ # @example SafeForConstants: true
28
+ # # bad
29
+ # ENV.fetch(:key) { VALUE }
30
+ #
31
+ # # good
32
+ # ENV.fetch(:key, VALUE)
33
+ #
34
+ class RedundantFetchBlock < Cop
35
+ include FrozenStringLiteral
36
+ include RangeHelp
37
+
38
+ MSG = 'Use `%<good>s` instead of `%<bad>s`.'
39
+
40
+ def_node_matcher :redundant_fetch_block_candidate?, <<~PATTERN
41
+ (block
42
+ $(send _ :fetch _)
43
+ (args)
44
+ ${nil? #basic_literal? #const_type?})
45
+ PATTERN
46
+
47
+ def on_block(node)
48
+ redundant_fetch_block_candidate?(node) do |send, body|
49
+ return if should_not_check?(send, body)
50
+
51
+ range = fetch_range(send, node)
52
+ good = build_good_method(send, body)
53
+ bad = build_bad_method(send, body)
54
+
55
+ add_offense(
56
+ node,
57
+ location: range,
58
+ message: format(MSG, good: good, bad: bad)
59
+ )
60
+ end
61
+ end
62
+
63
+ def autocorrect(node)
64
+ redundant_fetch_block_candidate?(node) do |send, body|
65
+ lambda do |corrector|
66
+ receiver, _, key = send.children
67
+ default_value = body ? body.source : 'nil'
68
+
69
+ corrector.replace(node, "#{receiver.source}.fetch(#{key.source}, #{default_value})")
70
+ end
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def basic_literal?(node)
77
+ node&.basic_literal?
78
+ end
79
+
80
+ def const_type?(node)
81
+ node&.const_type?
82
+ end
83
+
84
+ def should_not_check?(send, body)
85
+ (body&.const_type? && !check_for_constant?) ||
86
+ (body&.str_type? && !check_for_string?) ||
87
+ rails_cache?(send.receiver)
88
+ end
89
+
90
+ def_node_matcher :rails_cache?, <<~PATTERN
91
+ (send (const _ :Rails) :cache)
92
+ PATTERN
93
+
94
+ def fetch_range(send, node)
95
+ range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
96
+ end
97
+
98
+ def build_good_method(send, body)
99
+ key = send.children[2].source
100
+ default_value = body ? body.source : 'nil'
101
+
102
+ "fetch(#{key}, #{default_value})"
103
+ end
104
+
105
+ def build_bad_method(send, body)
106
+ key = send.children[2].source
107
+ block = body ? "{ #{body.source} }" : '{}'
108
+
109
+ "fetch(#{key}) #{block}"
110
+ end
111
+
112
+ def check_for_constant?
113
+ cop_config['SafeForConstants']
114
+ end
115
+
116
+ def check_for_string?
117
+ frozen_string_literals_enabled?
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for the presence of superfluous `.rb` extension in
7
+ # the filename provided to `require` and `require_relative`.
8
+ #
9
+ # Note: If the extension is omitted, Ruby tries adding '.rb', '.so',
10
+ # and so on to the name until found. If the file named cannot be found,
11
+ # a `LoadError` will be raised.
12
+ # There is an edge case where `foo.so` file is loaded instead of a `LoadError`
13
+ # if `foo.so` file exists when `require 'foo.rb'` will be changed to `require 'foo'`,
14
+ # but that seems harmless.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # require 'foo.rb'
19
+ # require_relative '../foo.rb'
20
+ #
21
+ # # good
22
+ # require 'foo'
23
+ # require 'foo.so'
24
+ # require_relative '../foo'
25
+ # require_relative '../foo.so'
26
+ #
27
+ class RedundantFileExtensionInRequire < Cop
28
+ MSG = 'Redundant `.rb` file extension detected.'
29
+
30
+ def_node_matcher :require_call?, <<~PATTERN
31
+ (send nil? {:require :require_relative} $str_type?)
32
+ PATTERN
33
+
34
+ def on_send(node)
35
+ require_call?(node) do |name_node|
36
+ add_offense(name_node) if name_node.value.end_with?('.rb')
37
+ end
38
+ end
39
+
40
+ def autocorrect(node)
41
+ correction = node.value.sub(/\.rb\z/, '')
42
+
43
+ lambda do |corrector|
44
+ corrector.replace(node, "'#{correction}'")
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -56,7 +56,7 @@ module RuboCop
56
56
  (begin (send {float int} {:+ :- :* :** :/ :% :<<} _))
57
57
  (begin (send !(str _) {:+ :- :* :** :/ :%} {float int}))
58
58
  (begin (send _ {:== :=== :!= :<= :>= :< :>} _))
59
- (send (const nil? :ENV) :[] _)
59
+ (send (const {nil? cbase} :ENV) :[] _)
60
60
  (send _ {:count :length :size} ...)
61
61
  (block (send _ {:count :length :size} ...) ...)
62
62
  }
@@ -156,7 +156,7 @@ module RuboCop
156
156
  source_buffer = node.source_range.source_buffer
157
157
  line_range = source_buffer.line_range(node.loc.end.line)
158
158
 
159
- line_range.source =~ /^\s*\)\s*,/
159
+ /^\s*\)\s*,/.match?(line_range.source)
160
160
  end
161
161
 
162
162
  def disallowed_literal?(begin_node, node)
@@ -205,7 +205,9 @@ module RuboCop
205
205
  end
206
206
 
207
207
  def first_argument?(node)
208
- first_send_argument?(node) || first_super_argument?(node)
208
+ first_send_argument?(node) ||
209
+ first_super_argument?(node) ||
210
+ first_yield_argument?(node)
209
211
  end
210
212
 
211
213
  def_node_matcher :first_send_argument?, <<~PATTERN
@@ -216,6 +218,10 @@ module RuboCop
216
218
  ^(super equal?(%0) ...)
217
219
  PATTERN
218
220
 
221
+ def_node_matcher :first_yield_argument?, <<~PATTERN
222
+ ^(yield equal?(%0) ...)
223
+ PATTERN
224
+
219
225
  def call_chain_starts_with_int?(begin_node, send_node)
220
226
  recv = first_part_of_call_chain(send_node)
221
227
  recv&.int_type? && (parent = begin_node.parent) &&
@@ -97,13 +97,13 @@ module RuboCop
97
97
 
98
98
  return true if STRING_INTERPOLATION_REGEXP.match?(src)
99
99
 
100
- src.scan(/\\./).any? { |s| s =~ ESCAPED_NON_BACKSLASH }
100
+ src.scan(/\\./).any? { |s| ESCAPED_NON_BACKSLASH.match?(s) }
101
101
  end
102
102
 
103
103
  def acceptable_capital_q?(node)
104
104
  src = node.source
105
105
  src.include?(QUOTE) &&
106
- (src =~ STRING_INTERPOLATION_REGEXP ||
106
+ (STRING_INTERPOLATION_REGEXP.match?(src) ||
107
107
  (node.str_type? && double_quotes_required?(src)))
108
108
  end
109
109
  end
@@ -34,10 +34,11 @@ module RuboCop
34
34
  \[ # Literal [
35
35
  (?!\#\{) # Not (the start of) an interpolation
36
36
  (?: # Either...
37
- \\. | # Any escaped character
37
+ \\[^b] | # Any escaped character except b (which would change behaviour)
38
38
  [^.*+?{}()|$] | # or one that doesn't require escaping outside the character class
39
39
  \\[upP]\{[^}]+\} # or a unicode code-point or property
40
40
  )
41
+ (?<!\\) # No \-prefix (i.e. not escaped)
41
42
  \] # Literal ]
42
43
  )
43
44
  /x.freeze
@@ -67,8 +68,8 @@ module RuboCop
67
68
  end
68
69
 
69
70
  def each_redundant_character_class(node)
70
- each_match_range(node.loc.expression, PATTERN) do |loc|
71
- yield loc
71
+ pattern_source(node).scan(PATTERN) do
72
+ yield match_range(node.loc.begin.end, Regexp.last_match)
72
73
  end
73
74
  end
74
75
 
@@ -18,6 +18,9 @@ module RuboCop
18
18
  # # good
19
19
  # %r/foo\/bar/
20
20
  #
21
+ # # good
22
+ # %r!foo\!bar!
23
+ #
21
24
  # # bad
22
25
  # /a\-b/
23
26
  #
@@ -63,41 +66,44 @@ module RuboCop
63
66
 
64
67
  private
65
68
 
66
- def slash_literal?(node)
67
- ['/', '%r/'].include?(node.loc.begin.source)
68
- end
69
-
70
69
  def allowed_escape?(node, char, within_character_class)
71
70
  # Strictly speaking a few single-letter metachars are currently
72
71
  # unnecessary to "escape", e.g. g, i, E, F, but enumerating them is
73
72
  # rather difficult, and their behaviour could change over time with
74
73
  # different versions of Ruby so that e.g. /\g/ != /g/
75
74
  return true if /[[:alnum:]]/.match?(char)
76
- return true if ALLOWED_ALWAYS_ESCAPES.include?(char)
75
+ return true if ALLOWED_ALWAYS_ESCAPES.include?(char) || delimiter?(node, char)
77
76
 
78
- if char == '/'
79
- slash_literal?(node)
80
- elsif within_character_class
77
+ if within_character_class
81
78
  ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES.include?(char)
82
79
  else
83
80
  ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES.include?(char)
84
81
  end
85
82
  end
86
83
 
84
+ def delimiter?(node, char)
85
+ delimiters = [
86
+ node.loc.begin.source[-1],
87
+ node.loc.end.source[0]
88
+ ]
89
+
90
+ delimiters.include?(char)
91
+ end
92
+
87
93
  def each_escape(node)
88
94
  pattern_source(node).each_char.with_index.reduce(
89
- [nil, false]
90
- ) do |(previous, within_character_class), (current, index)|
95
+ [nil, 0]
96
+ ) do |(previous, char_class_depth), (current, index)|
91
97
  if previous == '\\'
92
- yield [current, index - 1, within_character_class]
98
+ yield [current, index - 1, !char_class_depth.zero?]
93
99
 
94
- [nil, within_character_class]
95
- elsif previous == '[' && current != ':'
96
- [current, true]
97
- elsif previous != ':' && current == ']'
98
- [current, false]
100
+ [nil, char_class_depth]
101
+ elsif previous == '['
102
+ [current, char_class_depth + 1]
103
+ elsif current == ']'
104
+ [current, char_class_depth - 1]
99
105
  else
100
- [current, within_character_class]
106
+ [current, char_class_depth]
101
107
  end
102
108
  end
103
109
  end
@@ -109,21 +115,6 @@ module RuboCop
109
115
 
110
116
  range_between(start, start + 2)
111
117
  end
112
-
113
- def pattern_source(node)
114
- freespace_mode = freespace_mode_regexp?(node)
115
-
116
- node.children.reject(&:regopt_type?).map do |child|
117
- source = child.source
118
-
119
- if freespace_mode
120
- # Remove comments to avoid misleading results
121
- source.sub(/(?<!\\)#.*/, '')
122
- else
123
- source
124
- end
125
- end.join
126
- end
127
118
  end
128
119
  end
129
120
  end
@@ -44,6 +44,11 @@ module RuboCop
44
44
  class RedundantSelf < Cop
45
45
  MSG = 'Redundant `self` detected.'
46
46
  KERNEL_METHODS = Kernel.methods(false)
47
+ KEYWORDS = %i[alias and begin break case class def defined? do
48
+ else elsif end ensure false for if in module
49
+ next nil not or redo rescue retry return self
50
+ super then true undef unless until when while
51
+ yield __FILE__ __LINE__ __ENCODING__].freeze
47
52
 
48
53
  def self.autocorrect_incompatible_with
49
54
  [ColonMethodCall]
@@ -131,7 +136,7 @@ module RuboCop
131
136
 
132
137
  def regular_method_call?(node)
133
138
  !(node.operator_method? ||
134
- keyword?(node.method_name) ||
139
+ KEYWORDS.include?(node.method_name) ||
135
140
  node.camel_case_method? ||
136
141
  node.setter_method? ||
137
142
  node.implicit_call?)
@@ -142,14 +147,6 @@ module RuboCop
142
147
  @local_variables_scopes[node] << name
143
148
  end
144
149
 
145
- def keyword?(method_name)
146
- %i[alias and begin break case class def defined? do
147
- else elsif end ensure false for if in module
148
- next nil not or redo rescue retry return self
149
- super then true undef unless until when while
150
- yield __FILE__ __LINE__ __ENCODING__].include?(method_name)
151
- end
152
-
153
150
  def allow_self(node)
154
151
  return unless node.send_type? && node.self_receiver?
155
152