rubocop 1.59.0 → 1.65.1

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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +3 -4
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +1 -160
  6. data/config/default.yml +93 -17
  7. data/lib/rubocop/cached_data.rb +11 -3
  8. data/lib/rubocop/cli/command/auto_generate_config.rb +12 -3
  9. data/lib/rubocop/cli/command/lsp.rb +2 -2
  10. data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
  11. data/lib/rubocop/cli.rb +10 -1
  12. data/lib/rubocop/config.rb +36 -12
  13. data/lib/rubocop/config_finder.rb +12 -2
  14. data/lib/rubocop/config_loader.rb +1 -2
  15. data/lib/rubocop/config_loader_resolver.rb +9 -3
  16. data/lib/rubocop/config_obsoletion.rb +1 -1
  17. data/lib/rubocop/config_validator.rb +14 -7
  18. data/lib/rubocop/cop/autocorrect_logic.rb +6 -1
  19. data/lib/rubocop/cop/base.rb +63 -16
  20. data/lib/rubocop/cop/bundler/gem_version.rb +3 -5
  21. data/lib/rubocop/cop/cop.rb +22 -4
  22. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
  23. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +5 -13
  24. data/lib/rubocop/cop/documentation.rb +16 -6
  25. data/lib/rubocop/cop/exclude_limit.rb +1 -1
  26. data/lib/rubocop/cop/force.rb +12 -0
  27. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  28. data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
  29. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  30. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -1
  31. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
  32. data/lib/rubocop/cop/internal_affairs/example_description.rb +6 -5
  33. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
  34. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +122 -28
  35. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  36. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  37. data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
  38. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  39. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  40. data/lib/rubocop/cop/layout/condition_position.rb +0 -4
  41. data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
  42. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  43. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  44. data/lib/rubocop/cop/layout/end_alignment.rb +8 -2
  45. data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
  46. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -1
  47. data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
  48. data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
  49. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +1 -1
  50. data/lib/rubocop/cop/layout/line_length.rb +20 -20
  51. data/lib/rubocop/cop/layout/redundant_line_break.rb +14 -2
  52. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -0
  53. data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
  54. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
  55. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -4
  56. data/lib/rubocop/cop/legacy/corrector.rb +12 -2
  57. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +0 -2
  58. data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
  59. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
  60. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  61. data/lib/rubocop/cop/lint/boolean_symbol.rb +0 -2
  62. data/lib/rubocop/cop/lint/circular_argument_reference.rb +0 -13
  63. data/lib/rubocop/cop/lint/debugger.rb +27 -6
  64. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  65. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +0 -10
  66. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
  67. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
  68. data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -10
  69. data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
  70. data/lib/rubocop/cop/lint/else_layout.rb +0 -2
  71. data/lib/rubocop/cop/lint/empty_conditional_body.rb +2 -2
  72. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -11
  73. data/lib/rubocop/cop/lint/empty_interpolation.rb +0 -4
  74. data/lib/rubocop/cop/lint/empty_when.rb +1 -3
  75. data/lib/rubocop/cop/lint/ensure_return.rb +1 -6
  76. data/lib/rubocop/cop/lint/erb_new_arguments.rb +21 -14
  77. data/lib/rubocop/cop/lint/float_comparison.rb +3 -1
  78. data/lib/rubocop/cop/lint/float_out_of_range.rb +0 -4
  79. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +0 -10
  80. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +15 -12
  81. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
  82. data/lib/rubocop/cop/lint/interpolation_check.rb +0 -4
  83. data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
  84. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +13 -6
  85. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +0 -4
  86. data/lib/rubocop/cop/lint/loop.rb +6 -12
  87. data/lib/rubocop/cop/lint/mixed_case_range.rb +9 -4
  88. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -7
  89. data/lib/rubocop/cop/lint/next_without_accumulator.rb +0 -4
  90. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +0 -5
  91. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -1
  92. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
  93. data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
  94. data/lib/rubocop/cop/lint/rand_one.rb +0 -4
  95. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +3 -1
  96. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +14 -9
  97. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  98. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +0 -4
  99. data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -0
  100. data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
  101. data/lib/rubocop/cop/lint/rescue_exception.rb +0 -4
  102. data/lib/rubocop/cop/lint/rescue_type.rb +1 -3
  103. data/lib/rubocop/cop/lint/return_in_void_context.rb +0 -2
  104. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +0 -4
  105. data/lib/rubocop/cop/lint/script_permission.rb +3 -3
  106. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
  107. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +6 -10
  108. data/lib/rubocop/cop/lint/syntax.rb +6 -3
  109. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -3
  110. data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
  111. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
  112. data/lib/rubocop/cop/lint/unreachable_code.rb +4 -7
  113. data/lib/rubocop/cop/lint/unreachable_loop.rb +8 -2
  114. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -5
  115. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +0 -4
  116. data/lib/rubocop/cop/lint/useless_setter_call.rb +0 -4
  117. data/lib/rubocop/cop/lint/useless_times.rb +1 -1
  118. data/lib/rubocop/cop/lint/void.rb +11 -1
  119. data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
  120. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +5 -5
  121. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  122. data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
  123. data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
  124. data/lib/rubocop/cop/mixin/code_length.rb +12 -1
  125. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  126. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
  127. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +9 -2
  128. data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
  129. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  130. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
  131. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
  132. data/lib/rubocop/cop/naming/block_forwarding.rb +32 -5
  133. data/lib/rubocop/cop/naming/file_name.rb +2 -2
  134. data/lib/rubocop/cop/naming/inclusive_language.rb +1 -2
  135. data/lib/rubocop/cop/naming/predicate_name.rb +54 -28
  136. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -1
  137. data/lib/rubocop/cop/registry.rb +1 -1
  138. data/lib/rubocop/cop/security/compound_hash.rb +2 -2
  139. data/lib/rubocop/cop/security/open.rb +2 -2
  140. data/lib/rubocop/cop/style/access_modifier_declarations.rb +50 -0
  141. data/lib/rubocop/cop/style/alias.rb +1 -0
  142. data/lib/rubocop/cop/style/arguments_forwarding.rb +89 -17
  143. data/lib/rubocop/cop/style/case_like_if.rb +1 -1
  144. data/lib/rubocop/cop/style/class_vars.rb +3 -3
  145. data/lib/rubocop/cop/style/collection_compact.rb +14 -5
  146. data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
  147. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -7
  148. data/lib/rubocop/cop/style/copyright.rb +31 -21
  149. data/lib/rubocop/cop/style/def_with_parentheses.rb +0 -2
  150. data/lib/rubocop/cop/style/documentation.rb +24 -24
  151. data/lib/rubocop/cop/style/documentation_method.rb +20 -0
  152. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -8
  153. data/lib/rubocop/cop/style/eval_with_location.rb +15 -23
  154. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -1
  155. data/lib/rubocop/cop/style/file_read.rb +2 -5
  156. data/lib/rubocop/cop/style/file_write.rb +2 -5
  157. data/lib/rubocop/cop/style/for.rb +2 -0
  158. data/lib/rubocop/cop/style/format_string.rb +9 -9
  159. data/lib/rubocop/cop/style/global_std_stream.rb +7 -1
  160. data/lib/rubocop/cop/style/hash_each_methods.rb +29 -8
  161. data/lib/rubocop/cop/style/hash_except.rb +8 -5
  162. data/lib/rubocop/cop/style/hash_syntax.rb +24 -2
  163. data/lib/rubocop/cop/style/identical_conditional_branches.rb +4 -1
  164. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -4
  165. data/lib/rubocop/cop/style/inverse_methods.rb +8 -8
  166. data/lib/rubocop/cop/style/invertible_unless_condition.rb +46 -4
  167. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +81 -50
  168. data/lib/rubocop/cop/style/map_into_array.rb +175 -0
  169. data/lib/rubocop/cop/style/map_to_hash.rb +10 -6
  170. data/lib/rubocop/cop/style/map_to_set.rb +1 -1
  171. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +18 -5
  172. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -4
  173. data/lib/rubocop/cop/style/missing_else.rb +0 -4
  174. data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -1
  175. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
  176. data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
  177. data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
  178. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  179. data/lib/rubocop/cop/style/numeric_predicate.rb +10 -2
  180. data/lib/rubocop/cop/style/object_then.rb +5 -3
  181. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
  182. data/lib/rubocop/cop/style/parallel_assignment.rb +3 -5
  183. data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
  184. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  185. data/lib/rubocop/cop/style/raise_args.rb +4 -1
  186. data/lib/rubocop/cop/style/redundant_argument.rb +25 -2
  187. data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
  188. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  189. data/lib/rubocop/cop/style/redundant_condition.rb +0 -1
  190. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +5 -4
  191. data/lib/rubocop/cop/style/redundant_each.rb +7 -4
  192. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  193. data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
  194. data/lib/rubocop/cop/style/redundant_line_continuation.rb +17 -2
  195. data/lib/rubocop/cop/style/redundant_parentheses.rb +18 -2
  196. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  197. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -24
  198. data/lib/rubocop/cop/style/redundant_return.rb +6 -0
  199. data/lib/rubocop/cop/style/require_order.rb +1 -1
  200. data/lib/rubocop/cop/style/sample.rb +1 -3
  201. data/lib/rubocop/cop/style/send.rb +4 -4
  202. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +104 -0
  203. data/lib/rubocop/cop/style/slicing_with_range.rb +76 -10
  204. data/lib/rubocop/cop/style/sole_nested_conditional.rb +21 -2
  205. data/lib/rubocop/cop/style/special_global_vars.rb +1 -2
  206. data/lib/rubocop/cop/style/super_arguments.rb +174 -0
  207. data/lib/rubocop/cop/style/symbol_proc.rb +75 -5
  208. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  209. data/lib/rubocop/cop/style/while_until_do.rb +0 -2
  210. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  211. data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
  212. data/lib/rubocop/cop/team.rb +13 -0
  213. data/lib/rubocop/cop/util.rb +7 -1
  214. data/lib/rubocop/cop/utils/regexp_ranges.rb +1 -1
  215. data/lib/rubocop/cop/variable_force.rb +13 -1
  216. data/lib/rubocop/cops_documentation_generator.rb +16 -4
  217. data/lib/rubocop/core_ext/string.rb +2 -6
  218. data/lib/rubocop/directive_comment.rb +10 -8
  219. data/lib/rubocop/ext/regexp_node.rb +18 -35
  220. data/lib/rubocop/ext/regexp_parser.rb +4 -21
  221. data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
  222. data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -8
  223. data/lib/rubocop/formatter/formatter_set.rb +7 -1
  224. data/lib/rubocop/formatter/html_formatter.rb +32 -10
  225. data/lib/rubocop/formatter/json_formatter.rb +0 -1
  226. data/lib/rubocop/formatter/offense_count_formatter.rb +12 -2
  227. data/lib/rubocop/formatter/tap_formatter.rb +3 -7
  228. data/lib/rubocop/formatter.rb +1 -1
  229. data/lib/rubocop/lockfile.rb +56 -7
  230. data/lib/rubocop/lsp/logger.rb +1 -1
  231. data/lib/rubocop/lsp/routes.rb +12 -15
  232. data/lib/rubocop/lsp/runtime.rb +1 -1
  233. data/lib/rubocop/lsp/server.rb +7 -2
  234. data/lib/rubocop/lsp/severity.rb +1 -1
  235. data/lib/rubocop/lsp.rb +36 -0
  236. data/lib/rubocop/magic_comment.rb +1 -1
  237. data/lib/rubocop/options.rb +17 -12
  238. data/lib/rubocop/path_util.rb +6 -2
  239. data/lib/rubocop/rake_task.rb +1 -1
  240. data/lib/rubocop/rspec/cop_helper.rb +8 -2
  241. data/lib/rubocop/rspec/expect_offense.rb +16 -8
  242. data/lib/rubocop/rspec/shared_contexts.rb +73 -16
  243. data/lib/rubocop/rspec/support.rb +3 -0
  244. data/lib/rubocop/runner.rb +14 -3
  245. data/lib/rubocop/server/cache.rb +11 -2
  246. data/lib/rubocop/server/client_command/exec.rb +2 -3
  247. data/lib/rubocop/server/client_command/start.rb +1 -1
  248. data/lib/rubocop/server/core.rb +4 -0
  249. data/lib/rubocop/server/server_command/exec.rb +0 -1
  250. data/lib/rubocop/target_finder.rb +84 -78
  251. data/lib/rubocop/target_ruby.rb +82 -80
  252. data/lib/rubocop/version.rb +19 -4
  253. data/lib/rubocop.rb +9 -0
  254. metadata +18 -11
  255. /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -12,13 +12,23 @@ module RuboCop
