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
@@ -7,11 +7,13 @@ module RuboCop
7
7
  #
8
8
  # @example
9
9
  #
10
- # # bad
11
- # if x == nil
10
+ # # bad
11
+ # if x == nil
12
+ # end
12
13
  #
13
- # # good
14
- # if x.nil?
14
+ # # good
15
+ # if x.nil?
16
+ # end
15
17
  class NilComparison < Cop
16
18
  MSG = 'Prefer the use of the `nil?` predicate.'.freeze
17
19
 
@@ -23,8 +25,6 @@ module RuboCop
23
25
  end
24
26
  end
25
27
 
26
- private
27
-
28
28
  def autocorrect(node)
29
29
  new_code = node.source.sub(/\s*={2,3}\s*nil/, '.nil?')
30
30
  ->(corrector) { corrector.replace(node.source_range, new_code) }
@@ -7,22 +7,25 @@ module RuboCop
7
7
  #
8
8
  # @example
9
9
  #
10
- # # bad
11
- # if x != nil
10
+ # # bad
11
+ # if x != nil
12
+ # end
12
13
  #
13
- # # good (when not allowing semantic changes)
14
- # # bad (when allowing semantic changes)
15
- # if !x.nil?
14
+ # # good (when not allowing semantic changes)
15
+ # # bad (when allowing semantic changes)
16
+ # if !x.nil?
17
+ # end
16
18
  #
17
- # # good (when allowing semantic changes)
18
- # if x
19
+ # # good (when allowing semantic changes)
20
+ # if x
21
+ # end
19
22
  #
20
23
  # Non-nil checks are allowed if they are the final nodes of predicate.
21
24
  #
22
- # # good
23
- # def signed_in?
24
- # !current_user.nil?
25
- # end
25
+ # # good
26
+ # def signed_in?
27
+ # !current_user.nil?
28
+ # end
26
29
  class NonNilCheck < Cop
27
30
  def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
28
31
  def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
@@ -53,6 +56,17 @@ module RuboCop
53
56
  end
54
57
  alias on_defs on_def
55
58
 
59
+ def autocorrect(node)
60
+ case node.method_name
61
+ when :!=
62
+ autocorrect_comparison(node)
63
+ when :!
64
+ autocorrect_non_nil(node, node.receiver)
65
+ when :nil?
66
+ autocorrect_unless_nil(node, node.receiver)
67
+ end
68
+ end
69
+
56
70
  private
57
71
 
58
72
  def unless_and_nil_check?(send_node)
@@ -74,17 +88,6 @@ module RuboCop
74
88
  cop_config['IncludeSemanticChanges']
75
89
  end
76
90
 
77
- def autocorrect(node)
78
- case node.method_name
79
- when :!=
80
- autocorrect_comparison(node)
81
- when :!
82
- autocorrect_non_nil(node, node.receiver)
83
- when :nil?
84
- autocorrect_unless_nil(node, node.receiver)
85
- end
86
- end
87
-
88
91
  def autocorrect_comparison(node)
89
92
  expr = node.source
90
93
 
@@ -3,7 +3,16 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses if the keyword *not* instead of !.
6
+ # This cop checks for uses of the keyword `not` instead of `!`.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad - parentheses are required because of op precedence
11
+ # x = (not something)
12
+ #
13
+ # # good
14
+ # x = !something
15
+ #
7
16
  class Not < Cop
8
17
  MSG = 'Use `!` instead of `not`.'.freeze
9
18
 
@@ -22,10 +31,9 @@ module RuboCop
22
31
  add_offense(node, location: :selector)
23
32
  end
24
33
 
25
- private
26
-
27
34
  def autocorrect(node)
28
- range = range_with_surrounding_space(node.loc.selector, :right)
35
+ range = range_with_surrounding_space(range: node.loc.selector,
36
+ side: :right)
29
37
 
30
38
  if opposite_method?(node.receiver)
31
39
  correct_opposite_method(range, node.receiver)
@@ -36,6 +44,8 @@ module RuboCop
36
44
  end
37
45
  end
