rubocop 0.89.1 → 0.93.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 (365) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +160 -14
  4. data/lib/rubocop.rb +33 -5
  5. data/lib/rubocop/cached_data.rb +3 -1
  6. data/lib/rubocop/cli/command.rb +1 -0
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +9 -0
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  11. data/lib/rubocop/cli/command/show_cops.rb +1 -0
  12. data/lib/rubocop/cli/command/version.rb +1 -0
  13. data/lib/rubocop/cli/environment.rb +1 -0
  14. data/lib/rubocop/comment_config.rb +14 -5
  15. data/lib/rubocop/config_loader.rb +20 -9
  16. data/lib/rubocop/config_loader_resolver.rb +1 -0
  17. data/lib/rubocop/config_obsoletion.rb +1 -0
  18. data/lib/rubocop/config_regeneration.rb +33 -0
  19. data/lib/rubocop/config_store.rb +3 -3
  20. data/lib/rubocop/config_validator.rb +3 -0
  21. data/lib/rubocop/cop/base.rb +23 -0
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  23. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  24. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  25. data/lib/rubocop/cop/commissioner.rb +47 -7
  26. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  28. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  29. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  30. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  31. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  32. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
  33. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  34. data/lib/rubocop/cop/documentation.rb +22 -0
  35. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +10 -10
  36. data/lib/rubocop/cop/generator.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
  42. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  43. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  44. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  45. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  46. data/lib/rubocop/cop/layout/class_structure.rb +11 -10
  47. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  48. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  49. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  50. data/lib/rubocop/cop/layout/dot_position.rb +21 -20
  51. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  52. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  53. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  54. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  55. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  56. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  57. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +17 -14
  58. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  59. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +5 -8
  60. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  61. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  62. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  63. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  64. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  65. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  67. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  68. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  69. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  70. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  71. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  72. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  73. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  74. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  75. data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
  76. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  77. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  78. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  79. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  80. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  81. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  82. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  83. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  84. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  86. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -22
  87. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  88. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  89. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  90. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  91. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  92. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +17 -21
  93. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  94. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  95. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  96. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  97. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  98. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  99. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  101. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  102. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  103. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +13 -16
  104. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  105. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  106. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  107. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  108. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  109. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  110. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  111. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  112. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -0
  113. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
  114. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +15 -1
  115. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
  116. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  117. data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
  118. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  119. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  120. data/lib/rubocop/cop/lint/debugger.rb +2 -3
  121. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
  122. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
  123. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  124. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
  125. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  126. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  127. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
  128. data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
  129. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  130. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
  131. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  132. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  133. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  134. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  135. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -35
  136. data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
  137. data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
  138. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -20
  139. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  140. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  141. data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
  142. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  143. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +22 -12
  144. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  145. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  146. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +45 -0
  147. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
  149. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  150. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  151. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  152. data/lib/rubocop/cop/lint/to_json.rb +16 -5
  153. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  154. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  155. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
  156. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
  157. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -1
  158. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  159. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  160. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  161. data/lib/rubocop/cop/metrics/block_length.rb +3 -1
  162. data/lib/rubocop/cop/metrics/class_length.rb +8 -6
  163. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
  164. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  165. data/lib/rubocop/cop/mixin/alignment.rb +3 -0
  166. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  167. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  168. data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
  169. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  170. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  171. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  172. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  173. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  174. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  175. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  176. data/lib/rubocop/cop/mixin/hash_transform_method.rb +27 -2
  177. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  178. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
  179. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  180. data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
  181. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  182. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  183. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  184. data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -3
  185. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  186. data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
  187. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  188. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  189. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  190. data/lib/rubocop/cop/offense.rb +16 -2
  191. data/lib/rubocop/cop/security/eval.rb +1 -0
  192. data/lib/rubocop/cop/security/json_load.rb +1 -0
  193. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  194. data/lib/rubocop/cop/security/open.rb +1 -0
  195. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  196. data/lib/rubocop/cop/severity.rb +0 -8
  197. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -11
  198. data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
  199. data/lib/rubocop/cop/style/alias.rb +2 -0
  200. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  201. data/lib/rubocop/cop/style/array_join.rb +1 -0
  202. data/lib/rubocop/cop/style/attr.rb +1 -0
  203. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -0
  204. data/lib/rubocop/cop/style/case_equality.rb +11 -3
  205. data/lib/rubocop/cop/style/case_like_if.rb +40 -8
  206. data/lib/rubocop/cop/style/class_and_module_children.rb +2 -0
  207. data/lib/rubocop/cop/style/class_check.rb +6 -9
  208. data/lib/rubocop/cop/style/class_equality_comparison.rb +49 -0
  209. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  210. data/lib/rubocop/cop/style/class_vars.rb +1 -2
  211. data/lib/rubocop/cop/style/combinable_loops.rb +91 -0
  212. data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
  213. data/lib/rubocop/cop/style/commented_keyword.rb +7 -8
  214. data/lib/rubocop/cop/style/conditional_assignment.rb +49 -60
  215. data/lib/rubocop/cop/style/date_time.rb +12 -1
  216. data/lib/rubocop/cop/style/dir.rb +1 -0
  217. data/lib/rubocop/cop/style/double_negation.rb +1 -0
  218. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  219. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  220. data/lib/rubocop/cop/style/empty_literal.rb +3 -1
  221. data/lib/rubocop/cop/style/eval_with_location.rb +1 -3
  222. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  223. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  224. data/lib/rubocop/cop/style/explicit_block_argument.rb +7 -3
  225. data/lib/rubocop/cop/style/float_division.rb +2 -0
  226. data/lib/rubocop/cop/style/for.rb +0 -4
  227. data/lib/rubocop/cop/style/format_string.rb +1 -4
  228. data/lib/rubocop/cop/style/format_string_token.rb +1 -1
  229. data/lib/rubocop/cop/style/guard_clause.rb +1 -0
  230. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
  231. data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
  232. data/lib/rubocop/cop/style/hash_transform_keys.rb +16 -9
  233. data/lib/rubocop/cop/style/hash_transform_values.rb +16 -9
  234. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -6
  235. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  236. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  237. data/lib/rubocop/cop/style/lambda_call.rb +3 -1
  238. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
  239. data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
  240. data/lib/rubocop/cop/style/mixin_usage.rb +8 -27
  241. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  242. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +14 -1
  243. data/lib/rubocop/cop/style/multiline_when_then.rb +3 -2
  244. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  245. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  246. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  247. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  248. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
  249. data/lib/rubocop/cop/style/nested_ternary_operator.rb +16 -16
  250. data/lib/rubocop/cop/style/next.rb +10 -14
  251. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  252. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  253. data/lib/rubocop/cop/style/not.rb +20 -26
  254. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  255. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
  256. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  257. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  258. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  259. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  260. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  261. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  262. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  263. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  264. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  265. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  266. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  267. data/lib/rubocop/cop/style/proc.rb +6 -6
  268. data/lib/rubocop/cop/style/raise_args.rb +12 -24
  269. data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
  270. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  271. data/lib/rubocop/cop/style/redundant_begin.rb +28 -12
  272. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  273. data/lib/rubocop/cop/style/redundant_condition.rb +10 -7
  274. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  275. data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
  276. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  277. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  278. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  279. data/lib/rubocop/cop/style/redundant_interpolation.rb +31 -25
  280. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  281. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  282. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +44 -36
  283. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +13 -29
  284. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  285. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  286. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  287. data/lib/rubocop/cop/style/redundant_sort.rb +12 -29
  288. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  289. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  290. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  291. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  292. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  293. data/lib/rubocop/cop/style/safe_navigation.rb +18 -12
  294. data/lib/rubocop/cop/style/sample.rb +12 -14
  295. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  296. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  297. data/lib/rubocop/cop/style/send.rb +4 -5
  298. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  299. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  300. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  301. data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
  302. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  303. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  304. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  305. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  306. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  307. data/lib/rubocop/cop/style/string_concatenation.rb +17 -3
  308. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  309. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  310. data/lib/rubocop/cop/style/strip.rb +9 -14
  311. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  312. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  313. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  314. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  315. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  316. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  317. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  318. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  319. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  320. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  321. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  322. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  323. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  324. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  325. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  326. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  327. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  328. data/lib/rubocop/cop/style/when_then.rb +4 -6
  329. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  330. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  331. data/lib/rubocop/cop/style/word_array.rb +5 -23
  332. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  333. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -18
  334. data/lib/rubocop/cop/team.rb +1 -0
  335. data/lib/rubocop/cop/util.rb +1 -2
  336. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  337. data/lib/rubocop/cop/variable_force.rb +2 -0
  338. data/lib/rubocop/cop/variable_force/branch.rb +0 -4
  339. data/lib/rubocop/cops_documentation_generator.rb +4 -2
  340. data/lib/rubocop/core_ext/string.rb +2 -2
  341. data/lib/rubocop/directive_comment.rb +32 -0
  342. data/lib/rubocop/ext/regexp_node.rb +62 -0
  343. data/lib/rubocop/file_finder.rb +1 -0
  344. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  345. data/lib/rubocop/formatter/disabled_config_formatter.rb +12 -5
  346. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  347. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  348. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  349. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  350. data/lib/rubocop/name_similarity.rb +1 -0
  351. data/lib/rubocop/options.rb +40 -17
  352. data/lib/rubocop/remote_config.rb +1 -0
  353. data/lib/rubocop/result_cache.rb +39 -15
  354. data/lib/rubocop/rspec/cop_helper.rb +5 -2
  355. data/lib/rubocop/rspec/expect_offense.rb +14 -9
  356. data/lib/rubocop/rspec/shared_contexts.rb +12 -0
  357. data/lib/rubocop/runner.rb +38 -18
  358. data/lib/rubocop/string_interpreter.rb +3 -0
  359. data/lib/rubocop/target_finder.rb +28 -26
  360. data/lib/rubocop/target_ruby.rb +7 -1
  361. data/lib/rubocop/version.rb +7 -1
  362. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  363. metadata +31 -17
  364. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
  365. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -23,9 +23,12 @@ module RuboCop