12
12
  if corr.is_a?(CorrectionsProxy)
13
13
  merge!(corr.send(:corrector))
14
14
  else
15
- # warn "Corrector.new with corrections is deprecated." unless corr.empty? TODO
15
+ unless corr.empty?
16
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
17
+ `Corrector.new` with corrections is deprecated.
18
+ See https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
19
+ WARNING
20
+ end
21
+
16
22
  corr.each { |c| corrections << c }
17
23
  end
18
24
  end
19
25
 
20
26
  def corrections
21
- # warn "#corrections is deprecated. Open an issue if you have a valid usecase." TODO
27
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
28
+ `Corrector#corrections` is deprecated. Open an issue if you have a valid usecase.
29
+ See https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
30
+ WARNING
31
+
22
32
  CorrectionsProxy.new(self)
23
33
  end
24
34
  end
@@ -14,8 +14,6 @@ module RuboCop
14
14
  # # bad
15
15
  # some_method a { |val| puts val }
16
16
  #
17
- # @example
18
- #
19
17
  # # good
20
18
  # # With parentheses, there's no ambiguity.
21
19
  # some_method(a { |val| puts val })
@@ -14,8 +14,6 @@ module RuboCop
14
14
  # # a `*` method invocation (i.e. `do_something.*(some_array)`).
