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
@@ -4,12 +4,31 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # Checks for while and until statements that would fit on one line
7
- # if written as a modifier while/until.
8
- # The maximum line length is configurable.
7
+ # if written as a modifier while/until. The maximum line length is
8
+ # configured in the `Metrics/LineLength` cop.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # while x < 10
13
+ # x += 1
14
+ # end
15
+ #
16
+ # # good
17
+ # x += 1 while x < 10
18
+ #
19
+ # @example
20
+ # # bad
21
+ # until x > 10
22
+ # x += 1
23
+ # end
24
+ #
25
+ # # good
26
+ # x += 1 until x > 10
9
27
  class WhileUntilModifier < Cop
10
28
  include StatementModifier
11
29
 
12
- MSG = 'Favor modifier `%s` usage when having a single-line body.'.freeze
30
+ MSG = 'Favor modifier `%<keyword>s` usage when ' \
31
+ 'having a single-line body.'.freeze
13
32
 
14
33
  def on_while(node)
15
34
  check(node)
@@ -19,8 +38,6 @@ module RuboCop
19
38
  check(node)
20
39
  end
21
40
 
22
- private
23
-
24
41
  def autocorrect(node)
25
42
  oneline = "#{node.body.source} #{node.keyword} " \
26
43
  "#{node.condition.source}"
@@ -30,11 +47,13 @@ module RuboCop
30
47
  end
31
48
  end
32
49
 
50
+ private
51
+
33
52
  def check(node)
34
53
  return unless node.multiline? && single_line_as_modifier?(node)
35
54
 
36
55
  add_offense(node, location: :keyword,
37
- message: format(MSG, node.keyword))
56
+ message: format(MSG, keyword: node.keyword))
38
57
  end
39
58
  end
40
59
  end
@@ -14,18 +14,14 @@ module RuboCop
14
14
  # cop. For example, a `MinSize` of `3` will not enforce a style on an
15
15
  # array of 2 or fewer elements.
16
16
  #
17
- # @example
18
- # EnforcedStyle: percent (default)
19
- #
17
+ # @example EnforcedStyle: percent (default)
20
18
  # # good
21
19
  # %w[foo bar baz]
22
20
  #
23
21
  # # bad
24
22
  # ['foo', 'bar', 'baz']
25
23
  #
26
- # @example
27
- # EnforcedStyle: brackets
28
- #
24
+ # @example EnforcedStyle: brackets
29
25
  # # good
30
26
  # ['foo', 'bar', 'baz']
31
27
  #
@@ -56,8 +52,6 @@ module RuboCop
56
52
  end
57
53
  end
58
54
 
59
- private
60
-
61
55
  def autocorrect(node)
62
56
  if style == :percent
63
57
  correct_percent(node, 'w')
@@ -66,6 +60,8 @@ module RuboCop
66
60
  end
67
61
  end
68
62
 
63
+ private
64
+
69
65
  def check_bracketed_array(node)
70
66
  return if allowed_bracket_array?(node)
71
67
 
@@ -7,10 +7,7 @@ module RuboCop
7
7
  # readability is reduced because the operands are not ordered the same
8
8
  # way as they would be ordered in spoken English.
9
9
  #
10
- # @example
11
- #
12
- # # EnforcedStyle: all_comparison_operators
13
- #
10
+ # @example EnforcedStyle: all_comparison_operators (default)
14
11
  # # bad
15
12
  # 99 == foo
16
13
  # "bar" != foo
@@ -23,10 +20,7 @@ module RuboCop
23
20
  # foo <= 42
24
21
  # bar > 10
25
22
  #
26
- # @example
27
- #
28
- # # EnforcedStyle: equality_operators_only
29
- #
23
+ # @example EnforcedStyle: equality_operators_only
30
24
  # # bad
31
25
  # 99 == foo
32
26
  # "bar" != foo
@@ -37,7 +31,7 @@ module RuboCop
37
31
  class YodaCondition < Cop
38
32
  include ConfigurableEnforcedStyle
39
33
 
40
- MSG = 'Reverse the order of the operands `%s`.'.freeze
34
+ MSG = 'Reverse the order of the operands `%<source>s`.'.freeze
41
35
 
