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,10 +8,7 @@ module RuboCop
8
8
  # It is configurable to enforce one of the styles for both single line
9
9
  # and multiline lambdas as well.
10
10
  #
11
- # @example
12
- #
13
- # # EnforcedStyle: line_count_dependent (default)
14
- #
11
+ # @example EnforcedStyle: line_count_dependent (default)
15
12
  # # bad
16
13
  # f = lambda { |x| x }
17
14
  # f = ->(x) do
@@ -24,10 +21,7 @@ module RuboCop
24
21
  # x
25
22
  # end
26
23
  #
27
- # @example
28
- #
29
- # # EnforcedStyle: lambda
30
- #
24
+ # @example EnforcedStyle: lambda
31
25
  # # bad
32
26
  # f = ->(x) { x }
33
27
  # f = ->(x) do
@@ -40,10 +34,7 @@ module RuboCop
40
34
  # x
41
35
  # end
42
36
  #
43
- # @example
44
- #
45
- # # EnforcedStyle: literal
46
- #
37
+ # @example EnforcedStyle: literal
47
38
  # # bad
48
39
  # f = lambda { |x| x }
49
40
  # f = lambda do |x|
@@ -59,8 +50,9 @@ module RuboCop
59
50
  include ConfigurableEnforcedStyle
60
51
 
61
52
  LITERAL_MESSAGE = 'Use the `-> { ... }` lambda literal syntax for ' \
62
- '%s lambdas.'.freeze
63
- METHOD_MESSAGE = 'Use the `lambda` method for %s lambdas.'.freeze
53
+ '%<modifier>s lambdas.'.freeze
54
+ METHOD_MESSAGE = 'Use the `lambda` method for %<modifier>s ' \
55
+ 'lambdas.'.freeze
64
56
 