23
23
  # # good
24
24
  # rand(1..6)
25
25
  # rand(1...7)
26
- class RandomWithOffset < Cop
26
+ class RandomWithOffset < Base
27
+ extend AutoCorrector
28
+
27
29
  MSG = 'Prefer ranges when generating random numbers instead of ' \
28
30
  'integers with offsets.'
31
+ RESTRICT_ON_SEND = %i[+ - succ pred next].freeze
29
32
 
30
33
  def_node_matcher :integer_op_rand?, <<~PATTERN
31
34
  (send
@@ -33,7 +36,7 @@ module RuboCop
33
36
  (send
34
37
  {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
35
38
  :rand
36
- {int irange erange}))
39
+ {int (irange int int) (erange int int)}))
37
40
  PATTERN
38
41
 
39
42
  def_node_matcher :rand_op_integer?, <<~PATTERN
@@ -41,7 +44,7 @@ module RuboCop
41
44
  (send
42
45
  {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
43
46
  :rand
44
- {int irange erange})
47
+ {int (irange int int) (erange int int)})
45
48
  {:+ :-}
46
49
  int)
47
50
  PATTERN
@@ -51,7 +54,7 @@ module RuboCop
51
54
  (send
52
55
  {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
53
56
  :rand
54
- {int irange erange})
57
+ {int (irange int int) (erange int int)})
55
58
  {:succ :pred :next})
