rubocop 0.51.0 → 0.52.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 (360) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/config/default.yml +86 -10
  4. data/config/disabled.yml +9 -4
  5. data/config/enabled.yml +1105 -1006
  6. data/lib/rubocop.rb +30 -3
  7. data/lib/rubocop/ast/builder.rb +2 -0
  8. data/lib/rubocop/ast/node.rb +24 -2
  9. data/lib/rubocop/ast/node/args_node.rb +17 -0
  10. data/lib/rubocop/ast/node/array_node.rb +1 -1
  11. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  12. data/lib/rubocop/ast/node/send_node.rb +20 -0
  13. data/lib/rubocop/ast/node/str_node.rb +14 -0
  14. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  15. data/lib/rubocop/ast/traversal.rb +4 -4
  16. data/lib/rubocop/cli.rb +45 -4
  17. data/lib/rubocop/comment_config.rb +2 -5
  18. data/lib/rubocop/config.rb +42 -8
  19. data/lib/rubocop/config_loader.rb +39 -100
  20. data/lib/rubocop/config_loader_resolver.rb +99 -2
  21. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
  24. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  25. data/lib/rubocop/cop/cop.rb +16 -46
  26. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  27. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
  28. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  29. data/lib/rubocop/cop/generator.rb +23 -4
  30. data/lib/rubocop/cop/internal_affairs.rb +1 -1
  31. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
  33. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  34. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  35. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  36. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
  37. data/lib/rubocop/cop/layout/align_hash.rb +16 -16
  38. data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
  39. data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
  40. data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
  41. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  42. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
  43. data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
  44. data/lib/rubocop/cop/layout/dot_position.rb +22 -13
  45. data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
  47. data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  52. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  53. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
  54. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
  55. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  56. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  57. data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
  58. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
  59. data/lib/rubocop/cop/layout/indent_array.rb +67 -20
  60. data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
  61. data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
  62. data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
  63. data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
  64. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  65. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  66. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
  67. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  68. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  69. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
  70. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  71. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
  72. data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
  73. data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
  74. data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
  75. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  76. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
  77. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
  78. data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
  79. data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
  80. data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
  81. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  82. data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
  83. data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
  84. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  87. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
  88. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
  89. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
  90. data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
  91. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  92. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  93. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
  94. data/lib/rubocop/cop/layout/tab.rb +2 -2
  95. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
  96. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
  97. data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
  98. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  99. data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
  100. data/lib/rubocop/cop/lint/else_layout.rb +2 -2
  101. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  102. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
  103. data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
  104. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  105. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  106. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  107. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  108. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
  109. data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
  110. data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
  111. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  112. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  113. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  114. data/lib/rubocop/cop/lint/script_permission.rb +1 -0
  115. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  116. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  117. data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
  118. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
  119. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
  120. data/lib/rubocop/cop/message_annotator.rb +4 -2
  121. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  122. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  123. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  124. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  125. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  126. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  127. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  128. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  129. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
  130. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  131. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
  132. data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
  133. data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
  134. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
  135. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
  136. data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
  137. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
  138. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  139. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
  140. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
  141. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  142. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  143. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  144. data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
  145. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
  146. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  147. data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
  148. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
  149. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
  150. data/lib/rubocop/cop/naming/constant_name.rb +32 -3
  151. data/lib/rubocop/cop/naming/file_name.rb +19 -8
  152. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  153. data/lib/rubocop/cop/naming/method_name.rb +20 -14
  154. data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
  155. data/lib/rubocop/cop/naming/variable_name.rb +17 -2
  156. data/lib/rubocop/cop/naming/variable_number.rb +10 -27
  157. data/lib/rubocop/cop/offense.rb +6 -1
  158. data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
  159. data/lib/rubocop/cop/performance/casecmp.rb +5 -4
  160. data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
  161. data/lib/rubocop/cop/performance/count.rb +5 -4
  162. data/lib/rubocop/cop/performance/detect.rb +7 -4
  163. data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
  164. data/lib/rubocop/cop/performance/end_with.rb +2 -2
  165. data/lib/rubocop/cop/performance/flat_map.rb +3 -2
  166. data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
  167. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
  168. data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
  169. data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
  170. data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
  171. data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
  172. data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
  173. data/lib/rubocop/cop/performance/size.rb +2 -2
  174. data/lib/rubocop/cop/performance/start_with.rb +2 -2
  175. data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
  176. data/lib/rubocop/cop/performance/times_map.rb +14 -15
  177. data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
  178. data/lib/rubocop/cop/rails/action_filter.rb +22 -0
  179. data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
  180. data/lib/rubocop/cop/rails/application_job.rb +4 -2
  181. data/lib/rubocop/cop/rails/application_record.rb +4 -2
  182. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  183. data/lib/rubocop/cop/rails/delegate.rb +20 -25
  184. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
  185. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  186. data/lib/rubocop/cop/rails/exit.rb +7 -0
  187. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
  188. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
  189. data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
  190. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  191. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  192. data/lib/rubocop/cop/rails/output.rb +9 -0
  193. data/lib/rubocop/cop/rails/output_safety.rb +14 -20
  194. data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
  195. data/lib/rubocop/cop/rails/presence.rb +105 -0
  196. data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
  197. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  198. data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
  199. data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
  200. data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
  201. data/lib/rubocop/cop/rails/save_bang.rb +2 -2
  202. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
  203. data/lib/rubocop/cop/rails/validation.rb +7 -7
  204. data/lib/rubocop/cop/security/json_load.rb +4 -2
  205. data/lib/rubocop/cop/security/marshal_load.rb +4 -2
  206. data/lib/rubocop/cop/style/alias.rb +24 -26
  207. data/lib/rubocop/cop/style/and_or.rb +34 -28
  208. data/lib/rubocop/cop/style/array_join.rb +9 -0
  209. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  210. data/lib/rubocop/cop/style/attr.rb +14 -4
  211. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
  212. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  213. data/lib/rubocop/cop/style/block_comments.rb +14 -2
  214. data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
  215. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
  216. data/lib/rubocop/cop/style/case_equality.rb +12 -0
  217. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  218. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
  219. data/lib/rubocop/cop/style/class_check.rb +28 -9
  220. data/lib/rubocop/cop/style/class_methods.rb +8 -8
  221. data/lib/rubocop/cop/style/class_vars.rb +4 -3
  222. data/lib/rubocop/cop/style/collection_methods.rb +4 -2
  223. data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
  224. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  225. data/lib/rubocop/cop/style/command_literal.rb +70 -21
  226. data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
  227. data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
  228. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
  229. data/lib/rubocop/cop/style/copyright.rb +19 -20
  230. data/lib/rubocop/cop/style/date_time.rb +2 -2
  231. data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
  232. data/lib/rubocop/cop/style/dir.rb +2 -2
  233. data/lib/rubocop/cop/style/documentation.rb +17 -2
  234. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
  235. data/lib/rubocop/cop/style/each_with_object.rb +5 -5
  236. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  237. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  238. data/lib/rubocop/cop/style/empty_else.rb +52 -22
  239. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  240. data/lib/rubocop/cop/style/empty_literal.rb +17 -5
  241. data/lib/rubocop/cop/style/empty_method.rb +4 -10
  242. data/lib/rubocop/cop/style/encoding.rb +2 -1
  243. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  244. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  245. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  246. data/lib/rubocop/cop/style/flip_flop.rb +11 -0
  247. data/lib/rubocop/cop/style/format_string.rb +29 -2
  248. data/lib/rubocop/cop/style/format_string_token.rb +15 -14
  249. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
  250. data/lib/rubocop/cop/style/global_vars.rb +11 -1
  251. data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
  252. data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
  253. data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
  254. data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
  255. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
  256. data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
  257. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  258. data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
  259. data/lib/rubocop/cop/style/lambda.rb +23 -31
  260. data/lib/rubocop/cop/style/lambda_call.rb +15 -9
  261. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
  262. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
  263. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
  264. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
  265. data/lib/rubocop/cop/style/method_missing.rb +8 -8
  266. data/lib/rubocop/cop/style/min_max.rb +12 -12
  267. data/lib/rubocop/cop/style/missing_else.rb +5 -4
  268. data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
  269. data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
  270. data/lib/rubocop/cop/style/module_function.rb +17 -5
  271. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
  272. data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
  273. data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
  274. data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
  275. data/lib/rubocop/cop/style/negated_if.rb +22 -30
  276. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
  278. data/lib/rubocop/cop/style/next.rb +39 -11
  279. data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
  280. data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
  281. data/lib/rubocop/cop/style/not.rb +14 -4
  282. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
  283. data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
  284. data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
  285. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
  286. data/lib/rubocop/cop/style/option_hash.rb +11 -14
  287. data/lib/rubocop/cop/style/or_assignment.rb +2 -2
  288. data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
  289. data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
  290. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
  291. data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
  292. data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
  293. data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
  294. data/lib/rubocop/cop/style/proc.rb +8 -0
  295. data/lib/rubocop/cop/style/raise_args.rb +8 -14
  296. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  297. data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
  298. data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
  299. data/lib/rubocop/cop/style/redundant_return.rb +5 -4
  300. data/lib/rubocop/cop/style/redundant_self.rb +25 -26
  301. data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
  302. data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
  303. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  304. data/lib/rubocop/cop/style/return_nil.rb +4 -8
  305. data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
  306. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  307. data/lib/rubocop/cop/style/semicolon.rb +18 -8
  308. data/lib/rubocop/cop/style/send.rb +9 -0
  309. data/lib/rubocop/cop/style/signal_exception.rb +100 -0
  310. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  311. data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
  312. data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
  313. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
  314. data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
  315. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  316. data/lib/rubocop/cop/style/string_literals.rb +22 -0
  317. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
  318. data/lib/rubocop/cop/style/string_methods.rb +18 -7
  319. data/lib/rubocop/cop/style/symbol_array.rb +5 -9
  320. data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
  321. data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
  322. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  323. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  324. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  325. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  326. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
  327. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
  328. data/lib/rubocop/cop/style/unless_else.rb +15 -0
  329. data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
  330. data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
  331. data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
  332. data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
  333. data/lib/rubocop/cop/style/when_then.rb +13 -0
  334. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  335. data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
  336. data/lib/rubocop/cop/style/word_array.rb +4 -8
  337. data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
  338. data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
  339. data/lib/rubocop/cop/util.rb +42 -33
  340. data/lib/rubocop/cop/variable_force.rb +1 -1
  341. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  342. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  343. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  344. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
  345. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  346. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  347. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  348. data/lib/rubocop/node_pattern.rb +2 -3
  349. data/lib/rubocop/options.rb +8 -8
  350. data/lib/rubocop/path_util.rb +15 -3
  351. data/lib/rubocop/processed_source.rb +5 -2
  352. data/lib/rubocop/rspec/shared_contexts.rb +4 -0
  353. data/lib/rubocop/runner.rb +1 -1
  354. data/lib/rubocop/token.rb +74 -0
  355. data/lib/rubocop/version.rb +1 -1
  356. metadata +37 -10
  357. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  358. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  359. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  360. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -72,7 +72,7 @@ module RuboCop
