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,31 +5,32 @@ module RuboCop
5
5
  module Style
6
6
  # Use a consistent style for named format string tokens.
7
7
  #
8
- # @example
9
- #
10
- # EnforcedStyle: annotated
8
+ # @example EnforcedStyle: annotated (default)
11
9
  #
12
10
  # # bad
13
- #
14
11
  # format('%{greeting}', greeting: 'Hello')
15
12
  # format('%s', 'Hello')
16
13
  #
17
14
  # # good
18
- #
19
15
  # format('%<greeting>s', greeting: 'Hello')
20
16
  #
21
- # @example
22
- #
23
- # EnforcedStyle: template
17
+ # @example EnforcedStyle: template
24
18
  #
25
19
  # # bad
26
- #
27
20
  # format('%<greeting>s', greeting: 'Hello')
28
21
  # format('%s', 'Hello')
29
22
  #
30
23
  # # good
31
- #
32
24
  # format('%{greeting}', greeting: 'Hello')
25
+ #
26
+ # @example EnforcedStyle: unannotated
27
+ #
28
+ # # bad
29
+ # format('%<greeting>s', greeting: 'Hello')
30
+ # format('%{greeting}', 'Hello')
31
+ #
32
+ # # good
33
+ # format('%s', 'Hello')
33
34
  class FormatStringToken < Cop
34
35
  include ConfigurableEnforcedStyle
35
36
 
@@ -37,7 +38,8 @@ module RuboCop
37
38
 
38
39
  STYLE_PATTERNS = {
39
40
  annotated: /(?<token>%<[^>]+>#{FIELD_CHARACTERS})/,
40
- template: /(?<token>%\{[^\}]+\})/
41
+ template: /(?<token>%\{[^\}]+\})/,
42
+ unannotated: /(?<token>%#{FIELD_CHARACTERS})/
41
43
  }.freeze
42
44
 
43
45
  TOKEN_PATTERN = Regexp.union(STYLE_PATTERNS.values)
@@ -62,14 +64,13 @@ module RuboCop
62
64
  "Prefer #{message_text(style)} over #{message_text(detected_style)}."
63
65
  end
64
66
 
65
- # rubocop:disable FormatStringToken
66
67
  def message_text(style)
67
68
  case style
68
69
  when :annotated then 'annotated tokens (like `%<foo>s`)'
69
- when :template then 'template tokens (like `%{foo}`)'
70
+ when :template then 'template tokens (like `%{foo}`)'
71
+ when :unannotated then 'unannotated tokens (like `%s`)'
70
72
  end
71
73
  end
72
- # rubocop:enable FormatStringToken
73
74
 
74
75
  def tokens(str_node, &block)
75
76
  return if str_node.source == '__FILE__'
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Style
6
6
  # This cop is designed to help upgrade to Ruby 3.0. It will add the
7
7
  # comment `# frozen_string_literal: true` to the top of files to
8
- # enable frozen string literals. Frozen string literals will be default
8
+ # enable frozen string literals. Frozen string literals may be default
9
9
  # in Ruby 3.0. The comment will be added below a shebang and encoding
10
10
  # comment. The frozen string literal comment is only valid in Ruby 2.3+.
11
11
  class FrozenStringLiteralComment < Cop
@@ -27,10 +27,11 @@ module RuboCop
27
27
  end
28
28
  end
29
29
 
30
- def autocorrect(node)
30
+ def autocorrect(node) # rubocop:disable Metrics/MethodLength
31
31
  lambda do |corrector|
32
32
  if style == :never
33
- corrector.remove(range_with_surrounding_space(node.pos, :right))
33
+ corrector.remove(range_with_surrounding_space(range: node.pos,
34
+ side: :right))
34
35
  else
35
36
  last_special_comment = last_special_comment(processed_source)
36
37
  if last_special_comment.nil?
@@ -9,10 +9,20 @@ module RuboCop
9
9
  # users can allow additional variables via the AllowedVariables option.
10
10
  #
11
11
  # Note that backreferences like $1, $2, etc are not global variables.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # $foo = 2
16
+ # bar = $foo + 5
17
+ #
18
+ # # good
19
+ # FOO = 2
20
+ # foo = 2
21
+ # $stdin.read
12
22
  class GlobalVars < Cop