56
59
  PATTERN
57
60
 
@@ -61,21 +64,8 @@ module RuboCop
61
64
  rand_op_integer?(node) ||
62
65
  rand_modified?(node)
63
66
 
64
- add_offense(node)
65
- end
66
-
67
- def autocorrect(node)
68
- lambda do |corrector|
69
- if integer_op_rand?(node)
70
- corrector.replace(node,
71
- corrected_integer_op_rand(node))
72
- elsif rand_op_integer?(node)
73
- corrector.replace(node,
74
- corrected_rand_op_integer(node))
75
- elsif rand_modified?(node)
76
- corrector.replace(node,
77
- corrected_rand_modified(node))
78
- end
67
+ add_offense(node) do |corrector|
68
+ autocorrect(corrector, node)
79
69
  end
80
70
  end
81
71
 
@@ -86,6 +76,16 @@ module RuboCop
86
76
  (send _ _ (send $_ _ $_))}
87
77
  PATTERN
88
78
 
79
+ def autocorrect(corrector, node)
80
+ if integer_op_rand?(node)
81
+ corrector.replace(node, corrected_integer_op_rand(node))
82
+ elsif rand_op_integer?(node)
83
+ corrector.replace(node, corrected_rand_op_integer(node))
84
+ elsif rand_modified?(node)
85
+ corrector.replace(node, corrected_rand_modified(node))
86
+ end
87
+ end
88
+
89
89
  def corrected_integer_op_rand(node)
