rubocop-rails 2.21.0 → 2.21.2

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.
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