42
36
  REVERSE_COMPARISON = {
43
37
  '<' => '>',
@@ -56,6 +50,12 @@ module RuboCop
56
50
  add_offense(node)
57
51
  end
58
52
 
53
+ def autocorrect(node)
54
+ lambda do |corrector|
55
+ corrector.replace(actual_code_range(node), corrected_code(node))
56
+ end
57
+ end
58
+
59
59
  private
60
60
 
61
61
  def yoda_condition?(node)
@@ -72,13 +72,7 @@ module RuboCop
72
72
  end
73
73
 
74
74
  def message(node)
75
- format(MSG, node.source)
76
- end
77
-
78
- def autocorrect(node)
79
- lambda do |corrector|
80
- corrector.replace(actual_code_range(node), corrected_code(node))
81
- end
75
+ format(MSG, source: node.source)
82
76
  end
83
77
 
84
78
  def corrected_code(node)
@@ -10,8 +10,7 @@ module RuboCop
10
10
  # replaced by receiver.empty? and !receiver.empty.
11
11
  #
12
12
  # @example
13
- #
14
- # @bad
13
+ # # bad
15
14
  # [1, 2, 3].length == 0
16
15
  # 0 == "foobar".length
17
16
  # array.length < 1
@@ -19,7 +18,7 @@ module RuboCop
19
18
  # string.length > 0
20
19
  # hash.size > 0
21
20
  #
22
- # @good
21
+ # # good
23
22
  # [1, 2, 3].empty?
24
23
  # "foobar".empty?
25
24
  # array.empty?
@@ -27,14 +26,21 @@ module RuboCop
27
26
  # !string.empty?
28
27
  # !hash.empty?
29
28
  class ZeroLengthPredicate < Cop
30
- ZERO_MSG = 'Use `empty?` instead of `%s %s %s`.'.freeze
31
- NONZERO_MSG = 'Use `!empty?` instead of `%s %s %s`.'.freeze
29
+ ZERO_MSG = 'Use `empty?` instead of `%<lhs>s %<opr>s %<rhs>s`.'.freeze
30
+ NONZERO_MSG = 'Use `!empty?` instead of ' \
31
+ '`%<lhs>s %<opr>s %<rhs>s`.'.freeze
32
32
 
33
33
  def on_send(node)
34
34
  check_zero_length_predicate(node)
35
35
  check_nonzero_length_predicate(node)
36
36
  end
37
37
 
38
+ def autocorrect(node)
39
+ lambda do |corrector|
40
+ corrector.replace(node.loc.expression, replacement(node))
41
+ end
42
+ end
43
+
38
44
  private
39
45
 
40
46
  def check_zero_length_predicate(node)
@@ -42,8 +48,12 @@ module RuboCop
42
48
 
43
49
  return unless zero_length_predicate
44
50
 
45
- add_offense(node,
46
- message: format(ZERO_MSG, *zero_length_predicate))
51
+ lhs, opr, rhs = zero_length_predicate
52
+
53
+ add_offense(
54
+ node,
55
+ message: format(ZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
56
+ )
47
57
  end
48
58
 
49
59
  def check_nonzero_length_predicate(node)
@@ -51,8 +61,12 @@ module RuboCop
51
61
 
52
62
  return unless nonzero_length_predicate
53
63
 
54
- add_offense(node,
55
- message: format(NONZERO_MSG, *nonzero_length_predicate))
64
+ lhs, opr, rhs = nonzero_length_predicate
65
+
66
+ add_offense(
67
+ node,
68
+ message: format(NONZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
69
+ )
56
70
  end
57
71
 
58
72
  def_node_matcher :zero_length_predicate, <<-PATTERN
@@ -67,12 +81,6 @@ module RuboCop
67
81
  (send (int $0) ${:< :!=} (send (...) ${:length :size}))}
68
82
  PATTERN
69
83
 
70
- def autocorrect(node)
71
- lambda do |corrector|
72
- corrector.replace(node.loc.expression, replacement(node))
73
- end
74
- end
75
-
76
84
  def replacement(node)
77
85
  receiver = zero_length_receiver(node)
78
86
  return "#{receiver.source}.empty?" if receiver
@@ -23,7 +23,7 @@ module RuboCop
23
23
  # Backtick is added last just to help editors parse this code.
24
24
  OPERATOR_METHODS = %w(
25
25
  | ^ & <=> == === =~ > >= < <= << >>
26
- + - * / % ** ~ +@ -@ [] []= ! != !~
26
+ + - * / % ** ~ +@ -@ !@ ~@ [] []= ! != !~
27
27
  ).map(&:to_sym).push(:'`').freeze
28
28
 
29
29
  # Match literal regex characters, not including anchors, character
@@ -48,10 +48,6 @@ module RuboCop
48
48
  str
49
49
  end
50
50
 
51
- def block_length(block_node)
52
- block_node.loc.end.line - block_node.loc.begin.line
53
- end
54
-
55
51
  def comment_line?(line_source)
56
52
  line_source =~ /^\s*#/
57
53
  end
@@ -137,18 +133,22 @@ module RuboCop
137
133
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
138
134
  end
139
135
 
140
- def range_with_surrounding_space(range, side = :both, with_newline = true)
136
+ def range_with_surrounding_space(range:,
137
+ side: :both,
138
+ newlines: true,
139
+ whitespace: false)
141
140
  buffer = @processed_source.buffer
142
141
  src = buffer.source
143
142
 
144
143
  go_left, go_right = directions(side)
145
144
 
146
145
  begin_pos = range.begin_pos
146
+ if go_left
147
+ begin_pos =
148
+ final_pos(src, begin_pos, -1, newlines, whitespace)
149
+ end
147
150
  end_pos = range.end_pos
148
- begin_pos = move_pos(src, begin_pos, -1, go_left, /[ \t]/)
149
- begin_pos = move_pos(src, begin_pos, -1, go_left && with_newline, /\n/)
150
- end_pos = move_pos(src, end_pos, 1, go_right, /[ \t]/)
151
- end_pos = move_pos(src, end_pos, 1, go_right && with_newline, /\n/)
151
+ end_pos = final_pos(src, end_pos, 1, newlines, whitespace) if go_right
152
152
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
153
153
  end
154
154
 
@@ -168,20 +168,6 @@ module RuboCop
168
168
  Parser::Source::Range.new(buffer, begin_of_first_line, end_of_last_line)
169
169
  end
170
170
 
171
- def move_pos(src, pos, step, condition, regexp)
172
- offset = step == -1 ? -1 : 0
173
- pos += step while condition && src[pos + offset] =~ regexp
174
- pos < 0 ? 0 : pos
175
- end
176
-
177
- def directions(side)
178
- if side == :both
179
- [true, true]
180
- else
181
- [side == :left, side == :right]
182
- end
183
- end
184
-
185
171
  def begins_its_line?(range)
186
172
  (range.source_line =~ /\S/) == range.column
187
173
  end
@@ -282,11 +268,7 @@ module RuboCop
282
268
  n1.loc.line == n2.loc.line
283
269
  end
284
270
 
285
- def line_distance(n1, n2)
286
- n2.loc.line - n1.loc.line
287
- end
288
-
289
- def preceed?(n1, n2)
271
+ def precede?(n1, n2)
290
272
  line_distance(n1, n2) == 1
291
273
  end
292
274
 
@@ -294,16 +276,43 @@ module RuboCop
294
276
  processed_source[0..line].map(&:strip)
295
277
  end
296
278
 
279
+ def to_supported_styles(enforced_style)
280
+ enforced_style
281
+ .sub(/^Enforced/, 'Supported')
282
+ .sub('Style', 'Styles')
283
+ end
284
+
285
+ private
286
+
287
+ def directions(side)
288
+ if side == :both
289
+ [true, true]
290
+ else
291
+ [side == :left, side == :right]
292
+ end
293
+ end
294
+
295
+ def final_pos(src, pos, increment, newlines, whitespace)
296
+ pos = move_pos(src, pos, increment, true, /[ \t]/)
297
+ pos = move_pos(src, pos, increment, newlines, /\n/)
298
+ move_pos(src, pos, increment, whitespace, /\s/)
299
+ end
300
+
301
+ def move_pos(src, pos, step, condition, regexp)
302
+ offset = step == -1 ? -1 : 0
303
+ pos += step while condition && src[pos + offset] =~ regexp
304
+ pos < 0 ? 0 : pos
305
+ end
306
+
297
307
  def compatible_external_encoding_for?(src)
298
308
  src = src.dup if RUBY_VERSION < '2.3' || RUBY_ENGINE == 'jruby'
299
309
  src.force_encoding(Encoding.default_external).valid_encoding?
300
310
  end
301
311
 
302
- def to_supported_styles(enforced_style)
303
- enforced_style
304
- .sub(/^Enforced/, 'Supported')
305
- .sub('Style', 'Styles')
312
+ def line_distance(n1, n2)
313
+ n2.loc.line - n1.loc.line
306
314
  end
307
315
  end
308
316
  end
309
317
  end
318
+ # rubocop:enable Metrics/ModuleLength
@@ -320,7 +320,7 @@ module RuboCop
320
320
  next if assignment_nodes_in_loop.none? do |assignment_node|
321
321
  assignment_node.equal?(assignment.node)
322
322
  end
323
- assignment.reference!
323
+ assignment.reference!(node)
324
324
  end
325
325
  end
326
326
  end
@@ -9,7 +9,7 @@ module RuboCop
9
9
 
10
10
  MULTIPLE_LEFT_HAND_SIDE_TYPE = :mlhs
11
11
 
12
- attr_reader :node, :variable, :referenced
12
+ attr_reader :node, :variable, :referenced, :references
13
13
  alias referenced? referenced
14
14
 
15
15
  def initialize(node, variable)
@@ -22,6 +22,7 @@ module RuboCop
22
22
  @node = node
23
23
  @variable = variable
24
24
  @referenced = false
25
+ @references = []
25
26
  end
26
27
 
27
28
  def name
@@ -32,7 +33,8 @@ module RuboCop
32
33
  @variable.scope
33
34
  end
34
35
 
35
- def reference!
36
+ def reference!(node)
37
+ @references << node
36
38
  @referenced = true
37
39
  end
38
40
 
@@ -37,11 +37,7 @@ module RuboCop
37
37
  end
38
38
 
39
39
  def name
40
- # TODO: Add an else clause
41
- case @node.type
42
- when :def then @node.children[0]
43
- when :defs then @node.children[1]
44
- end
40
+ @node.method_name
45
41
  end
46
42
 
47
43
  def body_node
@@ -47,7 +47,7 @@ module RuboCop
47
47
  next if consumed_branches.include?(assignment.branch)
48
48
 
49
49
  unless assignment.run_exclusively_with?(reference)
50
- assignment.reference!
50
+ assignment.reference!(node)
51
51
  end
52
52
 
53
53
  break if !assignment.branch || assignment.branch == reference.branch
@@ -55,8 +55,6 @@ module RuboCop
55
55
  output_offenses
56
56
 
57
57
  puts "Created #{output.path}."
58
- puts "Run `rubocop --config #{output.path}`, or add `inherit_from: " \
59
- "#{output.path}` in a .rubocop.yml file."
60
58
  end
61
59
 
62
60
  private
@@ -107,7 +105,8 @@ module RuboCop
107
105
  end
108
106
 
109
107
  def output_cop_param_comments(params, default_cfg)
110
- output.puts "# Configuration parameters: #{params.join(', ')}."
108
+ config_params = params.reject { |p| p.start_with?('Supported') }
109
+ output.puts "# Configuration parameters: #{config_params.join(', ')}."
111
110
 
112
111
  params.each do |param|
113
112
  value = default_cfg[param]
@@ -20,7 +20,8 @@ module RuboCop
20
20
  'offenses' => OffenseCountFormatter,
21
21
  'disabled' => DisabledLinesFormatter,
22
22
  'worst' => WorstOffendersFormatter,
23
- 'tap' => TapFormatter
23
+ 'tap' => TapFormatter,
24
+ 'quiet' => QuietFormatter
24
25
  }.freeze
25
26
 
26
27
  FORMATTER_APIS = %i[started finished].freeze