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
@@ -87,7 +87,7 @@ module RuboCop
87
87
  private
88
88
 
89
89
  def check_ending_if(node)
90
- return if accepted_form?(node, true) || !min_body_length?(node)
90
+ return if accepted_form?(node, ending: true) || !min_body_length?(node)
91
91
 
92
92
  register_offense(node, 'return', opposite_keyword(node))
93
93
  end
@@ -125,7 +125,7 @@ module RuboCop
125
125
  max && node.source_range.column + example.length > max
126
126
  end
127
127
 
128
- def accepted_form?(node, ending = false)
128
+ def accepted_form?(node, ending: false)
129
129
  accepted_if?(node, ending) || node.condition.multiline? ||
130
130
  node.parent&.assignment?
131
131
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for presence or absence of braces around hash literal as a last
7
+ # array item depending on configuration.
8
+ #
9
+ # @example EnforcedStyle: braces (default)
10
+ # # bad
11
+ # [1, 2, one: 1, two: 2]
12
+ #
13
+ # # good
14
+ # [1, 2, { one: 1, two: 2 }]
15
+ #
16
+ # @example EnforcedStyle: no_braces
17
+ # # bad
18
+ # [1, 2, { one: 1, two: 2 }]
19
+ #
20
+ # # good
21
+ # [1, 2, one: 1, two: 2]
22
+ #
23
+ class HashAsLastArrayItem < Base
24
+ include ConfigurableEnforcedStyle
25
+ extend AutoCorrector
26
+
27
+ def on_hash(node)
28
+ return unless last_array_item?(node)
29
+
30
+ if braces_style?
31
+ check_braces(node)
32
+ else
33
+ check_no_braces(node)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def last_array_item?(node)
40
+ parent = node.parent
41
+ return false unless parent
42
+
43
+ parent.array_type? && parent.values.last == node
44
+ end
45
+
46
+ def check_braces(node)
47
+ return if node.braces?
48
+
49
+ add_offense(node, message: 'Wrap hash in `{` and `}`.') do |corrector|
50
+ corrector.wrap(node, '{', '}')
51
+ end
52
+ end
53
+
54
+ def check_no_braces(node)
55
+ return unless node.braces?
56
+
57
+ add_offense(node, message: 'Omit the braces around the hash.') do |corrector|
58
+ corrector.remove(node.loc.begin)
59
+ corrector.remove(node.loc.end)
60
+ end
61
+ end
62
+
63
+ def braces_style?
64
+ style == :braces
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where `case-when` represents a simple 1:1
7
+ # mapping and can be replaced with a hash lookup.
8
+ #
9
+ # @example MinBranchesCount: 3 (default)
10
+ # # bad
11
+ # case country
12
+ # when 'europe'
13
+ # 'http://eu.example.com'
14
+ # when 'america'
15
+ # 'http://us.example.com'
16
+ # when 'australia'
17
+ # 'http://au.example.com'
18
+ # end
19
+ #
20
+ # # good
21
+ # SITES = {
22
+ # 'europe' => 'http://eu.example.com',
23
+ # 'america' => 'http://us.example.com',
24
+ # 'australia' => 'http://au.example.com'
25
+ # }
26
+ # SITES[country]
27
+ #
28
+ # @example MinBranchesCount: 4
29
+ # # good
30
+ # case country
31
+ # when 'europe'
32
+ # 'http://eu.example.com'
33
+ # when 'america'
34
+ # 'http://us.example.com'
35
+ # when 'australia'
36
+ # 'http://au.example.com'
37
+ # end
38
+ #
39
+ class HashLikeCase < Base
40
+ MSG = 'Consider replacing `case-when` with a hash lookup.'
41
+
42
+ def_node_matcher :hash_like_case?, <<~PATTERN
43
+ (case
44
+ _
45
+ (when
46
+ ${str_type? sym_type?}
47
+ $[!nil? recursive_basic_literal?])+ nil?)
48
+ PATTERN
49
+
50
+ def on_case(node)
51
+ return if node.when_branches.size < min_branches_count
52
+
53
+ hash_like_case?(node) do |condition_nodes, body_nodes|
54
+ if nodes_of_same_type?(condition_nodes) &&
55
+ nodes_of_same_type?(body_nodes)
56
+ add_offense(node)
57
+ end
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ def nodes_of_same_type?(nodes)
64
+ nodes.all? { |node| node.type == nodes.first.type }
65
+ end
66
+
67
+ def min_branches_count
68
+ length = cop_config['MinBranchesCount'] || 3
69
+ return length if length.is_a?(Integer) && length.positive?
70
+
71
+ raise 'MinBranchesCount needs to be a positive integer!'
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -62,6 +62,7 @@ module RuboCop
62
62
  MSG_NO_MIXED_KEYS = "Don't mix styles in the same hash."