65
57
  OFFENDING_SELECTORS = {
66
58
  style: {
@@ -84,6 +76,22 @@ module RuboCop
84
76
  message: message(node, selector))
85
77
  end
86
78
 
79
+ def autocorrect(node)
80
+ block_method, _args = *node
81
+ selector = block_method.source
82
+
83
+ # Don't autocorrect if this would change the meaning of the code
84
+ return if selector == '->' && arg_to_unparenthesized_call?(node)
85
+
86
+ lambda do |corrector|
87
+ if selector == 'lambda'
88
+ autocorrect_method_to_literal(corrector, node)
89
+ else
90
+ autocorrect_literal_to_method(corrector, node)
91
+ end
92
+ end
93
+ end
94
+
87
95
  private
88
96
 
89
97
  def offending_selector?(node, selector)
@@ -95,7 +103,7 @@ module RuboCop
95
103
  def message(node, selector)
96
104
  message = selector == '->' ? METHOD_MESSAGE : LITERAL_MESSAGE
97
105
 
98
- format(message, message_line_modifier(node))
106
+ format(message, modifier: message_line_modifier(node))
99
107
  end
100
108
 
101
109
  def message_line_modifier(node)
@@ -107,22 +115,6 @@ module RuboCop
107
115
  end
108
116
  end
109
117
 
110
- def autocorrect(node)
111
- block_method, _args = *node
112
- selector = block_method.source
113
-
114
- # Don't autocorrect if this would change the meaning of the code
115
- return if selector == '->' && arg_to_unparenthesized_call?(node)
116
-
117
- lambda do |corrector|
118
- if selector == 'lambda'
119
- autocorrect_method_to_literal(corrector, node)
120
- else
121
- autocorrect_literal_to_method(corrector, node)
122
- end
123
- end
124
- end
125
-
126
118
  def autocorrect_literal_to_method(corrector, node)
127
119
  block_method, args = *node
128
120
 
@@ -5,13 +5,19 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for use of the lambda.(args) syntax.
7
7
  #
8
- # @example
9
- #
8
+ # @example EnforcedStyle: call (default)
10
9
  # # bad
11
10
  # lambda.(x, y)
12
11
  #
13
12
  # # good
14
13
  # lambda.call(x, y)
14
+ #
15
+ # @example EnforcedStyle: braces
16
+ # # bad
17
+ # lambda.call(x, y)
18
+ #
19
+ # # good
20
+ # lambda.(x, y)
15
21
  class LambdaCall < Cop
16
22
  include ConfigurableEnforcedStyle
17
23
 
@@ -25,13 +31,6 @@ module RuboCop
25
31
  end
26
32
  end
27
33
 
28
- private
29
-
30
- def offense?(node)
31
- explicit_style? && node.implicit_call? ||
32
- implicit_style? && !node.implicit_call?
33
- end
34
-
35
34
  def autocorrect(node)
36
35
  lambda do |corrector|
37
36
  if explicit_style?
@@ -46,6 +45,13 @@ module RuboCop
46
45
  end
47
46
  end
48
47
 
48
+ private
49
+
50
+ def offense?(node)
51
+ explicit_style? && node.implicit_call? ||
52
+ implicit_style? && !node.implicit_call?
53
+ end
54
+
49
55
  def add_parentheses(node, corrector)
50
56
  if node.arguments.empty?
51
57
  corrector.insert_after(node.source_range, '()')
@@ -41,9 +41,9 @@ module RuboCop
41
41
 
42
42
  def autocorrect(operator_range)
43
43
  # Include any trailing whitespace so we don't create a syntax error.
44
- operator_range = range_with_surrounding_space(operator_range,
45
- :right,
46
- false)
44
+ operator_range = range_with_surrounding_space(range: operator_range,
45
+ side: :right,
46
+ newlines: false)
47
47
  one_more_char = operator_range.resize(operator_range.size + 1)
48
48
  # Don't create a double backslash at the end of the line, in case
49
49
  # there already was a backslash after the concatenation operator.
@@ -61,7 +61,7 @@ module RuboCop
61
61
  eligible_operator?(operator) &&
62
62
  eligible_predecessor?(predecessor)
63
63
 
64
- return if operator.pos.line == successor.pos.line
64
+ return if operator.line == successor.line
65
65
 
66
66
  next_successor = token_after_last_string(successor, index)
67
67
 
@@ -51,8 +51,6 @@ module RuboCop
51
51
  alias on_super on_send
52
52
  alias on_yield on_send
53
53
 
54
- private
55
-
56
54
  def autocorrect(node)
57
55
  lambda do |corrector|
58
56
  corrector.replace(args_begin(node), '(')
@@ -60,6 +58,8 @@ module RuboCop
60
58
  end
61
59
  end
62
60
 
61
+ private
62
+
63
63
  def ignored_method?(node)
64
64
  node.operator_method? || node.setter_method? ||
65
65
  ignore_macros? && node.macro? ||
@@ -25,8 +25,6 @@ module RuboCop
25
25
  add_offense(node, location: :begin)
26
26
  end
27
27
 
28
- private
29
-
30
28
  def autocorrect(node)
31
29
  lambda do |corrector|
32
30
  corrector.remove(node.loc.begin)
@@ -34,6 +32,8 @@ module RuboCop
34
32
  end
35
33
  end
36
34
 
35
+ private
36
+
37
37
  def ineligible_node?(node)
38
38
  node.camel_case_method? || node.implicit_call? || node.keyword_not?
39
39
  end
@@ -29,8 +29,6 @@ module RuboCop
29
29
  end
30
30
  alias on_defs on_def
31
31
 
32
- private
33
-
34
32
  def autocorrect(node)
35
33
  lambda do |corrector|
36
34
  if node.args_type?
@@ -39,7 +37,8 @@ module RuboCop
39
37
  corrector.remove(node.loc.end)
40
38
  else
41
39
  args_expr = node.arguments.source_range
42
- args_with_space = range_with_surrounding_space(args_expr, :left)
40
+ args_with_space = range_with_surrounding_space(range: args_expr,
41
+ side: :left)
43
42
  just_space = range_between(args_with_space.begin_pos,
44
43
  args_expr.begin_pos)
45
44
  corrector.replace(just_space, '(')
@@ -48,6 +47,8 @@ module RuboCop
48
47
  end
49
48
  end
50
49
 
50
+ private
51
+
51
52
  def require_parentheses?(args)
52
53
  style == :require_parentheses ||
53
54
  (style == :require_no_parentheses_except_multiline &&
@@ -8,21 +8,21 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  # #bad
11
- # def method_missing(...)
12
- # ...
11
+ # def method_missing(name, *args)
12
+ # # ...
13
13
  # end
14
14
  #
15
15
  # #good
16
- # def respond_to_missing?(...)
17
- # ...
16
+ # def respond_to_missing?(name, include_private)
17
+ # # ...
18
18
  # end
19
19
  #
20
- # def method_missing(...)
21
- # ...
20
+ # def method_missing(name, *args)
21
+ # # ...
22
22
  # super
23
23
  # end
24
24
  class MethodMissing < Cop
25
- MSG = 'When using `method_missing`, %s.'.freeze
25
+ MSG = 'When using `method_missing`, %<instructions>s.'.freeze
26
26
 
27
27
  def on_def(node)
28
28
  return unless node.method?(:method_missing)
@@ -50,7 +50,7 @@ module RuboCop
50
50
  instructions << 'fall back on `super`'.freeze
51
51
  end
52
52
 
53
- format(MSG, instructions.join(' and '))
53
+ format(MSG, instructions: instructions.join(' and '))
54
54
  end
55
55
 
56
56
  def calls_super?(node)
@@ -7,11 +7,11 @@ module RuboCop
7
7
  #
8
8
  # @example
9
9
  #
10
- # @bad
10
+ # # bad
11
11
  # bar = [foo.min, foo.max]
12
12
  # return foo.min, foo.max
13
13
  #
14
- # @good
14
+ # # good
15
15
  # bar = foo.minmax
16
16
  # return foo.minmax
17
17
  class MinMax < Cop
@@ -27,10 +27,19 @@ module RuboCop
27
27
  end
28
28
  alias on_return on_array
29
29
 
30
+ def autocorrect(node)
31
+ receiver = node.children.first.receiver
32
+
33
+ lambda do |corrector|
34
+ corrector.replace(offending_range(node),
35
+ "#{receiver.source}.minmax")
36
+ end
37
+ end
38
+
30
39
  private
31
40
 
32
41
  def_node_matcher :min_max_candidate, <<-PATTERN
33
- ({array return} (send $_receiver :min) (send $_receiver :max))
42
+ ({array return} (send [$_receiver !nil?] :min) (send [$_receiver !nil?] :max))
34
43
  PATTERN
35
44
 
36
45
  def message(offender, receiver)
@@ -38,15 +47,6 @@ module RuboCop
38
47
  receiver: receiver.source)
39
48
  end
40
49
 
41
- def autocorrect(node)
42
- receiver = node.children.first.receiver
43
-
44
- lambda do |corrector|
45
- corrector.replace(offending_range(node),
46
- "#{receiver.source}.minmax")
47
- end
48
- end
49
-
50
50
  def offending_range(node)
51
51
  case node.type
52
52
  when :return
@@ -32,10 +32,11 @@ module RuboCop
32
32
  include OnNormalIfUnless
33
33
  include ConfigurableEnforcedStyle
34
34
 
35
- MSG = '`%s` condition requires an `else`-clause.'.freeze
36
- MSG_NIL = '`%s` condition requires an `else`-clause with ' \
35
+ MSG = '`%<type>s` condition requires an `else`-clause.'.freeze
36
+ MSG_NIL = '`%<type>s` condition requires an `else`-clause with ' \
37
37
  '`nil` in it.'.freeze
38
- MSG_EMPTY = '`%s` condition requires an empty `else`-clause.'.freeze
38
+ MSG_EMPTY = '`%<type>s` condition requires an empty ' \
39
+ '`else`-clause.'.freeze
39
40
 
40
41
  def on_normal_if_unless(node)
41
42
  return if case_style?
@@ -76,7 +77,7 @@ module RuboCop
76
77
  MSG
77
78
  end
78
79
 
79
- format(template, node.type)
80
+ format(template, type: node.type)
80
81
  end
81
82
 
82
83
  def if_style?
@@ -7,30 +7,26 @@ module RuboCop
7
7
  # By default it enforces mixins to be placed in separate declarations,
8
8
  # but it can be configured to enforce grouping them in one declaration.
9
9
  #
10
- # @example
11
- #
12
- # EnforcedStyle: separated (default)
13
- #
14
- # @bad
10
+ # @example EnforcedStyle: separated (default)
11
+ # # bad
15
12
  # class Foo
16
13
  # include Bar, Qox
17
14
  # end
18
15
  #
19
- # @good
16
+ # # good
20
17
  # class Foo
21
18
  # include Qox
22
19
  # include Bar
23
20
  # end
24
21
  #
25
- # EnforcedStyle: grouped
26
- #
27
- # @bad
22
+ # @example EnforcedStyle: grouped
23
+ # # bad
28
24
  # class Foo
29
25
  # extend Bar
30
26
  # extend Qox
31
27
  # end
32
28
  #
33
- # @good
29
+ # # good
34
30
  # class Foo
35
31
  # extend Qox, Bar
36
32
  # end
@@ -38,7 +34,7 @@ module RuboCop
38
34
  include ConfigurableEnforcedStyle
39
35
 
40
36
  MIXIN_METHODS = %i[extend include prepend].freeze
41
- MSG = 'Put `%s` mixins in %s.'.freeze
37
+ MSG = 'Put `%<mixin>s` mixins in %<suffix>s.'.freeze
42
38
 
43
39
  def on_send(node)
44
40
  return unless node.macro? && MIXIN_METHODS.include?(node.method_name)
@@ -47,15 +43,17 @@ module RuboCop
47
43
  end
48
44
 
49
45
  def autocorrect(node)
46
+ range = node.loc.expression
50
47
  if separated_style?
51
- range = node.loc.expression
52
48
  correction = separate_mixins(node)
53
49
  else
54
50
  mixins = sibling_mixins(node)
55
- mixins.unshift(node)
56
-
57
- range = node.loc.expression.join(mixins.last.loc.expression)
58
- correction = group_mixins(node, mixins)
51
+ if node == mixins.first
52
+ correction = group_mixins(node, mixins)
53
+ else
54
+ range = range_to_remove_for_subsequent_mixin(mixins, node)
55
+ correction = ''
56
+ end
59
57
  end
60
58
 
61
59
  ->(corrector) { corrector.replace(range, correction) }
@@ -63,6 +61,18 @@ module RuboCop
63
61
 
64
62
  private
65
63
 
64
+ def range_to_remove_for_subsequent_mixin(mixins, node)
65
+ range = node.loc.expression
66
+ prev_mixin = mixins.each_cons(2) { |m, n| break m if n == node }
67
+ between = prev_mixin.loc.expression.end
68
+ .join(range.begin)
69
+ # if separated from previous mixin with only whitespace?
70
+ if between.source !~ /\S/
71
+ range = range.join(between) # then remove that too
72
+ end
73
+ range
74
+ end
75
+
66
76
  def check(send_node)
67
77
  if separated_style?
68
78
  check_separated_style(send_node)
@@ -72,7 +82,7 @@ module RuboCop
72
82
  end
73
83
 
74
84
  def check_grouped_style(send_node)
75
- return if sibling_mixins(send_node).empty?
85
+ return if sibling_mixins(send_node).size == 1
76
86
 
77
87
  add_offense(send_node)
78
88
  end
@@ -85,7 +95,7 @@ module RuboCop
85
95
 
86
96
  def sibling_mixins(send_node)
87
97
  siblings = send_node.parent.each_child_node(:send)
88
- .reject { |sibling| sibling == send_node }
98
+ .select(&:macro?)
89
99
 
90
100
  siblings.select do |sibling_node|
91
101
  sibling_node.method_name == send_node.method_name
@@ -96,7 +106,7 @@ module RuboCop
96
106
  suffix =
97
107
  separated_style? ? 'separate statements' : 'a single statement'
98
108
 
99
- format(MSG, send_node.method_name, suffix)
109
+ format(MSG, mixin: send_node.method_name, suffix: suffix)
100
110
  end
101
111
 
102
112
  def grouped_style?