rubocop 0.88.0 → 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 (320) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +1 -0
  4. data/config/default.yml +96 -16
  5. data/lib/rubocop.rb +16 -4
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
  7. data/lib/rubocop/cli/command/base.rb +1 -0
  8. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/comment_config.rb +5 -7
  12. data/lib/rubocop/config.rb +20 -3
  13. data/lib/rubocop/config_loader.rb +2 -2
  14. data/lib/rubocop/config_loader_resolver.rb +3 -3
  15. data/lib/rubocop/config_obsoletion.rb +6 -1
  16. data/lib/rubocop/config_validator.rb +2 -4
  17. data/lib/rubocop/cop/base.rb +2 -2
  18. data/lib/rubocop/cop/commissioner.rb +0 -1
  19. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  20. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  21. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  23. data/lib/rubocop/cop/force.rb +1 -0
  24. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
  25. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  26. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  27. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  28. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  29. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  30. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  31. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  32. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  33. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  34. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  35. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  36. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  37. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  38. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  39. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  40. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  41. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  42. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  43. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
  44. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  45. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  46. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  47. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  48. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  49. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  50. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  51. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  52. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  53. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  54. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  55. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  56. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  57. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  58. data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -4
  59. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  60. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  61. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  62. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  63. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  64. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  65. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  66. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  67. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  68. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  69. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  70. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  71. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  72. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  73. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  74. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
  75. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  76. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  77. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  78. data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
  79. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  80. data/lib/rubocop/cop/lint/loop.rb +23 -2
  81. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  82. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  83. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  84. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  85. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  86. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  87. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  88. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
  89. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  90. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  91. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  92. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  93. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  94. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  95. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  96. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  97. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  98. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  99. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  100. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  101. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  102. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  103. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  104. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  105. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  106. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  107. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  109. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  110. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  111. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  112. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  113. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  114. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  115. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  116. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  117. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  118. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  119. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  120. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  121. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  122. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  123. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  124. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  125. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  126. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  127. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  128. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  129. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  130. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  131. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  132. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  133. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  134. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  135. data/lib/rubocop/cop/lint/void.rb +3 -7
  136. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  137. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  138. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  139. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  140. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  141. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  142. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  143. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  144. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  145. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  146. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  147. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  148. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  149. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  150. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  151. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  152. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  153. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  154. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  155. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  156. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  157. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  158. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  159. data/lib/rubocop/cop/mixin/statement_modifier.rb +37 -8
  160. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  161. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  162. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  163. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  164. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  165. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  166. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  167. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  168. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  169. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  170. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  171. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  172. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  173. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  174. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  175. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  176. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  177. data/lib/rubocop/cop/registry.rb +3 -3
  178. data/lib/rubocop/cop/security/eval.rb +2 -2
  179. data/lib/rubocop/cop/security/json_load.rb +6 -8
  180. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  181. data/lib/rubocop/cop/security/open.rb +2 -2
  182. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  183. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  184. data/lib/rubocop/cop/style/accessor_grouping.rb +23 -21
  185. data/lib/rubocop/cop/style/alias.rb +41 -36
  186. data/lib/rubocop/cop/style/and_or.rb +9 -11
  187. data/lib/rubocop/cop/style/array_join.rb +6 -8
  188. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  189. data/lib/rubocop/cop/style/attr.rb +11 -9
  190. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  191. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  192. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  193. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -14
  194. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  195. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  196. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  197. data/lib/rubocop/cop/style/case_like_if.rb +19 -16
  198. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  199. data/lib/rubocop/cop/style/class_check.rb +7 -9
  200. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  201. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  202. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  203. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  204. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  205. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  206. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  207. data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
  208. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
  209. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  210. data/lib/rubocop/cop/style/copyright.rb +12 -12
  211. data/lib/rubocop/cop/style/date_time.rb +1 -1
  212. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  213. data/lib/rubocop/cop/style/dir.rb +7 -10
  214. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  215. data/lib/rubocop/cop/style/documentation.rb +6 -8
  216. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  217. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  218. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  219. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  220. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  221. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  222. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  223. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  224. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  225. data/lib/rubocop/cop/style/encoding.rb +5 -9
  226. data/lib/rubocop/cop/style/end_block.rb +4 -6
  227. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  228. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  229. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  230. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  231. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  232. data/lib/rubocop/cop/style/float_division.rb +1 -1
  233. data/lib/rubocop/cop/style/for.rb +11 -15
  234. data/lib/rubocop/cop/style/format_string.rb +21 -19
  235. data/lib/rubocop/cop/style/format_string_token.rb +5 -7
  236. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  237. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  238. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  239. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  240. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +8 -1
  241. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  242. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  243. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  244. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  245. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  246. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  247. data/lib/rubocop/cop/style/if_unless_modifier.rb +10 -32
  248. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  249. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  250. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  251. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  252. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  253. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  254. data/lib/rubocop/cop/style/lambda.rb +7 -12
  255. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  256. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  257. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  258. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  259. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  260. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  261. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  262. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  263. data/lib/rubocop/cop/style/min_max.rb +8 -12
  264. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  265. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  266. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  267. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  268. data/lib/rubocop/cop/style/module_function.rb +10 -13
  269. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  270. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  271. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  272. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  273. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  274. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  275. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  276. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  278. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -0
  279. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  280. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  281. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  282. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  283. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  284. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  285. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  286. data/lib/rubocop/cop/style/redundant_sort.rb +23 -10
  287. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  288. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  289. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  290. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  291. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  292. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  293. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  294. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  295. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  296. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  297. data/lib/rubocop/cop/team.rb +1 -1
  298. data/lib/rubocop/cop/tokens_util.rb +84 -0
  299. data/lib/rubocop/cop/util.rb +3 -13
  300. data/lib/rubocop/cop/variable_force.rb +0 -2
  301. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  302. data/lib/rubocop/cop/variable_force/variable.rb +2 -2
  303. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  304. data/lib/rubocop/error.rb +1 -0
  305. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  306. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  307. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  308. data/lib/rubocop/options.rb +3 -3
  309. data/lib/rubocop/path_util.rb +19 -4
  310. data/lib/rubocop/rake_task.rb +1 -0
  311. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  312. data/lib/rubocop/rspec/shared_contexts.rb +1 -5
  313. data/lib/rubocop/runner.rb +1 -1
  314. data/lib/rubocop/target_finder.rb +12 -9
  315. data/lib/rubocop/version.rb +2 -2
  316. metadata +21 -8
  317. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  318. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  319. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  320. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -30,8 +30,9 @@ module RuboCop
