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,50 +5,49 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for redundant uses of `self`.
7
7
  #
8
- # `self` is only needed when:
8
+ # The usage of `self` is only needed when:
9
9
  #
10
10
  # * Sending a message to same object with zero arguments in
11
11
  # presence of a method name clash with an argument or a local
12
12
  # variable.
13
13
  #
14
- # Note, with using explicit self you can only send messages
15
- # with public or protected scope, you cannot send private
16
- # messages this way.
14
+ # * Calling an attribute writer to prevent an local variable assignment.
17
15
  #
18
- # Example:
16
+ # Note, with using explicit self you can only send messages with public or
17
+ # protected scope, you cannot send private messages this way.
19
18
  #
20
- # def bar
21
- # :baz
22
- # end
19
+ # Note we allow uses of `self` with operators because it would be awkward
20
+ # otherwise.
21
+ #
22
+ # @example
23
23
  #
24
+ # # bad
24
25
  # def foo(bar)
25
- # self.bar # resolves name clash with argument
26
+ # self.baz
26
27
  # end
27
28
  #
28
- # def foo2
29
- # bar = 1
30
- # self.bar # resolves name clash with local variable
29
+ # # good
30
+ # def foo(bar)
31
+ # self.bar # Resolves name clash with the argument.
31
32
  # end
32
33
  #
33
- # %w[x y z].select do |bar|
34
- # self.bar == bar # resolves name clash with argument of a block
34
+ # def foo
35
+ # bar = 1
36
+ # self.bar # Resolves name clash with the local variable.
35
37
  # end
36
38
  #
37
- # * Calling an attribute writer to prevent an local variable assignment
38
- #
39
- # attr_writer :bar
40
- #
41
39
  # def foo
42
- # self.bar= 1 # Make sure above attr writer is called
40
+ # %w[x y z].select do |bar|
41
+ # self.bar == bar # Resolves name clash with argument of the block.
42
+ # end
43
43
  # end
44
- #
45
- # Special cases:
46
- #
47
- # We allow uses of `self` with operators because it would be awkward
48
- # otherwise.
49
44
  class RedundantSelf < Cop
50
45
  MSG = 'Redundant `self` detected.'.freeze
51
46
 
47
+ def self.autocorrect_incompatible_with
48
+ [ColonMethodCall]
49
+ end
50
+
52
51
  def initialize(config = nil, options = nil)
53
52
  super
54
53
  @allowed_send_nodes = []
@@ -101,8 +100,6 @@ module RuboCop
101
100
  add_scope(node, @local_variables_scopes[node])
102
101
  end
103
102
 
104
- private
105
-
106
103
  def autocorrect(node)
107
104
  lambda do |corrector|
108
105
  corrector.remove(node.receiver.source_range)
@@ -110,6 +107,8 @@ module RuboCop
110
107
  end
111
108
  end
112
109
 
110
+ private
111
+
113
112
  def add_scope(node, local_variables = [])
114
113
  node.descendants.each do |child_node|
115
114
  @local_variables_scopes[child_node] = local_variables
@@ -5,28 +5,81 @@ module RuboCop
5
5
  module Style
6
6
  # This cop enforces using // or %r around regular expressions.
7
7
  #
8
- # @example
9
- # # Good if EnforcedStyle is slashes or mixed, bad if percent_r.
8
+ # @example EnforcedStyle: slashes (default)
9
+ # # bad
10
+ # snake_case = %r{^[\dA-Z_]+$}
11
+ #
12
+ # # bad
13
+ # regex = %r{
14
+ # foo
15
+ # (bar)
16
+ # (baz)
17
+ # }x
18
+ #
19
+ # # good
10
20
  # snake_case = /^[\dA-Z_]+$/
11
21
  #
