rubocop-rails 2.22.1 → 2.22.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: a4d08f111893c16ea5c725b8da3b488a85d193366cdec6c876e780e794d66ba3
4
- data.tar.gz: 40bd526fbf58ea8b3b45ab82ff5b7f809dcf29c7377991023fb30157dc66cc0d
3
+ metadata.gz: 54ac592e4d6ccfd065a9f61d33b9305f0a54cc879af4963b7a0a5f13e34ef5f7
4
+ data.tar.gz: e7d9a2dc53b76a3b8308b4cb1c2023f1a18d133efd7e14ad0efd43733cb5ffe1
5
5
  SHA512:
6
- metadata.gz: 6dd91e7f4068bba386e8b66ce86ec18961bc6e346d000947220af3fccdaf076907a11d7367786702124370aa070aacadba96bde0c200303ad64eaf1b5de6f8d5
7
- data.tar.gz: 783d1a9013524550b3bbd2271f3d244b13565038b1f0e73b7726565a6ea79e6e409b19f748e043fd7d850c623ea3f56c831f81f7d5bafd2cbd5e08d4181b1172
6
+ metadata.gz: e5b230f2623f63afcdba2fd1fd5dc415538e47ab283bc78c40715c3e6d10c8b8af92bd3597c87aa7105aded11dde0ec66e79f857675e57ebff7a3455e59a102e
7
+ data.tar.gz: 27092e6dc744ce084d4b1eb8eb85c339bc389de861ab6f82cb2956a550921500d4eb012dc74ff702315c6a39dde7b71b7a43ebec70bd8834ba9314365c45b8ea
@@ -11,10 +11,10 @@ module RuboCop
11
11
  # `update` but the method name remained same in the method definition.
12
12
  #
13
13
  # @example
14
- # #bad
14
+ # # bad
15
15
  # book.update_attributes!(author: 'Alice')
16
16
  #
17
- # #good
17
+ # # good
18
18
  # book.update!(author: 'Alice')
19
19
  class ActiveRecordAliases < Base
20
20
  extend AutoCorrector
@@ -48,7 +48,7 @@ module RuboCop
48
48
  seen_callback_names = {}
49
49
 
50
50
  each_after_commit_callback(class_node) do |node|
51
- callback_name = node.arguments[0].value
51
+ callback_name = node.first_argument.value
52
52
  if seen_callback_names.key?(callback_name)
53
53
  add_offense(node, message: format(MSG, name: callback_name))
54
54
  else
@@ -212,7 +212,7 @@ module RuboCop
212
212
  # @param node [RuboCop::AST::SendNode]
213
213
  def add_offense_for_alter_methods(node)
214
214
  # arguments: [{(sym :table)(str "table")} ...]
215
- table_node = node.arguments[0]
215
+ table_node = node.first_argument
216
216
  return unless table_node.is_a? RuboCop::AST::BasicLiteralNode
217
217
 
218
218
  message = format(MSG_FOR_ALTER_METHODS, table: table_node.value)
@@ -234,10 +234,10 @@ module RuboCop
234
234
  # @param new_node [RuboCop::AST::SendNode]
235
235
  def process(new_node)
236
236
  # arguments: [{(sym :table)(str "table")} ...]
237
- table_node = new_node.arguments[0]
237
+ table_node = new_node.first_argument
238
238
  if table_node.is_a? RuboCop::AST::BasicLiteralNode
239
239
  flush unless @nodes.all? do |node|
240
- node.arguments[0].value.to_s == table_node.value.to_s
240
+ node.first_argument.value.to_s == table_node.value.to_s
241
241
  end
242
242
  @nodes << new_node
243
243
  else
@@ -428,7 +428,7 @@ module RuboCop
428
428
  when :rename_column
429
429
  node.arguments[2]
430
430
  when *COLUMN_TYPE_METHOD_NAMES
431
- node.arguments[0]
431
+ node.first_argument
432
432
  end
433
433
  end
434
434
 
