rubocop 0.87.1 → 0.89.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +153 -22
  5. data/lib/rubocop.rb +22 -4
  6. data/lib/rubocop/cli.rb +2 -2
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +3 -3
  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/show_cops.rb +2 -2
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +20 -3
  14. data/lib/rubocop/config_loader.rb +22 -9
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -1
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +14 -6
  22. data/lib/rubocop/cop/commissioner.rb +0 -1
  23. data/lib/rubocop/cop/cop.rb +1 -1
  24. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  25. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  26. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  27. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  28. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  29. data/lib/rubocop/cop/force.rb +1 -0
  30. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  31. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  32. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  33. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  35. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  36. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  37. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  38. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  39. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  40. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  41. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  42. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  43. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  44. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  45. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  46. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  47. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  48. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  49. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -5
  50. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  51. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  52. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  53. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  54. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  55. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  56. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  57. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  58. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  59. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  60. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  61. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  62. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  63. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  64. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  65. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  66. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  67. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  68. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  69. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  70. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  71. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  72. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  73. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  74. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  75. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  76. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  77. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  78. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  79. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  80. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  82. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  83. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  84. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  85. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  86. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  87. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  88. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  89. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  90. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  91. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  92. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  93. data/lib/rubocop/cop/lint/loop.rb +23 -2
  94. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  95. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  96. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  97. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  98. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  99. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  100. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  101. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  102. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  103. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  104. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  105. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  106. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  107. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  108. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  109. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  110. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  111. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  112. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  113. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  114. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  115. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  116. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  117. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  118. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  119. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  120. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  121. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  122. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  123. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  124. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  125. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  126. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  127. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  128. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  129. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  130. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  131. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  132. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  133. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  134. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  135. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  136. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  137. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  138. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  139. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  140. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  141. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  142. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  143. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  144. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  145. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  146. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  147. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  148. data/lib/rubocop/cop/lint/void.rb +3 -7
  149. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  150. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  151. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  152. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  153. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  154. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  155. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  156. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  157. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  158. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  159. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  160. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  161. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  162. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  163. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  164. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  165. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  166. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  167. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  168. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  169. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  170. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  171. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  172. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  173. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  174. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  175. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  176. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  177. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  178. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  179. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  180. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  181. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  182. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  183. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  184. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  185. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  186. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  187. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  188. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  189. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  190. data/lib/rubocop/cop/registry.rb +3 -3
  191. data/lib/rubocop/cop/security/eval.rb +2 -2
  192. data/lib/rubocop/cop/security/json_load.rb +6 -8
  193. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  194. data/lib/rubocop/cop/security/open.rb +2 -2
  195. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  196. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  197. data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
  198. data/lib/rubocop/cop/style/alias.rb +41 -36
  199. data/lib/rubocop/cop/style/and_or.rb +9 -11
  200. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  201. data/lib/rubocop/cop/style/array_join.rb +6 -8
  202. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  203. data/lib/rubocop/cop/style/attr.rb +11 -9
  204. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  205. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  206. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  207. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
  208. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  209. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  210. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  211. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  212. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  213. data/lib/rubocop/cop/style/class_check.rb +7 -9
  214. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  215. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  216. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  217. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  218. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  219. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  220. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  221. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  222. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  223. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  224. data/lib/rubocop/cop/style/copyright.rb +12 -12
  225. data/lib/rubocop/cop/style/date_time.rb +1 -1
  226. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  227. data/lib/rubocop/cop/style/dir.rb +7 -10
  228. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  229. data/lib/rubocop/cop/style/documentation.rb +6 -8
  230. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  231. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  232. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  233. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  234. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  235. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  236. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  237. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  238. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  239. data/lib/rubocop/cop/style/encoding.rb +5 -9
  240. data/lib/rubocop/cop/style/end_block.rb +4 -6
  241. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  242. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  243. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  244. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  245. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  246. data/lib/rubocop/cop/style/float_division.rb +8 -11
  247. data/lib/rubocop/cop/style/for.rb +11 -15
  248. data/lib/rubocop/cop/style/format_string.rb +21 -19
  249. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  250. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  251. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  252. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  253. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  254. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  255. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  256. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  257. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  258. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  259. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  260. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  261. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  262. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  263. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  264. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  265. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  266. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  267. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  268. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  269. data/lib/rubocop/cop/style/lambda.rb +7 -12
  270. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  271. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  272. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  273. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  274. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  275. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  276. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  277. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  278. data/lib/rubocop/cop/style/min_max.rb +8 -12
  279. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  280. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  281. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  282. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  283. data/lib/rubocop/cop/style/module_function.rb +10 -13
  284. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  285. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  286. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  287. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  288. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  289. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  290. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  291. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  292. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  293. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  294. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  295. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  296. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  297. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  298. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  299. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  300. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  301. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  302. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  303. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  304. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  305. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  306. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  307. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  308. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  309. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  310. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  311. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  312. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  313. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  314. data/lib/rubocop/cop/team.rb +1 -1
  315. data/lib/rubocop/cop/tokens_util.rb +84 -0
  316. data/lib/rubocop/cop/util.rb +3 -13
  317. data/lib/rubocop/cop/variable_force.rb +0 -2
  318. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  319. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  320. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  321. data/lib/rubocop/error.rb +1 -0
  322. data/lib/rubocop/file_finder.rb +12 -12
  323. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  324. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  325. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  326. data/lib/rubocop/options.rb +3 -3
  327. data/lib/rubocop/path_util.rb +17 -17
  328. data/lib/rubocop/rake_task.rb +1 -0
  329. data/lib/rubocop/result_cache.rb +12 -8
  330. data/lib/rubocop/rspec/expect_offense.rb +31 -5
  331. data/lib/rubocop/rspec/shared_contexts.rb +13 -14
  332. data/lib/rubocop/runner.rb +6 -7
  333. data/lib/rubocop/target_finder.rb +13 -10
  334. data/lib/rubocop/version.rb +2 -2
  335. metadata +28 -8
  336. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  337. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  338. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  339. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -42,8 +42,34 @@ module RuboCop