15
15
  # do_something *some_array
16
16
  #
17
- # @example
18
- #
19
17
  # # good
20
18
  #
21
19
  # # With parentheses, there's no ambiguity.
@@ -15,8 +15,6 @@ module RuboCop
15
15
  # # (i.e. `do_something./(pattern)./(i)`)
16
16
  # do_something /pattern/i
17
17
  #
18
- # @example
19
- #
20
18
  # # good
21
19
  #
22
20
  # # With parentheses, there's no ambiguity.
@@ -50,7 +50,7 @@ module RuboCop
50
50
  MSG_WITHOUT_SAFE_ASSIGNMENT_ALLOWED =
51
51
  'Use `==` if you meant to do a comparison or move the assignment ' \
52
52
  'up out of the condition.'
53
- ASGN_TYPES = [:begin, *AST::Node::EQUALS_ASSIGNMENTS, :send].freeze
53
+ ASGN_TYPES = [:begin, *AST::Node::EQUALS_ASSIGNMENTS, :send, :csend].freeze
54
54
 
55
55
  def on_if(node)
56
56
  return if node.condition.block_type?
@@ -88,7 +88,7 @@ module RuboCop
88
88
  end
89
89
 
90
90
  def skip_children?(asgn_node)
91
- (asgn_node.send_type? && !asgn_node.assignment_method?) ||
91
+ (asgn_node.call_type? && !asgn_node.assignment_method?) ||
92
92
  empty_condition?(asgn_node) ||
