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
@@ -15,7 +15,7 @@ module RuboCop
15
15
  # valid_attributes: %i[name content],
16
16
  # nested_attributes: %i[name content %i[incorrectly nested]]
17
17
  # }
18
- class NestedPercentLiteral < Cop
18
+ class NestedPercentLiteral < Base
19
19
  include PercentLiteral
20
20
 
21
21
  MSG = 'Within percent literals, nested percent literals do not ' \
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # next acc if i.odd?
23
23
  # acc + i
24
24
  # end
25
- class NextWithoutAccumulator < Cop
25
+ class NextWithoutAccumulator < Base
26
26
  MSG = 'Use `next` with an accumulator argument in a `reduce`.'
27
27
 
28
28
  def_node_matcher :on_body_of_reduce, <<~PATTERN
@@ -35,7 +35,25 @@ module RuboCop
35
35
  # require file
36
36
  # end
37
37
  #
38
- class NonDeterministicRequireOrder < Cop
38
+ # @example
39
+ #
40
+ # # bad
41
+ # Dir['./lib/**/*.rb'].each(&method(:require))
42
+ #
43
+ # # good
44
+ # Dir['./lib/**/*.rb'].sort.each(&method(:require))
45
+ #
46
+ # @example
47
+ #
48
+ # # bad
49
+ # Dir.glob(Rails.root.join('test', '*.rb'), &method(:require))
50
+ #
51
+ # # good
52
+ # Dir.glob(Rails.root.join('test', '*.rb')).sort.each(&method(:require))
53
+ #
54
+ class NonDeterministicRequireOrder < Base
55
+ extend AutoCorrector
56
+
39
57
  MSG = 'Sort files before requiring them.'
40
58
 
41
59
  def on_block(node)
@@ -45,35 +63,88 @@ module RuboCop
45
63
  loop_variable(node.arguments) do |var_name|
46
64
  return unless var_is_required?(node.body, var_name)
47
65
 
48
- add_offense(node.send_node)
66
+ add_offense(node.send_node) do |corrector|
67
+ correct_block(corrector, node.send_node)
68
+ end
49
69
  end
50
70
  end
51
71
 
52
- def autocorrect(node)
53
- if unsorted_dir_block?(node)
54
- lambda do |corrector|
55
- corrector.replace(node, "#{node.source}.sort.each")
56
- end
57
- else
58
- lambda do |corrector|
59
- source = node.receiver.source
60
- corrector.replace(node, "#{source}.sort.each")
72
+ def on_block_pass(node)
73
+ return unless method_require?(node)
74
+ return unless unsorted_dir_pass?(node.parent)
75
+
76
+ parent_node = node.parent
77
+
78
+ add_offense(parent_node) do |corrector|
79
+ if parent_node.arguments.last&.block_pass_type?
80
+ correct_block_pass(corrector, parent_node)
81
+ else
82
+ correct_block(corrector, parent_node)
61
83
  end
62
84
  end
63
85
  end
64
86
 
65
87
  private
66
88
 
89
+ def correct_block(corrector, node)
90
+ if unsorted_dir_block?(node)
91
+ corrector.replace(node, "#{node.source}.sort.each")
92
+ else
93
+ source = node.receiver.source
94
+
95
+ corrector.replace(node, "#{source}.sort.each")
96
+ end
97
+ end
98
+
99
+ def correct_block_pass(corrector, node)
100
+ if unsorted_dir_glob_pass?(node)
101
+ block_arg = node.arguments.last
102
+
103
+ corrector.remove(last_arg_range(node))
104
+ corrector.insert_after(node, ".sort.each(#{block_arg.source})")
105
+ else
106
+ corrector.replace(node.loc.selector, 'sort.each')
107
+ end
108
+ end
109
+
110
+ # Returns range of last argument including comma and whitespace.
111
+ #
112
+ # @return [Parser::Source::Range]
113
+ #
114
+ def last_arg_range(node)
115
+ node.arguments.last.source_range.with(
116
+ begin_pos: node.arguments[-2].source_range.end_pos
117
+ )
118
+ end
119
+
67
120
  def unsorted_dir_loop?(node)
68
121
  unsorted_dir_block?(node) || unsorted_dir_each?(node)
69
122
  end
70
123
 