38
46
 
47
+ private
48
+
39
49
  def opposite_method?(child)
40
50
  child.send_type? && OPPOSITE_METHODS.key?(child.method_name)
41
51
  end
@@ -33,12 +33,6 @@ module RuboCop
33
33
  add_offense(node)
34
34
  end
35
35
 
36
- private
37
-
38
- def message(node)
39
- self.class.const_get("#{literal_type(node).upcase}_MSG")
40
- end
41
-
42
36
  def autocorrect(node)
43
37
  lambda do |corrector|
44
38
  type = literal_type(node)
@@ -47,6 +41,12 @@ module RuboCop
47
41
  end
48
42
  end
49
43
 
44
+ private
45
+
46
+ def message(node)
47
+ self.class.const_get("#{literal_type(node).upcase}_MSG")
48
+ end
49
+
50
50
  def literal_type(node)
51
51
  literal = integer_part(node)
52
52
 
@@ -41,6 +41,12 @@ module RuboCop
41
41
  check(node)
42
42
  end
43
43
 
44
+ def autocorrect(node)
45
+ lambda do |corrector|
46
+ corrector.replace(node.source_range, format_number(node))
47
+ end
48
+ end
49
+
44
50
  private
45
51
 
46
52
  def max_parameter_name
@@ -68,12 +74,6 @@ module RuboCop
68
74
  cop_config['Strict'] ? /_\d{1,2}(_|$)/ : /_\d{1,2}_/
69
75
  end
70
76
 
71
- def autocorrect(node)
72
- lambda do |corrector|
73
- corrector.replace(node.source_range, format_number(node))
74
- end
75
- end
76
-
77
77
  def format_number(node)
78
78
  int_part, float_part = node.source.split('.')
79
79
  int_part = int_part.to_i
@@ -86,7 +86,7 @@ module RuboCop
86
86
  formatted_int.insert(0, '-') if int_part < 0
87
87
 
88
88
  if float_part
89
- format('%s.%s', formatted_int, float_part)
89
+ format('%<int>s.%<float>s', int: formatted_int, float: float_part)
90
90
  else
91
91
  formatted_int
92
92
  end
@@ -16,10 +16,7 @@ module RuboCop
16
16
  # populated with objects which can be compared with integers, but are
17
17
  # not themselves `Interger` polymorphic.
18
18
  #
19
- # @example
20
- #
21
- # # EnforcedStyle: predicate (default)
22
- #
19
+ # @example EnforcedStyle: predicate (default)
23
20
  # # bad
24
21
  #
25
22
  # foo == 0
@@ -32,10 +29,7 @@ module RuboCop
32
29
  # foo.negative?
33
30
  # bar.baz.positive?
34
31
  #
35
- # @example
36
- #
37
- # # EnforcedStyle: comparison
38
- #
32
+ # @example EnforcedStyle: comparison
39
33
  # # bad
40
34
  #
41
35
  # foo.zero?
@@ -50,7 +44,7 @@ module RuboCop
50
44
  class NumericPredicate < Cop
51
45
  include ConfigurableEnforcedStyle
52
46
 
53
- MSG = 'Use `%s` instead of `%s`.'.freeze
47
+ MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
54
48
 
55
49
  REPLACEMENTS = {
56
50
  'zero?' => '==',
@@ -64,7 +58,17 @@ module RuboCop
64
58
  return unless numeric
65
59
 
66
60
  add_offense(node,
67
- message: format(MSG, replacement, node.source))
61
+ message: format(MSG,
62
+ prefer: replacement,
63
+ current: node.source))
64
+ end
65
+
66
+ def autocorrect(node)
67
+ _, replacement = check(node)
68
+
69
+ lambda do |corrector|
70
+ corrector.replace(node.loc.expression, replacement)
71
+ end
68
72
  end
69
73
 
70
74
  private
@@ -82,14 +86,6 @@ module RuboCop
82
86
  [numeric, replacement(numeric, operator)]
83
87
  end
84
88
 