93
93
  (safe_assignment_allowed? && safe_assignment?(asgn_node))
94
94
  end
@@ -19,8 +19,6 @@ module RuboCop
19
19
  # # good
20
20
  # true
21
21
  #
22
- # @example
23
- #
24
22
  # # bad
25
23
  # :false
26
24
  #
@@ -11,39 +11,26 @@ module RuboCop
11
11
  # @example
12
12
  #
13
13
  # # bad
14
- #
15
14
  # def bake(pie: pie)
16
15
  # pie.heat_up
17
16
  # end
18
17
  #
19
- # @example
20
- #
21
18
  # # good
22
- #
23
19
  # def bake(pie:)
24
20
  # pie.refrigerate
25
21
  # end
26
22
  #
27
- # @example
28
- #
29
23
  # # good
30
- #
31
24
  # def bake(pie: self.pie)
32
25
  # pie.feed_to(user)
33
26
  # end
34
27
  #
35
- # @example
36
- #
37
28
  # # bad
38
- #
39
29
  # def cook(dry_ingredients = dry_ingredients)
40
30
  # dry_ingredients.reduce(&:+)
41
31
  # end
42
32
  #
43
- # @example
44
- #
45
33
  # # good
46
- #
47
34
  # def cook(dry_ingredients = self.dry_ingredients)
48
35
  # dry_ingredients.combine
49
36
  # end
@@ -29,6 +29,11 @@ module RuboCop
29
29
  # MyDebugger.debug_this
30
30
  # ----
31
31
  #
32
+ # Some gems also ship files that will start a debugging session when required,
33
+ # for example `require 'debug/start'` from `ruby/debug`. These requires can
34
+ # be configured through `DebuggerRequires`. It has the same structure as
35
+ # `DebuggerMethods`, which you can read about above.
36
+ #
32
37
  # @example
33
38
  #
34
39
  # # bad (ok during development)
@@ -39,8 +44,6 @@ module RuboCop
39
44
  # do_something
40
45
  # end
41
46
  #
42
- # @example
43
- #
44
47
  # # bad (ok during development)
45
48
  #
46
49
  # # using byebug
@@ -49,8 +52,6 @@ module RuboCop
49
52
  # do_something
50
53
  # end
51
54
  #
