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
@@ -4,6 +4,27 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks for usage of the %Q() syntax when %q() would do.
7
+ #
8
+ # @example EnforcedStyle: lower_case_q (default)
9
+ # # The `lower_case_q` style prefers `%q` unless
10
+ # # interpolation is needed.
11
+ # # bad
12
+ # %Q[Mix the foo into the baz.]
13
+ # %Q(They all said: 'Hooray!')
14
+ #
15
+ # # good
16
+ # %q[Mix the foo into the baz]
17
+ # %q(They all said: 'Hooray!')
18
+ #
19
+ # @example EnforcedStyle: upper_case_q
20
+ # # The `upper_case_q` style requires the sole use of `%Q`.
21
+ # # bad
22
+ # %q/Mix the foo into the baz./
23
+ # %q{They all said: 'Hooray!'}
24
+ #
25
+ # # good
26
+ # %Q/Mix the foo into the baz./
27
+ # %Q{They all said: 'Hooray!'}
7
28
  class PercentQLiterals < Cop
8
29
  include PercentLiteral
9
30
  include ConfigurableEnforcedStyle
@@ -16,6 +37,12 @@ module RuboCop
16
37
  process(node, '%Q', '%q')
17
38
  end
18
39
 
40
+ def autocorrect(node)
41
+ lambda do |corrector|
42
+ corrector.replace(node.source_range, corrected(node.source))
43
+ end
44
+ end
45
+
19
46
  private
20
47
 
21
48
  def on_percent_literal(node)
@@ -37,12 +64,6 @@ module RuboCop
37
64
  style == :lower_case_q ? LOWER_CASE_Q_MSG : UPPER_CASE_Q_MSG
38
65
  end
39
66
 
40
- def autocorrect(node)
41
- lambda do |corrector|
42
- corrector.replace(node.source_range, corrected(node.source))
43
- end
44
- end
45
-
46
67
  def corrected(src)
47
68
  src.sub(src[1], src[1].swapcase)
48
69
  end
@@ -5,6 +5,13 @@ module RuboCop
5
5
  module Style
6
6
  # This cop looks for uses of Perl-style regexp match
7
7
  # backreferences like $1, $2, etc.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # puts $1
12
+ #
13
+ # # good
14
+ # puts Regexp.last_match(1)
8
15
  class PerlBackrefs < Cop
9
16
  MSG = 'Avoid the use of Perl-style backrefs.'.freeze
10
17
 
@@ -8,10 +8,7 @@ module RuboCop
8
8
  # It is configurable to enforce the inverse, using `verbose` method
9
9
  # names also.
10
10
  #
11
- # @example
12
- #
13
- # # EnforcedStyle: short (default)
14
- #
11
+ # @example EnforcedStyle: short (default)
15
12
  # # bad
16
13
  # Hash#has_key?
17
14
  # Hash#has_value?
@@ -20,10 +17,7 @@ module RuboCop
20
17
  # Hash#key?
21
18
  # Hash#value?
22
19
  #
23
- # @example
24
- #
25
- # # EnforcedStyle: verbose
26
- #
20
+ # @example EnforcedStyle: verbose
27
21
  # # bad
28
22
  # Hash#key?
29
23
  # Hash#value?
@@ -34,7 +28,7 @@ module RuboCop
34
28
  class PreferredHashMethods < Cop
35
29
  include ConfigurableEnforcedStyle
36
30
 
37
- MSG = 'Use `Hash#%s` instead of `Hash#%s`.'.freeze
31
+ MSG = 'Use `Hash#%<prefer>s` instead of `Hash#%<current>s`.'.freeze
38
32
 