@@ -14,10 +14,10 @@ module RuboCop
14
14
  # when no output would be produced anyway.
15
15
  #
16
16
  # @example
17
- # #bad
17
+ # # bad
18
18
  # Rails.logger.debug "The time is #{Time.zone.now}."
19
19
  #
20
- # #good
20
+ # # good
21
21
  # Rails.logger.debug { "The time is #{Time.zone.now}." }
22
22
  #
23
23
  class EagerEvaluationLogMessage < Base
@@ -163,9 +163,9 @@ module RuboCop
163
163
 
164
164
  def autocorrect_extension_after_rails_root_join_in_dstr(corrector, node, rails_root_index, extension_node)
165
165
  rails_root_node = node.children[rails_root_index].children.first
166
- return unless rails_root_node.arguments.last.str_type?
166
+ return unless rails_root_node.last_argument.str_type?
167
167
 
168
- corrector.insert_before(rails_root_node.arguments.last.location.end, extension_node.source)
168
+ corrector.insert_before(rails_root_node.last_argument.location.end, extension_node.source)
169
169
  corrector.remove(extension_node)
170
170
  end
171
171
 
@@ -174,7 +174,7 @@ module RuboCop
174
174
  corrector.remove(
175
175
  range_with_surrounding_space(
176
176
  range_with_surrounding_comma(
177
- node.arguments.first.source_range,
177
+ node.first_argument.source_range,
178
178
  :right
179
179
  ),
180
180
  side: :right
@@ -187,7 +187,7 @@ module RuboCop
187
187
  end
188
188
 
189
189
  def autocorrect_rails_root_join_with_string_arguments(corrector, node)
190
- corrector.replace(node.arguments.first, %("#{node.arguments.map(&:value).join('/')}"))
190
+ corrector.replace(node.first_argument, %("#{node.arguments.map(&:value).join('/')}"))
191
191
  node.arguments[1..].each do |argument|
192
192
  corrector.remove(
193
193
  range_with_surrounding_comma(
@@ -221,7 +221,7 @@ module RuboCop
221
221
  end
222
222
 
223
223
  def append_argument(corrector, node, argument_source)
224
- corrector.insert_after(node.arguments.last, %(, "#{argument_source}"))
224
+ corrector.insert_after(node.last_argument, %(, "#{argument_source}"))
225
225
  end
226
226
 
227
227
  def replace_with_rails_root_join(corrector, node, argument_source)
@@ -222,7 +222,7 @@ module RuboCop
222
222
 
223
223
  def with_options_arguments(recv, node)
224
224
  blocks = node.each_ancestor(:block).select do |block|
225
- block.send_node.command?(:with_options) && same_context_in_with_options?(block.arguments.first, recv)
225
+ block.send_node.command?(:with_options) && same_context_in_with_options?(block.first_argument, recv)
226
226
  end
227
227
  blocks.flat_map { |n| n.send_node.arguments }
228
228
  end
@@ -72,7 +72,7 @@ module RuboCop
72
72
  end
73
73
 
74
74
  def task_name(node)
75
- first_arg = node.arguments[0]
75
+ first_arg = node.first_argument
76
76
  case first_arg&.type
77
77
  when :sym, :str
78
78
  first_arg.value.to_sym
@@ -97,7 +97,7 @@ module RuboCop
97
97
  end
98
98
 
99
99
  def with_dependencies?(node)
100
- first_arg = node.arguments[0]
100
+ first_arg = node.first_argument
101
101
  return false unless first_arg
102
102
 
103
103
  if first_arg.hash_type?
@@ -3,8 +3,44 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
+ # TODO: In the future, please support only RuboCop 1.52+ and use `RuboCop::Cop::AllowedReceivers`:
7
+ # https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/cop/mixin/allowed_receivers.rb
8
+ # At that time, this duplicated module implementation can be removed.
9
+ module AllowedReceivers
10
+ def allowed_receiver?(receiver)
11
+ receiver_name = receiver_name(receiver)
12
+
13
+ allowed_receivers.include?(receiver_name)
14
+ end
15
+
16
+ def receiver_name(receiver)
17
+ return receiver_name(receiver.receiver) if receiver.receiver && !receiver.receiver.const_type?
18
+
19
+ if receiver.send_type?
20
+ if receiver.receiver
21
+ "#{receiver_name(receiver.receiver)}.#{receiver.method_name}"
22
+ else
23
+ receiver.method_name.to_s
24
+ end
25
+ else
26
+ receiver.source
27
+ end
28
+ end
29
+
30
+ def allowed_receivers
31
+ cop_config.fetch('AllowedReceivers', [])
32
+ end
33
+ end
34
+
6
35
  # Detect redundant `all` used as a receiver for Active Record query methods.
7
36
  #
37
+ # NOTE: For the methods `delete_all` and `destroy_all`,
38
+ # this cop will only check cases where the receiver is a model.
39
+ # It will ignore cases where the receiver is an association (e.g., `user.articles.all.delete_all`).
40
+ # This is because omitting `all` from an association changes the methods
41
+ # from `ActiveRecord::Relation` to `ActiveRecord::Associations::CollectionProxy`,
42
+ # which can affect their behavior.
43
+ #
8
44
  # @safety
9
45
  # This cop is unsafe for autocorrection if the receiver for `all` is not an Active Record object.
10
46
  #
@@ -144,13 +180,15 @@ module RuboCop
144
180
  ].to_set.freeze
145
181
 
146
182
  POSSIBLE_ENUMERABLE_BLOCK_METHODS = %i[any? count find none? one? select sum].freeze
183
+ SENSITIVE_METHODS_ON_ASSOCIATION = %i[delete_all destroy_all].freeze
147
184
 
148
185
  def_node_matcher :followed_by_query_method?, <<~PATTERN
149
186
  (send (send _ :all) QUERYING_METHODS ...)
150
187
  PATTERN
151
188
 
152
189
  def on_send(node)
153
- return if !followed_by_query_method?(node.parent) || possible_enumerable_block_method?(node)
190
+ return unless followed_by_query_method?(node.parent)
191
+ return if possible_enumerable_block_method?(node) || sensitive_association_method?(node)
154
192
  return if node.receiver ? allowed_receiver?(node.receiver) : !inherit_active_record_base?(node)
155
193
 
156
194
  range_of_all_method = offense_range(node)
@@ -169,37 +207,12 @@ module RuboCop
169
207
  parent.parent&.block_type? || parent.parent&.numblock_type? || parent.first_argument&.block_pass_type?
170
208
  end
171
209
 
172
- def offense_range(node)
173
- range_between(node.loc.selector.begin_pos, node.source_range.end_pos)
210
+ def sensitive_association_method?(node)
211
+ !node.receiver&.const_type? && SENSITIVE_METHODS_ON_ASSOCIATION.include?(node.parent.method_name)
174
212
  end
175
213
 
176
- # TODO: In the future, please support only RuboCop 1.52+ and use `RuboCop::Cop::AllowedReceivers`:
177
- # https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/cop/mixin/allowed_receivers.rb
178
- # At that time, this duplicated module implementation can be removed.
179
- module AllowedReceivers
180
- def allowed_receiver?(receiver)
181
- receiver_name = receiver_name(receiver)
182
-
183
- allowed_receivers.include?(receiver_name)
184
- end
185
-
186
- def receiver_name(receiver)
187
- return receiver_name(receiver.receiver) if receiver.receiver && !receiver.receiver.const_type?
188
-
189
- if receiver.send_type?
190
- if receiver.receiver
191
- "#{receiver_name(receiver.receiver)}.#{receiver.method_name}"
192
- else
193
- receiver.method_name.to_s
194
- end
195
- else
196
- receiver.source
197
- end
198
- end
199
-
200
- def allowed_receivers
201
- cop_config.fetch('AllowedReceivers', [])
202
- end
214
+ def offense_range(node)
215
+ range_between(node.loc.selector.begin_pos, node.source_range.end_pos)
203
216
  end
204
217
  end
205
218
  end
@@ -100,7 +100,7 @@ module RuboCop
100
100
  else
101
101
  return false if node.arguments.empty?
102
102
 
103
- arg = node.arguments.first
103
+ arg = node.first_argument
104
104
  ->(n) { same_value?(arg, n.receiver) }
105
105
  end
106
106
 
@@ -290,10 +290,10 @@ module RuboCop
290
290
  when :change
291
291
  false
292
292
  when :remove
293
- target_rails_version >= 6.1 && all_hash_key?(node.arguments.last, :type)
293
+ target_rails_version >= 6.1 && all_hash_key?(node.last_argument, :type)
294
294
  when :change_default, :change_column_default, :change_table_comment,
295
295
  :change_column_comment
296
- all_hash_key?(node.arguments.last, :from, :to)
296
+ all_hash_key?(node.last_argument, :from, :to)
297
297
  else
298
298
  true
299
299
  end
@@ -336,10 +336,10 @@ module RuboCop
336
336
 
337
337
  # Check argument signature as no arguments or one hash
338
338
  def expected_signature?(node)
339
- !node.arguments? ||
340
- (node.arguments.one? &&
341
- node.method_name != :destroy &&
342
- (node.first_argument.hash_type? || !node.first_argument.literal?))
339
+ return true unless node.arguments?
340
+ return false if !node.arguments.one? || node.method?(:destroy)
341
+
342
+ node.first_argument.hash_type? || !node.first_argument.literal?
343
343
  end
344
344
  end
345
345
  end
@@ -124,7 +124,7 @@ module RuboCop
124
124
  end
125
125
 
126
126
  def uniqueness_part(node)
127
- pairs = node.arguments.last
127
+ pairs = node.last_argument
128
128
  return unless pairs&.hash_type?
129
129
 
130
130
  pairs.each_pair.find do |pair|
@@ -87,9 +87,9 @@ module RuboCop
87
87
 
88
88
  def environments
89
89
  @environments ||= begin
90
- e = cop_config['Environments']
91
- e += ['local'] if target_rails_version >= 7.1
92
- e
90
+ environments = cop_config['Environments'] || []
91
+ environments << 'local' if target_rails_version >= 7.1
92
+ environments
93
93
  end
94
94
  end
95
95
  end
@@ -60,7 +60,7 @@ module RuboCop
60
60
  range = node.loc.selector
61
61
 
62
62
  add_offense(range, message: message(node)) do |corrector|
63
- last_argument = node.arguments.last
63
+ last_argument = node.last_argument
64
64
  return if !last_argument.literal? && !last_argument.splat_type? && !frozen_array_argument?(last_argument)
65
65
 
66
66
  corrector.replace(range, 'validates')
@@ -127,7 +127,7 @@ module RuboCop
127
127
  private
128
128
 
129
129
  def analyze_keywords!(node)
130
- pairs = node.arguments.last
130
+ pairs = node.last_argument
131
131
  return unless pairs.hash_type?
132
132
 
133
133
  pairs.each_pair do |k, v|
@@ -158,7 +158,7 @@ module RuboCop
158
158
  end
159
159
 
160
160
  def analyze_keywords!(node)
161
- pairs = node.arguments.last
161
+ pairs = node.last_argument
162
162
  return unless pairs.hash_type?
163
163
 
164
164
  pairs.each_pair do |k, v|
@@ -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.22.1'
7
+ STRING = '2.22.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.22.1
4
+ version: 2.22.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-10-28 00:00:00.000000000 Z
13
+ date: 2023-11-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -60,6 +60,26 @@ dependencies:
60
60
  - - "<"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '2.0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rubocop-ast
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 1.30.0
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '2.0'
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 1.30.0
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.0'
63
83
  description: |
64
84
  Automatic Rails code style checking tool.
65
85
  A RuboCop extension focused on enforcing Rails best practices and coding conventions.