30
30
  # bar
31
31
  # SQL
32
32
  #
33
- class HeredocMethodCallPosition < Cop
33
+ class HeredocMethodCallPosition < Base
34
34
  include RangeHelp
35
+ extend AutoCorrector
35
36
 
36
37
  MSG = 'Put a method call with a HEREDOC receiver on the ' \
37
38
  'same line as the HEREDOC opening.'
@@ -41,25 +42,23 @@ module RuboCop
41
42
  return unless heredoc
42
43
  return if correctly_positioned?(node, heredoc)
43
44
 
44
- add_offense(node, location: call_after_heredoc_range(heredoc))
45
+ add_offense(call_after_heredoc_range(heredoc)) do |corrector|
46
+ autocorrect(corrector, node, heredoc)
47
+ end
45
48
  end
46
49
  alias on_csend on_send
47
50
 
48
- def autocorrect(node)
49
- heredoc = heredoc_node_descendent_receiver(node)
51
+ private
50
52
 
51
- lambda do |corrector|
52
- call_range = call_range_to_safely_reposition(node, heredoc)
53
- return if call_range.nil?
53
+ def autocorrect(corrector, node, heredoc)
54
+ call_range = call_range_to_safely_reposition(node, heredoc)
55
+ return if call_range.nil?
54
56
 