39
33
  OFFENDING_SELECTORS = {
40
34
  short: %i[has_key? has_value?],
@@ -58,7 +52,9 @@ module RuboCop
58
52
  private
59
53
 
60
54
  def message(node)
61
- format(MSG, proper_method_name(node.method_name), node.method_name)
55
+ format(MSG,
56
+ prefer: proper_method_name(node.method_name),
57
+ current: node.method_name)
62
58
  end
63
59
 
64
60
  def proper_method_name(method_name)
@@ -5,6 +5,14 @@ module RuboCop
5
5
  module Style
6
6
  # This cops checks for uses of Proc.new where Kernel#proc
7
7
  # would be more appropriate.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # p = Proc.new { |n| puts n }
12
+ #
13
+ # # good
14
+ # p = proc { |n| puts n }
15
+ #
8
16
  class Proc < Cop
9
17
  MSG = 'Use `proc` instead of `Proc.new`.'.freeze
10
18
 
@@ -13,10 +13,7 @@ module RuboCop
13
13
  # will also suggest constructing error objects when the exception is
14
14
  # passed multiple arguments.
15
15
  #
16
- # @example
17
- #
18
- # # EnforcedStyle: exploded
19
- #
16
+ # @example EnforcedStyle: exploded (default)
20
17
  # # bad
21
18
  # raise StandardError.new("message")
22
19
  #
@@ -26,10 +23,7 @@ module RuboCop
26
23
  # raise MyCustomError.new(arg1, arg2, arg3)
27
24
  # raise MyKwArgError.new(key1: val1, key2: val2)
28
25
  #
29
- # @example
30
- #
31
- # # EnforcedStyle: compact
32
- #
26
+ # @example EnforcedStyle: compact
33
27
  # # bad
34
28
  # raise StandardError, "message"
35
29
  # raise RuntimeError, arg1, arg2, arg3
@@ -42,9 +36,9 @@ module RuboCop
42
36
  include ConfigurableEnforcedStyle
43
37
 
44
38
  EXPLODED_MSG = 'Provide an exception class and message ' \
45
- 'as arguments to `%s`.'.freeze
39
+ 'as arguments to `%<method>s`.'.freeze
46
40
  COMPACT_MSG = 'Provide an exception object ' \
47
- 'as an argument to `%s`.'.freeze
41
+ 'as an argument to `%<method>s`.'.freeze
48
42
 
49
43
  def on_send(node)
50
44
  return unless node.command?(:raise) || node.command?(:fail)
@@ -57,8 +51,6 @@ module RuboCop
57
51
  end
58
52
  end
59
53
 
60
- private
61
-
62
54
  def autocorrect(node)
63
55
  replacement = if style == :compact
64
56
  correction_exploded_to_compact(node)
@@ -69,6 +61,8 @@ module RuboCop
69
61
  ->(corrector) { corrector.replace(node.source_range, replacement) }
70
62
  end
71
63
 
64
+ private
65
+
72
66
  def correction_compact_to_exploded(node)
73
67
  exception_node, _new, message_node = *node.first_argument
74
68
 
@@ -128,9 +122,9 @@ module RuboCop
128
122
 
129
123
  def message(node)
130
124
  if style == :compact
131
- format(COMPACT_MSG, node.method_name)
125
+ format(COMPACT_MSG, method: node.method_name)
132
126
  else
133
- format(EXPLODED_MSG, node.method_name)
127
+ format(EXPLODED_MSG, method: node.method_name)
134
128
  end
135
129
  end
136
130
  end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for the use of randomly generated numbers,
7
+ # added/subtracted with integer literals, as well as those with
8
+ # Integer#succ and Integer#pred methods. Prefer using ranges instead,
9
+ # as it clearly states the intentions.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # rand(6) + 1
14
+ # 1 + rand(6)
15
+ # rand(6) - 1
16
+ # 1 - rand(6)
17
+ # rand(6).succ
18
+ # rand(6).pred
19
+ # Random.rand(6) + 1
20
+ # Kernel.rand(6) + 1
21
+ # rand(0..5) + 1
22
+ #
23
+ # # good
24
+ # rand(1..6)
25
+ # rand(1...7)
26
+ class RandomWithOffset < Cop
27
+ MSG = 'Prefer ranges when generating random numbers instead of ' \
28
+ 'integers with offsets.'.freeze
29
+
30
+ def_node_matcher :integer_op_rand?, <<-PATTERN
31
+ (send
32
+ int {:+ :-}
33
+ (send
34
+ {nil? (const nil? :Random) (const nil? :Kernel)}
35
+ :rand
36
+ {int irange erange}))
37
+ PATTERN
38
+
39
+ def_node_matcher :rand_op_integer?, <<-PATTERN
40
+ (send
41
+ (send
42
+ {nil? (const nil? :Random) (const nil? :Kernel)}
43
+ :rand
44
+ {int irange erange})
45
+ {:+ :-}
46
+ int)
47
+ PATTERN
48
+
49
+ def_node_matcher :rand_modified?, <<-PATTERN
50
+ (send
51
+ (send
52
+ {nil? (const nil? :Random) (const nil? :Kernel)}
53
+ :rand
54
+ {int irange erange})
55
+ {:succ :pred :next})
56
+ PATTERN
57
+
58
+ def on_send(node)
59
+ return unless integer_op_rand?(node) ||
60
+ rand_op_integer?(node) ||
61
+ rand_modified?(node)
62
+ add_offense(node)
63
+ end
64
+
65
+ def autocorrect(node)
66
+ lambda do |corrector|
67
+ if integer_op_rand?(node)
68
+ corrector.replace(node.source_range,
69
+ corrected_integer_op_rand(node))
70
+ elsif rand_op_integer?(node)
71
+ corrector.replace(node.source_range,
72
+ corrected_rand_op_integer(node))
73
+ elsif rand_modified?(node)
74
+ corrector.replace(node.source_range,
75
+ corrected_rand_modified(node))
76
+ end
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def corrected_integer_op_rand(node)
83
+ left, operator, right = *node
84
+
85
+ offset = int_from_int_node(left)
86
+
87
+ prefix_node, _, random_node = *right
88
+
89
+ prefix = prefix_from_prefix_node(prefix_node)
90
+ left_int, right_int = boundaries_from_random_node(random_node)
91
+
92
+ if operator == :+
93
+ "#{prefix}(#{offset + left_int}..#{offset + right_int})"
94
+ else
95
+ "#{prefix}(#{offset - right_int}..#{offset - left_int})"
96
+ end
97
+ end
98
+
99
+ def corrected_rand_op_integer(node)
100
+ left, operator, right = *node
101
+
102
+ prefix_node, _, random_node = *left
103
+
104
+ offset = int_from_int_node(right)
105
+
106
+ prefix = prefix_from_prefix_node(prefix_node)
107
+ left_int, right_int = boundaries_from_random_node(random_node)
108
+
109
+ if operator == :+
110
+ "#{prefix}(#{left_int + offset}..#{right_int + offset})"
111
+ else
112
+ "#{prefix}(#{left_int - offset}..#{right_int - offset})"
113
+ end
114
+ end
115
+
116
+ def corrected_rand_modified(node)
117
+ rand, method = *node
118
+ prefix_node, _, random_node = *rand
119
+
120
+ prefix = prefix_from_prefix_node(prefix_node)
121
+ left_int, right_int = boundaries_from_random_node(random_node)
122
+
123
+ if %i[succ next].include?(method)
124
+ "#{prefix}(#{left_int + 1}..#{right_int + 1})"
125
+ elsif method == :pred
126
+ "#{prefix}(#{left_int - 1}..#{right_int - 1})"
127
+ end
128
+ end
129
+
130
+ def prefix_from_prefix_node(node)
131
+ if node.nil?
132
+ 'rand'
133
+ else
134
+ _, prefix = *node
135
+ "#{prefix}.rand"
136
+ end
137
+ end
138
+
139
+ def boundaries_from_random_node(random_node)
140
+ children = random_node.children
141
+
142
+ case random_node.type
143
+ when :int
144
+ [0, int_from_int_node(random_node) - 1]
145
+ when :irange
146
+ [int_from_int_node(children.first),
147
+ int_from_int_node(children[1])]
148
+ when :erange
149
+ [int_from_int_node(children.first),
150
+ int_from_int_node(children[1]) - 1]
151
+ end
152
+ end
153
+
154
+ def int_from_int_node(node)
155
+ node.children.first
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -28,13 +28,15 @@ module RuboCop
28
28
  MSG = 'Redundant `begin` block detected.'.freeze
29
29
 
30
30
  def on_def(node)
31
- return unless node.body && node.body.kwbegin_type?
32
-
33
- add_offense(node.body, location: :begin)
31
+ check(node)
34
32
  end
35
33
  alias on_defs on_def
36
34
 
37
- private
35
+ def on_block(node)
36
+ return if target_ruby_version < 2.5
37
+ return if node.braces?
38
+ check(node)
39
+ end
38
40
 
39
41
  def autocorrect(node)
40
42
  lambda do |corrector|
@@ -42,6 +44,14 @@ module RuboCop
42
44
  corrector.remove(node.loc.end)
43
45
  end
44
46
  end
47
+
48
+ private
49
+
50
+ def check(node)
51
+ return unless node.body && node.body.kwbegin_type?
52
+
53
+ add_offense(node.body, location: :begin)
54
+ end
45
55
  end
46
56
  end
47
57
  end
@@ -29,7 +29,8 @@ module RuboCop
29
29
 
30
30
  COMPARISON_OPERATORS = RuboCop::AST::Node::COMPARISON_OPERATORS
31
31
 
32
- MSG = 'This conditional expression can just be replaced by `%s`.'.freeze
32
+ MSG = 'This conditional expression can just be replaced ' \
33
+ 'by `%<msg>s`.'.freeze
33
34
 
34
35
  def on_if(node)
35
36
  return unless offense?(node)
@@ -37,13 +38,19 @@ module RuboCop
37
38
  add_offense(node)
38
39
  end
39
40
 
41
+ def autocorrect(node)
42
+ lambda do |corrector|
43
+ corrector.replace(node.loc.expression, replacement_condition(node))
44
+ end
45
+ end
46
+
40
47
  private
41
48
 
42
49
  def message(node)
43
50
  replacement = replacement_condition(node)
44
51
  msg = node.elsif? ? "\n#{replacement}" : replacement
45
52
 
46
- format(MSG, msg)
53
+ format(MSG, msg: msg)
47
54
  end
48
55
 
49
56
  def_node_matcher :redundant_condition?, <<-RUBY
@@ -59,12 +66,6 @@ module RuboCop
59
66
  redundant_condition?(node) || redundant_condition_inverted?(node)
60
67
  end
61
68
 
62
- def autocorrect(node)
63
- lambda do |corrector|
64
- corrector.replace(node.loc.expression, replacement_condition(node))
65
- end
66
- end
67
-
68
69
  def replacement_condition(node)
69
70
  condition = node.condition.source
70
71
  expression = invert_expression?(node) ? "!(#{condition})" : condition
@@ -31,9 +31,7 @@ module RuboCop
31
31
  end
32
32
  alias on_defs on_def
33
33
 
34
- private
35
-
36
- def autocorrect(node)
34
+ def autocorrect(node) # rubocop:disable Metrics/MethodLength
37
35
  lambda do |corrector|
38
36
  unless arguments?(node.children)
39
37
  corrector.replace(node.source_range, 'nil')
@@ -46,11 +44,14 @@ module RuboCop
46
44
  elsif return_value.hash_type?
47
45
  add_braces(corrector, return_value) unless return_value.braces?
48
46
  end
49
- return_kw = range_with_surrounding_space(node.loc.keyword, :right)
47
+ return_kw = range_with_surrounding_space(range: node.loc.keyword,
48
+ side: :right)
50
49
  corrector.remove(return_kw)
51
50
  end
52
51
  end
53
52
 
53
+ private
54
+
54
55
  def add_brackets(corrector, node)
55
56
  kids = node.children.map(&:source_range)
56
57
  corrector.insert_before(kids.first, '[')