72
72
  # @return [Boolean]
73
73
  # whether this offense is automatically corrected.
74
74
  def corrected
75
- @status == :unsupported ? false : @status == :corrected
75
+ @status == :corrected
76
76
  end
77
77
  alias corrected? corrected
78
78
 
@@ -137,6 +137,11 @@ module RuboCop
137
137
  location.last_line
138
138
  end
139
139
 
140
+ # @api private
141
+ def last_column
142
+ location.last_column
143
+ end
144
+
140
145
  # @api private
141
146
  def column_range
142
147
  location.column_range
@@ -56,10 +56,6 @@ module RuboCop
56
56
  MSG = 'Place `when` conditions with a splat ' \
57
57
  'at the end of the `when` branches.'.freeze
58
58
  ARRAY_MSG = 'Do not expand array literals in `when` conditions.'.freeze
59
- PERCENT_W = '%w'.freeze
60
- PERCENT_CAPITAL_W = '%W'.freeze
61
- PERCENT_I = '%i'.freeze
62
- PERCENT_CAPITAL_I = '%I'.freeze
63
59
 
64
60
  def on_case(case_node)
65
61
  when_conditions = case_node.when_branches.flat_map(&:conditions)
@@ -72,8 +68,6 @@ module RuboCop
72
68
  end