12
- # # Good if EnforcedStyle is percent_r, bad if slashes or mixed.
22
+ # # good
23
+ # regex = /
24
+ # foo
25
+ # (bar)
26
+ # (baz)
27
+ # /x
28
+ #
29
+ # @example EnforcedStyle: percent_r
30
+ # # bad
31
+ # snake_case = /^[\dA-Z_]+$/
32
+ #
33
+ # # bad
34
+ # regex = /
35
+ # foo
36
+ # (bar)
37
+ # (baz)
38
+ # /x
39
+ #
40
+ # # good
41
+ # snake_case = %r{^[\dA-Z_]+$}
42
+ #
43
+ # # good
44
+ # regex = %r{
45
+ # foo
46
+ # (bar)
47
+ # (baz)
48
+ # }x
49
+ #
50
+ # @example EnforcedStyle: mixed
51
+ # # bad
13
52
  # snake_case = %r{^[\dA-Z_]+$}
14
53
  #
15
- # # Good if EnforcedStyle is slashes, bad if percent_r or mixed.
54
+ # # bad
16
55
  # regex = /
17
56
  # foo
18
57
  # (bar)
19
58
  # (baz)
20
59
  # /x
21
60
  #
22
- # # Good if EnforcedStyle is percent_r or mixed, bad if slashes.
61
+ # # good
62
+ # snake_case = /^[\dA-Z_]+$/
63
+ #
64
+ # # good
23
65
  # regex = %r{
24
66
  # foo
25
67
  # (bar)
26
68
  # (baz)
27
69
  # }x
28
70
  #
29
- # # Bad unless AllowInnerSlashes is true.
71
+ # @example AllowInnerSlashes: false (default)
72
+ # # If `false`, the cop will always recommend using `%r` if one or more
73
+ # # slashes are found in the regexp string.
74
+ #
75
+ # # bad
76
+ # x =~ /home\//
77
+ #
78
+ # # good
79
+ # x =~ %r{home/}
80
+ #
81
+ # @example AllowInnerSlashes: true
82
+ # # good
30
83
  # x =~ /home\//
31
84
  class RegexpLiteral < Cop
32
85
  include ConfigurableEnforcedStyle
@@ -42,6 +95,21 @@ module RuboCop
42
95
  end
43
96
  end
44
97
 
98
+ def autocorrect(node)
99
+ return if contains_slash?(node)
100
+
101
+ replacement = if slash_literal?(node)
102
+ ['%r', ''].zip(preferred_delimiters).map(&:join)
103
+ else
104
+ %w[/ /]
105
+ end
106
+
107
+ lambda do |corrector|
108
+ corrector.replace(node.loc.begin, replacement.first)
109
+ corrector.replace(node.loc.end, replacement.last)
110
+ end
111
+ end
112
+
45
113
  private
46
114
 
47
115
  def check_slash_literal(node)
@@ -101,21 +169,6 @@ module RuboCop
101
169
  config.for_cop('Style/PercentLiteralDelimiters') \
