rubocop-rails 2.21.0 → 2.21.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9de78b7956de6935004b845bb3a50ae7b751aa5b81abbc4feceb62ea20b9d3a7
4
- data.tar.gz: d8f7f57ae1cfe141e6082547f6ea40dbdc6d42f32c2e9f95ba4ec904baaeea7b
3
+ metadata.gz: 0e154e69d10b43226db08e454d992d724dc7504d54cac804e597156ee5cf13e5
4
+ data.tar.gz: 60d4697e076620a134f48eff2f81be7b2004fd824796b1a1b15f5822239e3ce3
5
5
  SHA512:
6
- metadata.gz: e9b3366bdbfa5bd3a53715a3b7ab2fcc5ffd8a6e1eef1da7e557297a827f1caf92bdcfbd2c771e9ef384713d97a347d7f09e4ef792252f8e9900476f034a82ab
7
- data.tar.gz: cb54c3f8a7a8ca823055341f531ed2922138c73f101e1cf2455376902b15d545708ddf3c94a06e44146f765277fbdf49e080eb6db085edf438afbaa4a2f61cbc
6
+ metadata.gz: f0aa0f69a7aa3b90d1e402ab26bdf5a4d03680080d9b06ba157cd92f3c5c290f821e81d4a99636009e17ec4ea2de0cfd405cea00134ebccd4323d424fb790ec8
7
+ data.tar.gz: 6b6ddbe47c1b112638cc3693464d9509f589a6683317b0bb30925a27788e39351a3a10853ecf286b419d3ec3b17e13aee9fd09ae07581d209635f0a56a44065b
data/README.md CHANGED
@@ -72,7 +72,9 @@ module YourCoolApp
72
72
  class Application < Rails::Application
73
73
  config.generators.after_generate do |files|
74
74
  parsable_files = files.filter { |file| file.end_with?('.rb') }
75
- system("bundle exec rubocop -A --fail-level=E #{parsable_files.shelljoin}", exception: true)
75
+ unless parsable_files.empty?
76
+ system("bundle exec rubocop -A --fail-level=E #{parsable_files.shelljoin}", exception: true)
77
+ end
76
78
  end
77
79
  end
78
80
  end
data/config/default.yml CHANGED
@@ -801,6 +801,9 @@ Rails/RedundantActiveRecordAllMethod:
801
801
  StyleGuide: 'https://rails.rubystyle.guide/#redundant-all'
802
802
  Enabled: pending
803
803
  Safe: false
804
+ AllowedReceivers:
805
+ - ActionMailer::Preview
806
+ - ActiveSupport::TimeZone
804
807
  VersionAdded: '2.21'
805
808
 
806
809
  Rails/RedundantAllowNil:
@@ -102,7 +102,7 @@ module RuboCop
102
102
  end
103
103
 
104
104
  # Internal helper class to hold match data
105
- Captures = Struct.new(
105
+ Captures = ::Struct.new(
106
106
  :transformed_argname,
107
107
  :transforming_body_expr
108
108
  ) do
@@ -112,7 +112,7 @@ module RuboCop
112
112
  end
113
113
 
114
114
  # Internal helper class to hold autocorrect data
115
- Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do
115
+ Autocorrection = ::Struct.new(:match, :block_node, :leading, :trailing) do
116
116
  def self.from_each_with_object(node, match)
117
117
  new(match, node, 0, 0)
118
118
  end
@@ -20,8 +20,15 @@ module RuboCop
20
20
  # User.order(:created_at)
21
21
  # users.where(id: ids)
22
22
  # user.articles.order(:created_at)
23
+ #
24
+ # @example AllowedReceivers: ['ActionMailer::Preview', 'ActiveSupport::TimeZone'] (default)
25
+ # # good
26
+ # ActionMailer::Preview.all.first
27
+ # ActiveSupport::TimeZone.all.first
23
28
  class RedundantActiveRecordAllMethod < Base
24
29
  include ActiveRecordHelper
30
+ include AllowedReceivers
31
+ include RangeHelp
25
32
  extend AutoCorrector
26
33
 
27
34
  MSG = 'Redundant `all` detected.'
@@ -124,21 +131,37 @@ module RuboCop
124
131
  update_all
125
132
  where
126
133
  without
127
- ].freeze
134
+ ].to_set.freeze
128
135
 
