rubocop-rails 2.21.2 → 2.23.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -10
  3. data/config/default.yml +11 -3
  4. data/lib/rubocop/cop/mixin/active_record_helper.rb +9 -2
  5. data/lib/rubocop/cop/mixin/database_type_resolvable.rb +66 -0
  6. data/lib/rubocop/cop/rails/action_filter.rb +3 -0
  7. data/lib/rubocop/cop/rails/active_record_aliases.rb +2 -2
  8. data/lib/rubocop/cop/rails/active_support_aliases.rb +6 -5
  9. data/lib/rubocop/cop/rails/after_commit_override.rb +1 -1
  10. data/lib/rubocop/cop/rails/bulk_change_table.rb +6 -56
  11. data/lib/rubocop/cop/rails/content_tag.rb +1 -1
  12. data/lib/rubocop/cop/rails/dangerous_column_names.rb +10 -2
  13. data/lib/rubocop/cop/rails/duplicate_association.rb +66 -12
  14. data/lib/rubocop/cop/rails/eager_evaluation_log_message.rb +2 -2
  15. data/lib/rubocop/cop/rails/env_local.rb +46 -0
  16. data/lib/rubocop/cop/rails/file_path.rb +5 -5
  17. data/lib/rubocop/cop/rails/find_by.rb +2 -2
  18. data/lib/rubocop/cop/rails/find_by_id.rb +9 -23
  19. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +1 -1
  20. data/lib/rubocop/cop/rails/helper_instance_variable.rb +1 -1
  21. data/lib/rubocop/cop/rails/inquiry.rb +1 -0
  22. data/lib/rubocop/cop/rails/inverse_of.rb +1 -1
  23. data/lib/rubocop/cop/rails/not_null_column.rb +13 -3
  24. data/lib/rubocop/cop/rails/output.rb +3 -2
  25. data/lib/rubocop/cop/rails/pick.rb +6 -5
  26. data/lib/rubocop/cop/rails/pluck.rb +1 -1
  27. data/lib/rubocop/cop/rails/pluck_id.rb +2 -1
  28. data/lib/rubocop/cop/rails/pluck_in_where.rb +18 -5
  29. data/lib/rubocop/cop/rails/rake_environment.rb +2 -2
  30. data/lib/rubocop/cop/rails/redundant_active_record_all_method.rb +53 -2
  31. data/lib/rubocop/cop/rails/redundant_presence_validation_on_belongs_to.rb +7 -0
  32. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -1
  33. data/lib/rubocop/cop/rails/response_parsed_body.rb +52 -10
  34. data/lib/rubocop/cop/rails/reversible_migration.rb +2 -2
  35. data/lib/rubocop/cop/rails/save_bang.rb +11 -6
  36. data/lib/rubocop/cop/rails/unique_validation_without_index.rb +1 -1
  37. data/lib/rubocop/cop/rails/unknown_env.rb +5 -1
  38. data/lib/rubocop/cop/rails/validation.rb +2 -2
  39. data/lib/rubocop/cop/rails/where_equals.rb +3 -2
  40. data/lib/rubocop/cop/rails/where_exists.rb +9 -8
  41. data/lib/rubocop/cop/rails/where_missing.rb +1 -1
  42. data/lib/rubocop/cop/rails/where_not.rb +8 -6
  43. data/lib/rubocop/cop/rails_cops.rb +2 -0
  44. data/lib/rubocop/rails/schema_loader/schema.rb +2 -2
  45. data/lib/rubocop/rails/version.rb +1 -1
  46. metadata +26 -4
@@ -55,11 +55,11 @@ module RuboCop
55
55
  RESTRICT_ON_SEND = %i[exists?].freeze
56
56
 
57
57
  def_node_matcher :where_exists_call?, <<~PATTERN
58
- (send (send _ :where $...) :exists?)
58
+ (call (call _ :where $...) :exists?)
59
59
  PATTERN
60
60
 
61
61
  def_node_matcher :exists_with_args?, <<~PATTERN
62
- (send _ :exists? $...)
62
+ (call _ :exists? $...)
63
63
  PATTERN
64
64
 
65
65
  def on_send(node)
@@ -67,7 +67,7 @@ module RuboCop
67
67
  return unless convertable_args?(args)
68
68
 
69
69
  range = correction_range(node)
70
- good_method = build_good_method(args)
70
+ good_method = build_good_method(args, dot_source: node.loc.dot.source)
71
71
  message = format(MSG, good_method: good_method, bad_method: range.source)
72
72
 
73
73
  add_offense(range, message: message) do |corrector|
@@ -75,6 +75,7 @@ module RuboCop
75
75
  end
76
76
  end
77
77
  end
78
+ alias on_csend on_send
78
79
 
79
80
  private
80
81
 
@@ -108,11 +109,11 @@ module RuboCop
108
109
  end
109
110
  end
110
111
 
111
- def build_good_method(args)
112
+ def build_good_method(args, dot_source: '.')
112
113
  if exists_style?
113
114
  build_good_method_exists(args)
114
115
  elsif where_style?
115
- build_good_method_where(args)
116
+ build_good_method_where(args, dot_source)
116
117
  end
117
118
  end
118
119
 
@@ -124,11 +125,11 @@ module RuboCop
124
125
  end
125
126
  end
126
127
 
127
- def build_good_method_where(args)
128
+ def build_good_method_where(args, dot_source)
128
129
  if args.size > 1
129
- "where(#{args.map(&:source).join(', ')}).exists?"
130
+ "where(#{args.map(&:source).join(', ')})#{dot_source}exists?"
130
131
  else
131
- "where(#{args[0].source}).exists?"
132
+ "where(#{args[0].source})#{dot_source}exists?"
132
133
  end