42
42
 
43
43
  corrector.insert_before(
44
44
  last_element_range_with_trailing_comma(node).end,
45
+ content_if_comment_present(corrector, node)
46
+ )
47
+ end
48
+
49
+ def content_if_comment_present(corrector, node)
50
+ range = range_with_surrounding_space(
51
+ range: children(node).last.source_range,
52
+ side: :right
53
+ ).end.resize(1)
54
+ if range.source == '#'
55
+ select_content_to_be_inserted_after_last_element(corrector, node)
56
+ else
45
57
  node.loc.end.source
58
+ end
59
+ end
60
+
61
+ def select_content_to_be_inserted_after_last_element(corrector, node)
62
+ range = range_between(
63
+ node.loc.end.begin_pos,
64
+ range_by_whole_lines(node.loc.expression).end.end_pos
46
65
  )
66
+
67
+ remove_trailing_content_of_comment(corrector, range)
68
+ range.source
69
+ end
70
+
71
+ def remove_trailing_content_of_comment(corrector, range)
72
+ corrector.remove(range)
47
73
  end
48
74
 
49
75
  def last_element_range_with_trailing_comma(node)
@@ -71,7 +71,7 @@ module RuboCop
71
71
  prev_line_num,
72
72
  base_line_num,
73
73
  index)
74
- prev_line_num = word_node.first_line
74
+ prev_line_num = word_node.last_line
75
75
  content = fix_escaped_content(word_node, escape, delimiters)
76
76
  line_breaks + content
77
77
  end
@@ -110,7 +110,7 @@ module RuboCop
110
110
 
111
111
  def end_content(source)
112
112
  result = /\A(\s*)\]/.match(source.split("\n").last)
113
- ("\n" + result[1]) if result
113
+ "\n#{result[1]}" if result
114
114
  end
115
115
  end
116
116
  end
@@ -10,7 +10,7 @@ module RuboCop
10
10
  end
11
11
 
12
12
  def add_space(token)
13
- ->(corrector) { corrector.replace(token.pos, token.pos.source + ' ') }
13
+ ->(corrector) { corrector.replace(token.pos, "#{token.pos.source} ") }
14
14
  end
15
15
 
16
16
  def swap_comma(range)
@@ -9,33 +9,30 @@ module RuboCop
9
9
  class << self
10
10
  attr_reader :processed_source
11
11
 
12
- def correct(processed_source, node)
12
+ def correct(corrector, processed_source, node)
13
13
  return if %i[kwarg kwoptarg].include?(node.type)
14
14
 
15
15
  @processed_source = processed_source
16
16
 
17
17
  if node.blockarg_type?
18
- correct_for_blockarg_type(node)
18
+ correct_for_blockarg_type(corrector, node)
19
19
  else