73
69
  end
74
70
 
75
- private
76
-
77
71
  def autocorrect(when_node)
78
72
  lambda do |corrector|
79
73
  if needs_reorder?(when_node)
@@ -84,6 +78,8 @@ module RuboCop
84
78
  end
85
79
  end
86
80
 
81
+ private
82
+
87
83
  def replacement(conditions)
88
84
  reordered = conditions.partition(&:splat_type?).reverse
89
85
  reordered.flatten.map(&:source).join(', ')
@@ -7,18 +7,18 @@ module RuboCop
7
7
  # can better be implemented using `casecmp`.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # str.downcase == 'abc'
12
12
  # str.upcase.eql? 'ABC'
13
13
  # 'abc' == str.downcase
14
14
  # 'ABC'.eql? str.upcase
15
15
  # str.downcase == str.downcase
16
16
  #
17
- # @good
17
+ # # good
18
18
  # str.casecmp('ABC').zero?
19
19
  # 'abc'.casecmp(str).zero?
20
20
  class Casecmp < Cop
21
- MSG = 'Use `casecmp` instead of `%s %s`.'.freeze
21
+ MSG = 'Use `casecmp` instead of `%<methods>s`.'.freeze
22
22
  CASE_METHODS = %i[downcase upcase].freeze
23
23
 