124
+ def unsorted_dir_pass?(node)
125
+ unsorted_dir_glob_pass?(node) || unsorted_dir_each_pass?(node)
126
+ end
127
+
71
128
  def_node_matcher :unsorted_dir_block?, <<~PATTERN
72
- (send (const nil? :Dir) :glob ...)
129
+ (send (const {nil? cbase} :Dir) :glob ...)
73
130
  PATTERN
74
131
 
75
132
  def_node_matcher :unsorted_dir_each?, <<~PATTERN
76
- (send (send (const nil? :Dir) {:[] :glob} ...) :each)
133
+ (send (send (const {nil? cbase} :Dir) {:[] :glob} ...) :each)
134
+ PATTERN
135
+
136
+ def_node_matcher :method_require?, <<~PATTERN
137
+ (block-pass (send nil? :method (sym :require)))
138
+ PATTERN
139
+
140
+ def_node_matcher :unsorted_dir_glob_pass?, <<~PATTERN
141
+ (send (const {nil? cbase} :Dir) :glob ...
142
+ (block-pass (send nil? :method (sym :require))))
143
+ PATTERN
144
+
145
+ def_node_matcher :unsorted_dir_each_pass?, <<~PATTERN
146
+ (send (send (const {nil? cbase} :Dir) {:[] :glob} ...) :each
147
+ (block-pass (send nil? :method (sym :require))))
77
148
  PATTERN
78
149
 
79
150
  def_node_matcher :loop_variable, <<~PATTERN
@@ -38,7 +38,7 @@ module RuboCop
38
38
  # end
39
39
  # end
40
40
  #
41
- class NonLocalExitFromIterator < Cop
41
+ class NonLocalExitFromIterator < Base
42
42
  MSG = 'Non-local exit from iterator, without return value. ' \
43
43
  '`next`, `break`, `Array#find`, `Array#any?`, etc. ' \
44
44
  'is preferred.'
@@ -57,7 +57,7 @@ module RuboCop
57
57
  next unless node.arguments?
58
58
 
59
59
  if chained_send?(node.send_node)
60
- add_offense(return_node, location: :keyword)
60
+ add_offense(return_node.loc.keyword)
61
61
  break
62
62
  end
63
63
  end
@@ -20,7 +20,9 @@ module RuboCop
20
20
  # Integer('10', 10)
21
21
  # Float('10.2')
22
22
  # Complex('10')
23
- class NumberConversion < Cop
23
+ class NumberConversion < Base
24
+ extend AutoCorrector
25
+
24
26
  CONVERSION_METHOD_CLASS_MAPPING = {
25
27
  to_i: "#{Integer.name}(%<number_object>s, 10)",
26
28
  to_f: "#{Float.name}(%<number_object>s)",
@@ -49,14 +51,9 @@ module RuboCop
49
51
  to_method: to_method,
50
52
  corrected_method: correct_method(node, receiver)
51
53
  )
52
- add_offense(node, message: message)
53
- end
54
- end
55
-
56
- def autocorrect(node)
57
- lambda do |corrector|
58
- corrector.replace(node,
59
- correct_method(node, node.receiver))
54
+ add_offense(node, message: message) do |corrector|
55
+ corrector.replace(node, correct_method(node, node.receiver))
56
+ end
60
57
  end
61
58
  end
62
59
 
@@ -27,13 +27,14 @@ module RuboCop
27
27
  # # frozen_string_literal: true
28
28
  # p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
29
29
  #
30
- class OrderedMagicComments < Cop
30
+ class OrderedMagicComments < Base
31
31
  include FrozenStringLiteral
32
+ extend AutoCorrector
32
33
 
33
34
  MSG = 'The encoding magic comment should precede all other ' \
34
35
  'magic comments.'
35
36
 
36
- def investigate(processed_source)
37
+ def on_new_investigation
37
38
  return if processed_source.buffer.source.empty?
38
39
 
39
40
  encoding_line, frozen_string_literal_line = magic_comment_lines
@@ -43,24 +44,21 @@ module RuboCop
43
44
 
44
45
  range = processed_source.buffer.line_range(encoding_line + 1)
45
46
 
46
- add_offense(range, location: range)
47
+ add_offense(range) do |corrector|
48
+ autocorrect(corrector, encoding_line, frozen_string_literal_line)
49
+ end
47
50
  end
48
51
 