20
- lambda do |corrector|
21
- variable_name = if node.optarg_type?
22
- node.node_parts[0]
23
- else
24
- # Extract only a var name without splat (`*`)
25
- node.source.gsub(/\A\*+/, '')
26
- end
27
- corrector.replace(node.loc.name, "_#{variable_name}")
28
- end
20
+ variable_name = if node.optarg_type?
21
+ node.node_parts[0]
22
+ else
23
+ # Extract only a var name without splat (`*`)
24
+ node.source.gsub(/\A\*+/, '')
25
+ end
26
+
27
+ corrector.replace(node.loc.name, "_#{variable_name}")
29
28
  end
30
29
  end
31
30
 
32
- def correct_for_blockarg_type(node)
33
- lambda do |corrector|
34
- range = range_with_surrounding_space(range: node.source_range,
35
- side: :left)
36
- range = range_with_surrounding_comma(range, :left)
37
- corrector.remove(range)
38
- end
31
+ def correct_for_blockarg_type(corrector, node)
32
+ range = range_with_surrounding_space(range: node.source_range, side: :left)
33
+ range = range_with_surrounding_comma(range, :left)
34
+
35
+ corrector.remove(range)
39
36
  end
40
37
  end
41
38
  end
@@ -11,6 +11,7 @@ module RuboCop
11
11
  end
12
12
 
13
13
  def self.inherited(subclass)
14
+ super
14
15
  all << subclass
15
16
  end
16
17
 
@@ -3,8 +3,8 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Gemspec
6
- # Checks that `required_ruby_version` of gemspec and `TargetRubyVersion`
7
- # of .rubocop.yml are equal.
6
+ # Checks that `required_ruby_version` of gemspec is specified and
7
+ # equal to `TargetRubyVersion` of .rubocop.yml.
8
8
  # Thereby, RuboCop to perform static analysis working on the version
9
9
  # required by gemspec.
10
10
  #
@@ -13,6 +13,11 @@ module RuboCop
13
13
  #
14
14
  # # bad
15
15
  # Gem::Specification.new do |spec|
16
+ # # no `required_ruby_version` specified
17
+ # end
18
+ #
19
+ # # bad
20
+ # Gem::Specification.new do |spec|
16
21
  # spec.required_ruby_version = '>= 2.4.0'
17
22
  # end
18
23
  #
@@ -35,18 +40,35 @@ module RuboCop
35
40
  # Gem::Specification.new do |spec|
36
41
  # spec.required_ruby_version = ['>= 2.5.0', '< 2.7.0']
37
42
  # end
43
+ #
44
+ # # good
45
+ # Gem::Specification.new do |spec|
46
+ # spec.required_ruby_version = '~> 2.5'
47
+ # end
38
48
  class RequiredRubyVersion < Cop
39
- MSG = '`required_ruby_version` (%<required_ruby_version>s, ' \
40
- 'declared in %<gemspec_filename>s) and `TargetRubyVersion` ' \
41
- '(%<target_ruby_version>s, which may be specified in ' \
42
- '.rubocop.yml) should be equal.'
49
+ include RangeHelp
50
+
51
+ NOT_EQUAL_MSG = '`required_ruby_version` (%<required_ruby_version>s, ' \
52
+ 'declared in %<gemspec_filename>s) and `TargetRubyVersion` ' \
53
+ '(%<target_ruby_version>s, which may be specified in ' \
54
+ '.rubocop.yml) should be equal.'
55
+ MISSING_MSG = '`required_ruby_version` should be specified.'
43
56
 
44
57
  def_node_search :required_ruby_version, <<~PATTERN
45
- (send _ :required_ruby_version= ${(str _) (array (str _))})
58
+ (send _ :required_ruby_version= $_)
59
+ PATTERN
60
+
61
+ def_node_matcher :string_version?, <<~PATTERN
62
+ {(str _) (array (str _))}
46
63
  PATTERN
47
64
 
65
+ # rubocop:disable Metrics/AbcSize
48
66
  def investigate(processed_source)
49
- required_ruby_version(processed_source.ast) do |version|
67
+ version = required_ruby_version(processed_source.ast).first
68
+
69
+ if version
70
+ return unless string_version?(version)
71
+
50
72
  ruby_version = extract_ruby_version(version)
51
73
 
52
74
  return if ruby_version == target_ruby_version.to_s
@@ -54,10 +76,14 @@ module RuboCop
54
76
  add_offense(
55
77
  processed_source.ast,
56
78
  location: version.loc.expression,
57
- message: message(ruby_version, target_ruby_version)
79
+ message: not_equal_message(ruby_version, target_ruby_version)
58
80
  )