13
23
  MSG = 'Do not introduce global variables.'.freeze
14
24
 
15
- # predefined global variables their English aliases
25
+ # built-in global variables and their English aliases
16
26
  # http://www.zenspider.com/Languages/Ruby/QuickRef.html
17
27
  BUILT_IN_VARS = %w[
18
28
  $: $LOAD_PATH
@@ -19,49 +19,41 @@ module RuboCop
19
19
  # * ruby19_no_mixed_keys - forces use of ruby 1.9 syntax and forbids mixed
20
20
  # syntax hashes
21
21
  #
22
- # @example
23
- # "EnforcedStyle => 'ruby19'"
22
+ # @example EnforcedStyle: ruby19 (default)
23
+ # # bad
24
+ # {:a => 2}
25
+ # {b: 1, :c => 2}
24
26
  #
25
- # @good
27
+ # # good
26
28
  # {a: 2, b: 1}
27
29
  # {:c => 2, 'd' => 2} # acceptable since 'd' isn't a symbol
28
30
  # {d: 1, 'e' => 2} # technically not forbidden
29
31
  #
30
- # @bad
31
- # {:a => 2}
32
- # {b: 1, :c => 2}
33
- #
34
- # @example
35
- # "EnforcedStyle => 'hash_rockets'"
36
- #
37
- # @good
38
- # {:a => 1, :b => 2}
39
- #
40
- # @bad
32
+ # @example EnforcedStyle: hash_rockets
33
+ # # bad
41
34
  # {a: 1, b: 2}
42
35
  # {c: 1, 'd' => 5}
43
36
  #
44
- # @example
45
- # "EnforcedStyle => 'no_mixed_keys'"
46
- #
47
- # @good
37
+ # # good
48
38
  # {:a => 1, :b => 2}
49
- # {c: 1, d: 2}
50
39
  #
51
- # @bad
40
+ # @example EnforcedStyle: no_mixed_keys
41
+ # # bad
52
42
  # {:a => 1, b: 2}
53
43
  # {c: 1, 'd' => 2}
54
44
  #
55
- # @example
56
- # "EnforcedStyle => 'ruby19_no_mixed_keys'"
57
- #
58
- # @good
59
- # {a: 1, b: 2}
60
- # {:c => 3, 'd' => 4}
45
+ # # good
46
+ # {:a => 1, :b => 2}
47
+ # {c: 1, d: 2}
61
48
  #
62
- # @bad
49
+ # @example EnforcedStyle: ruby19_no_mixed_keys
50
+ # # bad
63
51
  # {:a => 1, :b => 2}
64
52
  # {c: 2, 'd' => 3} # should just use hash rockets
53
+ #
54
+ # # good
55
+ # {a: 1, b: 2}
56
+ # {:c => 3, 'd' => 4}
65
57
  class HashSyntax < Cop
66
58
  include ConfigurableEnforcedStyle
67
59
 
@@ -174,30 +166,39 @@ module RuboCop
174
166
  end
175
167
  end
176
168
 
177
- def autocorrect_ruby19(corrector, node)
178
- key = node.children.first.source_range
179
- op = node.loc.operator
169
+ def autocorrect_ruby19(corrector, pair_node)
170
+ key = pair_node.key
171
+ op = pair_node.loc.operator
172
+
173
+ range = range_between(key.source_range.begin_pos, op.end_pos)
174
+ range = range_with_surrounding_space(range: range, side: :right)
175
+
176
+ new_key = key.sym_type? ? key.value : key.source
177
+
178
+ space = argument_without_space?(pair_node.parent) ? ' ' : ''
179
+
180
+ corrector.replace(range, "#{space}#{new_key}: ")
181
+ end
180
182
 
181
- range = range_between(key.begin_pos, op.end_pos)
182
- range = range_with_surrounding_space(range, :right)
183
- corrector.replace(range,
184
- range.source.sub(/^:(.*\S)\s*=>\s*$/, '\1: '))
183
+ def argument_without_space?(node)
184
+ node.argument? &&
185
+ node.loc.expression.begin_pos == node.parent.loc.selector.end_pos
185
186
  end
186
187
 
187
- def autocorrect_hash_rockets(corrector, node)
188
- key = node.children.first.source_range
189
- op = node.loc.operator
188
+ def autocorrect_hash_rockets(corrector, pair_node)
189
+ key = pair_node.key.source_range
190
+ op = pair_node.loc.operator
190
191
 
191
- corrector.insert_after(key, node.inverse_delimiter(true))
192
+ corrector.insert_after(key, pair_node.inverse_delimiter(true))
192
193
  corrector.insert_before(key, ':')
193
- corrector.remove(range_with_surrounding_space(op))
194
+ corrector.remove(range_with_surrounding_space(range: op))
194
195
  end
195
196
 
196
- def autocorrect_no_mixed_keys(corrector, node)
197
- if node.colon?
198
- autocorrect_hash_rockets(corrector, node)
197
+ def autocorrect_no_mixed_keys(corrector, pair_node)
198
+ if pair_node.colon?
199
+ autocorrect_hash_rockets(corrector, pair_node)
199
200
  else
200
- autocorrect_ruby19(corrector, node)
201
+ autocorrect_ruby19(corrector, pair_node)
201
202
  end
202
203
  end
203
204
 
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # each branch of a conditional statement.
8
8
  #
9
9
  # @example
10
- # @bad
10
+ # # bad
11
11
  # if condition
12
12
  # do_x
13
13
  # do_z
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # do_z
17
17
  # end
18
18
  #
19
- # @good
19
+ # # good
20
20
  # if condition
21
21
  # do_x
22
22
  # else
@@ -24,7 +24,7 @@ module RuboCop
24
24
  # end
25
25
  # do_z
26
26
  #
27
- # @bad
27
+ # # bad
28
28
  # if condition
29
29
  # do_z
30
30
  # do_x
@@ -33,7 +33,7 @@ module RuboCop
33
33
  # do_y
34
34
  # end
35
35
  #
36
- # @good
36
+ # # good
37
37
  # do_z
38
38
  # if condition
39
39
  # do_x
@@ -41,7 +41,7 @@ module RuboCop
41
41
  # do_y
42
42
  # end
43
43
  #
44
- # @bad
44
+ # # bad
45
45
  # case foo
46
46
  # when 1
47
47
  # do_x
@@ -51,7 +51,7 @@ module RuboCop
51
51
  # do_x
52
52
  # end
53
53
  #
54
- # @good
54
+ # # good
55
55
  # case foo
56
56
  # when 1
57
57
  # do_x
@@ -63,7 +63,7 @@ module RuboCop
63
63
  # do_z
64
64
  # end
65
65
  class IdenticalConditionalBranches < Cop
66
- MSG = 'Move `%s` out of the conditional.'.freeze
66
+ MSG = 'Move `%<source>s` out of the conditional.'.freeze
67
67
 
68
68
  def on_if(node)
69
69
  return if node.elsif?
@@ -105,7 +105,7 @@ module RuboCop
105
105
  end
106
106
 
107
107
  def message(node)
108
- format(MSG, node.source)
108
+ format(MSG, source: node.source)
109
109
  end
110
110
 
111
111
  # `elsif` branches show up in the if node as nested `else` branches. We
@@ -8,16 +8,7 @@ module RuboCop
8
8
  # This helps to keep the nesting level from getting too deep.
9
9
  #
10
10
  # @example
11
- # @good
12
- # if condition_a
13
- # action_a
14
- # elsif condition_b
15
- # action_b
16
- # else
17
- # action_c
18
- # end
19
- #
20
- # @bad
11
+ # # bad
21
12
  # if condition_a
22
13
  # action_a
23
14
  # else
@@ -27,6 +18,15 @@ module RuboCop
27
18
  # action_c
28
19
  # end
29
20
  # end
21
+ #
22
+ # # good
23
+ # if condition_a
24
+ # action_a
25
+ # elsif condition_b
26
+ # action_b
27
+ # else
28
+ # action_c
29
+ # end
30
30
  class IfInsideElse < Cop
31
31
  MSG = 'Convert `if` nested inside `else` to `elsif`.'.freeze
32
32
 
@@ -4,13 +4,13 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # Checks for if and unless statements that would fit on one line
7
- # if written as a modifier if/unless.
8
- # The maximum line length is configurable.
7
+ # if written as a modifier if/unless. The maximum line length is
8
+ # configured in the `Metrics/LineLength` cop.
9
9
  class IfUnlessModifier < Cop
10
10
  include StatementModifier
11
11
 
12
- MSG = 'Favor modifier `%s` usage when having a single-line body. ' \
13
- 'Another good alternative is the usage of control flow ' \
12
+ MSG = 'Favor modifier `%<keyword>s` usage when having a single-line ' \
13
+ 'body. Another good alternative is the usage of control flow ' \
14
14
  '`&&`/`||`.'.freeze
15
15
 
16
16
  ASSIGNMENT_TYPES = %i[lvasgn casgn cvasgn
@@ -20,17 +20,17 @@ module RuboCop
20
20
  return unless eligible_node?(node)
21
21
 
22
22
  add_offense(node, location: :keyword,
23
- message: format(MSG, node.keyword))
23
+ message: format(MSG, keyword: node.keyword))
24
24
  end
25
25
 
26
- private
27
-
28
26
  def autocorrect(node)
29
27
  lambda do |corrector|
30
28
  corrector.replace(node.source_range, to_modifier_form(node))
31
29
  end
32
30
  end
33
31
 
32
+ private
33
+
34
34
  def eligible_node?(node)
35
35
  !non_eligible_if?(node) && !node.chained? &&
36
36
  !node.nested_conditional? && single_line_as_modifier?(node)
@@ -25,13 +25,13 @@ module RuboCop
25
25
  class IfUnlessModifierOfIfUnless < Cop
26
26
  include StatementModifier
27
27
 
28
- MSG = 'Avoid modifier `%s` after another conditional.'.freeze
28
+ MSG = 'Avoid modifier `%<keyword>s` after another conditional.'.freeze
29
29
 
30
30
  def on_if(node)
31
31
  return unless node.modifier_form? && node.body.if_type?
32
32
 
33
33
  add_offense(node, location: :keyword,
34
- message: format(MSG, node.keyword))
34
+ message: format(MSG, keyword: node.keyword))
35
35
  end
