rubocop 1.50.2 → 1.52.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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/config/default.yml +38 -5
  4. data/lib/rubocop/config.rb +4 -0
  5. data/lib/rubocop/config_obsoletion.rb +2 -2
  6. data/lib/rubocop/cop/base.rb +5 -1
  7. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
  8. data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
  9. data/lib/rubocop/cop/internal_affairs/cop_description.rb +32 -8
  10. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +2 -2
  11. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +0 -1
  12. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  13. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -0
  14. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
  15. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -4
  16. data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
  17. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
  18. data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
  19. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  20. data/lib/rubocop/cop/lint/missing_super.rb +3 -0
  21. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
  22. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
  23. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -2
  24. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  25. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
  26. data/lib/rubocop/cop/lint/shadowed_exception.rb +5 -11
  27. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
  28. data/lib/rubocop/cop/lint/useless_assignment.rb +59 -1
  29. data/lib/rubocop/cop/lint/void.rb +62 -6
  30. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
  31. data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
  32. data/lib/rubocop/cop/mixin/comments_help.rb +6 -2
  33. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  34. data/lib/rubocop/cop/naming/constant_name.rb +1 -1
  35. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +22 -7
  36. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -3
  37. data/lib/rubocop/cop/naming/variable_name.rb +6 -1
  38. data/lib/rubocop/cop/style/accessor_grouping.rb +5 -1
  39. data/lib/rubocop/cop/style/attr.rb +11 -1
  40. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  41. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  42. data/lib/rubocop/cop/style/class_equality_comparison.rb +17 -39
  43. data/lib/rubocop/cop/style/collection_compact.rb +16 -6
  44. data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
  45. data/lib/rubocop/cop/style/combinable_loops.rb +26 -6
  46. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
  47. data/lib/rubocop/cop/style/copyright.rb +5 -2
  48. data/lib/rubocop/cop/style/dir.rb +1 -1
  49. data/lib/rubocop/cop/style/dir_empty.rb +8 -14
  50. data/lib/rubocop/cop/style/documentation.rb +1 -1
  51. data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
  52. data/lib/rubocop/cop/style/exact_regexp_match.rb +68 -0
  53. data/lib/rubocop/cop/style/file_read.rb +2 -2
  54. data/lib/rubocop/cop/style/guard_clause.rb +2 -0
  55. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -22
  56. data/lib/rubocop/cop/style/hash_except.rb +19 -8
  57. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  58. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  59. data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
  60. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -0
  61. data/lib/rubocop/cop/style/invertible_unless_condition.rb +9 -5
  62. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +1 -2
  63. data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
  64. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  65. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  66. data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
  67. data/lib/rubocop/cop/style/redundant_filter_chain.rb +101 -0
  68. data/lib/rubocop/cop/style/redundant_line_continuation.rb +5 -1
  69. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
  70. data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
  71. data/lib/rubocop/cop/style/require_order.rb +11 -5
  72. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
  73. data/lib/rubocop/cop/style/select_by_regexp.rb +15 -5
  74. data/lib/rubocop/cop/style/semicolon.rb +12 -1
  75. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  76. data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -1
  77. data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
  78. data/lib/rubocop/cop/team.rb +1 -1
  79. data/lib/rubocop/cop/variable_force/assignment.rb +33 -1
  80. data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
  81. data/lib/rubocop/cop/variable_force.rb +1 -0
  82. data/lib/rubocop/result_cache.rb +1 -1
  83. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  84. data/lib/rubocop/server/client_command/exec.rb +2 -1
  85. data/lib/rubocop/target_ruby.rb +3 -2
  86. data/lib/rubocop/version.rb +10 -6
  87. data/lib/rubocop.rb +5 -0
  88. metadata +15 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67accbc10c4c2ae80033ab2a3713fce8a190d772234cbd52c5584e5c69895915