81
+ else
82
+ range = source_range(processed_source.buffer, 1, 0)
83
+ add_offense(nil, location: range, message: MISSING_MSG)
59
84
  end
60
85
  end
86
+ # rubocop:enable Metrics/AbcSize
61
87
 
62
88
  private
63
89
 
@@ -68,12 +94,12 @@ module RuboCop
68
94
  end
69
95
  end
70
96
 
71
- required_ruby_version.str_content.match(/(\d\.\d)/)[1]
97
+ required_ruby_version.str_content.scan(/\d/).first(2).join('.')
72
98
  end
73
99
 
74
- def message(required_ruby_version, target_ruby_version)
100
+ def not_equal_message(required_ruby_version, target_ruby_version)
75
101
  format(
76
- MSG,
102
+ NOT_EQUAL_MSG,
77
103
  required_ruby_version: required_ruby_version,
78
104
  gemspec_filename: File.basename(processed_source.file_path),
79
105
  target_ruby_version: target_ruby_version
@@ -25,9 +25,9 @@ module RuboCop
25
25
  target_line = find_target_line
26
26
  if target_line
27
27
  configuration_entries.insert(target_line,
28
- new_configuration_entry + "\n")
28
+ "#{new_configuration_entry}\n")
29
29
  else
30
- configuration_entries.push("\n" + new_configuration_entry)
30
+ configuration_entries.push("\n#{new_configuration_entry}")
31
31
  end
32
32
 
33
33
  File.write(configuration_file_path, configuration_entries.join)
@@ -12,8 +12,9 @@ module RuboCop
12
12
  # # good
13
13
  # node.method?(:do_something)
14
14
  #
15
- class MethodNameEqual < Cop
15
+ class MethodNameEqual < Base
16
16
  include RangeHelp
17
+ extend AutoCorrector
17
18
 
18
19
  MSG = 'Use `method?(%<method_name>s)` instead of ' \
19
20
  '`method_name == %<method_name>s`.'
@@ -31,17 +32,8 @@ module RuboCop
31
32
 
32
33
  range = range(method_name_node, node)
33
34
 
34
- add_offense(node, location: range, message: message)
35
- end
36
- end
37
-
38
- def autocorrect(node)
39
- lambda do |corrector|
40
- method_name?(node) do |method_name_node, method_name_arg|
41
- corrector.replace(
42
- range(method_name_node, node),
43
- "method?(#{method_name_arg.first.source})"
44
- )
35
+ add_offense(range, message: message) do |corrector|
36
+ corrector.replace(range, "method?(#{method_name_arg.first.source})")
45
37
  end
46
38
  end
47
39
  end
@@ -15,7 +15,7 @@ module RuboCop
15
15
  #
16
16
  # # good
17
17
  # method_name = send_node.method_name
18
- class NodeDestructuring < Cop
18
+ class NodeDestructuring < Base
19
19
  MSG = 'Use the methods provided with the node extensions instead ' \
20
20
  'of manually destructuring nodes.'
21
21
 
@@ -13,24 +13,24 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # add_offense(node, location: :selector)
16
- class OffenseLocationKeyword < Cop
16
+ class OffenseLocationKeyword < Base
17
+ extend AutoCorrector
18
+
17
19
  MSG = 'Use `:%<keyword>s` as the location argument to ' \
18
20
  '`#add_offense`.'
19
21
 
20
22
  def on_send(node)
21
23
  node_type_check(node) do |node_arg, kwargs|
22
24
  find_offending_argument(node_arg, kwargs) do |location, keyword|
23
- add_offense(location, message: format(MSG, keyword: keyword))
25
+ add_offense(location, message: format(MSG, keyword: keyword)) do |corrector|
26
+ (*, keyword) = offending_location_argument(location.parent)
27
+
28
+ corrector.replace(location, ":#{keyword}")
29
+ end
24
30
  end
25
31
  end
26
32
  end
27
33
 
28
- def autocorrect(node)
29
- (*, keyword) = offending_location_argument(node.parent)
30
-
31
- ->(corrector) { corrector.replace(node, ":#{keyword}") }
32
- end
33
-
34
34
  private
35
35
 
36
36
  def_node_matcher :node_type_check, <<~PATTERN
@@ -16,8 +16,9 @@ module RuboCop
16
16
  # add_offense(node)
17
17
  # add_offense(node, location: :selector)
18
18
  #
19
- class RedundantLocationArgument < Cop
19
+ class RedundantLocationArgument < Base
20
20
  include RangeHelp
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Redundant location argument to `#add_offense`.'
23
24
 