85
- def autocorrect(node)
86
- _, replacement = check(node)
87
-
88
- lambda do |corrector|
89
- corrector.replace(node.loc.expression, replacement)
90
- end
91
- end
92
-
93
89
  def replacement(numeric, operation)
94
90
  if style == :predicate
95
91
  [parenthesized_source(numeric),
@@ -9,7 +9,7 @@ module RuboCop
9
9
  include OnNormalIfUnless
10
10
 
11
11
  MSG = 'Favor the ternary operator (`?:`) ' \
12
- 'over `%s/then/else/end` constructs.'.freeze
12
+ 'over `%<keyword>s/then/else/end` constructs.'.freeze
13
13
 
14
14
  def on_normal_if_unless(node)
15
15
  return unless node.single_line? && node.else_branch
@@ -17,16 +17,16 @@ module RuboCop
17
17
  add_offense(node)
18
18
  end
19
19
 
20
- private
21
-
22
20
  def autocorrect(node)
23
21
  lambda do |corrector|
24
22
  corrector.replace(node.source_range, replacement(node))
25
23
  end
26
24
  end
27
25
 
26
+ private
27
+
28
28
  def message(node)
29
- format(MSG, node.keyword)
29
+ format(MSG, keyword: node.keyword)
30
30
  end
31
31
 
32
32
  def replacement(node)
@@ -7,32 +7,29 @@ module RuboCop
7
7
  # current Ruby version supports keyword arguments.
8
8
  #
9
9
  # @example
10
- # Instead of:
11
10
  #
11
+ # # bad
12
12
  # def fry(options = {})
13
13
  # temperature = options.fetch(:temperature, 300)
14
- # ...
14
+ # # ...
15
15
  # end
16
16
  #
17
- # Prefer:
18
17
  #
18
+ # # good
19
19
  # def fry(temperature: 300)
20
- # ...
20
+ # # ...
21
21
  # end
22
22
  class OptionHash < Cop
23
23
  MSG = 'Prefer keyword arguments to options hashes.'.freeze
24
24
 
25
- def on_args(node)
26
- *_but_last, last_arg = *node
27
-
28
- return unless last_arg && last_arg.optarg_type?
29
-
30
- arg, default_value = *last_arg
25
+ def_node_matcher :option_hash, <<-PATTERN
26
+ (args ... $(optarg [#suspicious_name? _] (hash)))
27
+ PATTERN
31
28
 
32
- return unless default_value.hash_type? && default_value.pairs.empty?
33
- return unless suspicious_name?(arg)
34
-
35
- add_offense(last_arg)
29
+ def on_args(node)
30
+ option_hash(node) do |options|
31
+ add_offense(options)
32
+ end
36
33
  end
37
34
 
38
35
  private
@@ -58,8 +58,6 @@ module RuboCop
58
58
  alias on_cvasgn on_lvasgn
59
59
  alias on_gvasgn on_lvasgn
60
60
 
61
- private
62
-
63
61
  def autocorrect(node)
64
62
  if ternary_assignment?(node)
65
63
  variable, default = take_variable_and_default_from_ternary(node)
@@ -73,6 +71,8 @@ module RuboCop
73
71
  end
74
72
  end
75
73
 
74
+ private
75
+
76
76
  def take_variable_and_default_from_ternary(node)
77
77
  variable, if_statement = *node
78
78
  [variable, if_statement.else_branch]
@@ -38,6 +38,19 @@ module RuboCop
38
38
  add_offense(node)
39
39
  end
40
40
 
41
+ def autocorrect(node)
42
+ lambda do |corrector|
43
+ left, right = *node
44
+ left_elements = *left
45
+ right_elements = [*right].compact
46
+ order = find_valid_order(left_elements, right_elements)
47
+ correction = assignment_corrector(node, order)
48
+
49
+ corrector.replace(correction.correction_range,
50
+ correction.correction)
51
+ end
52
+ end
53
+
41
54
  private
42
55
 
43
56
  def allowed_masign?(lhs_elements, rhs_elements)
@@ -68,19 +81,6 @@ module RuboCop
68
81
  node.block_type? || node.send_type?
69
82
  end
70
83
 
71
- def autocorrect(node)
72
- lambda do |corrector|
73
- left, right = *node
74
- left_elements = *left
75
- right_elements = [*right].compact
76
- order = find_valid_order(left_elements, right_elements)
77
- correction = assignment_corrector(node, order)
78
-
79
- corrector.replace(correction.correction_range,
80
- correction.correction)
81
- end
82
- end
83
-
84
84
  def assignment_corrector(node, order)
85
85
  _assignment, modifier = *node.parent
86
86
  if modifier_statement?(node.parent)
@@ -5,6 +5,23 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for the presence of superfluous parentheses around the
7
7
  # condition of if/unless/while/until.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # x += 1 while (x < 10)
12
+ # foo unless (bar || baz)
13
+ #
14
+ # if (x > 10)
15
+ # elsif (x < 3)
16
+ # end
17
+ #
18
+ # # good
19
+ # x += 1 while x < 10
20
+ # foo unless bar || baz
21
+ #
22
+ # if x > 10
23
+ # elsif x < 3
24
+ # end
8
25
  class ParenthesesAroundCondition < Cop
9
26
  include SafeAssignment
10
27
  include Parentheses
@@ -31,7 +48,7 @@ module RuboCop
31
48
 
32
49
  control_op_condition(cond) do |first_child|
33
50
  return if modifier_op?(first_child)
34
- return if parens_required?(node.children.first)
51
+ return if parens_required?(node.condition)
35
52
  return if safe_assignment?(cond) && safe_assignment_allowed?
36
53
 
37
54
  add_offense(cond)
@@ -42,8 +59,7 @@ module RuboCop
42
59
  return false if node.if_type? && node.ternary?
43
60
  return true if node.rescue_type?
44
61
 
45
- MODIFIER_NODES.include?(node.type) &&
46
- node.modifier_form?
62
+ MODIFIER_NODES.include?(node.type) && node.modifier_form?
47
63
  end
48
64
 
49
65
  def message(node)
@@ -55,8 +55,6 @@ module RuboCop
55
55
  "`#{delimiters[0]}` and `#{delimiters[1]}`."
56
56
  end
57
57
 
58
- private
59
-
60
58
  def autocorrect(node)
61
59
  type = type(node)
62
60
 
@@ -68,10 +66,13 @@ module RuboCop
68
66
  end
69
67
  end
70
68
 
69
+ private
70
+
71
71
  def on_percent_literal(node)
72
72
  type = type(node)
73
73
  return if uses_preferred_delimiter?(node, type) ||
74
- contains_preferred_delimiter?(node, type)
74
+ contains_preferred_delimiter?(node, type) ||
75
+ include_same_character_as_used_for_delimiter?(node, type)
75
76
 
76
77
  add_offense(node)
77
78
  end
@@ -87,6 +88,17 @@ module RuboCop
87
88
  .any? { |s| preferred_delimiters.any? { |d| s.include?(d) } }
88
89
  end
89
90
 
91
+ def include_same_character_as_used_for_delimiter?(node, type)
92
+ return false unless %w[%w %i].include?(type)
93
+
94
+ used_delimiters = matchpairs(begin_source(node)[-1])
95
+ escaped_delimiters = used_delimiters.map { |d| "\\#{d}" }.join('|')
96
+
97
+ node
98
+ .children.map { |n| string_source(n) }.compact
99
+ .any? { |s| Regexp.new(escaped_delimiters) =~ s }
100
+ end
101
+
90
102
  def string_source(node)
91
103
  if node.is_a?(String)
92
104
  node
@@ -94,6 +106,15 @@ module RuboCop
94
106
  node.source
95
107
  end
96
108
  end
109
+
110
+ def matchpairs(begin_delimiter)
111
+ {
112
+ '(' => %w[( )],
113
+ '[' => %w[[ ]],
114
+ '{' => %w[{ }],
115
+ '<' => %w[< >]
116
+ }.fetch(begin_delimiter, [begin_delimiter])
117
+ end
97
118
  end
98
119
  end
99
120
  end