24
24
  def_node_matcher :downcase_eq, <<-PATTERN
@@ -40,7 +40,8 @@ module RuboCop
40
40
 
41
41
  inefficient_comparison(node) do |range, is_other_part, *methods|
42
42
  ignore_node(node) if is_other_part
43
- add_offense(node, location: range, message: format(MSG, *methods))
43
+ add_offense(node, location: range,
44
+ message: format(MSG, methods: methods.join(' ')))
44
45
  end
45
46
  end
46
47
 
@@ -8,13 +8,13 @@ module RuboCop
8
8
  # This cop also checks `max` and `min` methods.
9
9
  #
10
10
  # @example
11
- # @bad
11
+ # # bad
12
12
  # array.sort { |a, b| a.foo <=> b.foo }
13
13
  # array.max { |a, b| a.foo <=> b.foo }
14
14
  # array.min { |a, b| a.foo <=> b.foo }
15
15
  # array.sort { |a, b| a[:foo] <=> b[:foo] }
16
16
  #
17
- # @good
17
+ # # good
18
18
  # array.sort_by(&:foo)
19
19
  # array.sort_by { |v| v.foo }
20
20
  # array.sort_by do |var|
@@ -24,8 +24,9 @@ module RuboCop
24
24
  # array.min_by(&:foo)
25
25
  # array.sort_by { |a| a[:foo] }
26
26
  class CompareWithBlock < Cop
27
- MSG = 'Use `%s_by%s` instead of ' \
28
- '`%s { |%s, %s| %s <=> %s }`.'.freeze
27
+ MSG = 'Use `%<compare_method>s_by%<instead>s` instead of ' \
28
+ '`%<compare_method>s { |%<var_a>s, %<var_b>s| %<str_a>s ' \
29
+ '<=> %<str_b>s }`.'.freeze
29
30
 
