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
@@ -8,13 +8,13 @@ module RuboCop
8
8
  # index/`nil` and is more performant.
9
9
  #
10
10
  # @example
11
- # @bad
11
+ # # bad
12
12
  # do_something if str.match(/regex/)
13
13
  # while regex.match('str')
14
14
  # do_something
15
15
  # end
16
16
  #
17
- # @good
17
+ # # good
18
18
  # method(str =~ /regex/)
19
19
  # return value unless regex =~ 'str'
20
20
  class RedundantMatch < Cop
@@ -11,8 +11,8 @@ module RuboCop
11
11
  # hash.merge!({'key' => 'value'})
12
12
  # hash.merge!(a: 1, b: 2)
13
13
  class RedundantMerge < Cop
14
- AREF_ASGN = '%s[%s] = %s'.freeze
15
- MSG = 'Use `%s` instead of `%s`.'.freeze
14
+ AREF_ASGN = '%<receiver>s[%<key>s] = %<value>s'.freeze
15
+ MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
16
16
 
17
17
  def_node_matcher :redundant_merge_candidate, <<-PATTERN
18
18
  (send $!nil? :merge! [(hash $...) !kwsplat_type?])
@@ -46,7 +46,7 @@ module RuboCop
46
46
  redundant_merge_candidate(node) do |receiver, pairs|
47
47
  assignments = to_assignments(receiver, pairs).join('; ')
48
48
 
49
- format(MSG, assignments, node.source)
49
+ format(MSG, prefer: assignments, current: node.source)
50
50
  end
51
51
  end
52
52
 
@@ -94,7 +94,9 @@ module RuboCop
94
94
 
95
95
  key = key.sym_type? && pair.colon? ? ":#{key.source}" : key.source
96
96
 
97
- format(AREF_ASGN, receiver.source, key, value.source)
97
+ format(AREF_ASGN, receiver: receiver.source,
98
+ key: key,
99
+ value: value.source)
98
100
  end
99
101
  end
100
102
 
@@ -7,16 +7,16 @@ module RuboCop
7
7
  # `sort`.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # array.sort_by { |x| x }
12
12
  # array.sort_by do |var|
13
13
  # var
14
14
  # end
15
15
  #
16
- # @good
16
+ # # good
17
17
  # array.sort
18
18
  class RedundantSortBy < Cop
19
- MSG = 'Use `sort` instead of `sort_by { |%s| %s }`.'.freeze
19
+ MSG = 'Use `sort` instead of `sort_by { |%<var>s| %<var>s }`.'.freeze
20
20
 
21
21
  def_node_matcher :redundant_sort_by, <<-PATTERN
22
22
  (block $(send _ :sort_by) (args (arg $_x)) (lvar _x))
@@ -28,7 +28,7 @@ module RuboCop
28
28
 
29
29
  add_offense(node,
30
30
  location: range,
31
- message: format(MSG, var_name, var_name))
31
+ message: format(MSG, var: var_name))
32
32
  end
33
33
  end
34
34
 
@@ -64,7 +64,8 @@ module RuboCop
64
64
  minimum_target_ruby_version 2.4
65
65
 
66
66
  MSG =
67
- 'Use `match?` instead of `%s` when `MatchData` is not used.'.freeze
67
+ 'Use `match?` instead of `%<current>s` when `MatchData` ' \
68
+ 'is not used.'.freeze
68
69
 
69
70
  def_node_matcher :match_method?, <<-PATTERN