55
- call_source = call_range.source.strip
56
- corrector.remove(call_range)
57
- corrector.insert_after(heredoc_begin_line_range(node), call_source)
58
- end
57
+ call_source = call_range.source.strip
58
+ corrector.remove(call_range)
59
+ corrector.insert_after(heredoc_begin_line_range(node), call_source)
59
60
  end
60
61
 
61
- private
62
-
63
62
  def heredoc_node_descendent_receiver(node)
64
63
  while send_node?(node)
65
64
  return node.receiver if heredoc_node?(node.receiver)
@@ -148,7 +147,7 @@ module RuboCop
148
147
  end
149
148
 
150
149
  def trailing_comma?(call_source, call_line_source)
151
- call_source + ',' == call_line_source
150
+ "#{call_source}," == call_line_source
152
151
  end
153
152
  end
154
153
  end
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # 'Item 1' \
23
23
  # 'Item 2'
24
24
  # ]
25
- class ImplicitStringConcatenation < Cop
25
+ class ImplicitStringConcatenation < Base
26
26
  MSG = 'Combine %<string1>s and %<string2>s into a single string ' \
27
27
  'literal, rather than using implicit string concatenation.'
28
28
  FOR_ARRAY = ' Or, if they were intended to be separate array ' \
@@ -41,7 +41,7 @@ module RuboCop
41
41
  elsif node.parent&.send_type?
42
42
  message << FOR_METHOD
43
43
  end
44
- add_offense(node, location: range, message: message)
44
+ add_offense(range, message: message)
45
45
  end
46
46
  end
47
47
 
@@ -45,7 +45,7 @@ module RuboCop
45
45
  # end
46
46
  # end
47
47
  # end
48
- class IneffectiveAccessModifier < Cop
48
+ class IneffectiveAccessModifier < Base
49
49
  MSG = '`%<modifier>s` (on line %<line>d) does not make singleton ' \
50
50
  'methods %<modifier>s. Use %<alternative>s instead.'
51
51
  ALTERNATIVE_PRIVATE = '`private_class_method` or `private` inside a ' \
@@ -70,12 +70,8 @@ module RuboCop
70
70
  def check_node(node)
71
71
  return unless node&.begin_type?
72
72
 
73
- ignored_methods = private_class_method_names(node)
74
-
75
- ineffective_modifier(node, ignored_methods) do |defs_node, modifier|
76
- add_offense(defs_node,
77
- location: :keyword,
78
- message: format_message(modifier))
73
+ ineffective_modifier(node) do |defs_node, modifier|
74
+ add_offense(defs_node.loc.keyword, message: format_message(modifier))
79
75
  end
80
76
  end
81
77
 
@@ -97,20 +93,24 @@ module RuboCop
97
93
  alternative: alternative)
98
94
  end
99
95
 
100
- def ineffective_modifier(node, ignored_methods, modifier = nil, &block)
96
+ # rubocop:disable Metrics/CyclomaticComplexity
97
+ def ineffective_modifier(node, ignored_methods = nil, modifier = nil, &block)
101
98
  node.each_child_node do |child|
102
99
  case child.type
103
100
  when :send
104
101
  modifier = child if access_modifier?(child)
105
102
  when :defs
103
+ ignored_methods ||= private_class_method_names(node)
106
104
  next if correct_visibility?(child, modifier, ignored_methods)
107
105
 
108
106
  yield child, modifier
109
107
  when :kwbegin
108
+ ignored_methods ||= private_class_method_names(node)
110
109
  ineffective_modifier(child, ignored_methods, modifier, &block)
111
110
  end
112
111
  end
113
112
  end
113
+ # rubocop:enable Metrics/CyclomaticComplexity
114
114
 
115
115
  def access_modifier?(node)
116
116
  node.bare_access_modifier? && !node.method?(:module_function)