36
36
  end
37
37
  end
@@ -4,6 +4,15 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # Checks for uses of semicolon in if statements.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # result = if some_condition; something else another_thing end
12
+ #
13
+ # # good
14
+ # result = some_condition ? something : another_thing
15
+ #
7
16
  class IfWithSemicolon < Cop
8
17
  include OnNormalIfUnless
9
18
 
@@ -9,21 +9,21 @@ module RuboCop
9
9
  # nature of the error.)
10
10
  #
11
11
  # @example
12
- # @bad
12
+ # # bad
13
13
  # raise 'Error message here'
14
14
  #
15
- # @good
15
+ # # good
16
16
  # raise ArgumentError, 'Error message here'
17
17
  class ImplicitRuntimeError < Cop
18
- MSG = 'Use `%s` with an explicit exception class and message, ' \
19
- 'rather than just a message.'.freeze
18
+ MSG = 'Use `%<method>s` with an explicit exception class and message,' \
19
+ ' rather than just a message.'.freeze
20
20
 
21
21
  def_node_matcher :implicit_runtime_error_raise_or_fail,
22
22
  '(send nil? ${:raise :fail} {str dstr})'
23
23
 
24
24
  def on_send(node)
25
25
  implicit_runtime_error_raise_or_fail(node) do |method|
26
- add_offense(node, message: format(MSG, method))
26
+ add_offense(node, message: format(MSG, method: method))
27
27
  end
28
28
  end
29
29
  end
@@ -35,8 +35,6 @@ module RuboCop
35
35
  alias on_while_post on_while
36
36
  alias on_until_post on_until
37
37
 
38
- private
39
-
40
38
  def autocorrect(node)
41
39
  if node.while_post_type? || node.until_post_type?
42
40
  replace_begin_end_with_modifier(node)
@@ -47,6 +45,8 @@ module RuboCop
47
45
  end
48
46
  end
49
47
 
48
+ private
49
+
50
50
  def replace_begin_end_with_modifier(node)
51
51
  lambda do |corrector|
52
52
  corrector.replace(node.body.loc.begin, 'loop do')