30
31
  def_node_matcher :compare?, <<-PATTERN
31
32
  (block
@@ -85,6 +86,7 @@ module RuboCop
85
86
  true
86
87
  end
87
88
 
89
+ # rubocop:disable Metrics/MethodLength
88
90
  def message(send, method, var_a, var_b, args)
89
91
  compare_method = send.method_name
90
92
  if method == :[]
@@ -97,10 +99,14 @@ module RuboCop
97
99
  str_a = "#{var_a}.#{method}"
98
100
  str_b = "#{var_b}.#{method}"
99
101
  end
100
- format(MSG, compare_method, instead,
101
- compare_method, var_a, var_b,
102
- str_a, str_b)
102
+ format(MSG, compare_method: compare_method,
103
+ instead: instead,
104
+ var_a: var_a,
105
+ var_b: var_b,
106
+ str_a: str_a,
107
+ str_b: str_b)
103
108
  end
109
+ # rubocop:enable Metrics/MethodLength
104
110
 
105
111
  def compare_range(send, node)
106
112
  range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
@@ -40,7 +40,7 @@ module RuboCop
40
40
  class Count < Cop
41
41
  include SafeMode
42
42
 
43
- MSG = 'Use `count` instead of `%s...%s`.'.freeze
43
+ MSG = 'Use `count` instead of `%<selector>s...%<counter>s`.'.freeze
44
44
 
45
45
  def_node_matcher :count_candidate?, <<-PATTERN
46
46
  {
@@ -61,12 +61,11 @@ module RuboCop
61
61
 
62
62
  add_offense(node,
63
63
  location: range,
64
- message: format(MSG, selector, counter))
64
+ message: format(MSG, selector: selector,
65
+ counter: counter))
65
66
  end
66
67
  end
67
68
 
68
- private
69
-
70
69
  def autocorrect(node)
71
70
  selector_node, selector, _counter = count_candidate?(node)
72
71
  selector_loc = selector_node.loc.selector
@@ -81,6 +80,8 @@ module RuboCop
81
80
  end
82
81
  end
83
82
 
83
+ private
84
+
84
85
  def eligible_node?(node)
85
86
  !(node.parent && node.parent.block_type?)
86
87
  end
@@ -25,8 +25,10 @@ module RuboCop
25
25
  class Detect < Cop
26
26
  include SafeMode
27
27
 
28
- MSG = 'Use `%s` instead of `%s.%s`.'.freeze
29
- REVERSE_MSG = 'Use `reverse.%s` instead of `%s.%s`.'.freeze
28
+ MSG = 'Use `%<prefer>s` instead of ' \
29
+ '`%<first_method>s.%<second_method>s`.'.freeze
30
+ REVERSE_MSG = 'Use `reverse.%<prefer>s` instead of ' \
31
+ '`%<first_method>s.%<second_method>s`.'.freeze
30
32
 
31
33
  def_node_matcher :detect_candidate?, <<-PATTERN
32
34
  {
@@ -84,8 +86,9 @@ module RuboCop
84
86
  range = receiver.loc.selector.join(node.loc.selector)
85
87
 
86
88
  message = second_method == :last ? REVERSE_MSG : MSG
87
- formatted_message = format(message, preferred_method, first_method,
88
- second_method)
89
+ formatted_message = format(message, prefer: preferred_method,
90
+ first_method: first_method,
91
+ second_method: second_method)
89
92
 
90
93
  add_offense(node, location: range, message: formatted_message)
91
94
  end
@@ -8,19 +8,14 @@ module RuboCop
8
8
  # with an single `#start_with?`/`#end_with?` call.
9
9
  #
10
10
  # @example
11
- #
12
- # @bad
11
+ # # bad
13
12
  # str.start_with?("a") || str.start_with?(Some::CONST)
14
13
  # str.start_with?("a", "b") || str.start_with?("c")
15
- # var1 = ...
16
- # var2 = ...
17
14
  # str.end_with?(var1) || str.end_with?(var2)
18
15
  #
19
- # @good
16
+ # # good
20
17
  # str.start_with?("a", Some::CONST)
21
18
  # str.start_with?("a", "b", "c")
22
- # var1 = ...
23
- # var2 = ...
24
19
  # str.end_with?(var1, var2)
25
20
  class DoubleStartEndWith < Cop
26
21
  MSG = 'Use `%<receiver>s.%<method>s(%<combined_args>s)` ' \
@@ -7,11 +7,11 @@ module RuboCop
7
7
  # would suffice.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # 'abc' =~ /bc\Z/
12
12
  # 'abc'.match(/bc\Z/)
13
13
  #
14
- # @good
14
+ # # good
15
15
  # 'abc'.end_with?('bc')
16
16
  class EndWith < Cop
17
17
  MSG = 'Use `String#end_with?` instead of a regex match anchored to ' \
@@ -15,7 +15,7 @@ module RuboCop
15
15
  # [1, 2, 3, 4].map { |e| [e, e] }.flatten
16
16
  # [1, 2, 3, 4].collect { |e| [e, e] }.flatten
17
17
  class FlatMap < Cop
18
- MSG = 'Use `flat_map` instead of `%s...%s`.'.freeze
18
+ MSG = 'Use `flat_map` instead of `%<method>s...%<flatten>s`.'.freeze
19
19
  FLATTEN_MULTIPLE_LEVELS = ' Beware, `flat_map` only flattens 1 level ' \
20
20
  'and `flatten` can be used to flatten ' \
21
21
  'multiple levels.'.freeze
@@ -67,7 +67,8 @@ module RuboCop
67
67
 
68
68
  add_offense(node,
69
69
  location: range,
70
- message: format(message, first_method, flatten))
70
+ message: format(message, method: first_method,
71
+ flatten: flatten))
71
72
  end
72
73
  end
73
74
  end
@@ -7,7 +7,7 @@ module RuboCop
7
7
  #
8
8
  # Note: If you have an array of two-element arrays, you can put
9
9
  # parentheses around the block arguments to indicate that you're not
10
- # working with a hash, and supress RuboCop offenses.
10
+ # working with a hash, and suppress RuboCop offenses.
11
11
  #
12
12
  # @example
13
13
  # # bad
@@ -22,10 +22,10 @@ module RuboCop
22
22
  class HashEachMethods < Cop
23
23
  include Lint::UnusedArgument
24
24
 
25
- MSG = 'Use `%s` instead of `%s`.'.freeze
25
+ MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
26
26
 
27
27
  def_node_matcher :plain_each, <<-PATTERN
28
- (block $(send !(send _ :to_a) :each) (args (arg $_k) (arg $_v)) ...)
28
+ (block $(send !(send _ :to_a) :each) (args $(arg _k) $(arg _v)) ...)
29
29
  PATTERN
30
30
 
31
31
  def_node_matcher :kv_each, <<-PATTERN
@@ -37,24 +37,39 @@ module RuboCop
37
37
  register_kv_offense(node)
38
38
  end
39
39
 
40
+ def autocorrect(node)
41
+ receiver = node.receiver
42
+ _caller, first_method = *receiver
43
+
44
+ lambda do |corrector|
45
+ case first_method
46
+ when :keys, :values
47
+ correct_key_value_each(node, corrector)
48
+ else
49
+ correct_plain_each(node, corrector)
50
+ end
51
+ end
52
+ end
53
+
40
54
  private
41
55
 
42
56
  def register_each_offense(node)
43
57
  plain_each(node) do |target, k, v|
44
- return if @args[k] && @args[v]
45
- used = @args[k] ? :key : :value
58
+ return if used?(k) && used?(v)
59
+ used = used?(k) ? :key : :value
46
60
 
47
61
  add_offense(
48
62
  target,
49
63
  location: plain_range(target),
50
- message: format(message, "each_#{used}", :each)
64
+ message: format(message, prefer: "each_#{used}", current: :each)
51
65
  )
52
66
  end
53
67
  end
54
68
 
55
69
  def register_kv_offense(node)
56
70
  kv_each(node) do |target, method|
57
- msg = format(message, "each_#{method[0..-2]}", "#{method}.each")
71
+ msg = format(message, prefer: "each_#{method[0..-2]}",
72
+ current: "#{method}.each")
58
73
 
59
74
  add_offense(target, location: kv_range(target), message: msg)
60
75
  end
@@ -62,56 +77,43 @@ module RuboCop
62
77
 
63
78
  def check_argument(variable)
64
79
  return unless variable.block_argument?
65
- (@args ||= {})[variable.name] = variable.used?
80
+ (@block_args ||= []).push(variable)
66
81
  end
67
82
 
68
- def autocorrect(node)
69
- receiver, _second_method = *node
70
- _caller, first_method = *receiver
71
-
72
- lambda do |corrector|
73
- case first_method
74
- when :keys, :values
75
- return correct_implicit(node, corrector) if receiver.receiver.nil?
76
-
77
- correct_key_value_each(node, corrector)
78
- else
79
- return correct_implicit(node, corrector) if receiver.nil?
80
-
81
- correct_plain_each(node, corrector)
82
- end
83
- end
83
+ def used?(arg)
84
+ loc = arg.loc
85
+ variable = @block_args.find { |var| var.declaration_node.loc == loc }
86
+ variable.used?
84
87
  end
85
88
 
86
- def correct_implicit(node, corrector)
87
- method = @args.include?(:k) ? :key : :value
88
- new_source = "each_#{method}"
89
-
90
- corrector.replace(node.loc.expression, new_source)
89
+ def correct_implicit(node, corrector, method_name)
90
+ corrector.replace(node.loc.expression, method_name)
91
91
  correct_args(node, corrector)
92
92
  end
93
93
 
94
94
  def correct_key_value_each(node, corrector)
95
- receiver = node.receiver
95
+ receiver = node.receiver.receiver
96
+ name = "each_#{node.receiver.method_name.to_s.chop}"
97
+ return correct_implicit(node, corrector, name) unless receiver
96
98
 
97
- new_source = receiver.receiver.source +
98
- ".each_#{receiver.method_name[0..-2]}"
99
+ new_source = receiver.source + ".#{name}"
99
100
  corrector.replace(node.loc.expression, new_source)
100
101
  end
101
102
 
102
103
  def correct_plain_each(node, corrector)
103
- method = @args.include?(:k) ? :key : :value
104
- new_source = node.receiver.source + ".each_#{method}"
104
+ _each, key, _value = plain_each(node.parent)
105
+ name = used?(key) ? 'each_key' : 'each_value'
106
+ return correct_implicit(node, corrector, name) unless node.receiver
105
107
 
106
- corrector.replace(node.loc.expression, new_source)
108
+ corrector.replace(node.loc.selector, name)
107
109
  correct_args(node, corrector)
108
110
  end
109
111
 
110
112
  def correct_args(node, corrector)
111
- args = node.parent.children[1]
112
- used_arg = "|#{@args.detect { |_k, v| v }.first}|"
113
+ args = node.parent.arguments
114
+ name, = *args.children.find { |arg| used?(arg) }
113
115
 
114
- corrector.replace(args.source_range, used_arg)
116
+ corrector.replace(args.source_range, "|#{name}|")
115
117
  end
116
118
 
117
119
  def plain_range(outer_node)
@@ -119,8 +121,7 @@ module RuboCop
119
121
  end
120
122
 
121
123
  def kv_range(outer_node)
122
- inner_node = outer_node.children.first
123
- inner_node.loc.selector.join(outer_node.loc.selector)
124
+ outer_node.receiver.loc.selector.join(outer_node.loc.selector)
124
125
  end
125
126
  end
126
127
  end
@@ -7,14 +7,14 @@ module RuboCop
7
7
  # `strip`.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # 'abc'.lstrip.rstrip
12
12
  # 'abc'.rstrip.lstrip
13
13
  #
14
- # @good
14
+ # # good
15
15
  # 'abc'.strip
16
16
  class LstripRstrip < Cop
17
- MSG = 'Use `strip` instead of `%s.%s`.'.freeze
17
+ MSG = 'Use `strip` instead of `%<methods>s`.'.freeze
18
18
 
19
19
  def_node_matcher :lstrip_rstrip, <<-PATTERN
20
20
  {(send $(send _ $:rstrip) $:lstrip)
@@ -27,7 +27,8 @@ module RuboCop
27
27
  node.source_range.end_pos)
28
28
  add_offense(node,
29
29
  location: range,
30
- message: format(MSG, method_one, method_two))
30
+ message: format(MSG,
31
+ methods: "#{method_one}.#{method_two}"))
31
32
  end