4
- data.tar.gz: 69e7f99ee66c192619b2dc26df6d0ac73c794bb088bade8182f3eceb1cb8d8c0
3
+ metadata.gz: 84bada99408af7ceb29d5c6bb4e188f61b27a78cb52639bcbbb144a289ebbc92
4
+ data.tar.gz: 930174d41acdfd3e0f7da8ef80c496ce7e5b68e5b00312d692a2cd93605fa70a
5
5
  SHA512:
6
- metadata.gz: 21005d0d16a207a998640686ee7dcf251683899ab8e746baa861888fd26f2e58791733b48869a085b1b365ce2b67e64b216b4cfe6c1a2e26a2ecc699da0ea085
7
- data.tar.gz: 461a588bb95269c194efee4ee8570c166ce009695664aa31181f1f0806220f451e4685d4feff8751d4135f196d3cb42ec100c171b905526e06ed968cd9bb47f9
6
+ metadata.gz: 9c1f475617dc4826cef3c543ed35e65117bd93ff6f80605adc2096a06ddb38f9171a95800685a92103924600158ac306c27c9168cea787d5f11dc0616bd1a9ba
7
+ data.tar.gz: 9aaba3f7148469ce255ee22950f7c11542ca1e8480388493ab90c728831e47eef306372c42769a535beaba95d2d715c4b59161852689468cbd3fcd2c2236a535
data/README.md CHANGED
@@ -53,7 +53,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
53
53
  in your `Gemfile`:
54
54
 
55
55
  ```rb
56
- gem 'rubocop', '~> 1.50', require: false
56
+ gem 'rubocop', '~> 1.52', require: false
57
57
  ```
58
58
 