@@ -28,15 +29,17 @@ module RuboCop
28
29
  PATTERN
29
30
 
30
31
  def on_send(node)
31
- redundant_location_argument(node) { |argument| add_offense(argument) }
32
- end
33
-
34
- def autocorrect(node)
35
- range = offending_range(node)
32
+ redundant_location_argument(node) do |argument|
33
+ add_offense(argument) do |corrector|
34
+ range = offending_range(argument)
36
35
 
37
- ->(corrector) { corrector.remove(range) }
36
+ corrector.remove(range)
37
+ end
38
+ end
38
39
  end
39
40
 
41
+ private
42
+
40
43
  def offending_range(node)
41
44
  with_space = range_with_surrounding_space(range: node.loc.expression)
42
45
 
@@ -19,8 +19,9 @@ module RuboCop
19
19
  # add_offense(node, message: CUSTOM_MSG)
20
20
  # add_offense(node, message: message(other_node))
21
21
  #
22
- class RedundantMessageArgument < Cop
22
+ class RedundantMessageArgument < Base
23
23
  include RangeHelp
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = 'Redundant message argument to `#add_offense`.'
26
27
 
@@ -39,17 +40,15 @@ module RuboCop
39
40
  def on_send(node)
40
41
  node_type_check(node) do |node_arg, kwargs|
41
42
  find_offending_argument(node_arg, kwargs) do |pair|
42
- add_offense(pair)
43
+ add_offense(pair) do |corrector|
44
+ range = offending_range(pair)
45
+
46
+ corrector.remove(range)
47
+ end
43
48
  end
44
49
  end
45
50
  end
46
51
 
47
- def autocorrect(node)
48
- range = offending_range(node)
49
-
50
- ->(corrector) { corrector.remove(range) }
51
- end
52
-
53
52
  private
54
53
 
55
54
  def offending_range(node)
@@ -13,7 +13,7 @@ module RuboCop
13
13
  # # good
14
14
  # expect(cop.messages).to eq(['Do not write bad code like that.'])
15
15
  #
16
- class UselessMessageAssertion < Cop
16
+ class UselessMessageAssertion < Base
17
17
  MSG = 'Do not specify cop behavior using `described_class::MSG`.'
18
18
 
19
19
  def_node_search :described_class_msg, <<~PATTERN
@@ -24,7 +24,7 @@ module RuboCop
24
24
  (send (send nil? :expect #contains_described_class_msg?) :to ...)
25
25
  PATTERN
26
26
 
27
- def investigate(_processed_source)
27
+ def on_new_investigation
28
28
  assertions_using_described_class_msg.each do |node|
29
29
  add_offense(node)
30
30
  end
@@ -213,7 +213,7 @@ module RuboCop
213
213
  start_loc.column == source_line_column[:column]
214
214
  ''
215
215
  else
216
- ' or ' + format_source_line_column(source_line_column)
216
+ " or #{format_source_line_column(source_line_column)}"
217
217
  end
218
218
  end
219
219
 
@@ -269,15 +269,11 @@ module RuboCop
269
269
  end
270
270
 
271
271
  def begin_pos_with_comment(node)
272
- annotation_line = node.first_line - 1
273
272
  first_comment = nil
273
+ (node.first_line - 1).downto(1) do |annotation_line|
274
+ break unless (comment = processed_source.comment_at_line(annotation_line))
274
275
 
275
- processed_source.comments_before_line(annotation_line)
276
- .reverse_each do |comment|
277
- if comment.location.line == annotation_line
278
- first_comment = comment
279
- annotation_line -= 1
280
- end
276
+ first_comment = comment
281
277
  end
282
278
 
283
279
  start_line_position(first_comment || node)
@@ -39,7 +39,7 @@ module RuboCop
39
39
  'instead of %<correct_comment_indentation>d).'
40
40
 
41
41
  def investigate(processed_source)
42
- processed_source.each_comment { |comment| check(comment) }
42
+ processed_source.comments.each { |comment| check(comment) }
43
43
  end
44
44
 
45
45
  def autocorrect(comment)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
-
5
3
  module RuboCop
6
4
  module Cop
7
5
  module Layout
@@ -109,6 +109,7 @@ module RuboCop
109
109
 
110
110
  def allowed_only_before_style?(node)
111
111
  if node.special_modifier?
112
+ return true if processed_source[node.last_line] == 'end'
112
113
  return false if next_line_empty?(node.last_line)
113
114
  end
114
115