70
71
  {
@@ -147,7 +148,7 @@ module RuboCop
147
148
  end
148
149
 
149
150
  def message(node)
150
- format(MSG, node.loc.selector.source)
151
+ format(MSG, current: node.loc.selector.source)
151
152
  end
152
153
 
153
154
  def last_match_used?(match_node)
@@ -32,12 +32,12 @@ module RuboCop
32
32
  add_offense(node, location: :selector)
33
33
  end
34
34
 
35
- private
36
-
37
35
  def autocorrect(node)
38
36
  ->(corrector) { corrector.replace(node.loc.selector, 'size') }
39
37
  end
40
38
 
39
+ private
40
+
41
41
  def eligible_node?(node)
42
42
  return false unless node.method?(:count) && !node.arguments?
43
43
 
@@ -7,11 +7,11 @@ module RuboCop
7
7
  # `String#start_with?` would suffice.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # 'abc' =~ /\Aab/
12
12
  # 'abc'.match(/\Aab/)
13
13
  #
14
- # @good
14
+ # # good
15
15
  # 'abc'.start_with?('ab')
16
16
  class StartWith < Cop
17
17
  MSG = 'Use `String#start_with?` instead of a regex match anchored to ' \
@@ -7,19 +7,19 @@ module RuboCop
7
7
  # `tr` or `delete`.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # 'abc'.gsub('b', 'd')
12
12
  # 'abc'.gsub('a', '')
13
13
  # 'abc'.gsub(/a/, 'd')
14
14
  # 'abc'.gsub!('a', 'd')
15
15
  #
16
- # @good
16
+ # # good
17
17
  # 'abc'.gsub(/.*/, 'a')
18
18
  # 'abc'.gsub(/a+/, 'd')
19
19
  # 'abc'.tr('b', 'd')
20
20
  # 'a b c'.delete(' ')
21
21
  class StringReplacement < Cop
22
- MSG = 'Use `%s` instead of `%s`.'.freeze
22
+ MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
23
23
  DETERMINISTIC_REGEX = /\A(?:#{LITERAL_REGEX})+\Z/
24
24
  DELETE = 'delete'.freeze
25
25
  TR = 'tr'.freeze
@@ -151,7 +151,7 @@ module RuboCop
151
151
  replacement_method =
152
152
  replacement_method(node, first_source, second_source)
153
153
 
154
- format(MSG, replacement_method, node.method_name)
154
+ format(MSG, prefer: replacement_method, current: node.method_name)
155
155
  end
156
156
 
157
157
  def method_suffix(node)
@@ -8,13 +8,12 @@ module RuboCop
8
8
  # with an explicit array creation.
9
9
  #
10
10
  # @example
11
- #
12
- # @bad
11
+ # # bad
13
12
  # 9.times.map do |i|
14
13
  # i.to_s
15
14
  # end
16
15
  #
17
- # @good
16
+ # # good
18
17
  # Array.new(9) do |i|
19
18
  # i.to_s
20
19
  # end
@@ -31,6 +30,18 @@ module RuboCop
31
30
  check(node)
32
31
  end
33
32
 
33
+ def autocorrect(node)
34
+ map_or_collect, count = times_map_call(node)
35
+
36
+ replacement =
37
+ "Array.new(#{count.source}" \
38
+ "#{map_or_collect.arguments.map { |arg| ", #{arg.source}" }.join})"
39
+
40
+ lambda do |corrector|
41
+ corrector.replace(map_or_collect.loc.expression, replacement)
42
+ end
43
+ end
44
+
34
45
  private
35
46
 
36
47
  def check(node)
@@ -54,18 +65,6 @@ module RuboCop
54
65
  {(block $(send (send $!nil? :times) {:map :collect}) ...)
55
66
  $(send (send $!nil? :times) {:map :collect} (block_pass ...))}
56
67
  PATTERN
57
-
58
- def autocorrect(node)
59
- map_or_collect, count = times_map_call(node)
60
-
61
- replacement =
62
- "Array.new(#{count.source}" \
63
- "#{map_or_collect.arguments.map { |arg| ", #{arg.source}" }.join})"
64
-
65
- lambda do |corrector|
66
- corrector.replace(map_or_collect.loc.expression, replacement)
67
- end
68
- end
69
68
  end
70
69
  end
71
70
  end
@@ -14,8 +14,8 @@ module RuboCop
14
14
  # URI::DEFAULT_PARSER
15
15
  #
16
16
  class UriDefaultParser < Cop
17
- MSG = 'Use `%sURI::DEFAULT_PARSER` instead of ' \
18
- '`%sURI::Parser.new`.'.freeze
17
+ MSG = 'Use `%<double_colon>sURI::DEFAULT_PARSER` instead of ' \
18
+ '`%<double_colon>sURI::Parser.new`.'.freeze
19
19
 
20
20
  def_node_matcher :uri_parser_new?, <<-PATTERN
21
21
  (send
@@ -26,7 +26,7 @@ module RuboCop
26
26
  def on_send(node)
27
27
  return unless uri_parser_new?(node) do |captured_value|
28
28
  double_colon = captured_value ? '::' : ''
29
- message = format(MSG, double_colon, double_colon)
29
+ message = format(MSG, double_colon: double_colon)
30
30
 
31
31
  add_offense(node, message: message)
32
32
  end
@@ -10,6 +10,28 @@ module RuboCop
10
10
  #
11
11
  # If the TargetRailsVersion is set to less than 4.0, the cop will enforce
12
12
  # the use of filter methods.
13
+ #
14
+ # @example EnforcedStyle: action (default)
15
+ # # bad
16
+ # after_filter :do_stuff
17
+ # append_around_filter :do_stuff
18
+ # skip_after_filter :do_stuff
19
+ #
20
+ # # good
21
+ # after_action :do_stuff
22
+ # append_around_action :do_stuff
23
+ # skip_after_action :do_stuff
24
+ #
25
+ # @example EnforcedStyle: filter
26
+ # # bad
27
+ # after_action :do_stuff
28
+ # append_around_action :do_stuff
29
+ # skip_after_action :do_stuff
30
+ #
31
+ # # good
32
+ # after_filter :do_stuff
33
+ # append_around_filter :do_stuff
34
+ # skip_after_filter :do_stuff
13
35
  class ActionFilter < Cop
14
36
  extend TargetRailsVersion
15
37
  include ConfigurableEnforcedStyle
@@ -44,8 +44,6 @@ module RuboCop
44
44
  end
45
45
  end
46
46
 
47
- private
48
-
49
47
  def autocorrect(node)
50
48
  return false if append(node)
51
49
  lambda do |corrector|
@@ -55,6 +53,8 @@ module RuboCop
55
53
  end
56
54
  end
57
55
 
56
+ private
57
+
58
58
  def register_offense(node, method_name)
59
59
  add_offense(
60
60
  node,
@@ -9,12 +9,12 @@ module RuboCop
9
9
  #
10
10
  # # good
11
11
  # class Rails5Job < ApplicationJob
12
- # ...
12
+ # # ...
13
13
  # end
14
14
  #
15
15
  # # bad
16
16
  # class Rails4Job < ActiveJob::Base
17
- # ...
17
+ # # ...
18
18
  # end
19
19
  class ApplicationJob < Cop
20
20
  extend TargetRailsVersion
@@ -25,7 +25,9 @@ module RuboCop
25
25
  SUPERCLASS = 'ApplicationJob'.freeze
26
26
  BASE_PATTERN = '(const (const nil? :ActiveJob) :Base)'.freeze
27
27
 
28
+ # rubocop:disable Layout/ClassStructure
28
29
  include RuboCop::Cop::EnforceSuperclass
30
+ # rubocop:enable Layout/ClassStructure
29
31
  end
30
32
  end
31
33
  end
@@ -9,12 +9,12 @@ module RuboCop
9
9
  #
10
10
  # # good
11
11
  # class Rails5Model < ApplicationRecord
12
- # ...
12
+ # # ...
13
13
  # end
14
14
  #
15
15
  # # bad
16
16
  # class Rails4Model < ActiveRecord::Base
17
- # ...
17
+ # # ...
18
18
  # end
19
19
  class ApplicationRecord < Cop
20
20
  extend TargetRailsVersion
@@ -25,7 +25,9 @@ module RuboCop
25
25
  SUPERCLASS = 'ApplicationRecord'.freeze
26
26
  BASE_PATTERN = '(const (const nil? :ActiveRecord) :Base)'.freeze
27
27
 
28
+ # rubocop:disable Layout/ClassStructure
28
29
  include RuboCop::Cop::EnforceSuperclass
30
+ # rubocop:enable Layout/ClassStructure
29
31
  end
30
32
  end
31
33
  end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks the migration for which timestamps are not included
7
+ # when creating a new table.
8
+ # In many cases, timestamps are useful information and should be added.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # create_table :users
13
+ #
14
+ # # bad
15
+ # create_table :users do |t|
16
+ # t.string :name
17
+ # t.string :email
18
+ # end
19
+ #
20
+ # # good
21
+ # create_table :users do |t|
22
+ # t.string :name
23
+ # t.string :email
24
+ #
25
+ # t.timestamps
26
+ # end
27
+ #
28
+ # # good
29
+ # create_table :users do |t|
30
+ # t.string :name
31
+ # t.string :email
32
+ #
33
+ # t.datetime :created_at, default: -> { 'CURRENT_TIMESTAMP' }
34
+ # end
35
+ #
36
+ # # good
37
+ # create_table :users do |t|
38
+ # t.string :name
39
+ # t.string :email
40
+ #
41
+ # t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP' }
42
+ # end
43
+ class CreateTableWithTimestamps < Cop
44
+ MSG = 'Add timestamps when creating a new table.'.freeze
45
+
46
+ def_node_matcher :create_table_with_block?, <<-PATTERN
47
+ (block
48
+ (send nil? :create_table ...)
49
+ (args (arg _var))
50
+ _)
51
+ PATTERN
52
+
53
+ def_node_search :timestamps_included?, <<-PATTERN
54
+ (send _var :timestamps ...)
55
+ PATTERN
56
+
57
+ def_node_search :created_at_or_updated_at_included?, <<-PATTERN
58
+ (send _var :datetime (sym {:created_at :updated_at}) ...)
59
+ PATTERN
60
+
61
+ def on_send(node)
62
+ return unless node.command?(:create_table)
63
+ parent = node.parent
64
+
65
+ if create_table_with_block?(parent)
66
+ if parent.body.nil? || !time_columns_included?(parent.body)
67
+ add_offense(parent)
68
+ end
69
+ else
70
+ add_offense(node)
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def time_columns_included?(node)
77
+ timestamps_included?(node) || created_at_or_updated_at_included?(node)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -56,18 +56,17 @@ module RuboCop
56
56
  MSG = 'Use `delegate` to define delegations.'.freeze
57
57
 
58
58
  def on_def(node)
59
- method_name, args, body = *node
60
- return unless trivial_delegate?(method_name, args, body)
59
+ return unless trivial_delegate?(node)
61
60
  return if private_or_protected_delegation(node)
61
+
62
62
  add_offense(node, location: :keyword)
63
63
  end
64
64
 
65
- private
66
-
67
65
  def autocorrect(node)
68
66
  method_name, _args, body = *node
69
- delegation = ["delegate :#{body.children[1]}",
70
- "to: :#{body.children[0].children[1]}"]
67
+ delegation = ["delegate :#{body.method_name}",
68
+ "to: :#{body.receiver.method_name}"]
69
+
71
70
  if method_name == prefixed_method_name(body)
72
71
  delegation << ['prefix: true']
73
72
  end
@@ -77,33 +76,31 @@ module RuboCop
77
76
  end
78
77
  end
79
78
 
80
- def trivial_delegate?(method_name, args, body)
81
- body && delegate?(body) && !body.csend_type? &&
79
+ private
80
+
81
+ def trivial_delegate?(def_node)
82
+ method_name, args, body = *def_node
83
+
84
+ delegate?(body) &&
82
85
  method_name_matches?(method_name, body) &&
83
86
  arguments_match?(args, body)
84
87
  end
85
88
 
86
89
  def delegate?(body)
87
- receiver, = *body
88
- receiver.respond_to?(:type) && receiver.send_type? &&
89
- receiver.child_nodes.empty?
90
+ body && body.send_type? && body.receiver &&
91
+ body.receiver.send_type? && !body.receiver.receiver
90
92
  end
91
93
 
92
- def arguments_match?(args, body)
93
- _receiver, _method_name, *arguments = *body
94
- arg_array = Array(args)
95
- argument_array = Array(arguments)
96
- arg_array.size == argument_array.size && (
97
- arg_array == argument_array ||
94
+ def arguments_match?(arg_array, body)
95
+ argument_array = body.arguments
96
+
97
+ arg_array == argument_array ||
98
98
  arg_array.map(&:children) == argument_array.map(&:children)
99
- )
100
99
  end
101
100
 
102
101
  def method_name_matches?(method_name, body)
103
- _receiver, property_name, *_args = *body
104
- method_name == property_name ||
105
- (include_prefix_case? &&
106
- method_name == prefixed_method_name(body))
102
+ method_name == body.method_name ||
103
+ include_prefix_case? && method_name == prefixed_method_name(body)
107
104
  end
108
105
 
109
106
  def include_prefix_case?
@@ -111,9 +108,7 @@ module RuboCop
111
108
  end
112
109
 
113
110
  def prefixed_method_name(body)
114
- receiver, property_name, *_args = *body
115
- _receiver, target, *_args = *receiver
116
- [target, property_name].join('_').to_sym
111
+ [body.receiver.method_name, body.method_name].join('_').to_sym
117
112
  end
118
113
 
119
114
  def private_or_protected_delegation(node)