63
63
  MSG_HASH_ROCKETS = 'Use hash rockets syntax.'
64
64
 
65
+ # rubocop:disable Metrics/PerceivedComplexity, Metrics/AbcSize
65
66
  def on_hash(node)
66
67
  pairs = node.pairs
67
68
 
@@ -73,10 +74,11 @@ module RuboCop
73
74
  ruby19_no_mixed_keys_check(pairs)
74
75
  elsif style == :no_mixed_keys
75
76
  no_mixed_keys_check(pairs)
76
- else
77
+ elsif node.source.include?('=>')
77
78
  ruby19_check(pairs)
78
79
  end
79
80
  end
81
+ # rubocop:enable Metrics/PerceivedComplexity, Metrics/AbcSize
80
82
 
81
83
  def ruby19_check(pairs)
82
84
  check(pairs, '=>', MSG_19) if sym_indices?(pairs)
@@ -174,7 +176,7 @@ module RuboCop
174
176
 
175
177
  corrector.replace(
176
178
  range,
177
- range.source.sub(/^:(.*\S)\s*=>\s*$/, space.to_s + '\1: ')
179
+ range.source.sub(/^:(.*\S)\s*=>\s*$/, "#{space}\\1: ")
178
180
  )
179
181
 
180
182
  hash_node = pair_node.parent
@@ -199,7 +201,8 @@ module RuboCop
199
201
  def autocorrect_hash_rockets(corrector, pair_node)
200
202
  op = pair_node.loc.operator
201
203
 
202
- corrector.wrap(pair_node.key, ':', pair_node.inverse_delimiter(true))
204
+ key_with_hash_rocket = ":#{pair_node.key.source}#{pair_node.inverse_delimiter(true)}"
205
+ corrector.replace(pair_node.key, key_with_hash_rocket)
203
206
  corrector.remove(range_with_surrounding_space(range: op))
204
207
  end
205
208
 
@@ -81,7 +81,7 @@ module RuboCop
81
81
 
82
82
  private
83
83
 
84
- def check_branches(branches)
84
+ def check_branches(branches) # rubocop:todo Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
85
85
  # return if any branch is empty. An empty branch can be an `if`
86
86
  # without an `else` or a branch that contains only comments.
87
87
  return if branches.any?(&:nil?)
@@ -41,11 +41,8 @@ module RuboCop
41
41
  MSG_USE_NORMAL =
42
42
  'Modifier form of `%<keyword>s` makes the line too long.'
43
43
 
44
- ASSIGNMENT_TYPES = %i[lvasgn casgn cvasgn
45
- gvasgn ivasgn masgn].freeze
46
-
47
44
  def on_if(node)
48
- msg = if eligible_node?(node)
45
+ msg = if single_line_as_modifier?(node)
49
46
  MSG_USE_MODIFIER unless named_capture_in_condition?(node)
50
47
  elsif too_long_due_to_modifier?(node)
51
48
  MSG_USE_NORMAL
@@ -125,13 +122,15 @@ module RuboCop
125
122
  node.condition.match_with_lvasgn_type?
126
123
  end
127
124
 
128
- def eligible_node?(node)
129
- !non_eligible_if?(node) && !node.chained? &&
130
- !node.nested_conditional? && single_line_as_modifier?(node)
125
+ def non_eligible_node?(node)
126
+ non_simple_if_unless?(node) ||
127
+ node.chained? ||
128
+ node.nested_conditional? ||
129
+ super
131
130
  end