49
- def autocorrect(_node)
50
- encoding_line, frozen_string_literal_line = magic_comment_lines
52
+ private
51
53
 
54
+ def autocorrect(corrector, encoding_line, frozen_string_literal_line)
52
55
  range1 = processed_source.buffer.line_range(encoding_line + 1)
53
- range2 =
54
- processed_source.buffer.line_range(frozen_string_literal_line + 1)
56
+ range2 = processed_source.buffer.line_range(frozen_string_literal_line + 1)
55
57
 
56
- lambda do |corrector|
57
- corrector.replace(range1, range2.source)
58
- corrector.replace(range2, range1.source)
59
- end
58
+ corrector.replace(range1, range2.source)
59
+ corrector.replace(range2, range1.source)
60
60
  end
61
61
 
62
- private
63
-
64
62
  def magic_comment_lines
65
63
  lines = [nil, nil]
66
64
 
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cops looks for references of Regexp captures that are out of range
7
+ # and thus always returns nil.
8
+ #
9
+ # @example
10
+ #
11
+ # /(foo)bar/ =~ 'foobar'
12
+ #
13
+ # # bad - always returns nil
14
+ #
15
+ # puts $2 # => nil
16
+ #
17
+ # # good
18
+ #
19
+ # puts $1 # => foo
20
+ #
21
+ class OutOfRangeRegexpRef < Base
22
+ MSG = 'Do not use out of range reference for the Regexp.'
23
+
24
+ def on_new_investigation
25
+ @valid_ref = 0
26
+ end
27
+
28
+ def on_regexp(node)
29
+ @valid_ref = nil
30
+ return if contain_non_literal?(node)
31
+
32
+ tree = Regexp::Parser.parse(node.content)
33
+ @valid_ref = regexp_captures(tree)
34
+ end
35
+
36
+ def on_nth_ref(node)
37
+ backref, = *node
38
+ return if @valid_ref.nil?
39
+
40
+ add_offense(node) if backref > @valid_ref
41
+ end
42
+
43
+ private
44
+
45
+ def contain_non_literal?(node)
46
+ node.children.size != 2 || !node.children.first.str_type?
47
+ end
48
+
49
+ def regexp_captures(tree)
50
+ named_capture = numbered_capture = 0
51
+ tree.each_expression do |e|
52
+ if e.type?(:group)
53
+ e.respond_to?(:name) ? named_capture += 1 : numbered_capture += 1
54
+ end
55
+ end
56
+ named_capture.positive? ? named_capture : numbered_capture
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -15,8 +15,9 @@ module RuboCop
15
15
  # do_something(foo)
16
16
  # do_something (2 + 3) * 4
17
17
  # do_something (foo * bar).baz
18
- class ParenthesesAsGroupedExpression < Cop
18
+ class ParenthesesAsGroupedExpression < Base
19
19
  include RangeHelp
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = '`(...)` interpreted as grouped expression.'
22
23
 
@@ -28,18 +29,11 @@ module RuboCop
28
29
 
29
30
  range = space_range(node.first_argument.source_range, space_length)
30
31
 
31
- add_offense(node, location: range)
32
- end
33
- alias on_csend on_send
34
-
35
- def autocorrect(node)
36
- space_length = spaces_before_left_parenthesis(node)
37
- range = space_range(node.first_argument.source_range, space_length)
38
-
39
- lambda do |corrector|
32
+ add_offense(range) do |corrector|
40
33
  corrector.remove(range)
41
34
  end
42
35
  end
36
+ alias on_csend on_send
43
37
 
44
38
  private
45
39
 
@@ -48,17 +42,22 @@ module RuboCop
48
42
  return true
49
43
  end
50
44
 
51
- node.operator_method? || node.setter_method? || grouped_parentheses?(node)
45
+ node.operator_method? || node.setter_method? || chained_calls?(node) ||
46
+ operator_keyword?(node)
52
47
  end
53
48
 
54
49
  def first_argument_starts_with_left_parenthesis?(node)
55
50
  node.first_argument.source.start_with?('(')
56
51
  end
57
52
 
58
- def grouped_parentheses?(node)
53
+ def chained_calls?(node)
59
54
  first_argument = node.first_argument
55
+ first_argument.send_type? && (node.children.last&.children&.count || 0) > 1
56
+ end
60
57
 
