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
@@ -5,10 +5,19 @@ module RuboCop
5
5
  module Style
6
6
  # This cop enforces the use of consistent method names
7
7
  # from the String class.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # 'name'.intern
12
+ # 'var'.unfavored_method
13
+ #
14
+ # # good
15
+ # 'name'.to_sym
16
+ # 'var'.preferred_method
8
17
  class StringMethods < Cop
9
18
  include MethodPreference
10
19
 
11
- MSG = 'Prefer `%s` over `%s`.'.freeze
20
+ MSG = 'Prefer `%<prefer>s` over `%<current>s`.'.freeze
12
21
 
13
22
  def on_send(node)
14
23
  return unless preferred_method(node.method_name)
@@ -16,18 +25,20 @@ module RuboCop
16
25
  add_offense(node, location: :selector)
17
26
  end
18
27
 
19
- private
20
-
21
- def message(node)
22
- format(MSG, preferred_method(node.method_name), node.method_name)
23
- end
24
-
25
28
  def autocorrect(node)
26
29
  lambda do |corrector|
27
30
  corrector.replace(node.loc.selector,
28
31
  preferred_method(node.method_name))
29
32
  end
30
33
  end
34
+
35
+ private
36
+
37
+ def message(node)
38
+ format(MSG,
39
+ prefer: preferred_method(node.method_name),
40
+ current: node.method_name)
41
+ end
31
42
  end
32
43
  end
33
44
  end
@@ -14,18 +14,14 @@ module RuboCop
14
14
  # cop. For example, a `MinSize of `3` will not enforce a style on an array
15
15
  # of 2 or fewer elements.
16
16
  #
17
- # @example
18
- # EnforcedStyle: percent (default)
19
- #
17
+ # @example EnforcedStyle: percent (default)
20
18
  # # good
21
19
  # %i[foo bar baz]
22
20
  #
23
21
  # # bad
24
22
  # [:foo, :bar, :baz]
25
23
  #
26
- # @example
27
- # EnforcedStyle: brackets
28
- #
24
+ # @example EnforcedStyle: brackets
29
25
  # # good
30
26
  # [:foo, :bar, :baz]
31
27
  #
@@ -55,8 +51,6 @@ module RuboCop
55
51
  end
56
52
  end
57
53
 
58
- private
59
-
60
54
  def autocorrect(node)
61
55
  if style == :percent
62
56
  correct_percent(node, 'i')
@@ -65,6 +59,8 @@ module RuboCop
65
59
  end
66
60
  end
67
61
 
62
+ private
63
+
68
64
  def symbols_contain_spaces?(node)
69
65
  node.children.any? do |sym|
70
66
  content, = *sym
@@ -73,7 +69,7 @@ module RuboCop
73
69
  end
74
70
 
75
71
  def correct_bracketed(node)
76
- syms = node.children.map { |c| to_symbol_literal(c.children[0].to_s) }
72
+ syms = node.children.map { |c| to_symbol_literal(c.value.to_s) }
77
73
 
78
74
  lambda do |corrector|
79
75
  corrector.replace(node.source_range, "[#{syms.join(', ')}]")
@@ -12,7 +12,8 @@ module RuboCop
12
12
  # # good
13
13
  # something.map(&:upcase)
14
14
  class SymbolProc < Cop
15
- MSG = 'Pass `&:%s` as an argument to `%s` instead of a block.'.freeze
15
+ MSG = 'Pass `&:%<method>s` as an argument to `%<block_method>s` ' \
16
+ 'instead of a block.'.freeze
16
17
  SUPER_TYPES = %i[super zsuper].freeze
17
18
 
18
19
  def_node_matcher :proc_node?, '(send (const nil? :Proc) :new)'
@@ -73,8 +74,8 @@ module RuboCop
73
74
  add_offense(node,
74
75
  location: range,
75
76
  message: format(MSG,
76
- method_name,
77
- block_method_name))
77
+ method: method_name,
78
+ block_method: block_method_name))
78
79
  end