129
- def on_send(node)
130
- query_node = node.parent
136
+ POSSIBLE_ENUMERABLE_BLOCK_METHODS = %i[any? count find none? one? select sum].freeze
131
137
 
132
- return unless query_node&.send_type?
133
- return unless QUERYING_METHODS.include?(query_node.method_name)
134
- return if node.receiver.nil? && !inherit_active_record_base?(node)
138
+ def_node_matcher :followed_by_query_method?, <<~PATTERN
139
+ (send (send _ :all) QUERYING_METHODS ...)
140
+ PATTERN
135
141
 
136
- range_of_all_method = node.loc.selector
142
+ def on_send(node)
143
+ return if !followed_by_query_method?(node.parent) || possible_enumerable_block_method?(node)
144
+ return if node.receiver ? allowed_receiver?(node.receiver) : !inherit_active_record_base?(node)
145
+
146
+ range_of_all_method = offense_range(node)
137
147
  add_offense(range_of_all_method) do |collector|
138
148
  collector.remove(range_of_all_method)
139
- collector.remove(query_node.loc.dot)
149
+ collector.remove(node.parent.loc.dot)
140
150
  end
141
151
  end
152
+
153
+ private
154
+
155
+ def possible_enumerable_block_method?(node)
156
+ parent = node.parent
157
+ return false unless POSSIBLE_ENUMERABLE_BLOCK_METHODS.include?(parent.method_name)
158
+
159
+ parent.parent&.block_type? || parent.parent&.numblock_type? || parent.first_argument&.block_pass_type?
160
+ end
161
+
162
+ def offense_range(node)
163
+ range_between(node.loc.selector.begin_pos, node.source_range.end_pos)
164
+ end
142
165
  end
143
166
  end
144
167
  end
@@ -51,10 +51,13 @@ module RuboCop
51
51
  end
52
52
  end
53
53
 
54
+ # rubocop:disable Metrics/AbcSize
54
55
  def autocorrect(corrector, select_node, node, preferred_method)
55
- corrector.remove(select_node.loc.dot.begin.join(select_node.source_range.end))
56
+ corrector.remove(select_node.loc.dot || node.loc.dot)
57
+ corrector.remove(select_node.loc.selector.begin.join(select_node.source_range.end))
56
58
  corrector.replace(node.loc.selector.begin.join(node.source_range.end), preferred_method)
57
59
  end
60
+ # rubocop:enable Metrics/AbcSize
58
61
 
59
62
  def match_column_name?(select_candidate, column_name)
60
63
  return false unless select_candidate.arguments.one?
@@ -69,7 +69,7 @@ module RuboCop
69
69
  return if !node.receiver&.str_type? || !node.method?(:to_time)
70
70
 
71
71
  add_offense(node.loc.selector, message: MSG_STRING_TO_TIME) do |corrector|
72
- autocorrect(corrector, node)
72
+ corrector.replace(node, "Time.zone.parse(#{node.receiver.source})")
73
73
  end
74
74
  end
75
75
 
@@ -125,7 +125,7 @@ module RuboCop
125
125
 
126
126
  def uniqueness_part(node)
127
127
  pairs = node.arguments.last
128
- return unless pairs.hash_type?
128
+ return unless pairs&.hash_type?
129
129
 
130
130
  pairs.each_pair.find do |pair|
131
131
  next unless pair.key.sym_type? && pair.key.value == :uniqueness
@@ -14,10 +14,9 @@ module RuboCop
14
14
  # render status: 100, plain: 'Ruby!'
15
15
  #
16
16
  # # good
17
- # render status: :continue
18
- # render status: 100
17
+ # head :continue
18
+ # head 100
19
19
  class UnusedRenderContent < Base
20
- extend AutoCorrector
21
20
  include RangeHelp
22
21
 
23
22
  MSG = 'Do not specify body content for a response with a non-content status code'
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Rails
5
5
  # This module holds the RuboCop Rails version information.
6
6
  module Version
7
- STRING = '2.21.0'
7
+ STRING = '2.21.2'
8
8
 
9
9
  def self.document_version
10
10
  STRING.match('\d+\.\d+').to_s
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.21.0
4
+ version: 2.21.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-09-09 00:00:00.000000000 Z
13
+ date: 2023-09-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport