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
@@ -15,20 +15,17 @@ module RuboCop
15
15
  # extend self
16
16
  # end
17
17
  #
18
- class TrailingBodyOnModule < Cop
18
+ class TrailingBodyOnModule < Base
19
19
  include Alignment
20
20
  include TrailingBody
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Place the first line of module body on its own line.'
23
24
 
24
25
  def on_module(node)
25
26
  return unless trailing_body?(node)
26
27
 
27
- add_offense(node, location: first_part_of(node.to_a.last))
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(first_part_of(node.to_a.last)) do |corrector|
32
29
  LineBreakCorrector.correct_trailing_body(
33
30
  configured_width: configured_indentation_width,
34
31
  corrector: corrector,
@@ -84,8 +84,9 @@ module RuboCop
84
84
  # 1,
85
85
  # 2
86
86
  # )
87
- class TrailingCommaInArguments < Cop
87
+ class TrailingCommaInArguments < Base
88
88
  include TrailingComma
89
+ extend AutoCorrector
89
90
 
90
91
  def on_send(node)
91
92
  return unless node.arguments? && node.parenthesized?
@@ -96,10 +97,6 @@ module RuboCop
96
97
  end
97
98
  alias on_csend on_send
98
99
 
99
- def autocorrect(range)
100
- PunctuationCorrector.swap_comma(range)
101
- end
102
-
103
100
  def self.autocorrect_incompatible_with
104
101
  [Layout::HeredocArgumentClosingParenthesis]
105
102
  end
@@ -81,18 +81,15 @@ module RuboCop
81
81
  # 1,
82
82
  # 2
83
83
  # ]
84
- class TrailingCommaInArrayLiteral < Cop
84
+ class TrailingCommaInArrayLiteral < Base
85
85
  include TrailingComma
86
+ extend AutoCorrector
86
87
 
87
88
  def on_array(node)
88
89
  return unless node.square_brackets?
89
90
 
90
91
  check_literal(node, 'item of %<article>s array')
91
92
  end
92
-
93
- def autocorrect(range)
94
- PunctuationCorrector.swap_comma(range)
95
- end
96
93
  end
97
94
  end
98
95
  end
@@ -40,20 +40,21 @@ module RuboCop
40
40
  # add do
41
41
  # foo + bar
42
42
  # end
43
- class TrailingCommaInBlockArgs < Cop
43
+ class TrailingCommaInBlockArgs < Base
44
+ extend AutoCorrector
45
+
44
46
  MSG = 'Useless trailing comma present in block arguments.'
45
47
 
46
48
  def on_block(node)
47
49
  # lambda literal (`->`) never has block arguments.
48
50
  return if node.send_node.lambda_literal?
49
-
50
51
  return unless useless_trailing_comma?(node)
51
52
 
52
- add_offense(node, location: last_comma(node).pos)
53
- end
53
+ last_comma_pos = last_comma(node).pos
54
54
 
55
- def autocorrect(node)
56
- ->(corrector) { corrector.replace(last_comma(node).pos, '') }
55
+ add_offense(last_comma_pos) do |corrector|
56
+ corrector.replace(last_comma_pos, '')
57
+ end
57
58
  end
58
59
 
59
60
  private
@@ -75,12 +76,13 @@ module RuboCop
75
76
  end
76
77
 
77
78
  def argument_tokens(node)
78
- pipes = tokens(node).select { |token| token.type == :tPIPE }
79
+ tokens = processed_source.tokens_within(node)
80
+ pipes = tokens.select { |token| token.type == :tPIPE }
79
81
  begin_pos, end_pos = pipes.map do |pipe|
80
- tokens(node).index(pipe)
82
+ tokens.index(pipe)
81
83
  end
82
84
 
83
- tokens(node)[begin_pos + 1..end_pos - 1]
85
+ tokens[begin_pos + 1..end_pos - 1]
84
86
  end
85
87
  end
86
88
  end
@@ -84,16 +84,13 @@ module RuboCop
84
84
  # foo: 1,
85
85
  # bar: 2
86
86
  # }
87
- class TrailingCommaInHashLiteral < Cop
87
+ class TrailingCommaInHashLiteral < Base
88
88
  include TrailingComma
89
+ extend AutoCorrector
89
90
 
90
91
  def on_hash(node)
91
92
  check_literal(node, 'item of %<article>s hash')
92
93
  end
93
-
94
- def autocorrect(range)
95
- PunctuationCorrector.swap_comma(range)
96
- end
97
94
  end
98
95
  end
99
96
  end
@@ -28,9 +28,10 @@ module RuboCop
28
28
  # # bad
29
29
  # a, b, _something = foo()
30
30
  #
31
- class TrailingUnderscoreVariable < Cop
31
+ class TrailingUnderscoreVariable < Base
32
32
  include SurroundingSpace
33
33
  include RangeHelp
34
+ extend AutoCorrector
34
35
 
35
36
  MSG = 'Do not use trailing `_`s in parallel assignment. ' \
36
37
  'Prefer `%<code>s`.'
@@ -44,17 +45,9 @@ module RuboCop
44
45
  offset = range.begin_pos - node.source_range.begin_pos
45
46
  good_code[offset, range.size] = ''
46
47
 
47
- add_offense(node,
48
- location: range,
49
- message: format(MSG, code: good_code))
50
- end
51
- end
52
-
53
- def autocorrect(node)
54
- ranges = unneeded_ranges(node)
55
-
56
- lambda do |corrector|
57
- ranges.each { |range| corrector.remove(range) if range }
48
+ add_offense(range, message: format(MSG, code: good_code)) do |corrector|
49
+ corrector.remove(range)
50
+ end
58
51
  end
59
52
  end
60
53
 
@@ -75,11 +68,9 @@ module RuboCop
75
68
 
76
69
  var, = *variable
77
70
  var, = *var
78
- if allow_named_underscore_variables
79
- break offense unless var == :_
80
- else
81
- break offense unless var.to_s.start_with?(UNDERSCORE)
82
- end
71
+
72
+ break offense if (allow_named_underscore_variables && var != :_) ||
73
+ !var.to_s.start_with?(UNDERSCORE)
83
74
 
84
75
  variable
85
76
  end
@@ -27,8 +27,9 @@ module RuboCop
27
27
  # class << self
28
28
  # attr_reader :baz
29
29
  # end
30
- class TrivialAccessors < Cop
30
+ class TrivialAccessors < Base
31
31
  include AllowedMethods
32
+ extend AutoCorrector
32
33
 
33
34
  MSG = 'Use `attr_%<kind>s` to define trivial %<kind>s methods.'
34
35
 
@@ -41,17 +42,6 @@ module RuboCop
41
42
  end
42
43
  alias on_defs on_def
43
44
 
44
- def autocorrect(node)
45
- parent = node.parent
46
- return if parent&.send_type?
47
-
48
- if node.def_type?
49
- autocorrect_instance(node)
50
- elsif node.defs_type? && node.children.first.self_type?
51
- autocorrect_class(node)
52
- end
53
- end
54
-
55
45
  private
56
46
 
57
47
  def in_module_or_instance_eval?(node)
@@ -76,9 +66,20 @@ module RuboCop
76
66
  end
77
67
  return unless kind
78
68
 
79
- add_offense(node,
80
- location: :keyword,
81
- message: format(MSG, kind: kind))
69
+ add_offense(node.loc.keyword, message: format(MSG, kind: kind)) do |corrector|
70
+ autocorrect(corrector, node)
71
+ end
72
+ end
73
+
74
+ def autocorrect(corrector, node)
75
+ parent = node.parent
76
+ return if parent&.send_type?
77
+
78
+ if node.def_type?
79
+ autocorrect_instance(corrector, node)
80
+ elsif node.defs_type? && node.children.first.self_type?
81
+ autocorrect_class(corrector, node)
82
+ end
82
83
  end
83
84
 
84
85
  def exact_name_match?
@@ -156,31 +157,26 @@ module RuboCop
156
157
  "attr_#{kind} :#{method_name.to_s.chomp('=')}"
157
158
  end
158
159
 
159
- def autocorrect_instance(node)
160
+ def autocorrect_instance(corrector, node)
160
161
  kind = trivial_accessor_kind(node)
161
162
 
162
163
  return unless names_match?(node) && !node.predicate_method? && kind
163
164
 
164
- lambda do |corrector|
165
- corrector.replace(node,
166
- accessor(kind, node.method_name))
167
- end
165
+ corrector.replace(node, accessor(kind, node.method_name))
168
166
  end
169
167
 
170
- def autocorrect_class(node)
168
+ def autocorrect_class(corrector, node)
171
169
  kind = trivial_accessor_kind(node)
172
170
 
173
171
  return unless names_match?(node) && kind
174
172
 
175
- lambda do |corrector|
176
- indent = ' ' * node.loc.column
177
- corrector.replace(
178
- node.source_range,
179
- ['class << self',
180
- "#{indent} #{accessor(kind, node.method_name)}",
181
- "#{indent}end"].join("\n")
182
- )
183
- end
173
+ indent = ' ' * node.loc.column
174
+ corrector.replace(
175
+ node.source_range,
176
+ ['class << self',
177
+ "#{indent} #{accessor(kind, node.method_name)}",
178
+ "#{indent}end"].join("\n")
179
+ )
184
180
  end
185
181
 
186
182
  def top_level_node?(node)
@@ -19,8 +19,9 @@ module RuboCop
19
19
  # else
20
20
  # # do a different thing...
21
21
  # end
22
- class UnlessElse < Cop
22
+ class UnlessElse < Base
23
23
  include RangeHelp
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = 'Do not use `unless` with `else`. Rewrite these with the ' \
26
27
  'positive case first.'
@@ -28,14 +29,10 @@ module RuboCop
28
29
  def on_if(node)
29
30
  return unless node.unless? && node.else?
30
31
 
31
- add_offense(node)
32
- end
33
-
34
- def autocorrect(node)
35
- body_range = range_between_condition_and_else(node, node.condition)
36
- else_range = range_between_else_and_end(node)
32
+ add_offense(node) do |corrector|
33
+ body_range = range_between_condition_and_else(node, node.condition)
34
+ else_range = range_between_else_and_end(node)
37
35
 
38
- lambda do |corrector|
39
36
  corrector.replace(node.loc.keyword, 'if')
40
37
  corrector.replace(body_range, else_range.source)
41
38
  corrector.replace(else_range, body_range.source)
@@ -17,9 +17,12 @@ module RuboCop
17
17
  # # good
18
18
  # 'foo'.unpack1('h*')
19
19
  #
20
- class UnpackFirst < Cop
20
+ class UnpackFirst < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of '\
22
24
  '`%<receiver>s.unpack(%<format>s)%<method>s`.'
25
+ RESTRICT_ON_SEND = %i[first [] slice at].freeze
23
26
 
24
27
  def_node_matcher :unpack_and_first_element?, <<~PATTERN
25
28
  {
@@ -35,13 +38,7 @@ module RuboCop
35
38
  receiver: unpack_call.receiver.source,
36
39
  format: unpack_arg.source,
37
40
  method: range.source)
38
- add_offense(node, message: message)
39
- end
40
- end
41
-
42
- def autocorrect(node)
43
- unpack_and_first_element?(node) do |unpack_call, _unpack_arg|
44
- lambda do |corrector|
41
+ add_offense(node, message: message) do |corrector|
45
42
  corrector.remove(first_element_range(node, unpack_call))
46
43
  corrector.replace(unpack_call.loc.selector, 'unpack1')
47
44
  end
@@ -15,28 +15,25 @@ module RuboCop
15
15
  # "His name is #{$name}"
16
16
  # /check #{$pattern}/
17
17
  # "Let's go to the #{@store}"
18
- class VariableInterpolation < Cop
18
+ class VariableInterpolation < Base
19
19
  include Interpolation
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = 'Replace interpolated variable `%<variable>s` ' \
22
23
  'with expression `#{%<variable>s}`.'
23
24
 
24
25
  def on_node_with_interpolations(node)
25
26
  var_nodes(node.children).each do |var_node|
26
- add_offense(var_node)
27
- end
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
32
- corrector.replace(node, "{#{node.source}}")
27
+ add_offense(var_node) do |corrector|
28
+ corrector.replace(var_node, "{#{var_node.source}}")
29
+ end
33
30
  end
34
31
  end
35
32
 
36
33
  private
37
34
 
38
- def message(node)
39
- format(MSG, variable: node.source)
35
+ def message(range)
36
+ format(MSG, variable: range.source)
40
37
  end
41
38
 
42
39
  def var_nodes(nodes)
@@ -17,17 +17,15 @@ module RuboCop
17
17
  # when 1 then 'baz'
18
18
  # when 2 then 'bar'
19
19
  # end
20
- class WhenThen < Cop
20
+ class WhenThen < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Do not use `when x;`. Use `when x then` instead.'
22
24
 
23
25
  def on_when(node)
24
26
  return if node.multiline? || node.then? || !node.body
25
27
 
26
- add_offense(node, location: :begin)
27
- end
28
-
29
- def autocorrect(node)
30
- lambda do |corrector|
28
+ add_offense(node.loc.begin) do |corrector|
31
29
  corrector.replace(node.loc.begin, ' then')
32
30
  end
33
31
  end
@@ -28,31 +28,21 @@ module RuboCop
28
28
  # until x.empty?
29
29
  # do_something(x.pop)
30
30
  # end
31
- class WhileUntilDo < Cop
31
+ class WhileUntilDo < Base
32
+ extend AutoCorrector
33
+
32
34
  MSG = 'Do not use `do` with multi-line `%<keyword>s`.'
33
35
 
34
36
  def on_while(node)
35
- handle(node)
36
- end
37
-
38
- def on_until(node)
39
- handle(node)
40
- end
41
-
42
- def handle(node)
43
37
  return unless node.multiline? && node.do?
44
38
 
45
- add_offense(node, location: :begin,
46
- message: format(MSG, keyword: node.keyword))
47
- end
48
-
49
- def autocorrect(node)
50
- do_range = node.condition.source_range.end.join(node.loc.begin)
39
+ add_offense(node.loc.begin, message: format(MSG, keyword: node.keyword)) do |corrector|
40
+ do_range = node.condition.source_range.end.join(node.loc.begin)
51
41
 
52
- lambda do |corrector|
53
42
  corrector.remove(do_range)
54
43
  end
55
44
  end
45
+ alias on_until on_while
56
46
  end
57
47
  end
58
48
  end
@@ -24,37 +24,23 @@ module RuboCop
24
24
  #
25
25
  # # good
26
26
  # x += 1 until x > 10
27
- class WhileUntilModifier < Cop
27
+ class WhileUntilModifier < Base
28
28
  include StatementModifier
29
+ extend AutoCorrector
29
30
 
30
31
  MSG = 'Favor modifier `%<keyword>s` usage when ' \
31
32
  'having a single-line body.'
32
33
 
33
34
  def on_while(node)
34
- check(node)
35
- end
36
-
37
- def on_until(node)
38
- check(node)
39
- end
35
+ return unless node.multiline? && single_line_as_modifier?(node)
40
36
 
41
- def autocorrect(node)
42
- oneline = "#{node.body.source} #{node.keyword} " \
43
- "#{node.condition.source}"
37
+ add_offense(node.loc.keyword, message: format(MSG, keyword: node.keyword)) do |corrector|
38
+ oneline = "#{node.body.source} #{node.keyword} #{node.condition.source}"
44
39
 
45
- lambda do |corrector|
46
40
  corrector.replace(node, oneline)
47
41
  end
48
42
  end
49
-
50
- private
51
-
52
- def check(node)
53
- return unless node.multiline? && single_line_as_modifier?(node)
54
-
55
- add_offense(node, location: :keyword,
56
- message: format(MSG, keyword: node.keyword))
57
- end
43
+ alias on_until on_while
58
44
  end
59
45
  end
60
46
  end