90
90
  random_call(node) do |prefix_node, random_node|
91
91
  prefix = prefix_from_prefix_node(prefix_node)
@@ -37,7 +37,9 @@ module RuboCop
37
37
  # end
38
38
  # end
39
39
  #
40
- class RedundantAssignment < Cop
40
+ class RedundantAssignment < Base
41
+ extend AutoCorrector
42
+
41
43
  MSG = 'Redundant assignment before returning detected.'
42
44
 
43
45
  def_node_matcher :redundant_assignment?, <<~PATTERN
@@ -49,14 +51,6 @@ module RuboCop
49
51
  end
50
52
  alias on_defs on_def
51
53
 
52
- def autocorrect(node)
53
- lambda do |corrector|
54
- expression = node.children[1]
55
- corrector.replace(node, expression.source)
56
- corrector.remove(right_sibling_of(node))
57
- end
58
- end
59
-
60
54
  private
61
55
 
62
56
  def check_branch(node)
@@ -97,20 +91,16 @@ module RuboCop
97
91
 
98
92
  def check_begin_node(node)
99
93
  if (assignment = redundant_assignment?(node))
100
- add_offense(assignment)
94
+ add_offense(assignment) do |corrector|
95
+ expression = assignment.children[1]
96
+ corrector.replace(assignment, expression.source)
97
+ corrector.remove(assignment.right_sibling)
98
+ end
101
99
  else
102
100
  last_expr = node.children.last
103
101
  check_branch(last_expr)
104
102
  end
105
103
  end
106
-
107
- def right_sibling_of(node)
108
- siblings_of(node)[node.sibling_index + 1]
109
- end
110
-
111
- def siblings_of(node)
112
- node.parent.children
113
- end
114
104
  end
115
105
  end
116
106
  end
@@ -28,6 +28,14 @@ module RuboCop
28
28
  # end
29
29
  #
30
30
  # # bad
31
+ # begin
32
+ # do_something
33
+ # end
34
+ #
35
+ # # good
36
+ # do_something
37
+ #
38
+ # # bad
31
39
  # # When using Ruby 2.5 or later.
32
40
  # do_something do
33
41
  # begin
@@ -54,11 +62,15 @@ module RuboCop
54
62
  # baz
55
63
  # end
56
64
  # end
57
- class RedundantBegin < Cop
65
+ class RedundantBegin < Base
66
+ extend AutoCorrector
67
+
58
68
  MSG = 'Redundant `begin` block detected.'
59
69
 
60
70
  def on_def(node)
61
- check(node)
71
+ return unless node.body&.kwbegin_type?
72
+
73
+ register_offense(node.body)
62
74
  end
63
75
  alias on_defs on_def
64
76
 
@@ -67,23 +79,27 @@ module RuboCop
67
79
 
68
80
  return if node.send_node.lambda_literal?
69
81
  return if node.braces?
82
+ return unless node.body&.kwbegin_type?
70
83
 
71
- check(node)
84
+ register_offense(node.body)
72
85
  end
73
86
 
74
- def autocorrect(node)
75
- lambda do |corrector|
76
- corrector.remove(node.loc.begin)
77
- corrector.remove(node.loc.end)
78
- end
87
+ def on_kwbegin(node)
88
+ return if node.parent&.assignment?
89
+
90
+ first_child = node.children.first
91
+ return if first_child.rescue_type? || first_child.ensure_type?
92
+
93
+ register_offense(node)
79
94
  end
80
95
 
81
96
  private
82
97
 
83
- def check(node)
84
- return unless node.body&.kwbegin_type?
85
-
86
- add_offense(node.body, location: :begin)
98
+ def register_offense(node)
99
+ add_offense(node.loc.begin) do |corrector|
100
+ corrector.remove(node.loc.begin)
101
+ corrector.remove(node.loc.end)
102
+ end
87
103
  end
88
104
  end
89
105
  end
@@ -14,8 +14,9 @@ module RuboCop
14
14
  # %w/swim run bike/
15
15
  # %w[shirt pants shoes]
16
16
  # %W(apple #{fruit} grape)
17
- class RedundantCapitalW < Cop
17
+ class RedundantCapitalW < Base
18
18
  include PercentLiteral
19
+ extend AutoCorrector
19
20
 
20
21
  MSG = 'Do not use `%W` unless interpolation is needed. ' \
21
22
  'If not, use `%w`.'
@@ -24,19 +25,15 @@ module RuboCop
24
25
  process(node, '%W')
25
26
  end
26
27
 
27
- def autocorrect(node)
28
- lambda do |corrector|
29
- src = node.loc.begin.source
30
- corrector.replace(node.loc.begin, src.tr('W', 'w'))
31
- end
32
- end
33
-
34
28
  private
35
29
 
36
30
  def on_percent_literal(node)
37
31
  return if requires_interpolation?(node)
38
32
 
39
- add_offense(node)
33
+ add_offense(node) do |corrector|
34
+ src = node.loc.begin.source
35
+ corrector.replace(node.loc.begin, src.tr('W', 'w'))
36
+ end
40
37
  end
41
38
 
42
39
  def requires_interpolation?(node)
@@ -30,8 +30,9 @@ module RuboCop
30
30
  # c
31
31
  # end
32
32
  #
33
- class RedundantCondition < Cop
33
+ class RedundantCondition < Base
34
34
  include RangeHelp
35
+ extend AutoCorrector
35
36
 
36
37
  MSG = 'Use double pipes `||` instead.'
37
38
  REDUNDANT_CONDITION = 'This condition is not needed.'
@@ -40,11 +41,9 @@ module RuboCop
40
41
  return if node.elsif_conditional?
41
42
  return unless offense?(node)
42
43
 
43
- add_offense(node, location: range_of_offense(node))
44
- end
44
+ message = message(node)
45
45
 
46
- def autocorrect(node)
47
- lambda do |corrector|
46
+ add_offense(range_of_offense(node), message: message) do |corrector|
48
47
  if node.ternary?
49
48
  correct_ternary(corrector, node)
50
49
  elsif node.modifier_form? || !node.else_branch
@@ -68,7 +67,7 @@ module RuboCop
68
67
  end
69
68
 
70
69
  def range_of_offense(node)
71
- return :expression unless node.ternary?
70
+ return node.loc.expression unless node.ternary?
72
71
 
73
72
  range_between(node.loc.question.begin_pos, node.loc.colon.end_pos)
74
73
  end
@@ -76,7 +75,7 @@ module RuboCop
76
75
  def offense?(node)
77
76
  condition, if_branch, else_branch = *node
78
77
 
79
- return false if use_if_branch?(else_branch)
78
+ return false if use_if_branch?(else_branch) || use_hash_key_assignment?(else_branch)
80
79
 