32
33
  end
33
34
 
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # where `yield` would do just as well.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # def method(&block)
12
12
  # block.call
13
13
  # end
@@ -15,7 +15,7 @@ module RuboCop
15
15
  # func.call 1, 2, 3
16
16
  # end
17
17
  #
18
- # @good
18
+ # # good
19
19
  # def method
20
20
  # yield
21
21
  # end
@@ -23,7 +23,7 @@ module RuboCop
23
23
  # yield 1, 2, 3
24
24
  # end
25
25
  class RedundantBlockCall < Cop
26
- MSG = 'Use `yield` instead of `%s.call`.'.freeze
26
+ MSG = 'Use `yield` instead of `%<argname>s.call`.'.freeze
27
27
  YIELD = 'yield'.freeze
28
28
  OPEN_PAREN = '('.freeze
29
29
  CLOSE_PAREN = ')'.freeze
@@ -47,29 +47,11 @@ module RuboCop
47
47
  next unless body
48
48
 
49
49
  calls_to_report(argname, body).each do |blockcall|
50
- add_offense(blockcall, message: format(MSG, argname))
50
+ add_offense(blockcall, message: format(MSG, argname: argname))
51
51
  end
52
52
  end
53
53
  end
54
54
 
55
- private
56
-
57
- def calls_to_report(argname, body)
58
- return [] if blockarg_assigned?(body, argname)
59
-
60
- calls = to_enum(:blockarg_calls, body, argname)
61
-
62
- return [] if calls.any? { |call| args_include_block_pass?(call) }
63
-
64
- calls
65
- end
66
-
67
- def args_include_block_pass?(blockcall)
68
- _receiver, _call, *args = *blockcall
69
-
70
- args.any?(&:block_pass_type?)
71
- end
72
-
73
55
  # offenses are registered on the `block.call` nodes
74
56
  def autocorrect(node)
75
57
  _receiver, _method, *args = *node
@@ -87,6 +69,24 @@ module RuboCop
87
69
  new_source << CLOSE_PAREN if parentheses?(node) && !args.empty?
88
70
  ->(corrector) { corrector.replace(node.source_range, new_source) }
89
71
  end
72
+
73
+ private
74
+
75
+ def calls_to_report(argname, body)
76
+ return [] if blockarg_assigned?(body, argname)
77
+
78
+ calls = to_enum(:blockarg_calls, body, argname)
79
+
80
+ return [] if calls.any? { |call| args_include_block_pass?(call) }
81
+
82
+ calls
83
+ end
84
+
85
+ def args_include_block_pass?(blockcall)
86
+ _receiver, _call, *args = *blockcall
87
+
88
+ args.any?(&:block_pass_type?)
89
+ end
90
90
  end
91
91
  end
92
92
  end