@@ -33,8 +33,9 @@ module RuboCop
33
33
  # class C < StandardError; end
34
34
  #
35
35
  # C = Class.new(StandardError)
36
- class InheritException < Cop
36
+ class InheritException < Base
37
37
  include ConfigurableEnforcedStyle
38
+ extend AutoCorrector
38
39
 
39
40
  MSG = 'Inherit from `%<prefer>s` instead of `%<current>s`.'
40
41
  PREFERRED_BASE_CLASS = {
@@ -65,19 +66,23 @@ module RuboCop
65
66
  return unless node.parent_class &&
66
67
  illegal_class_name?(node.parent_class)
67
68
 
68
- add_offense(node.parent_class)
69
+ message = message(node.parent_class)
70
+
71
+ add_offense(node.parent_class, message: message) do |corrector|
72
+ corrector.replace(node.parent_class, preferred_base_class)
73
+ end
69
74
  end
70
75
 
71
76
  def on_send(node)
77
+ return unless node.method?(:new)
78
+
72
79
  constant = class_new_call?(node)
73
80
  return unless constant && illegal_class_name?(constant)
74
81
 
75
- add_offense(constant)
76
- end
82
+ message = message(constant)
77
83
 
78
- def autocorrect(node)
79
- lambda do |corrector|
80
- corrector.replace(node, preferred_base_class)
84
+ add_offense(constant, message: message) do |corrector|
85
+ corrector.replace(constant, preferred_base_class)
81
86
  end
82
87
  end
83
88
 
@@ -16,31 +16,34 @@ module RuboCop
16
16
  # # good
17
17
  #
18
18
  # foo = "something with #{interpolation} inside"
19
- class InterpolationCheck < Cop
19
+ class InterpolationCheck < Base
20
+ extend AutoCorrector
21
+
20
22
  MSG = 'Interpolation in single quoted string detected. '\
21
23
  'Use double quoted strings if you need interpolation.'
22
24
 
23
25
  def on_str(node)
24
- return if heredoc?(node)
25
-
26
26
  parent = node.parent
27
27
  return if parent && (parent.dstr_type? || parent.regexp_type?)
28
- return unless /(?<!\\)#\{.*\}/.match?(node.source.scrub)
28
+ return unless /(?<!\\)#\{.*\}/.match?(node.source)
29
+ return if heredoc?(node)
29
30
 
30
- add_offense(node)
31
+ add_offense(node) do |corrector|
32
+ autocorrect(corrector, node)
33
+ end
31
34
  end
32
35
 
33
- def autocorrect(node)
34
- lambda do |corrector|
35
- starting_token, ending_token = if node.source.include?('"')
36
- ['%{', '}']
37
- else
38
- ['"', '"']
39
- end
36
+ private
40
37
 
41
- corrector.replace(node.loc.begin, starting_token)
42
- corrector.replace(node.loc.end, ending_token)
43
- end
38
+ def autocorrect(corrector, node)
39
+ starting_token, ending_token = if node.source.include?('"')
40
+ ['%{', '}']
41
+ else
42
+ ['"', '"']
43
+ end
44
+
45
+ corrector.replace(node.loc.begin, starting_token)
46
+ corrector.replace(node.loc.end, ending_token)
44
47
  end
45
48
 
46
49
  def heredoc?(node)
@@ -29,7 +29,7 @@ module RuboCop
29
29
  # while true
30
30
  # break if condition
31
31
  # end
32
- class LiteralAsCondition < Cop
32
+ class LiteralAsCondition < Base
33
33
  include RangeHelp
34
34
 
35
35
  MSG = 'Literal `%<literal>s` appeared as a condition.'
@@ -60,7 +60,9 @@ module RuboCop
60
60
  next unless when_node.conditions.all?(&:literal?)
61
61
 
62
62
  range = when_conditions_range(when_node)
63
- add_offense(when_node, location: range, message: message(range))
63
+ message = message(range)
64
+
65
+ add_offense(range, message: message)
64
66
  end
65
67
  end
66
68
  end
@@ -16,10 +16,11 @@ module RuboCop
16
16
  # # good
17
17
  #
18
18
  # "result is 10"
19
- class LiteralInInterpolation < Cop
19
+ class LiteralInInterpolation < Base
20
20
  include Interpolation
21
21
  include RangeHelp
22
22
  include PercentLiteral
23
+ extend AutoCorrector
23
24
 
24
25
  MSG = 'Literal interpolation detected.'
25
26
  COMPOSITE = %i[array hash pair irange erange].freeze
@@ -30,14 +31,13 @@ module RuboCop
30
31
  return if special_keyword?(final_node)
31
32
  return unless prints_as_self?(final_node)
32
33
 
33
- add_offense(final_node)
34
- end
34
+ add_offense(final_node) do |corrector|
35
+ return if final_node.dstr_type? # nested, fixed in next iteration
35
36
 
36
- def autocorrect(node)
37
- return if node.dstr_type? # nested, fixed in next iteration
37
+ value = autocorrected_value(final_node)
38
38
 
39
- value = autocorrected_value(node)
40
- ->(corrector) { corrector.replace(node.parent, value) }
39
+ corrector.replace(final_node.parent, value)
40
+ end
41
41
  end
42
42
 
43
43
  private
@@ -42,7 +42,9 @@ module RuboCop
42
42
  # do_something
43
43
  # break if some_condition
44
44
  # end
45
- class Loop < Cop
45
+ class Loop < Base
46
+ extend AutoCorrector
47
+
46
48
  MSG = 'Use `Kernel#loop` with `break` rather than ' \
47
49
  '`begin/end/until`(or `while`).'
48
50
 
@@ -57,7 +59,26 @@ module RuboCop
57
59
  private
58
60
 
59
61
  def register_offense(node)
60
- add_offense(node, location: :keyword)
62
+ body = node.body
63
+
64
+ add_offense(node.loc.keyword) do |corrector|
65
+ corrector.replace(body.loc.begin, 'loop do')
66
+ corrector.remove(keyword_and_condition_range(node))
67
+ corrector.insert_before(body.loc.end, build_break_line(node))
68
+ end
69
+ end
70
+
71
+ def keyword_and_condition_range(node)
72
+ node.body.loc.end.end.join(node.source_range.end)
73
+ end
74
+
75
+ def build_break_line(node)
76
+ conditional_keyword = node.while_post_type? ? 'unless' : 'if'
77
+ "break #{conditional_keyword} #{node.condition.source}\n#{indent(node)}"
78
+ end
79
+
80
+ def indent(node)
81
+ ' ' * node.loc.column
61
82
  end
62
83
  end
63
84
  end
@@ -42,7 +42,7 @@ module RuboCop
42
42
  # # Including this, that's 3 lines on which the cop is disabled.
43
43
  # # rubocop:enable Layout/SpaceAroundOperators
44
44
  #
45
- class MissingCopEnableDirective < Cop
45
+ class MissingCopEnableDirective < Base
46
46
  include RangeHelp
47
47
 
48
48
  MSG = 'Re-enable %<cop>s cop with `# rubocop:enable` after ' \
@@ -50,7 +50,8 @@ module RuboCop
50
50
  MSG_BOUND = 'Re-enable %<cop>s cop within %<max_range>s lines after ' \
51
51
  'disabling it.'
52
52
 
53
- def investigate(processed_source)
53
+ # rubocop:disable Metrics/AbcSize
54
+ def on_new_investigation
54
55
  max_range = cop_config['MaximumRangeSize']
55
56
  processed_source.disabled_line_ranges.each do |cop, line_ranges|
56
57
  line_ranges.each do |line_range|
@@ -61,12 +62,12 @@ module RuboCop
61
62
  range = source_range(processed_source.buffer,
62
63
  line_range.min,
63
64
  (0..0))
64
- add_offense(range,
65
- location: range,
66
- message: message(max_range: max_range, cop: cop))
65
+
66
+ add_offense(range, message: message(max_range: max_range, cop: cop))
67
67
  end
68
68
  end
69
69
  end
70
+ # rubocop:enable Metrics/AbcSize
70
71
 
71
72
  private
72
73
 
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for the presence of constructors and lifecycle callbacks
7
+ # without calls to `super`.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # class Employee < Person
12
+ # def initialize(name, salary)
13
+ # @salary = salary
14
+ # end
15
+ # end
16
+ #
17
+ # # good
18
+ # class Employee < Person
19
+ # def initialize(name, salary)
20
+ # super(name)
21
+ # @salary = salary
22
+ # end
23
+ # end
24
+ #
25
+ # # bad
26
+ # class Parent
27
+ # def self.inherited(base)
28
+ # do_something
29
+ # end
30
+ # end
31
+ #
32
+ # # good
33
+ # class Parent
34
+ # def self.inherited(base)
35
+ # super
36
+ # do_something
37
+ # end
38
+ # end
39
+ #
40
+ class MissingSuper < Base
41
+ CONSTRUCTOR_MSG = 'Call `super` to initialize state of the parent class.'
42
+ CALLBACK_MSG = 'Call `super` to invoke callback defined in the parent class.'
43
+
44
+ STATELESS_CLASSES = %w[BasicObject Object].freeze
45
+
46
+ OBJECT_LIFECYCLE_CALLBACKS = %i[method_missing respond_to_missing?].freeze
47
+ CLASS_LIFECYCLE_CALLBACKS = %i[inherited].freeze
48
+ METHOD_LIFECYCLE_CALLBACKS = %i[method_added method_removed method_undefined
49
+ singleton_method_added singleton_method_removed
50
+ singleton_method_undefined].freeze
51
+
52
+ CALLBACKS = (OBJECT_LIFECYCLE_CALLBACKS +
53
+ CLASS_LIFECYCLE_CALLBACKS +
54
+ METHOD_LIFECYCLE_CALLBACKS).to_set.freeze
55
+
56
+ def on_def(node)
57
+ return unless offender?(node)
58
+
59
+ if node.method?(:initialize)
60
+ add_offense(node, message: CONSTRUCTOR_MSG) if inside_class_with_stateful_parent?(node)
61
+ elsif callback_method_def?(node)
62
+ add_offense(node, message: CALLBACK_MSG)
63
+ end
64
+ end
65
+
66
+ def on_defs(node)
67
+ return if !callback_method_def?(node) || contains_super?(node)
68
+
69
+ add_offense(node, message: CALLBACK_MSG)
70
+ end
71
+
72
+ private
73
+
74
+ def offender?(node)
75
+ (node.method?(:initialize) || callback_method_def?(node)) && !contains_super?(node)
76
+ end
77
+
78
+ def callback_method_def?(node)
79
+ return unless CALLBACKS.include?(node.method_name)
80
+
81
+ node.each_ancestor(:class, :sclass, :module).first
82
+ end
83
+
84
+ def contains_super?(node)
85
+ node.each_descendant(:super, :zsuper).any?
86
+ end
87
+
88
+ def inside_class_with_stateful_parent?(node)
89
+ class_node = node.each_ancestor(:class).first
90
+ class_node&.parent_class && !stateless_class?(class_node.parent_class)
91
+ end
92
+
93
+ def stateless_class?(node)
94
+ STATELESS_CLASSES.include?(node.const_name)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -20,7 +20,7 @@ module RuboCop
20
20
  # # good
21
21
  # /(FOO)(BAR)/
22
22
  #
23
- class MixedRegexpCaptureTypes < Cop
23
+ class MixedRegexpCaptureTypes < Base
24
24
  MSG = 'Do not mix named captures and numbered captures ' \
25
25
  'in a Regexp literal.'
26
26