132
131
 
133
- def non_eligible_if?(node)
134
- node.ternary? || node.modifier_form? || node.elsif? || node.else?
132
+ def non_simple_if_unless?(node)
133
+ node.ternary? || node.elsif? || node.else?
135
134
  end
136
135
 
137
136
  def another_statement_on_same_line?(node)
@@ -149,25 +148,6 @@ module RuboCop
149
148
  sibling.source_range.first_line == line_no
150
149
  end
151
150
 
152
- def parenthesize?(node)
153
- # Parenthesize corrected expression if changing to modifier-if form
154
- # would change the meaning of the parent expression
155
- # (due to the low operator precedence of modifier-if)
156
- return false if node.parent.nil?
157
- return true if ASSIGNMENT_TYPES.include?(node.parent.type)
158
-
159
- node.parent.send_type? && !node.parent.parenthesized?
160
- end
161
-
162
- def to_modifier_form(node)
163
- expression = [node.body.source,
164
- node.keyword,
165
- node.condition.source,
166
- first_line_comment(node)].compact.join(' ')
167
-
168
- parenthesize?(node) ? "(#{expression})" : expression
169
- end
170
-
171
151
  def to_normal_form(node)
172
152
  indentation = ' ' * node.source_range.column
173
153
  <<~RUBY.chomp
@@ -33,6 +33,18 @@ module RuboCop
33
33
  add_offense(node, location: :keyword,
34
34
  message: format(MSG, keyword: node.keyword))
35
35
  end
36
+
37
+ def autocorrect(node)
38
+ lambda do |corrector|
39
+ keyword = node.if? ? 'if' : 'unless'
40
+
41
+ corrector.replace(node, <<~RUBY.chop)
42
+ #{keyword} #{node.condition.source}
43
+ #{node.if_branch.source}
44
+ end
45
+ RUBY
46
+ end
47
+ end
36
48
  end
37
49
  end
38
50
  end
@@ -99,7 +99,7 @@ module RuboCop
99
99
  def modifier_replacement(node)
100
100
  body = node.body
101
101
  if node.single_line?
102
- 'loop { ' + body.source + ' }'
102
+ "loop { #{body.source} }"
103
103
  else
104
104
  indentation = body.source_range.source_line[LEADING_SPACE]
105
105
 
@@ -64,12 +64,11 @@ module RuboCop
64
64
  PATTERN
65
65
 
66
66
  def on_send(node)
67
- return if part_of_ignored_node?(node)
68
-
69
67
  inverse_candidate?(node) do |_method_call, lhs, method, rhs|
70
68
  return unless inverse_methods.key?(method)
71
- return if possible_class_hierarchy_check?(lhs, rhs, method)
72
69
  return if negated?(node)
70
+ return if part_of_ignored_node?(node)
71
+ return if possible_class_hierarchy_check?(lhs, rhs, method)
73
72
 