52
- # @example
53
- #
54
55
  # # good
55
56
  #
56
57
  # def some_method
@@ -64,14 +65,20 @@ module RuboCop
64
65
  # def some_method
65
66
  # my_debugger
66
67
  # end
68
+ #
69
+ # @example DebuggerRequires: [my_debugger/start]
70
+ #
71
+ # # bad (ok during development)
72
+ #
73
+ # require 'my_debugger/start'
67
74
  class Debugger < Base
68
75
  MSG = 'Remove debugger entry point `%<source>s`.'
69
76
  BLOCK_TYPES = %i[block numblock kwbegin].freeze
70
77
 
71
78
  def on_send(node)
72
- return if !debugger_method?(node) || assumed_usage_context?(node)
79
+ return if assumed_usage_context?(node)
73
80
 
74
- add_offense(node)
81
+ add_offense(node) if debugger_method?(node) || debugger_require?(node)
75
82
  end
76
83
 
77
84
  private
@@ -87,12 +94,26 @@ module RuboCop
87
94
  end
88
95
  end
89
96
 
97
+ def debugger_requires
98
+ @debugger_requires ||= begin
99
+ config = cop_config.fetch('DebuggerRequires', [])
100
+ config.is_a?(Array) ? config : config.values.flatten
101
+ end
102
+ end
103
+
90
104
  def debugger_method?(send_node)
91
105
  return false if send_node.parent&.send_type? && send_node.parent.receiver == send_node
92
106
 
93
107
  debugger_methods.include?(chained_method_name(send_node))
94
108
  end
95
109
 
110
+ def debugger_require?(send_node)
111
+ return false unless send_node.method?(:require) && send_node.arguments.one?
112
+ return false unless (argument = send_node.first_argument).str_type?
113
+
114
+ debugger_requires.include?(argument.value)
115
+ end
116
+
96
117
  def assumed_usage_context?(node)
97
118
  # Basically, debugger methods are not used as a method argument without arguments.
98
119
  return false unless node.arguments.empty? && node.each_ancestor(:send, :csend).any?
@@ -52,7 +52,7 @@ module RuboCop
52
52
  # @!method deprecated_class_method?(node)
53
53
  def_node_matcher :deprecated_class_method?, <<~PATTERN