133
134
  end
134
135
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  PATTERN
37
37
 
38
38
  def on_send(node)
39
- return unless node.first_argument.sym_type?
39
+ return unless node.first_argument&.sym_type?
40
40
 
41
41
  root_receiver = root_receiver(node)
42
42
  where_node_and_argument(root_receiver) do |where_node, where_argument|
@@ -32,8 +32,8 @@ module RuboCop
32
32
 
33
33
  def_node_matcher :where_method_call?, <<~PATTERN
34
34
  {
35
- (send _ :where (array $str_type? $_ ?))
36
- (send _ :where $str_type? $_ ?)
35
+ (call _ :where (array $str_type? $_ ?))
36
+ (call _ :where $str_type? $_ ?)
37
37
  }
38
38
  PATTERN
39
39
 
@@ -46,7 +46,7 @@ module RuboCop
46
46
  column_and_value = extract_column_and_value(template_node, value_node)
47
47
  return unless column_and_value
48
48
 
49
- good_method = build_good_method(*column_and_value)
49
+ good_method = build_good_method(node.loc.dot&.source, *column_and_value)
50
50
  message = format(MSG, good_method: good_method)
51
51
 
52
52
  add_offense(range, message: message) do |corrector|
@@ -54,6 +54,7 @@ module RuboCop
54
54
  end
55
55
  end
56
56
  end
57
+ alias on_csend on_send
57
58
 
58
59
  NOT_EQ_ANONYMOUS_RE = /\A([\w.]+)\s+(?:!=|<>)\s+\?\z/.freeze # column != ?, column <> ?
59
60
  NOT_IN_ANONYMOUS_RE = /\A([\w.]+)\s+NOT\s+IN\s+\(\?\)\z/i.freeze # column NOT IN (?)
@@ -86,13 +87,14 @@ module RuboCop
86
87
  [Regexp.last_match(1), value]
87
88
  end
88
89
 
89
- def build_good_method(column, value)
90
+ def build_good_method(dot, column, value)
91
+ dot ||= '.'
90
92
  if column.include?('.')
91
93
  table, column = column.split('.')
92
94
 
93
- "where.not(#{table}: { #{column}: #{value} })"
95
+ "where#{dot}not(#{table}: { #{column}: #{value} })"
94
96
  else
95
- "where.not(#{column}: #{value})"
97
+ "where#{dot}not(#{column}: #{value})"
96
98
  end
97
99
  end
98
100
  end
@@ -3,6 +3,7 @@
3
3
  require_relative 'mixin/active_record_helper'
4
4
  require_relative 'mixin/active_record_migrations_helper'
5
5
  require_relative 'mixin/class_send_node_helper'
6
+ require_relative 'mixin/database_type_resolvable'
6
7
  require_relative 'mixin/enforce_superclass'
7
8
  require_relative 'mixin/index_method'
8
9
  require_relative 'mixin/migrations_helper'
@@ -46,6 +47,7 @@ require_relative 'rails/dynamic_find_by'
46
47
  require_relative 'rails/eager_evaluation_log_message'
47
48
  require_relative 'rails/enum_hash'
48
49
  require_relative 'rails/enum_uniqueness'
50
+ require_relative 'rails/env_local'
49
51
  require_relative 'rails/environment_comparison'
50
52
  require_relative 'rails/environment_variable_access'
51
53
  require_relative 'rails/exit'
@@ -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.21.2'
7
+ STRING = '2.23.1'
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.2
4
+ version: 2.23.1
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-30 00:00:00.000000000 Z
13
+ date: 2023-12-25 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.
@@ -78,6 +98,7 @@ files:
78
98
  - lib/rubocop/cop/mixin/active_record_helper.rb
79
99
  - lib/rubocop/cop/mixin/active_record_migrations_helper.rb
80
100
  - lib/rubocop/cop/mixin/class_send_node_helper.rb
101
+ - lib/rubocop/cop/mixin/database_type_resolvable.rb
81
102
  - lib/rubocop/cop/mixin/enforce_superclass.rb
82
103
  - lib/rubocop/cop/mixin/index_method.rb
83
104
  - lib/rubocop/cop/mixin/migrations_helper.rb
@@ -120,6 +141,7 @@ files:
120
141
  - lib/rubocop/cop/rails/eager_evaluation_log_message.rb
121
142
  - lib/rubocop/cop/rails/enum_hash.rb
122
143
  - lib/rubocop/cop/rails/enum_uniqueness.rb
144
+ - lib/rubocop/cop/rails/env_local.rb
123
145
  - lib/rubocop/cop/rails/environment_comparison.rb
124
146
  - lib/rubocop/cop/rails/environment_variable_access.rb
125
147
  - lib/rubocop/cop/rails/exit.rb
@@ -223,7 +245,7 @@ metadata:
223
245
  homepage_uri: https://docs.rubocop.org/rubocop-rails/
224
246
  changelog_uri: https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md
225
247
  source_code_uri: https://github.com/rubocop/rubocop-rails/
226
- documentation_uri: https://docs.rubocop.org/rubocop-rails/2.21/
248
+ documentation_uri: https://docs.rubocop.org/rubocop-rails/2.23/
227
249
  bug_tracker_uri: https://github.com/rubocop/rubocop-rails/issues
228
250
  rubygems_mfa_required: 'true'
229
251
  post_install_message:
@@ -241,7 +263,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
263
  - !ruby/object:Gem::Version
242
264
  version: '0'
243
265
  requirements: []
244
- rubygems_version: 3.5.0.dev
266
+ rubygems_version: 3.4.19
245
267
  signing_key:
246
268
  specification_version: 4
247
269
  summary: Automatic Rails code style checking tool.