79
80
 
80
81
  def autocorrect_method(corrector, node, args, method_name)
@@ -101,7 +102,7 @@ module RuboCop
101
102
  def block_range_with_space(node)
102
103
  block_range = range_between(begin_pos_for_replacement(node),
103
104
  node.loc.end.end_pos)
104
- range_with_surrounding_space(block_range, :left)
105
+ range_with_surrounding_space(range: block_range, side: :left)
105
106
  end
106
107
 
107
108
  def begin_pos_for_replacement(node)
@@ -8,44 +8,35 @@ module RuboCop
8
8
  # parentheses using `EnforcedStyle`. Omission is only enforced when
9
9
  # removing the parentheses won't cause a different behavior.
10
10
  #
11
- # @example
12
- #
13
- # EnforcedStyle: require_no_parentheses (default)
14
- #
15
- # @bad
11
+ # @example EnforcedStyle: require_no_parentheses (default)
12
+ # # bad
16
13
  # foo = (bar?) ? a : b
17
14
  # foo = (bar.baz?) ? a : b
18
15
  # foo = (bar && baz) ? a : b
19
16
  #
20
- # @good
17
+ # # good
21
18
  # foo = bar? ? a : b
22
19
  # foo = bar.baz? ? a : b
23
20
  # foo = bar && baz ? a : b
24
21
  #
25
- # @example
26
- #
27
- # EnforcedStyle: require_parentheses
28
- #
29
- # @bad
22
+ # @example EnforcedStyle: require_parentheses
23
+ # # bad
30
24
  # foo = bar? ? a : b
31
25
  # foo = bar.baz? ? a : b
32
26
  # foo = bar && baz ? a : b
33
27
  #
34
- # @good
28
+ # # good
35
29
  # foo = (bar?) ? a : b
36
30
  # foo = (bar.baz?) ? a : b
37
31
  # foo = (bar && baz) ? a : b
38
32
  #
39
- # @example
40
- #
41
- # EnforcedStyle: require_parentheses_when_complex
42
- #
43
- # @bad
33
+ # @example EnforcedStyle: require_parentheses_when_complex
34
+ # # bad
44
35
  # foo = (bar?) ? a : b
45
36
  # foo = (bar.baz?) ? a : b
46
37
  # foo = bar && baz ? a : b
47
38
  #
48
- # @good
39
+ # # good
49
40
  # foo = bar? ? a : b
50
41
  # foo = bar.baz? ? a : b
51
42
  # foo = (bar && baz) ? a : b
@@ -57,8 +48,8 @@ module RuboCop
57
48
  VARIABLE_TYPES = AST::Node::VARIABLES
58
49
  NON_COMPLEX_TYPES = [*VARIABLE_TYPES, :const, :defined?, :yield].freeze
59
50
 
60
- MSG = '%s parentheses for ternary conditions.'.freeze
61
- MSG_COMPLEX = '%s parentheses for ternary expressions with' \
51
+ MSG = '%<command>s parentheses for ternary conditions.'.freeze
52
+ MSG_COMPLEX = '%<command>s parentheses for ternary expressions with' \
62
53
  ' complex conditions.'.freeze
63
54
 
64
55
  def on_if(node)
@@ -67,6 +58,20 @@ module RuboCop
67
58
  add_offense(node, location: node.source_range)
68
59
  end
69
60
 
61
+ def autocorrect(node)
62
+ condition = node.condition
63
+
64
+ return nil if parenthesized?(condition) &&
65
+ (safe_assignment?(condition) ||
66
+ unsafe_autocorrect?(condition))
67
+
68
+ if parenthesized?(condition)
69
+ correct_parenthesized(condition)
70
+ else
71
+ correct_unparenthesized(condition)
72
+ end
73
+ end
74
+
70
75
  private
71
76
 
72
77
  def offense?(node)