59
59
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
@@ -75,8 +75,8 @@ You can read a lot more about RuboCop in its [official docs](https://docs.ruboco
75
75
 
76
76
  RuboCop officially supports the following runtime Ruby implementations:
77
77
 
78
- * MRI 2.6+
79
- * JRuby 9.3+
78
+ * MRI 2.7+
79
+ * JRuby 9.4+
80
80
 
81
81
  Targets Ruby 2.0+ code analysis.
82
82
 
data/config/default.yml CHANGED
@@ -140,7 +140,7 @@ AllCops:
140
140
  # or gems.locked file. (Although the Ruby version is specified in the Gemfile
141
141
  # or gems.rb file, RuboCop reads the final value from the lock file.) If the
142
142
  # Ruby version is still unresolved, RuboCop will use the oldest officially
143
- # supported Ruby version (currently Ruby 2.6).
143
+ # supported Ruby version (currently Ruby 2.7).
144
144
  TargetRubyVersion: ~
145
145
  # Determines if a notification for extension libraries should be shown when
146
146
  # rubocop is run. Keys are the name of the extension, and values are an array
@@ -154,6 +154,7 @@ AllCops:
154
154
  rubocop-rake: [rake]
155
155
  rubocop-graphql: [graphql]
156
156
  rubocop-capybara: [capybara]
157
+ rubocop-factory_bot: [factory_bot, factory_bot_rails]
157
158
  # Enable/Disable checking the methods extended by Active Support.
158
159
  ActiveSupportExtensionsEnabled: false
159
160
 
@@ -2343,6 +2344,9 @@ Lint/TopLevelReturnWithArgument:
2343
2344
  Description: 'Detects top level return statements with argument.'
2344
2345
  Enabled: true
2345
2346
  VersionAdded: '0.89'
2347
+ # These codes are `eval`-ed in method and their return values may be used.
2348
+ Exclude:
2349
+ - '**/*.jb'
2346
2350
 
2347
2351
  Lint/TrailingCommaInAttributeDeclaration:
2348
2352
  Description: 'Checks for trailing commas in attribute declarations.'
@@ -2451,6 +2455,8 @@ Lint/UselessAssignment:
2451
2455
  StyleGuide: '#underscore-unused-vars'
2452
2456
  Enabled: true
2453
2457
  VersionAdded: '0.11'
2458
+ VersionChanged: '1.51'
2459
+ SafeAutoCorrect: false
2454
2460
 
2455
2461
  Lint/UselessElseWithoutRescue:
2456
2462
  Description: 'Checks for useless `else` in `begin..end` without `rescue`.'
@@ -2478,10 +2484,9 @@ Lint/UselessRuby2Keywords:
2478
2484
  Lint/UselessSetterCall:
2479
2485
  Description: 'Checks for useless setter call to a local variable.'
2480
2486
  Enabled: true
2481
- SafeAutoCorrect: false
2487
+ Safe: false
2482
2488
  VersionAdded: '0.13'
2483
2489
  VersionChanged: '1.2'
2484
- Safe: false
2485
2490
 
2486
2491
  Lint/UselessTimes:
2487
2492
  Description: 'Checks for useless `Integer#times` calls.'
@@ -2942,7 +2947,9 @@ Naming/VariableNumber:
2942
2947
  Security/CompoundHash:
2943
2948
  Description: 'When overwriting Object#hash to combine values, prefer delegating to Array#hash over writing a custom implementation.'
2944
2949
  Enabled: pending
2950
+ Safe: false
2945
2951
  VersionAdded: '1.28'
2952
+ VersionChanged: '1.51'
2946
2953
 
2947
2954
  Security/Eval:
2948
2955
  Description: 'The use of eval represents a serious security risk.'
@@ -3355,6 +3362,7 @@ Style/CollectionCompact:
3355
3362
  Safe: false
3356
3363
  VersionAdded: '1.2'
3357
3364
  VersionChanged: '1.3'
3365
+ AllowedReceivers: []
3358
3366
 
3359
3367
  # Align with the style guide.
3360
3368
  Style/CollectionMethods:
@@ -3515,7 +3523,9 @@ Style/DataInheritance:
3515
3523
  Description: 'Checks for inheritance from Data.define.'
3516
3524
  StyleGuide: '#no-extend-data-define'
3517
3525
  Enabled: pending
3526
+ SafeAutoCorrect: false
3518
3527
  VersionAdded: '1.49'
3528
+ VersionChanged: '1.51'
3519
3529
 
3520
3530
  Style/DateTime:
3521
3531
  Description: 'Use Time over DateTime.'
@@ -3706,6 +3716,11 @@ Style/EvenOdd:
3706
3716
  VersionAdded: '0.12'
3707
3717
  VersionChanged: '0.29'
3708
3718
 
3719
+ Style/ExactRegexpMatch:
3720
+ Description: 'Checks for exact regexp match inside Regexp literals.'
3721
+ Enabled: pending
3722
+ VersionAdded: '1.51'
3723
+
3709
3724
  Style/ExpandPathArguments:
3710
3725
  Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`."
3711
3726
  Enabled: true
@@ -4092,8 +4107,6 @@ Style/InvertibleUnlessCondition:
4092
4107
  # :blank?: :present?
4093
4108
  # :include?: :exclude?
4094
4109
  # :exclude?: :include?
4095
- # :one?: :many?
4096
- # :many?: :one?
4097
4110
 
4098
4111
  Style/IpAddresses:
4099
4112
  Description: "Don't include literal IP addresses in code."
@@ -4370,6 +4383,7 @@ Style/MultipleComparison:
4370
4383
  VersionAdded: '0.49'
4371
4384
  VersionChanged: '1.1'
4372
4385
  AllowMethodComparison: true
4386
+ ComparisonsThreshold: 2
4373
4387
 
4374
4388
  Style/MutableConstant:
4375
4389
  Description: 'Do not assign mutable objects to constants.'
@@ -4624,7 +4638,9 @@ Style/OpenStructUse:
4624
4638
  - https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats
4625
4639
 
4626
4640
  Enabled: pending
4641
+ Safe: false
4627
4642
  VersionAdded: '1.23'
4643
+ VersionChanged: '1.51'
4628
4644
 
4629
4645
  Style/OperatorMethodCall:
4630
4646
  Description: 'Checks for redundant dot before operator method call.'
@@ -4790,6 +4806,11 @@ Style/RedundantArgument:
4790
4806
  # String#chomp!
4791
4807
  chomp!: "\n"
4792
4808
 
4809
+ Style/RedundantArrayConstructor:
4810
+ Description: 'Checks for the instantiation of array using redundant `Array` constructor.'
4811
+ Enabled: pending
4812
+ VersionAdded: '1.52'
4813
+
4793
4814
  Style/RedundantAssignment:
4794
4815
  Description: 'Checks for redundant assignment before returning.'
4795
4816
  Enabled: true
@@ -4861,6 +4882,13 @@ Style/RedundantFileExtensionInRequire:
4861
4882
  Enabled: true
4862
4883
  VersionAdded: '0.88'
4863
4884
 
4885
+ Style/RedundantFilterChain:
4886
+ Description: >-
4887
+ Identifies usages of `any?`, `empty?`, `none?` or `one?` predicate methods chained to
4888
+ `select`/`filter`/`find_all` and change them to use predicate method instead.
4889
+ Enabled: pending
4890
+ VersionAdded: '1.52'
4891
+
4864
4892
  Style/RedundantFreeze:
4865
4893
  Description: "Checks usages of Object#freeze on immutable objects."
4866
4894
  Enabled: true
@@ -4908,6 +4936,11 @@ Style/RedundantRegexpCharacterClass:
4908
4936
  Enabled: true
4909
4937
  VersionAdded: '0.85'
4910
4938
 
4939
+ Style/RedundantRegexpConstructor:
4940
+ Description: 'Checks for the instantiation of regexp using redundant `Regexp.new` or `Regexp.compile`.'
4941
+ Enabled: pending
4942
+ VersionAdded: '1.52'
4943
+
4911
4944
  Style/RedundantRegexpEscape:
4912
4945
  Description: 'Checks for redundant escapes in Regexps.'
4913
4946
  Enabled: true
@@ -284,6 +284,10 @@ module RuboCop
284
284
  end
285
285
  end
286
286
 
287
+ def inspect # :nodoc:
288
+ "#<#{self.class.name}:#{object_id} @loaded_path=#{loaded_path}>"
289
+ end
290
+
287
291
  private
288
292
 
289
293
  def target_rails_version_from_bundler_lock_file
@@ -68,11 +68,11 @@ module RuboCop
68
68
  # Cop rules are keyed by the name of the original cop
69
69
  def load_cop_rules(rules)
70
70
  rules.flat_map do |rule_type, data|
71
- data.map do |cop_name, configuration|
71
+ data.filter_map do |cop_name, configuration|
72
72
  next unless configuration # allow configurations to be disabled with `CopName: ~`
73
73
 
74
74
  COP_RULE_CLASSES[rule_type].new(@config, cop_name, configuration)
75
- end.compact
75
+ end
76
76
  end
77
77
  end
78
78
 
@@ -284,7 +284,7 @@ module RuboCop
284
284
  # @api private
285
285
  def self.callbacks_needed
286
286
  @callbacks_needed ||= public_instance_methods.select do |m|
287
- m.match?(/^on_|^after_/) &&
287
+ m.start_with?(/on_|after_/) &&
288
288
  !Base.method_defined?(m) # exclude standard "callbacks" like 'on_begin_investigation'
289
289
  end
290
290
  end
@@ -305,6 +305,10 @@ module RuboCop
305
305
  @current_original = original
306
306
  end
307
307
 
308
+ def inspect # :nodoc:
309
+ "#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
310
+ end
311
+
308
312
  private
309
313
 
310
314
  ### Reserved for Cop::Cop
@@ -54,7 +54,7 @@ module RuboCop
54
54
  def inside_string_ranges(node)
55
55
  return [] unless node.is_a?(Parser::AST::Node)
56
56
 
57
- node.each_node(:str, :dstr, :xstr).map { |n| inside_string_range(n) }.compact
57
+ node.each_node(:str, :dstr, :xstr).filter_map { |n| inside_string_range(n) }
58
58
  end
59
59
 
60
60
  def inside_string_range(node)
@@ -75,7 +75,7 @@ module RuboCop
75
75
 
76
76
  # @!method add_development_dependency?(node)
77
77
  def_node_matcher :add_development_dependency?, <<~PATTERN
78
- (send _ :add_development_dependency (str #forbidden_gem? ...))
78
+ (send _ :add_development_dependency (str #forbidden_gem? ...) _? _?)
79
79
  PATTERN
80
80
 
81
81
  # @!method gem?(node)
@@ -12,6 +12,13 @@ module RuboCop
12
12
  # ....
13
13
  # end
14
14
  #
15
+ # # bad
16
+ # #
17
+ # # Checks ...
18
+ # class SomeCop < Base
19
+ # ...
20
+ # end
21
+ #
15
22
  # # good
16
23
  # # Checks ...
17
24
  # class SomeCop < Base
@@ -21,27 +28,47 @@ module RuboCop
21
28
  class CopDescription < Base
22
29
  extend AutoCorrector
23
30
 
24
- MSG = 'Description should be started with %<suggestion>s instead of `This cop ...`.'
31
+ MSG_STARTS_WITH_WRONG_WORD =
32
+ 'Description should be started with %<suggestion>s instead of `This cop ...`.'
33
+ MSG_STARTS_WITH_EMPTY_COMMENT_LINE =
34
+ 'Description should not start with an empty comment line.'
25
35
 
26
36
  SPECIAL_WORDS = %w[is can could should will would must may].freeze
27
37
  COP_DESC_OFFENSE_REGEX =
28
38
  /^\s+# This cop (?<special>#{SPECIAL_WORDS.join('|')})?\s*(?<word>.+?) .*/.freeze
29
39
  REPLACEMENT_REGEX = /^\s+# This cop (#{SPECIAL_WORDS.join('|')})?\s*(.+?) /.freeze
40
+ EMPTY_COMMENT_LINE_REGEX = /\A\s*#\s*\n\z/.freeze
30
41
 
31
- # rubocop:disable Metrics/CyclomaticComplexity
32
42
  def on_class(node)
33
43
  return unless (module_node = node.parent) && node.parent_class
34
44
 
35
45
  description_beginning = first_comment_line(module_node)
36
46
  return unless description_beginning
37
47
 
38
- start_with_subject = description_beginning.match(COP_DESC_OFFENSE_REGEX)
39
- return unless start_with_subject
48
+ if description_beginning.match?(EMPTY_COMMENT_LINE_REGEX)
49
+ register_offense_for_empty_comment_line(module_node, description_beginning)
50
+ else
51
+ start_with_subject = description_beginning.match(COP_DESC_OFFENSE_REGEX)
52
+ return unless start_with_subject
53
+
54
+ register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
55
+ end
56
+ end
57
+
58
+ private
40
59
 
60
+ def register_offense_for_empty_comment_line(module_node, description_beginning)
61
+ range = range(module_node, description_beginning)
62
+ add_offense(range, message: MSG_STARTS_WITH_EMPTY_COMMENT_LINE) do |corrector|
63
+ corrector.remove(range)
64
+ end
65
+ end
66
+
67
+ def register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
41
68
  suggestion = start_with_subject['word']&.capitalize
42
69
  range = range(module_node, description_beginning)
43
70
  suggestion_for_message = suggestion_for_message(suggestion, start_with_subject)
44
- message = format(MSG, suggestion: suggestion_for_message)
71
+ message = format(MSG_STARTS_WITH_WRONG_WORD, suggestion: suggestion_for_message)
45
72
 
46
73
  add_offense(range, message: message) do |corrector|
47
74
  if suggestion && !start_with_subject['special']
@@ -49,9 +76,6 @@ module RuboCop
49
76
  end
50
77
  end
51
78
  end
52
- # rubocop:enable Metrics/CyclomaticComplexity
53
-
54
- private
55
79
 
56
80
  def replace_with_suggestion(corrector, range, suggestion, description_beginning)
57
81
  replacement = description_beginning.gsub(REPLACEMENT_REGEX, "#{suggestion} ")
@@ -59,12 +59,12 @@ module RuboCop
59
59
  def method_directives(node)
60
60
  comments = processed_source.ast_with_comments[node]
61
61
 
62
- comments.map do |comment|
62
+ comments.filter_map do |comment|
63
63
  match = comment.text.match(REGEXP)
64
64
  next unless match
65
65
 
66
66
  { node: comment, method_name: match[:method_name], args: match[:args] }
67
- end.compact
67
+ end
68
68
  end
69
69
 
70
70
  def too_many_directives(node)
@@ -3,7 +3,6 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- #
7
6
  # Checks the indentation of here document closings.
8
7
  #
9
8
  # @example
@@ -228,9 +228,9 @@ module RuboCop
228
228
  end
229
229
 
230
230
  def find_most_bottom_of_heredoc_end(arguments)
231
- arguments.map do |argument|
231
+ arguments.filter_map do |argument|
232
232
  argument.loc.heredoc_end.end_pos if argument.loc.respond_to?(:heredoc_end)
233
- end.compact.max
233
+ end.max
234
234
  end
235
235
 
236
236
  # Internal trailing comma helpers.
@@ -236,6 +236,8 @@ module RuboCop
236
236
  end
237
237
 
238
238
  def offense(begin_pos, end_pos, msg, style_param = 'EnforcedStyle')
239
+ return if begin_pos > end_pos
240
+
239
241
  range = range_between(begin_pos, end_pos)
240
242
  add_offense(range, message: msg) do |corrector|
241
243
  case range.source
@@ -52,6 +52,8 @@ module RuboCop
52
52
  # expect { do_something }.to not_change { object.attribute }
53
53
  #
54
54
  class AmbiguousBlockAssociation < Base
55
+ extend AutoCorrector
56
+
55
57
  include AllowedMethods
56
58
  include AllowedPattern
57
59
 
@@ -68,7 +70,9 @@ module RuboCop
68
70
 
69
71
  message = message(node)
70
72
 
71
- add_offense(node, message: message)
73
+ add_offense(node, message: message) do |corrector|
74
+ wrap_in_parentheses(corrector, node)
75
+ end
72
76
  end
73
77
  alias on_csend on_send
74
78
 
@@ -89,6 +93,14 @@ module RuboCop
89
93
 
90
94
  format(MSG, param: block_param.source, method: block_param.send_node.source)
91
95
  end
96
+
97
+ def wrap_in_parentheses(corrector, node)
98
+ range = node.loc.selector.end.join(node.first_argument.source_range.begin)
99
+
100
+ corrector.remove(range)
101
+ corrector.insert_before(range, '(')
102
+ corrector.insert_after(node.last_argument, ')')
103
+ end
92
104
  end
93
105
  end
94
106
  end
@@ -3,14 +3,13 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- #
7
- # This cop emulates the following Ruby warnings in Ruby 2.6.
6
+ # Emulates the following Ruby warnings in Ruby 2.6.
8
7
  #
9
8
  # [source,console]
10
9
  # ----
11
- # % cat example.rb
10
+ # $ cat example.rb
12
11
  # ERB.new('hi', nil, '-', '@output_buffer')
13
- # % ruby -rerb example.rb
12
+ # $ ruby -rerb example.rb
14
13
  # example.rb:1: warning: Passing safe_level with the 2nd argument of ERB.new is
15
14
  # deprecated. Do not use it, and specify other arguments as keyword arguments.
16
15
  # example.rb:1: warning: Passing trim_mode with the 3rd argument of ERB.new is
@@ -3,7 +3,6 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- #
7
6
  # Prefer `equal?` over `==` when comparing `object_id`.
8
7
  #
9
8
  # `Object#equal?` is provided to compare objects for identity, and in contrast
@@ -3,8 +3,10 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
+ # Checks for `IO.select` that is incompatible with Fiber Scheduler since Ruby 3.0.
6
7
  #
7
- # This cop checks for `IO.select` that is incompatible with Fiber Scheduler since Ruby 3.0.
8
+ # When an array of IO objects waiting for an exception (the third argument of `IO.select`)
9
+ # is used as an argument, there is no alternative API, so offenses are not registered.
8
10
  #
9
11
  # NOTE: When the method is successful the return value of `IO.select` is `[[IO]]`,
10
12
  # and the return value of `io.wait_readable` and `io.wait_writable` are `self`.
@@ -42,8 +44,8 @@ module RuboCop
42
44
  PATTERN
43
45
 
44
46
  def on_send(node)
45
- read, write, _excepts, timeout = *io_select(node)
46
- return unless read
47
+ read, write, excepts, timeout = *io_select(node)
48
+ return if excepts && !excepts.children.empty?
47
49
  return unless scheduler_compatible?(read, write) || scheduler_compatible?(write, read)
48
50
 
49
51
  preferred = preferred_method(read, write, timeout)
@@ -58,6 +58,7 @@ module RuboCop
58
58
 
59
59
  def on_class(node)
60
60
  return unless node.parent_class && exception_class?(node.parent_class)
61
+ return if inherit_exception_class_with_omitted_namespace?(node)
61
62
 
62
63
  message = message(node.parent_class)
63
64
 
@@ -87,6 +88,14 @@ module RuboCop
87
88
  class_node.const_name == 'Exception'
88
89
  end
89
90
 
91
+ def inherit_exception_class_with_omitted_namespace?(class_node)
92
+ return false if class_node.parent_class.namespace&.cbase_type?
93
+
94
+ class_node.left_siblings.any? do |sibling|
95
+ sibling.respond_to?(:identifier) && exception_class?(sibling.identifier)
96
+ end
97
+ end
98
+
90
99
  def preferred_base_class
91
100
  PREFERRED_BASE_CLASS[style]
92
101
  end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks uses of lambda without a literal block.
7
7
  # It emulates the following warning in Ruby 3.0:
8
8
  #
9
- # % ruby -vwe 'lambda(&proc {})'
9
+ # $ ruby -vwe 'lambda(&proc {})'
10
10
  # ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]
11
11
  # -e:1: warning: lambda without a literal block is deprecated; use the proc without
12
12
  # lambda instead
@@ -11,6 +11,9 @@ module RuboCop
11
11
  # missing method. In other cases, the theoretical ideal handling could be
12
12
  # challenging or verbose for no actual gain.
13
13
  #
14
+ # Autocorrection is not supported because the position of `super` cannot be
15
+ # determined automatically.
16
+ #
14
17
  # @example
15
18
  # # bad
16
19
  # class Employee < Person
@@ -6,13 +6,13 @@ module RuboCop
6
6
  # Checks for uses of numbered parameter assignment.
7
7
  # It emulates the following warning in Ruby 2.7:
8
8
  #
9
- # % ruby -ve '_1 = :value'
9
+ # $ ruby -ve '_1 = :value'
10
10
  # ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin19]
11
11
  # -e:1: warning: `_1' is reserved for numbered parameter; consider another name
12
12
  #
13
13
  # Assigning to a numbered parameter (from `_1` to `_9`) causes an error in Ruby 3.0.
14
14
  #
15
- # % ruby -ve '_1 = :value'
15
+ # $ ruby -ve '_1 = :value'
16
16
  # ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]
17
17
  # -e:1: _1 is reserved for numbered parameter
18
18
  #
@@ -3,7 +3,6 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- #
7
6
  # Checks the proper ordering of magic comments and whether
8
7
  # a magic comment is not placed before a shebang.
9
8
  #
@@ -65,13 +65,13 @@ module RuboCop
65
65
  def on_when(node)
66
66
  regexp_conditions = node.conditions.select(&:regexp_type?)
67
67
 
68
- @valid_ref = regexp_conditions.map { |condition| check_regexp(condition) }.compact.max
68
+ @valid_ref = regexp_conditions.filter_map { |condition| check_regexp(condition) }.max
69
69
  end
70
70
 
71
71
  def on_in_pattern(node)
72
72
  regexp_patterns = regexp_patterns(node)
73
73
 
74
- @valid_ref = regexp_patterns.map { |pattern| check_regexp(pattern) }.compact.max
74
+ @valid_ref = regexp_patterns.filter_map { |pattern| check_regexp(pattern) }.max
75
75
  end
76
76
 
77
77
  def on_nth_ref(node)
@@ -47,7 +47,7 @@ module RuboCop
47
47
  return if node.receiver
48
48
 
49
49
  node.each_child_node(:send) do |child|
50
- next unless child.method?(:to_s)
50
+ next if !child.method?(:to_s) || child.arguments.any?
51
51
 
52
52
  register_offense(child, "`#{node.method_name}`")
53
53
  end
@@ -3,8 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- #
7
- # This cop checks for `send`, `public_send`, and `__send__` methods
6
+ # Checks for `send`, `public_send`, and `__send__` methods
8
7
  # when using mix-in.
9
8
  #
10
9
  # `include` and `prepend` methods were private methods until Ruby 2.0,
@@ -121,18 +121,12 @@ module RuboCop
121
121
 
122
122
  if rescued_exceptions.any?
123
123
  rescued_exceptions.each_with_object([]) do |exception, converted|
124
- # FIXME: Workaround `rubocop:disable` comment for JRuby.
125
- # https://github.com/jruby/jruby/issues/6642
126
- # rubocop:disable Style/RedundantBegin
127
- begin
128
- RuboCop::Util.silence_warnings do
129
- # Avoid printing deprecation warnings about constants
130
- converted << Kernel.const_get(exception.source)
131
- end
132
- rescue NameError
133
- converted << nil
124
+ RuboCop::Util.silence_warnings do
125
+ # Avoid printing deprecation warnings about constants
126
+ converted << Kernel.const_get(exception.source)
134
127
  end
135
- # rubocop:enable Style/RedundantBegin
128
+ rescue NameError
129
+ converted << nil
136
130
  end
137
131
  else
138
132
  # treat an empty `rescue` as `rescue StandardError`
@@ -8,25 +8,39 @@ module RuboCop
8
8
  # always ignored. This is detected automatically since Ruby 2.7.
9
9
  #
10
10
  # @example
11
+ # # bad
12
+ # return 1
11
13
  #
12
- # # Detected since Ruby 2.7
13
- # return 1 # 1 is always ignored.
14
+ # # good
15
+ # return
14
16
  class TopLevelReturnWithArgument < Base
15
- # This cop works by validating the ancestors of the return node. A
16
- # top-level return node's ancestors should not be of block, def, or
17
- # defs type.
17
+ extend AutoCorrector
18
18
 
19
19
  MSG = 'Top level return with argument detected.'
20
20
 
21
21
  def on_return(return_node)
22
- add_offense(return_node) if return_node.arguments? && ancestors_valid?(return_node)
22
+ return unless top_level_return_with_any_argument?(return_node)
23
+
24
+ add_offense(return_node) do |corrector|
25
+ remove_arguments(corrector, return_node)
26
+ end
23
27
  end
24
28
 
25
29
  private
26
30
 
27
- def ancestors_valid?(return_node)
28
- prohibited_ancestors = return_node.each_ancestor(:block, :def, :defs)
29
- prohibited_ancestors.none?
31
+ def top_level_return_with_any_argument?(return_node)
32
+ top_level_return?(return_node) && return_node.arguments?
33
+ end
34
+
35
+ def remove_arguments(corrector, return_node)
36
+ corrector.replace(return_node, 'return')
37
+ end
38
+
39
+ # This cop works by validating the ancestors of the return node. A
40
+ # top-level return node's ancestors should not be of block, def, or
41
+ # defs type.
42
+ def top_level_return?(return_node)
43
+ return_node.each_ancestor(:block, :def, :defs).none?
30
44
  end
31
45
  end
32
46
  end