102
170
  ['PreferredDelimiters']['%r'].split(//)
103
171
  end
104
-
105
- def autocorrect(node)
106
- return if contains_slash?(node)
107
-
108
- replacement = if slash_literal?(node)
109
- ['%r', ''].zip(preferred_delimiters).map(&:join)
110
- else
111
- %w[/ /]
112
- end
113
-
114
- lambda do |corrector|
115
- corrector.replace(node.loc.begin, replacement.first)
116
- corrector.replace(node.loc.end, replacement.last)
117
- end
118
- end
119
172
  end
120
173
  end
121
174
  end
@@ -4,6 +4,17 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks for uses of rescue in its modifier form.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # some_method rescue handle_error
11
+ #
12
+ # # good
13
+ # begin
14
+ # some_method
15
+ # rescue
16
+ # handle_error
17
+ # end
7
18
  class RescueModifier < Cop
8
19
  include AutocorrectAlignment
9
20
  include RescueNode
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for rescuing `StandardError`. There are two supported
7
+ # styles `implicit` and `explicit`. This cop will not register an offense
8
+ # if any error other than `StandardError` is specified.
9
+ #
10
+ # @example EnforcedStyle: implicit
11
+ # # `implicit` will enforce using `rescue` instead of
12
+ # # `rescue StandardError`.
13
+ #
14
+ # # bad
15
+ # begin
16
+ # foo
17
+ # rescue StandardError
18
+ # bar
19
+ # end
20
+ #
21
+ # # good
22
+ # begin
23
+ # foo
24
+ # rescue
25
+ # bar
26
+ # end
27
+ #
28
+ # # good
29
+ # begin
30
+ # foo
31
+ # rescue OtherError
32
+ # bar
33
+ # end
34
+ #
35
+ # # good
36
+ # begin
37
+ # foo
38
+ # rescue StandardError, SecurityError
39
+ # bar
40
+ # end
41
+ #
42
+ # @example EnforcedStyle: explicit (default)
43
+ # # `explicit` will enforce using `rescue StandardError`
44
+ # # instead of `rescue`.
45
+ #
46
+ # # bad
47
+ # begin
48
+ # foo
49
+ # rescue
50
+ # bar
51
+ # end
52
+ #
53
+ # # good
54
+ # begin
55
+ # foo
56
+ # rescue StandardError
57
+ # bar
58
+ # end
59
+ #
60
+ # # good
61
+ # begin
62
+ # foo
63
+ # rescue OtherError
64
+ # bar
65
+ # end
66
+ #
67
+ # # good
68
+ # begin
69
+ # foo
70
+ # rescue StandardError, SecurityError
71
+ # bar
72
+ # end
73
+ class RescueStandardError < Cop
74
+ include RescueNode
75
+ include ConfigurableEnforcedStyle
76
+
77
+ MSG_IMPLICIT = 'Omit the error class when rescuing ' \
78
+ '`StandardError` by itself.'.freeze
79
+ MSG_EXPLICIT = 'Avoid rescuing without specifying ' \
80
+ 'an error class.'.freeze
81
+
82
+ def_node_matcher :rescue_without_error_class?, <<-PATTERN
83
+ (resbody nil? _ _)
84
+ PATTERN
85
+
86
+ def_node_matcher :rescue_standard_error?, <<-PATTERN
87
+ (resbody $(array (const nil? :StandardError)) _ _)
88
+ PATTERN
89
+
90
+ def on_resbody(node)
91
+ return if rescue_modifier?(node)
92
+ case style
93
+ when :implicit
94
+ rescue_standard_error?(node) do |error|
95
+ add_offense(node,
96
+ location: node.loc.keyword.join(error.loc.expression),
97
+ message: MSG_IMPLICIT)
98
+ end
99
+ when :explicit
100
+ rescue_without_error_class?(node) do
101
+ add_offense(node, location: :keyword, message: MSG_EXPLICIT)
102
+ end
103
+ end
104
+ end
105
+
106
+ def autocorrect(node)
107
+ lambda do |corrector|
108
+ case style
109
+ when :implicit
110
+ error = rescue_standard_error?(node)
111
+ range = range_between(node.loc.keyword.end_pos,
112
+ error.loc.expression.end_pos)
113
+ corrector.remove(range)
114
+ when :explicit
115
+ corrector.insert_after(node.loc.keyword, ' StandardError')
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -7,10 +7,7 @@ module RuboCop
7
7
  #
8
8
  # Supported styles are: return, return_nil.
9
9
  #
10
- # @example
11
- #
12
- # # EnforcedStyle: return (default)
13
- #
10
+ # @example EnforcedStyle: return (default)
14
11
  # # bad
15
12
  # def foo(arg)
16
13
  # return nil if arg
@@ -21,8 +18,7 @@ module RuboCop
21
18
  # return if arg
22
19
  # end
23
20
  #
24
- # # EnforcedStyle: return_nil
25
- #
21
+ # @example EnforcedStyle: return_nil
26
22
  # # bad
27
23
  # def foo(arg)
28
24
  # return if arg
@@ -61,8 +57,6 @@ module RuboCop
61
57
  add_offense(node) unless correct_style?(node)
62
58
  end
63
59
 
64
- private
65
-
66
60
  def autocorrect(node)
67
61
  lambda do |corrector|
68
62
  corrected = style == :return ? 'return' : 'return nil'
@@ -70,6 +64,8 @@ module RuboCop
70
64
  end
71
65
  end
72
66
 
67
+ private
68
+
73
69
  def message(_node)
74
70
  style == :return ? RETURN_MSG : RETURN_NIL_MSG
75
71
  end
@@ -150,18 +150,36 @@ module RuboCop
150
150
  node.receiver
151
151
  end
152
152
 
153
- return receiver if receiver == checked_variable
153
+ if receiver == checked_variable
154
+ return nil if assignment_arithmetic_or_comparison?(node)
155
+
156
+ return receiver
157
+ end
154
158
 
155
159
  find_matching_receiver_invocation(receiver, checked_variable)
156
160
  end
157
161
 
162
+ def assignment_arithmetic_or_comparison?(node)
163
+ node.assignment? ||
164
+ node.parent.arithmetic_operation? ||
165
+ comparison_node?(node.parent)
166
+ end
167
+
168
+ def comparison_node?(parent)
169
+ parent.send_type? && parent.comparison_method?
170
+ end
171
+
158
172
  def unsafe_method?(send_node)
159
173
  NIL_METHODS.include?(send_node.method_name) ||
160
174
  negated?(send_node) || !send_node.dot?
161
175
  end
162
176
 
163
177
  def negated?(send_node)
164
- send_node.parent.send_type? && send_node.parent.method?(:!)
178
+ if send_node.parent && send_node.parent.send_type?
179
+ negated?(send_node.parent)
180
+ else
181
+ send_node.send_type? && send_node.method?(:!)
182
+ end
165
183
  end
166
184
 
167
185
  def begin_range(node, method_call)
@@ -13,7 +13,7 @@ module RuboCop
13
13
  # # good
14
14
  # x += 1
15
15
  class SelfAssignment < Cop
16
- MSG = 'Use self-assignment shorthand `%s=`.'.freeze
16
+ MSG = 'Use self-assignment shorthand `%<method>s=`.'.freeze
17
17
  OPS = %i[+ - * ** / | &].freeze
18
18
 
19
19
  def self.autocorrect_incompatible_with
@@ -32,6 +32,16 @@ module RuboCop
32
32
  check(node, :cvar)
33
33
  end
34
34
 
35
+ def autocorrect(node)
36
+ _var_name, rhs = *node
37
+
38
+ if rhs.send_type?
39
+ autocorrect_send_node(node, rhs)
40
+ elsif %i[and or].include?(rhs.type)
41
+ autocorrect_boolean_node(node, rhs)
42
+ end
43
+ end
44
+
35
45
  private
36
46
 
37
47
  def check(node, var_type)
@@ -52,7 +62,7 @@ module RuboCop
52
62
  target_node = s(var_type, var_name)
53
63
  return unless receiver == target_node
54
64
 
55
- add_offense(node, message: format(MSG, method_name))
65
+ add_offense(node, message: format(MSG, method: method_name))
56
66
  end
57
67
 
58
68
  def check_boolean_node(node, rhs, var_name, var_type)
@@ -62,17 +72,7 @@ module RuboCop
62
72
  return unless first_operand == target_node
63
73
 
64
74
  operator = rhs.loc.operator.source
65
- add_offense(node, message: format(MSG, operator))
66
- end
67
-
68
- def autocorrect(node)
69
- _var_name, rhs = *node
70
-
71
- if rhs.send_type?
72
- autocorrect_send_node(node, rhs)
73
- elsif %i[and or].include?(rhs.type)
74
- autocorrect_boolean_node(node, rhs)
75
- end
75
+ add_offense(node, message: format(MSG, method: operator))
76
76
  end
77
77
 
78
78
  def autocorrect_send_node(node, rhs)