@@ -85,20 +90,6 @@ module RuboCop
85
90
  end
86
91
  end
87
92
 
88
- def autocorrect(node)
89
- condition = node.condition
90
-
91
- return nil if parenthesized?(condition) &&
92
- (safe_assignment?(condition) ||
93
- unsafe_autocorrect?(condition))
94
-
95
- if parenthesized?(condition)
96
- correct_parenthesized(condition)
97
- else
98
- correct_unparenthesized(condition)
99
- end
100
- end
101
-
102
93
  # If the condition is parenthesized we recurse and check for any
103
94
  # complex expressions within it.
104
95
  def complex_condition?(condition)
@@ -124,11 +115,11 @@ module RuboCop
124
115
 
125
116
  def message(node)
126
117
  if require_parentheses_when_complex?
127
- omit = parenthesized?(node.condition) ? 'Only use' : 'Use'
128
- format(MSG_COMPLEX, omit)
118
+ command = parenthesized?(node.condition) ? 'Only use' : 'Use'
119
+ format(MSG_COMPLEX, command: command)
129
120
  else
130
- verb = require_parentheses? ? 'Use' : 'Omit'
131
- format(MSG, verb)
121
+ command = require_parentheses? ? 'Use' : 'Omit'
122
+ format(MSG, command: command)
132
123
  end
133
124
  end
134
125
 
@@ -195,8 +186,8 @@ module RuboCop
195
186
 
196
187
  def whitespace_after?(node)
197
188
  index = index_of_last_token(node)
198
- last_token, next_token = processed_source.tokens[index, 2]
199
- space_between?(last_token, next_token)
189
+ last_token = processed_source.tokens[index]
190
+ last_token.space_after?
200
191
  end
201
192
  end
202
193
  end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for trailing code after the method definition.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # def some_method; do_stuff
11
+ # end
12
+ #
13
+ # def f(x); b = foo
14
+ # b[c: x]
15
+ # end
16
+ #
17
+ # # good
18
+ # def some_method
19
+ # do_stuff
20
+ # end
21
+ #
22
+ # def f(x)
23
+ # b = foo
24
+ # b[c: x]
25
+ # end
26
+ #
27
+ class TrailingBodyOnMethodDefinition < Cop
28
+ include AutocorrectAlignment
29
+
30
+ MSG = "Place the first line of a multi-line method definition's " \
31
+ 'body on its own line.'.freeze
32
+
33
+ def on_def(node)
34
+ return unless trailing_body?(node)
35
+
36
+ add_offense(node, location: first_part_of(node.body))
37
+ end
38
+ alias on_defs on_def
39
+
40
+ def autocorrect(node)
41
+ lambda do |corrector|
42
+ break_line_before_body(node, corrector)
43
+ move_comment(node, corrector)
44
+ remove_semicolon(corrector)
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def trailing_body?(node)
51
+ node.body && node.multiline? && on_def_line?(node)
52
+ end
53
+
54
+ def on_def_line?(node)
55
+ node.source_range.first_line == node.body.source_range.first_line
56
+ end
57
+
58
+ def break_line_before_body(node, corrector)
59
+ corrector.insert_before(
60
+ first_part_of(node.body),
61
+ "\n" + ' ' * (node.loc.keyword.column +
62
+ configured_indentation_width)
63
+ )
64
+ end
65
+
66
+ def first_part_of(body)
67
+ if body.begin_type?
68
+ body.children.first.source_range
69
+ else
70
+ body.source_range
71
+ end
72
+ end
73
+
74
+ def move_comment(node, corrector)
75
+ eol_comment = end_of_line_comment(node.source_range.line)
76
+ return unless eol_comment
77
+
78
+ text = eol_comment.loc.expression.source
79
+ corrector.insert_before(node.source_range,
80
+ text + "\n" + (' ' * node.loc.keyword.column))
81
+ corrector.remove(eol_comment.loc.expression)
82
+ end
83
+
84
+ def end_of_line_comment(line)
85
+ processed_source.comments.find { |c| c.loc.line == line }
86
+ end
87
+
88
+ def remove_semicolon(corrector)
89
+ return unless semicolon
90
+ corrector.remove(semicolon.pos)
91
+ end
92
+
93
+ def semicolon
94
+ @semicolon ||= processed_source.tokens.find do |token|
95
+ token.line == 1 && token.semicolon?
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -5,23 +5,37 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for trailing comma in argument lists.
7
7
  #