74
73
  add_offense(node,
75
74
  message: format(MSG, method: method,
@@ -178,7 +177,7 @@ module RuboCop
178
177
  end
179
178
 
180
179
  def camel_case_constant?(node)
181
- node.const_type? && node.source =~ CAMEL_CASE
180
+ node.const_type? && CAMEL_CASE.match?(node.source)
182
181
  end
183
182
 
184
183
  def dot_range(loc)
@@ -34,7 +34,7 @@ module RuboCop
34
34
  # shortcut out if the string does not look like an IP address
35
35
  return false unless could_be_ip?(contents)
36
36
 
37
- contents =~ ::Resolv::IPv4::Regex || contents =~ ::Resolv::IPv6::Regex
37
+ ::Resolv::IPv4::Regex.match?(contents) || ::Resolv::IPv6::Regex.match?(contents)
38
38
  end
39
39
 
40
40
  # Dummy implementation of method in ConfigurableEnforcedStyle that is
@@ -60,6 +60,7 @@ module RuboCop
60
60
  call_with_ambiguous_arguments?(node) ||
61
61
  call_in_logical_operators?(node) ||
62
62
  call_in_optional_arguments?(node) ||
63
+ call_in_single_line_inheritance?(node) ||
63
64
  allowed_multiline_call_with_parentheses?(node) ||
64
65
  allowed_chained_call_with_parentheses?(node)
65
66
  end
@@ -86,6 +87,10 @@ module RuboCop
86
87
  (node.parent.optarg_type? || node.parent.kwoptarg_type?)
87
88
  end
88
89
 
90
+ def call_in_single_line_inheritance?(node)
91
+ node.parent&.class_type? && node.parent&.single_line?
92
+ end
93
+
89
94
  def call_with_ambiguous_arguments?(node)
90
95
  call_with_braced_block?(node) ||
91
96
  call_as_argument_or_chain?(node) ||
@@ -18,8 +18,8 @@ module RuboCop
18
18
  'no arguments.'
19
19
 
20
20
  def on_send(node)
21
- return if ineligible_node?(node)
22
21
  return unless !node.arguments? && node.parenthesized?
22
+ return if ineligible_node?(node)
23
23
  return if ignored_method?(node.method_name)
24
24
  return if same_name_assignment?(node)
25
25
 
@@ -119,17 +119,7 @@ module RuboCop
119
119
  private
120
120
 
121
121
  def check(node)
122
- return if node.else?
123
-
124
- if empty_else_cop_enabled?
125
- if empty_else_style == :empty
126
- add_offense(node)
127
- elsif empty_else_style == :nil
128
- add_offense(node)
129
- end
130
- end
131
-
132
- add_offense(node)
122
+ add_offense(node) unless node.else?
133
123
  end
134
124
 
135
125
  def message(node)
@@ -36,9 +36,16 @@ module RuboCop
36
36
  private
37
37
 
38
38
  def implements_respond_to_missing?(node)
39
- node.parent.each_child_node(node.type).any? do |sibling|
40
- sibling.method?(:respond_to_missing?)
39
+ return false unless (grand_parent = node.parent.parent)
40
+
41
+ grand_parent.each_descendant(node.type) do |descendant|
42
+ return true if descendant.method?(:respond_to_missing?)
43
+
44
+ child = descendant.children.first
45
+ return true if child.respond_to?(:method?) && child.method?(:respond_to_missing?)
41
46
  end
47
+
48
+ false
42
49
  end
43
50
  end
44
51
  end
@@ -8,11 +8,20 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  #
11
- # Thread.list.find_all do |t|
11
+ # # bad
12
+ # Thread.list.select do |t|
12
13
  # t.alive?
13
14
  # end.map do |t|
14
15
  # t.object_id
15
16
  # end
17
+ #
18
+ # # good
19
+ # alive_threads = Thread.list.select do |t|
20
+ # t.alive?
21
+ # end
22
+ # alive_threads.map do |t|
23
+ # t.object_id
24
+ # end
16
25
  class MultilineBlockChain < Cop
17
26
  include RangeHelp
18
27
 
@@ -42,7 +42,7 @@ module RuboCop
42
42
  private
43
43
 
44
44
  def non_modifier_then?(node)
45
- node.loc.begin && node.loc.begin.source_line =~ NON_MODIFIER_THEN
45
+ NON_MODIFIER_THEN.match?(node.loc.begin&.source_line)
46
46
  end
47
47
  end
48
48
  end
@@ -77,13 +77,13 @@ module RuboCop
77
77
  if node_buf.source[node.loc.begin.end_pos] == "\n"
78
78
  'begin'
79
79
  else
80
- "begin\n" + (' ' * (node.loc.column + indent))
80
+ "begin\n#{' ' * (node.loc.column + indent)}"
81
81
  end
82
82
  end
83
83
 
84
84
  def keyword_end_str(node, node_buf)
85
85
  if /[^\s)]/.match?(node_buf.source_line(node.loc.end.line))
86
- "\n" + (' ' * node.loc.column) + 'end'
86
+ "\n#{' ' * node.loc.column}end"
87
87
  else
88
88
  'end'
89
89
  end