81
80
  condition == if_branch && !node.elsif? && (
82
81
  node.ternary? ||
@@ -89,6 +88,10 @@ module RuboCop
89
88
  else_branch&.if_type?
90
89
  end
91
90
 
91
+ def use_hash_key_assignment?(else_branch)
92
+ else_branch&.send_type? && else_branch&.method?(:[]=)
93
+ end
94
+
92
95
  def else_source(else_branch)
93
96
  if require_parentheses?(else_branch)
94
97
  "(#{else_branch.source})"
@@ -24,8 +24,9 @@ module RuboCop
24
24
  #
25
25
  # # good
26
26
  # x != y
27
- class RedundantConditional < Cop
27
+ class RedundantConditional < Base
28
28
  include Alignment
29
+ extend AutoCorrector
29
30
 
30
31
  operators = RuboCop::AST::Node::COMPARISON_OPERATORS.to_a
31
32
  COMPARISON_OPERATOR_MATCHER = "{:#{operators.join(' :')}}"
@@ -36,11 +37,9 @@ module RuboCop
36
37
  def on_if(node)
37
38
  return unless offense?(node)
38
39
 
39
- add_offense(node)
40
- end
40
+ message = message(node)
41
41
 
42
- def autocorrect(node)
43
- lambda do |corrector|
42
+ add_offense(node, message: message) do |corrector|
44
43
  corrector.replace(node, replacement_condition(node))
45
44
  end
46
45
  end
@@ -23,13 +23,11 @@ module RuboCop
23
23
  MSG_2 = 'Redundant `RuntimeError.new` call can be replaced with ' \
24
24
  'just the message.'
25
25
 
26
- RAISE_METHODS = %i[raise fail].freeze
26
+ RESTRICT_ON_SEND = %i[raise fail].freeze
27
27
 
28
28
  # Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
29
29
  # `raise RuntimeError.new('message')` to `raise 'message'`.
30
30
  def on_send(node)
31
- return unless RAISE_METHODS.include?(node.method_name)
32
-
33
31
  fix_exploded(node) || fix_compact(node)
34
32
  end
35
33
 
@@ -31,9 +31,10 @@ module RuboCop
31
31
  # # good
32
32
  # ENV.fetch(:key, VALUE)
33
33
  #
34
- class RedundantFetchBlock < Cop
34
+ class RedundantFetchBlock < Base
35
35
  include FrozenStringLiteral
36
36
  include RangeHelp
37
+ extend AutoCorrector
37
38
 
38
39
  MSG = 'Use `%<good>s` instead of `%<bad>s`.'
39
40
 
@@ -52,17 +53,7 @@ module RuboCop
52
53
  good = build_good_method(send, body)
53
54
  bad = build_bad_method(send, body)
54
55
 
55
- add_offense(
56
- node,
57
- location: range,
58
- message: format(MSG, good: good, bad: bad)
59
- )
60
- end
61
- end
62
-
63
- def autocorrect(node)
64
- redundant_fetch_block_candidate?(node) do |send, body|
65
- lambda do |corrector|
56
+ add_offense(range, message: format(MSG, good: good, bad: bad)) do |corrector|
66
57
  receiver, _, key = send.children
67
58
  default_value = body ? body.source : 'nil'
68
59
 
@@ -24,8 +24,11 @@ module RuboCop
24
24
  # require_relative '../foo'
25
25
  # require_relative '../foo.so'
26
26
  #
27
- class RedundantFileExtensionInRequire < Cop
27
+ class RedundantFileExtensionInRequire < Base
28
+ extend AutoCorrector
29
+
28
30
  MSG = 'Redundant `.rb` file extension detected.'
31
+ RESTRICT_ON_SEND = %i[require require_relative].freeze
29
32
 
30
33
  def_node_matcher :require_call?, <<~PATTERN
31
34
  (send nil? {:require :require_relative} $str_type?)
@@ -33,15 +36,13 @@ module RuboCop
33
36
 
34
37
  def on_send(node)
35
38
  require_call?(node) do |name_node|
36
- add_offense(name_node) if name_node.value.end_with?('.rb')
37
- end
38
- end
39
+ return unless name_node.value.end_with?('.rb')
39
40
 
40
- def autocorrect(node)
41
- correction = node.value.sub(/\.rb\z/, '')
41
+ add_offense(name_node) do |corrector|
42
+ correction = name_node.value.sub(/\.rb\z/, '')
42
43
 
43
- lambda do |corrector|
44
- corrector.replace(node, "'#{correction}'")
44
+ corrector.replace(name_node, "'#{correction}'")
45
+ end
45
46
  end
46
47
  end
47
48
  end
@@ -11,22 +11,20 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # CONST = 1
14
- class RedundantFreeze < Cop
14
+ class RedundantFreeze < Base
15
+ extend AutoCorrector
15
16
  include FrozenStringLiteral
16
17
 
17
18
  MSG = 'Do not freeze immutable objects, as freezing them has no ' \
18
19
  'effect.'
20
+ RESTRICT_ON_SEND = %i[freeze].freeze
19
21
 
20
22
  def on_send(node)
21
- return unless node.receiver && node.method?(:freeze) &&
23
+ return unless node.receiver &&
22
24
  (immutable_literal?(node.receiver) ||
23
25
  operation_produces_immutable_object?(node.receiver))
24
26
 
25
- add_offense(node)
26
- end
27
-
28
- def autocorrect(node)
29
- lambda do |corrector|
27
+ add_offense(node) do |corrector|
30
28
  corrector.remove(node.loc.dot)
31
29
  corrector.remove(node.loc.selector)
32
30
  end
@@ -15,8 +15,9 @@ module RuboCop
15
15
  #
16
16
  # # good if @var is already a String
17
17
  # @var
18
- class RedundantInterpolation < Cop
18
+ class RedundantInterpolation < Base
19
19
  include PercentLiteral
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = 'Prefer `to_s` over string interpolation.'
22
23
 
@@ -25,18 +26,18 @@ module RuboCop
25
26
  end
26
27
 
27
28
  def on_dstr(node)
28
- add_offense(node) if single_interpolation?(node)
29
- end
30
-
31
- def autocorrect(node)
32
- embedded_node = node.children.first
33
-
34
- if variable_interpolation?(embedded_node)
35
- autocorrect_variable_interpolation(embedded_node, node)
36
- elsif single_variable_interpolation?(embedded_node)
37
- autocorrect_single_variable_interpolation(embedded_node, node)
38
- else
39
- autocorrect_other(embedded_node, node)
29
+ return unless single_interpolation?(node)
30
+
31
+ add_offense(node) do |corrector|
32
+ embedded_node = node.children.first
33
+
34
+ if variable_interpolation?(embedded_node)
35
+ autocorrect_variable_interpolation(corrector, embedded_node, node)
36
+ elsif single_variable_interpolation?(embedded_node)
37
+ autocorrect_single_variable_interpolation(corrector, embedded_node, node)
38
+ else
39
+ autocorrect_other(corrector, embedded_node, node)
40
+ end
40
41
  end
41
42
  end
42
43
 
@@ -50,7 +51,12 @@ module RuboCop
50
51
  end
51
52
 
52
53
  def single_variable_interpolation?(node)
53
- node.children.one? && variable_interpolation?(node.children.first)
54
+ return false unless node.children.one?
55
+
56
+ first_child = node.children.first
57
+
58
+ variable_interpolation?(first_child) ||
59
+ first_child.send_type? && !first_child.operator_method?
54
60
  end
55
61
 
56
62
  def interpolation?(node)
@@ -70,27 +76,27 @@ module RuboCop
70
76
  percent_literal?(node.parent)
71
77
  end
72
78
 
73
- def autocorrect_variable_interpolation(embedded_node, node)
79
+ def autocorrect_variable_interpolation(corrector, embedded_node, node)
74
80
  replacement = "#{embedded_node.loc.expression.source}.to_s"
75
- ->(corrector) { corrector.replace(node, replacement) }
81
+
82
+ corrector.replace(node, replacement)
76
83
  end
77
84
 
78
- def autocorrect_single_variable_interpolation(embedded_node, node)
85
+ def autocorrect_single_variable_interpolation(corrector, embedded_node, node)
79
86
  variable_loc = embedded_node.children.first.loc
80
87
  replacement = "#{variable_loc.expression.source}.to_s"
81
- ->(corrector) { corrector.replace(node, replacement) }
88
+
89
+ corrector.replace(node, replacement)
82
90
  end
83
91
 
84
- def autocorrect_other(embedded_node, node)
92
+ def autocorrect_other(corrector, embedded_node, node)
85
93
  loc = node.loc
86
94
  embedded_loc = embedded_node.loc
87
95
 
88
- lambda do |corrector|
89
- corrector.replace(loc.begin, '')
90
- corrector.replace(loc.end, '')
91
- corrector.replace(embedded_loc.begin, '(')
92
- corrector.replace(embedded_loc.end, ').to_s')
93
- end
96
+ corrector.replace(loc.begin, '')
97
+ corrector.replace(loc.end, '')
98
+ corrector.replace(embedded_loc.begin, '(')
99
+ corrector.replace(embedded_loc.end, ').to_s')
94
100
  end
95
101
  end
96
102
  end