54
54
  {
55
- (send (const {cbase nil?} {:ENV}) {:clone :dup :freeze})
55
+ (send (const {cbase nil?} :ENV) {:clone :dup :freeze})
56
56
  (send (const {cbase nil?} {:File :Dir}) :exists? _)
57
57
  (send (const {cbase nil?} :Socket) {:gethostbyaddr :gethostbyname} ...)
58
58
  (send nil? :attr _ boolean)
@@ -9,28 +9,18 @@ module RuboCop
9
9
  #
10
10
  # @example
11
11
  #
12
- # # Example for OpenSSL::Cipher instantiation.
13
- #
14
12
  # # bad
15
13
  # OpenSSL::Cipher::AES.new(128, :GCM)
16
14
  #
17
15
  # # good
18
16
  # OpenSSL::Cipher.new('aes-128-gcm')
19
17
  #
20
- # @example
21
- #
22
- # # Example for OpenSSL::Digest instantiation.
23
- #
24
18
  # # bad
25
19
  # OpenSSL::Digest::SHA256.new
26
20
  #
27
21
  # # good
28
22
  # OpenSSL::Digest.new('SHA256')
29
23
  #
30
- # @example
31
- #
32
- # # Example for ::Digest inherited class methods.
33
- #
34
24
  # # bad
35
25
  # OpenSSL::Digest::SHA256.digest('foo')
36
26
  #
@@ -9,7 +9,6 @@ module RuboCop
9
9
  # @example
10
10
  #
11
11
  # # bad
12
- #
13
12
  # case x
14
13
  # when 'first'
15
14
  # do_something
@@ -17,10 +16,7 @@ module RuboCop
17
16
  # do_something_else
18
17
  # end
19
18
  #
20
- # @example
21
- #
22
19
  # # good
23
- #
24
20
  # case x
25
21
  # when 'first'
26
22
  # do_something
@@ -32,7 +28,7 @@ module RuboCop
32
28
 
33
29
  def on_case(case_node)
34
30
  case_node.when_branches.each_with_object(Set.new) do |when_node, previous|
35
- when_node.each_condition do |condition|
31
+ when_node.conditions.each do |condition|
36
32
  add_offense(condition) unless previous.add?(condition)
37
33
  end
38
34
  end
@@ -11,13 +11,9 @@ module RuboCop
11
11
  # @example
12
12
  #
13
13
  # # bad
14
- #
15
14
  # hash = { food: 'apple', food: 'orange' }
16
15
  #
17
- # @example
18
- #
19
16
  # # good
20
- #
21
17
  # hash = { food: 'apple', other_food: 'orange' }
22
18
  class DuplicateHashKey < Base
23
19
  include Duplication
@@ -9,7 +9,6 @@ module RuboCop
9
9
  # @example
10
10
  #
11
11
  # # bad
12
- #
13
12
  # def foo
14
13
  # 1
15
14
  # end
@@ -18,20 +17,14 @@ module RuboCop
18
17
  # 2
19
18
  # end
20
19
  #
21
- # @example
22
- #
23
20
  # # bad
24
- #
25
21
  # def foo
26
22
  # 1
27
23
  # end
28
24
  #
29
25
  # alias foo bar
30
26
  #
31
- # @example
32
- #
33
27
  # # good
34
- #
35
28
  # def foo
36
29
  # 1
37
30
  # end
@@ -40,10 +33,7 @@ module RuboCop
40
33
  # 2
41
34
  # end
42
35
  #
43
- # @example
44
- #
45
36
  # # good
46
- #
47
37
  # def foo
48
38
  # 1
49
39
  # end
@@ -12,13 +12,9 @@ module RuboCop
12
12
  # @example
13
13
  #
14
14
  # # bad
15
- #
16
15
  # sum = numbers.each_with_object(0) { |e, a| a += e }
17
16
  #
18
- # @example
19
- #
20
17
  # # good
21
- #
22
18
  # num = 0
23
19
  # sum = numbers.each_with_object(num) { |e, a| a += e }
24
20
  class EachWithObjectArgument < Base
@@ -21,8 +21,6 @@ module RuboCop
21
21
  # do_that
22
22
  # end
23
23
  #
24
- # @example
25
- #
26
24
  # # good
27
25
  #
28
26
  # # This code is compatible with the bad case. It will be autocorrected like this.
@@ -104,7 +104,7 @@ module RuboCop
104
104
  def correct_other_branches(corrector, node)
105
105
  return unless require_other_branches_correction?(node)
106
106
 
107
- if node.else_branch&.if_type?
107
+ if node.else_branch&.if_type? && !node.else_branch.modifier_form?
108
108
  # Replace an orphaned `elsif` with `if`
109
109
  corrector.replace(node.else_branch.loc.keyword, 'if')
110
110
  else
@@ -146,7 +146,7 @@ module RuboCop
146
146
  node.source_range.with(end_pos: node.condition.source_range.end_pos)
147
147
  elsif all_branches_body_missing?(node)
148
148
  if_node = node.ancestors.detect(&:if?)
149
- node.source_range.with(end_pos: if_node.loc.end.end_pos)
149
+ node.source_range.join(if_node.loc.end.end)
150
150
  else
151
151
  node.source_range
152
152
  end
@@ -3,40 +3,30 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Checks for empty `ensure` blocks
6
+ # Checks for empty `ensure` blocks.
7
7
  #
8
8
  # @example
9
9
  #
10
10
  # # bad
11
- #
12
11
  # def some_method
13
12
  # do_something
14
13
  # ensure
15
14
  # end
16
15
  #
17
- # @example
18
- #
19
16
  # # bad
20
- #
21
17
  # begin
22
18
  # do_something
23
19
  # ensure
24
20
  # end
25
21
  #
26
- # @example
27
- #
28
22
  # # good
29
- #
30
23
  # def some_method
31
24
  # do_something
32
25
  # ensure
33
26
  # do_something_else
34
27
  # end
35
28
  #
36
- # @example
37
- #
38
29
  # # good
39
- #
40
30
  # begin
41
31
  # do_something
42
32
  # ensure
@@ -8,13 +8,9 @@ module RuboCop
8
8
  # @example
9
9
  #
10
10
  # # bad
11
- #
12
11
  # "result is #{}"
13
12
  #
14
- # @example
15
- #
16
13
  # # good
17
- #
18
14
  # "result is #{some_result}"
19
15
  class EmptyInterpolation < Base
20
16
  include Interpolation
@@ -14,8 +14,6 @@ module RuboCop
14
14
  # when baz
15
15
  # end
16
16
  #
17
- # @example
18
- #
19
17
  # # good
20
18
  # case condition
21
19
  # when foo
@@ -50,7 +48,7 @@ module RuboCop
50
48
  MSG = 'Avoid `when` branches without a body.'
51
49
 
52
50
  def on_case(node)
53
- node.each_when do |when_node|
51
+ node.when_branches.each do |when_node|
54
52
  next if when_node.body
55
53
  next if cop_config['AllowComments'] && contains_comments?(when_node)
56
54
 
@@ -13,7 +13,6 @@ module RuboCop
13
13
  # @example
14
14
  #
15
15
  # # bad
16
- #
17
16
  # def foo
18
17
  # do_something
19
18
  # ensure
@@ -21,10 +20,7 @@ module RuboCop
21
20
  # return self
22
21
  # end
23
22
  #
24
- # @example
25
- #
26
23
  # # good
27
- #
28
24
  # def foo
29
25
  # do_something
30
26
  # self
@@ -32,8 +28,7 @@ module RuboCop
32
28
  # cleanup
33
29
  # end
34
30
  #
35
- # # also good
36
- #
31
+ # # good
37
32
  # def foo
38
33
  # begin
39
34
  # do_something
@@ -65,17 +65,15 @@ module RuboCop
65
65
 
66
66
  minimum_target_ruby_version 2.6
67
67
 
68
- MESSAGES = [
69
- 'Passing safe_level with the 2nd argument of `ERB.new` is ' \
70
- 'deprecated. Do not use it, and specify other arguments as ' \
71
- 'keyword arguments.',
72
- 'Passing trim_mode with the 3rd argument of `ERB.new` is ' \
73
- 'deprecated. Use keyword argument like ' \
74
- '`ERB.new(str, trim_mode: %<arg_value>s)` instead.',
75
- 'Passing eoutvar with the 4th argument of `ERB.new` is ' \
76
- 'deprecated. Use keyword argument like ' \
77
- '`ERB.new(str, eoutvar: %<arg_value>s)` instead.'
78
- ].freeze
68
+ MESSAGE_SAFE_LEVEL = 'Passing safe_level with the 2nd argument of `ERB.new` is ' \
69
+ 'deprecated. Do not use it, and specify other arguments as ' \
70
+ 'keyword arguments.'
71
+ MESSAGE_TRIM_MODE = 'Passing trim_mode with the 3rd argument of `ERB.new` is ' \
72
+ 'deprecated. Use keyword argument like ' \
73
+ '`ERB.new(str, trim_mode: %<arg_value>s)` instead.'
74
+ MESSAGE_EOUTVAR = 'Passing eoutvar with the 4th argument of `ERB.new` is ' \
75
+ 'deprecated. Use keyword argument like ' \
76
+ '`ERB.new(str, eoutvar: %<arg_value>s)` instead.'
79
77
 
80
78
  RESTRICT_ON_SEND = %i[new].freeze
81
79
 
@@ -92,10 +90,8 @@ module RuboCop
92
90
  arguments[1..3].each_with_index do |argument, i|
93
91
  next if !argument || argument.hash_type?
94
92
 
95
- message = format(MESSAGES[i], arg_value: argument.source)
96
-
97
93
  add_offense(
98
- argument.source_range, message: message
94
+ argument.source_range, message: message(i, argument.source)
99
95
  ) do |corrector|
100
96
  autocorrect(corrector, node)
101
97
  end
@@ -105,6 +101,17 @@ module RuboCop
105
101
 
106
102
  private
107
103
 
104
+ def message(positional_argument_index, arg_value)
105
+ case positional_argument_index
106
+ when 0
107
+ MESSAGE_SAFE_LEVEL
108
+ when 1
109
+ format(MESSAGE_TRIM_MODE, arg_value: arg_value)
110
+ when 2
111
+ format(MESSAGE_EOUTVAR, arg_value: arg_value)
112
+ end
113
+ end
114
+
108
115
  def autocorrect(corrector, node)
109
116
  str_arg = node.first_argument.source
110
117
 
@@ -66,7 +66,9 @@ module RuboCop
66
66
  end
67
67
 
68
68
  def literal_zero?(node)
69
- node&.numeric_type? && node.value.zero?
69
+ # TODO: https://github.com/rubocop/rubocop-ast/pull/304 is released,
70
+ # replace this condition with `node&.numeric_type? && node.value.zero?`.
71
+ node&.numeric_type? && node.node_parts[0].zero?
70
72
  end
71
73
 
72
74
  # rubocop:disable Metrics/PerceivedComplexity
@@ -10,13 +10,9 @@ module RuboCop
10
10
  # @example
11
11
  #
12
12
  # # bad
13
- #
14
13
  # float = 3.0e400
15
14
  #
16
- # @example
17
- #
18
15
  # # good
19
- #
20
16
  # float = 42.9
21
17
  class FloatOutOfRange < Base
22
18
  MSG = 'Float out of range.'
@@ -14,25 +14,15 @@ module RuboCop
14
14
  # @example
15
15
  #
16
16
  # # bad
17
- #
18
17
  # format('A value: %s and another: %i', a_value)
19
18
  #
20
- # @example
21
- #
22
19
  # # good
23
- #
24
20
  # format('A value: %s and another: %i', a_value, another)
25
21
  #
26
- # @example
27
- #
28
22
  # # bad
29
- #
30
23
  # format('Unnumbered format: %s and numbered: %2$s', a_value, another)
31
24
  #
32
- # @example
33
- #
34
25
  # # good
35
- #
36
26
  # format('Numbered format: %1$s and numbered %2$s', a_value, another)
37
27
  class FormatParameterMismatch < Base
38
28
  # http://rubular.com/r/CvpbxkcTzy
@@ -9,13 +9,9 @@ module RuboCop
9
9
  # @example
10
10
  #
11
11
  # # bad
12
- #
13
12
  # array = ['Item 1' 'Item 2']
14
13
  #
15
- # @example
16
- #
17
14
  # # good
18
- #
19
15
  # array = ['Item 1Item 2']
20
16
  # array = ['Item 1' + 'Item 2']
21
17
  # array = [
@@ -23,27 +19,34 @@ module RuboCop
23
19
  # 'Item 2'
24
20
  # ]
25
21
  class ImplicitStringConcatenation < Base
26
- MSG = 'Combine %<string1>s and %<string2>s into a single string ' \
22
+ extend AutoCorrector
23
+
24
+ MSG = 'Combine %<lhs>s and %<rhs>s into a single string ' \
27
25
  'literal, rather than using implicit string concatenation.'
28
26
  FOR_ARRAY = ' Or, if they were intended to be separate array ' \
29
27
  'elements, separate them with a comma.'
30
28
  FOR_METHOD = ' Or, if they were intended to be separate method ' \
31
29
  'arguments, separate them with a comma.'
32
30
 
31
+ # rubocop:disable Metrics/AbcSize
33
32
  def on_dstr(node)
34
- each_bad_cons(node) do |child_node1, child_node2|
35
- range = child_node1.source_range.join(child_node2.source_range)
36
- message = format(MSG,
37
- string1: display_str(child_node1),
38
- string2: display_str(child_node2))
33
+ each_bad_cons(node) do |lhs_node, rhs_node|
34
+ range = lhs_node.source_range.join(rhs_node.source_range)
35
+ message = format(MSG, lhs: display_str(lhs_node), rhs: display_str(rhs_node))
39
36
  if node.parent&.array_type?
40
37
  message << FOR_ARRAY
41
38
  elsif node.parent&.send_type?
42
39
  message << FOR_METHOD
43
40
  end
44
- add_offense(range, message: message)
41
+
42
+ add_offense(range, message: message) do |corrector|
43
+ preferred = "#{lhs_node.source} + #{rhs_node.source}"
44
+
45
+ corrector.replace(range, preferred)
46
+ end
45
47
  end
46
48
  end
49
+ # rubocop:enable Metrics/AbcSize
47
50
 
48
51
  private
49
52
 
@@ -73,7 +76,7 @@ module RuboCop
73
76
  end
74
77
 
75
78
  def string_literal?(node)
76
- node.str_type? || (node.dstr_type? && node.children.all? { |c| string_literal?(c) })
79
+ node.str_type? || node.dstr_type?
77
80
  end
78
81
 
79
82
  def string_literals?(node1, node2)
@@ -11,7 +11,6 @@ module RuboCop
11
11
  # @example
12
12
  #
13
13
  # # bad
14
- #
15
14
  # class C
16
15
  # private
17
16
  #
@@ -20,10 +19,7 @@ module RuboCop
20
19
  # end
21
20
  # end
22
21
  #
23
- # @example
24
- #
25
22
  # # good
26
- #
27
23
  # class C
28
24
  # def self.method
29
25
  # puts 'hi'
@@ -32,10 +28,7 @@ module RuboCop
32
28
  # private_class_method :method
33
29
  # end
34
30
  #
35
- # @example
36
- #
37
31
  # # good
38
- #
39
32
  # class C
40
33
  # class << self
41
34
  # private