61
- first_argument.send_type? && first_argument.receiver&.begin_type?
58
+ def operator_keyword?(node)
59
+ first_argument = node.first_argument
60
+ first_argument.operator_keyword?
62
61
  end
63
62
 
64
63
  def spaces_before_left_parenthesis(node)
@@ -20,8 +20,9 @@ module RuboCop
20
20
  # # good
21
21
  #
22
22
  # %w(foo bar)
23
- class PercentStringArray < Cop
23
+ class PercentStringArray < Base
24
24
  include PercentLiteral
25
+ extend AutoCorrector
25
26
 
26
27
  QUOTES_AND_COMMAS = [/,$/, /^'.*'$/, /^".*"$/].freeze
27
28
  LEADING_QUOTE = /^['"]/.freeze
@@ -37,24 +38,24 @@ module RuboCop
37
38
  def on_percent_literal(node)
38
39
  return unless contains_quotes_or_commas?(node)
39
40
 
40
- add_offense(node)
41
+ add_offense(node) do |corrector|
42
+ autocorrect(corrector, node)
43
+ end
41
44
  end
42
45
 
43
- def autocorrect(node)
44
- lambda do |corrector|
45
- node.each_value do |value|
46
- range = value.loc.expression
46
+ private
47
+
48
+ def autocorrect(corrector, node)
49
+ node.each_value do |value|
50
+ range = value.loc.expression
47
51
 
48
- match = range.source.match(TRAILING_QUOTE)
49
- corrector.remove_trailing(range, match[0].length) if match
52
+ match = range.source.match(TRAILING_QUOTE)
53
+ corrector.remove_trailing(range, match[0].length) if match
50
54
 
51
- corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
52
- end
55
+ corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
53
56
  end
54
57
  end
55
58
 
56
- private
57
-
58
59
  def contains_quotes_or_commas?(node)
59
60
  node.values.any? do |value|
60
61
  literal = value.children.first.to_s.scrub
@@ -62,7 +63,7 @@ module RuboCop
62
63
  # To avoid likely false positives (e.g. a single ' or ")
63
64
  next if literal.gsub(/[^[[:alnum:]]]/, '').empty?
64
65
 
65
- QUOTES_AND_COMMAS.any? { |pat| literal =~ pat }
66
+ QUOTES_AND_COMMAS.any? { |pat| literal.match?(pat) }
66
67
  end
67
68
  end
68
69
  end
@@ -20,8 +20,9 @@ module RuboCop
20
20
  # # good
21
21
  #
22
22
  # %i(foo bar)
23
- class PercentSymbolArray < Cop
23
+ class PercentSymbolArray < Base
24
24
  include PercentLiteral
25
+ extend AutoCorrector
25
26
 
26
27
  MSG = "Within `%i`/`%I`, ':' and ',' are unnecessary and may be " \
27
28
  'unwanted in the resulting symbols.'
@@ -33,23 +34,23 @@ module RuboCop
33
34
  def on_percent_literal(node)
34
35
  return unless contains_colons_or_commas?(node)
35
36
 
36
- add_offense(node)
37
+ add_offense(node) do |corrector|
38
+ autocorrect(corrector, node)
39
+ end
37
40
  end
38
41
 
39
- def autocorrect(node)
40
- lambda do |corrector|
41
- node.children.each do |child|
42
- range = child.loc.expression
42
+ private
43
+
44
+ def autocorrect(corrector, node)
45
+ node.children.each do |child|
46
+ range = child.loc.expression
43
47
 
44
- corrector.remove_trailing(range, 1) if range.source.end_with?(',')
45
- corrector.remove_leading(range, 1) if
46
- range.source.start_with?(':')
47
- end
48
+ corrector.remove_trailing(range, 1) if range.source.end_with?(',')
49
+ corrector.remove_leading(range, 1) if
50
+ range.source.start_with?(':')
48
51
  end
49
52
  end
50
53
 
51
- private
52
-
53
54
  def contains_colons_or_commas?(node)
54
55
  node.children.any? do |child|
55
56
  literal = child.children.first.to_s
@@ -61,7 +62,7 @@ module RuboCop
61
62
  end
62
63
 
63
64
  def non_alphanumeric_literal?(literal)
64
- literal !~ /[[:alnum:]]/
65
+ !/[[:alnum:]]/.match?(literal)
65
66
  end
66
67
  end
67
68
  end