8
- # @example
9
- # # always bad
8
+ # @example EnforcedStyleForMultiline: consistent_comma
9
+ # # bad
10
10
  # method(1, 2,)
11
11
  #
12
- # # good if EnforcedStyleForMultiline is consistent_comma
12
+ # # good
13
13
  # method(
14
14
  # 1, 2,
15
15
  # 3,
16
16
  # )
17
17
  #
18
- # # good if EnforcedStyleForMultiline is comma or consistent_comma
18
+ # # good
19
19
  # method(
20
20
  # 1,
21
21
  # 2,
22
22
  # )
23
23
  #
24
- # # good if EnforcedStyleForMultiline is no_comma
24
+ # @example EnforcedStyleForMultiline: comma
25
+ # # bad
26
+ # method(1, 2,)
27
+ #
28
+ # # good
29
+ # method(
30
+ # 1,
31
+ # 2,
32
+ # )
33
+ #
34
+ # @example EnforcedStyleForMultiline: no_comma (default)
35
+ # # bad
36
+ # method(1, 2,)
37
+ #
38
+ # # good
25
39
  # method(
26
40
  # 1,
27
41
  # 2
@@ -32,7 +46,7 @@ module RuboCop
32
46
  def on_send(node)
33
47
  return unless node.arguments? && node.parenthesized?
34
48
 
35
- check(node, node.arguments, 'parameter of %s method call',
49
+ check(node, node.arguments, 'parameter of %<article>s method call',
36
50
  node.last_argument.source_range.end_pos,
37
51
  node.source_range.end_pos)
38
52
  end
@@ -5,23 +5,37 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for trailing comma in array and hash literals.
7
7
  #
8
- # @example
9
- # # always bad
8
+ # @example EnforcedStyleForMultiline: consistent_comma
9
+ # # bad
10
10
  # a = [1, 2,]
11
11
  #
12
- # # good if EnforcedStyleForMultiline is consistent_comma
12
+ # # good
13
13
  # a = [
14
14
  # 1, 2,
15
15
  # 3,
16
16
  # ]
17
17
  #
18
- # # good if EnforcedStyleForMultiline is comma or consistent_comma
18
+ # # good
19
19
  # a = [
20
20
  # 1,
21
21
  # 2,
22
22
  # ]
23
23
  #
24
- # # good if EnforcedStyleForMultiline is no_comma
24
+ # @example EnforcedStyleForMultiline: comma
25
+ # # bad
26
+ # a = [1, 2,]
27
+ #
28
+ # # good
29
+ # a = [
30
+ # 1,
31
+ # 2,
32
+ # ]
33
+ #
34
+ # @example EnforcedStyleForMultiline: no_comma (default)
35
+ # # bad
36
+ # a = [1, 2,]
37
+ #
38
+ # # good
25
39
  # a = [
26
40
  # 1,
27
41
  # 2
@@ -31,11 +45,12 @@ module RuboCop
31
45
  include TrailingComma
32
46
 
33
47
  def on_array(node)
34
- check_literal(node, 'item of %s array') if node.square_brackets?
48
+ return unless node.square_brackets?
49
+ check_literal(node, 'item of %<article>s array')
35
50
  end
36
51
 
37
52
  def on_hash(node)
38
- check_literal(node, 'item of %s hash')
53
+ check_literal(node, 'item of %<article>s hash')
39
54
  end
40
55
 
41
56
  private