rubocop-rails 2.20.2 → 2.24.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -7
- data/config/default.yml +72 -10
- data/lib/rubocop/cop/mixin/active_record_helper.rb +15 -3
- data/lib/rubocop/cop/mixin/database_type_resolvable.rb +66 -0
- data/lib/rubocop/cop/mixin/index_method.rb +2 -2
- data/lib/rubocop/cop/rails/action_controller_flash_before_render.rb +3 -1
- data/lib/rubocop/cop/rails/action_controller_test_case.rb +2 -2
- data/lib/rubocop/cop/rails/action_filter.rb +3 -0
- data/lib/rubocop/cop/rails/active_record_aliases.rb +2 -2
- data/lib/rubocop/cop/rails/active_support_aliases.rb +6 -5
- data/lib/rubocop/cop/rails/active_support_on_load.rb +21 -1
- data/lib/rubocop/cop/rails/after_commit_override.rb +1 -1
- data/lib/rubocop/cop/rails/bulk_change_table.rb +8 -41
- data/lib/rubocop/cop/rails/content_tag.rb +1 -1
- data/lib/rubocop/cop/rails/dangerous_column_names.rb +446 -0
- data/lib/rubocop/cop/rails/date.rb +1 -1
- data/lib/rubocop/cop/rails/duplicate_association.rb +69 -12
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +3 -3
- data/lib/rubocop/cop/rails/eager_evaluation_log_message.rb +2 -2
- data/lib/rubocop/cop/rails/env_local.rb +46 -0
- data/lib/rubocop/cop/rails/expanded_date_range.rb +1 -1
- data/lib/rubocop/cop/rails/file_path.rb +9 -6
- data/lib/rubocop/cop/rails/find_by.rb +3 -3
- data/lib/rubocop/cop/rails/find_by_id.rb +9 -23
- data/lib/rubocop/cop/rails/freeze_time.rb +1 -1
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +1 -1
- data/lib/rubocop/cop/rails/helper_instance_variable.rb +1 -1
- data/lib/rubocop/cop/rails/http_status.rb +4 -3
- data/lib/rubocop/cop/rails/i18n_lazy_lookup.rb +63 -13
- data/lib/rubocop/cop/rails/inquiry.rb +1 -0
- data/lib/rubocop/cop/rails/inverse_of.rb +1 -1
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +7 -8
- data/lib/rubocop/cop/rails/not_null_column.rb +13 -3
- data/lib/rubocop/cop/rails/output.rb +3 -2
- data/lib/rubocop/cop/rails/pick.rb +6 -5
- data/lib/rubocop/cop/rails/pluck.rb +1 -1
- data/lib/rubocop/cop/rails/pluck_id.rb +2 -1
- data/lib/rubocop/cop/rails/pluck_in_where.rb +18 -5
- data/lib/rubocop/cop/rails/rake_environment.rb +22 -6
- data/lib/rubocop/cop/rails/redundant_active_record_all_method.rb +219 -0
- data/lib/rubocop/cop/rails/redundant_presence_validation_on_belongs_to.rb +7 -0
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -1
- data/lib/rubocop/cop/rails/response_parsed_body.rb +52 -10
- data/lib/rubocop/cop/rails/reversible_migration.rb +4 -4
- data/lib/rubocop/cop/rails/root_pathname_methods.rb +38 -4
- data/lib/rubocop/cop/rails/save_bang.rb +15 -8
- data/lib/rubocop/cop/rails/schema_comment.rb +16 -10
- data/lib/rubocop/cop/rails/select_map.rb +78 -0
- data/lib/rubocop/cop/rails/time_zone.rb +13 -5
- data/lib/rubocop/cop/rails/transaction_exit_statement.rb +29 -10
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +12 -4
- data/lib/rubocop/cop/rails/unique_validation_without_index.rb +2 -2
- data/lib/rubocop/cop/rails/unknown_env.rb +5 -1
- data/lib/rubocop/cop/rails/unused_render_content.rb +67 -0
- data/lib/rubocop/cop/rails/validation.rb +2 -2
- data/lib/rubocop/cop/rails/where_equals.rb +3 -2
- data/lib/rubocop/cop/rails/where_exists.rb +9 -9
- data/lib/rubocop/cop/rails/where_missing.rb +6 -2
- data/lib/rubocop/cop/rails/where_not.rb +8 -6
- data/lib/rubocop/cop/rails_cops.rb +6 -0
- data/lib/rubocop/rails/schema_loader/schema.rb +3 -2
- data/lib/rubocop/rails/schema_loader.rb +5 -15
- data/lib/rubocop/rails/version.rb +1 -1
- data/lib/rubocop-rails.rb +8 -0
- metadata +30 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee7d9bdd0fa7838d8bfecece133ccd92cc308603bcdf120c14224c5f2e312344
|
4
|
+
data.tar.gz: 7d740b495ffa368d26a73808af9adff990bb9c1d317d905f877b4f3e2025487c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98172f41e7b1aab55931f351757425815850809edd6fc4f5bc55c59271d9f12459ac51c2002e409534b623f321ab27798c32aaccb2d15d60c7bf309a9c044d58
|
7
|
+
data.tar.gz: c78e9a0d9e53e5203a2dd1846a79c3e9c7a16af69e98d94e6b7ae6358ae6a29b71c2ac3f09ddb2a9be06dc64097a736c3379730f50b9309c0e2ae084267aee70
|
data/README.md
CHANGED
@@ -56,6 +56,8 @@ Note: `--rails` option is required while `rubocop` command supports `--rails` op
|
|
56
56
|
### Rake task
|
57
57
|
|
58
58
|
```ruby
|
59
|
+
require 'rubocop/rake_task'
|
60
|
+
|
59
61
|
RuboCop::RakeTask.new do |task|
|
60
62
|
task.requires << 'rubocop-rails'
|
61
63
|
end
|
@@ -64,21 +66,21 @@ end
|
|
64
66
|
## Rails configuration tip
|
65
67
|
|
66
68
|
If you are using Rails 6.1 or newer, add the following `config.generators.after_generate` setting to
|
67
|
-
your config/
|
69
|
+
your `config/environments/development.rb` to apply RuboCop autocorrection to code generated by `bin/rails g`.
|
68
70
|
|
69
71
|
```ruby
|
70
|
-
# config/
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
# config/environments/development.rb
|
73
|
+
Rails.application.configure do
|
74
|
+
config.generators.after_generate do |files|
|
75
|
+
parsable_files = files.filter { |file| file.end_with?('.rb') }
|
76
|
+
unless parsable_files.empty?
|
75
77
|
system("bundle exec rubocop -A --fail-level=E #{parsable_files.shelljoin}", exception: true)
|
76
78
|
end
|
77
79
|
end
|
78
80
|
end
|
79
81
|
```
|
80
82
|
|
81
|
-
It uses `rubocop -A` to apply `Style/FrozenStringLiteralComment` and other unsafe
|
83
|
+
It uses `rubocop -A` to apply `Style/FrozenStringLiteralComment` and other unsafe autocorrection cops.
|
82
84
|
`rubocop -A` is unsafe autocorrection, but code generated by default is simple and less likely to
|
83
85
|
be incompatible with `rubocop -A`. If you have problems you can replace it with `rubocop -a` instead.
|
84
86
|
|
data/config/default.yml
CHANGED
@@ -61,6 +61,18 @@ Lint/RedundantSafeNavigation:
|
|
61
61
|
- presence
|
62
62
|
- present?
|
63
63
|
|
64
|
+
Lint/SafeNavigationChain:
|
65
|
+
# Add `presence_in` method to the default of the RuboCop core:
|
66
|
+
# https://github.com/rubocop/rubocop/blob/v1.56.0/config/default.yml#L2265-L2271
|
67
|
+
AllowedMethods:
|
68
|
+
- present?
|
69
|
+
- blank?
|
70
|
+
- presence
|
71
|
+
- presence_in
|
72
|
+
- try
|
73
|
+
- try!
|
74
|
+
- in?
|
75
|
+
|
64
76
|
Rails:
|
65
77
|
Enabled: true
|
66
78
|
DocumentationBaseURL: https://docs.rubocop.org/rubocop-rails
|
@@ -83,8 +95,9 @@ Rails/ActionControllerTestCase:
|
|
83
95
|
|
84
96
|
Rails/ActionFilter:
|
85
97
|
Description: 'Enforces consistent use of action filter methods.'
|
86
|
-
Enabled:
|
98
|
+
Enabled: false
|
87
99
|
VersionAdded: '0.19'
|
100
|
+
VersionChanged: '2.22'
|
88
101
|
EnforcedStyle: action
|
89
102
|
SupportedStyles:
|
90
103
|
- action
|
@@ -152,6 +165,7 @@ Rails/ActiveSupportOnLoad:
|
|
152
165
|
- 'https://guides.rubyonrails.org/engines.html#available-load-hooks'
|
153
166
|
SafeAutoCorrect: false
|
154
167
|
VersionAdded: '2.16'
|
168
|
+
VersionChanged: '2.24'
|
155
169
|
|
156
170
|
Rails/AddColumnIndex:
|
157
171
|
Description: >-
|
@@ -296,6 +310,15 @@ Rails/CreateTableWithTimestamps:
|
|
296
310
|
- db/**/*_create_active_storage_tables.active_storage.rb
|
297
311
|
- db/**/*_create_active_storage_variant_records.active_storage.rb
|
298
312
|
|
313
|
+
Rails/DangerousColumnNames:
|
314
|
+
Description: >-
|
315
|
+
Avoid dangerous column names.
|
316
|
+
Enabled: pending
|
317
|
+
Severity: warning
|
318
|
+
VersionAdded: '2.21'
|
319
|
+
Include:
|
320
|
+
- 'db/**/*.rb'
|
321
|
+
|
299
322
|
Rails/Date:
|
300
323
|
Description: >-
|
301
324
|
Checks the correct usage of date aware methods,
|
@@ -317,7 +340,6 @@ Rails/Date:
|
|
317
340
|
|
318
341
|
Rails/DefaultScope:
|
319
342
|
Description: 'Avoid use of `default_scope`.'
|
320
|
-
StyleGuide: 'https://rails.rubystyle.guide#avoid-default-scope'
|
321
343
|
Enabled: false
|
322
344
|
VersionAdded: '2.7'
|
323
345
|
|
@@ -409,6 +431,11 @@ Rails/EnumUniqueness:
|
|
409
431
|
Include:
|
410
432
|
- app/models/**/*.rb
|
411
433
|
|
434
|
+
Rails/EnvLocal:
|
435
|
+
Description: 'Use `Rails.env.local?` instead of `Rails.env.development? || Rails.env.test?`.'
|
436
|
+
Enabled: pending
|
437
|
+
VersionAdded: '2.22'
|
438
|
+
|
412
439
|
Rails/EnvironmentComparison:
|
413
440
|
Description: "Favor `Rails.env.production?` over `Rails.env == 'production'`."
|
414
441
|
Enabled: true
|
@@ -419,9 +446,10 @@ Rails/EnvironmentVariableAccess:
|
|
419
446
|
# TODO: Set to `pending` status in RuboCop Rails 2 series when migration doc will be written.
|
420
447
|
Enabled: false
|
421
448
|
VersionAdded: '2.10'
|
422
|
-
VersionChanged: '2.
|
449
|
+
VersionChanged: '2.24'
|
423
450
|
Include:
|
424
451
|
- app/**/*.rb
|
452
|
+
- config/initializers/**/*.rb
|
425
453
|
- lib/**/*.rb
|
426
454
|
Exclude:
|
427
455
|
- lib/**/*.rake
|
@@ -463,10 +491,8 @@ Rails/FindBy:
|
|
463
491
|
StyleGuide: 'https://rails.rubystyle.guide#find_by'
|
464
492
|
Enabled: true
|
465
493
|
VersionAdded: '0.30'
|
466
|
-
VersionChanged: '2.
|
494
|
+
VersionChanged: '2.21'
|
467
495
|
IgnoreWhereFirst: true
|
468
|
-
Include:
|
469
|
-
- app/models/**/*.rb
|
470
496
|
|
471
497
|
Rails/FindById:
|
472
498
|
Description: >-
|
@@ -482,9 +508,7 @@ Rails/FindEach:
|
|
482
508
|
Enabled: true
|
483
509
|
Safe: false
|
484
510
|
VersionAdded: '0.30'
|
485
|
-
VersionChanged: '2.
|
486
|
-
Include:
|
487
|
-
- app/models/**/*.rb
|
511
|
+
VersionChanged: '2.21'
|
488
512
|
AllowedMethods:
|
489
513
|
# Methods that don't work well with `find_each`.
|
490
514
|
- order
|
@@ -547,6 +571,10 @@ Rails/I18nLazyLookup:
|
|
547
571
|
Reference: 'https://guides.rubyonrails.org/i18n.html#lazy-lookup'
|
548
572
|
Enabled: pending
|
549
573
|
VersionAdded: '2.14'
|
574
|
+
EnforcedStyle: lazy
|
575
|
+
SupportedStyles:
|
576
|
+
- lazy
|
577
|
+
- explicit
|
550
578
|
Include:
|
551
579
|
- 'app/controllers/**/*.rb'
|
552
580
|
|
@@ -669,6 +697,9 @@ Rails/NotNullColumn:
|
|
669
697
|
Enabled: true
|
670
698
|
VersionAdded: '0.43'
|
671
699
|
VersionChanged: '2.20'
|
700
|
+
Database: null
|
701
|
+
SupportedDatabases:
|
702
|
+
- mysql
|
672
703
|
Include:
|
673
704
|
- db/**/*.rb
|
674
705
|
|
@@ -775,6 +806,16 @@ Rails/ReadWriteAttribute:
|
|
775
806
|
Include:
|
776
807
|
- app/models/**/*.rb
|
777
808
|
|
809
|
+
Rails/RedundantActiveRecordAllMethod:
|
810
|
+
Description: Detect redundant `all` used as a receiver for Active Record query methods.
|
811
|
+
StyleGuide: 'https://rails.rubystyle.guide/#redundant-all'
|
812
|
+
Enabled: pending
|
813
|
+
Safe: false
|
814
|
+
AllowedReceivers:
|
815
|
+
- ActionMailer::Preview
|
816
|
+
- ActiveSupport::TimeZone
|
817
|
+
VersionAdded: '2.21'
|
818
|
+
|
778
819
|
Rails/RedundantAllowNil:
|
779
820
|
Description: >-
|
780
821
|
Finds redundant use of `allow_nil` when `allow_blank` is set to
|
@@ -863,7 +904,7 @@ Rails/RequireDependency:
|
|
863
904
|
VersionAdded: '2.10'
|
864
905
|
|
865
906
|
Rails/ResponseParsedBody:
|
866
|
-
Description: Prefer `response.parsed_body` to `
|
907
|
+
Description: Prefer `response.parsed_body` to custom parsing logic for `response.body`.
|
867
908
|
Enabled: pending
|
868
909
|
Safe: false
|
869
910
|
VersionAdded: '2.18'
|
@@ -955,6 +996,12 @@ Rails/ScopeArgs:
|
|
955
996
|
Include:
|
956
997
|
- app/models/**/*.rb
|
957
998
|
|
999
|
+
Rails/SelectMap:
|
1000
|
+
Description: 'Checks for uses of `select(:column_name)` with `map(&:column_name)`.'
|
1001
|
+
Enabled: pending
|
1002
|
+
Safe: false
|
1003
|
+
VersionAdded: '2.21'
|
1004
|
+
|
958
1005
|
Rails/ShortI18n:
|
959
1006
|
Description: 'Use the short form of the I18n methods: `t` instead of `translate` and `l` instead of `localize`.'
|
960
1007
|
StyleGuide: 'https://rails.rubystyle.guide/#short-i18n'
|
@@ -1083,6 +1130,7 @@ Rails/TransactionExitStatement:
|
|
1083
1130
|
- https://github.com/rails/rails/commit/15aa4200e083
|
1084
1131
|
Enabled: pending
|
1085
1132
|
VersionAdded: '2.14'
|
1133
|
+
TransactionMethods: []
|
1086
1134
|
|
1087
1135
|
Rails/UniqBeforePluck:
|
1088
1136
|
Description: 'Prefer the use of uniq or distinct before pluck.'
|
@@ -1120,6 +1168,12 @@ Rails/UnusedIgnoredColumns:
|
|
1120
1168
|
Include:
|
1121
1169
|
- app/models/**/*.rb
|
1122
1170
|
|
1171
|
+
Rails/UnusedRenderContent:
|
1172
|
+
Description: 'Do not specify body content for a response with a non-content status code.'
|
1173
|
+
Enabled: pending
|
1174
|
+
Severity: warning
|
1175
|
+
VersionAdded: '2.21'
|
1176
|
+
|
1123
1177
|
Rails/Validation:
|
1124
1178
|
Description: 'Use validates :attribute, hash of validations.'
|
1125
1179
|
Enabled: true
|
@@ -1175,6 +1229,14 @@ Style/FormatStringToken:
|
|
1175
1229
|
AllowedMethods:
|
1176
1230
|
- redirect
|
1177
1231
|
|
1232
|
+
Style/InvertibleUnlessCondition:
|
1233
|
+
InverseMethods:
|
1234
|
+
# Active Support defines some common inverse methods. They are listed below:
|
1235
|
+
:present?: :blank?
|
1236
|
+
:blank?: :present?
|
1237
|
+
:include?: :exclude?
|
1238
|
+
:exclude?: :include?
|
1239
|
+
|
1178
1240
|
Style/SymbolProc:
|
1179
1241
|
AllowedMethods:
|
1180
1242
|
- define_method
|
@@ -39,7 +39,12 @@ module RuboCop
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def schema
|
42
|
-
RuboCop
|
42
|
+
# For compatibility with RuboCop 1.61.0 or lower.
|
43
|
+
if respond_to?(:parser_engine)
|
44
|
+
RuboCop::Rails::SchemaLoader.load(target_ruby_version, parser_engine)
|
45
|
+
else
|
46
|
+
RuboCop::Rails::SchemaLoader.load(target_ruby_version, :parser_whitequark)
|
47
|
+
end
|
43
48
|
end
|
44
49
|
|
45
50
|
def table_name(class_node)
|
@@ -98,8 +103,15 @@ module RuboCop
|
|
98
103
|
end
|
99
104
|
|
100
105
|
def in_where?(node)
|
101
|
-
send_node = node.each_ancestor(:send).first
|
102
|
-
|
106
|
+
send_node = node.each_ancestor(:send, :csend).first
|
107
|
+
return false unless send_node
|
108
|
+
|
109
|
+
return true if WHERE_METHODS.include?(send_node.method_name)
|
110
|
+
|
111
|
+
receiver = send_node.receiver
|
112
|
+
return false unless receiver&.send_type?
|
113
|
+
|
114
|
+
send_node.method?(:not) && WHERE_METHODS.include?(receiver.method_name)
|
103
115
|
end
|
104
116
|
end
|
105
117
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# A mixin to extend cops in order to determine the database type.
|
6
|
+
#
|
7
|
+
# This module automatically detect an adapter from `development` environment
|
8
|
+
# in `config/database.yml` or the environment variable `DATABASE_URL`
|
9
|
+
# when the `Database` option is not set.
|
10
|
+
module DatabaseTypeResolvable
|
11
|
+
MYSQL = 'mysql'
|
12
|
+
POSTGRESQL = 'postgresql'
|
13
|
+
|
14
|
+
def database
|
15
|
+
cop_config['Database'] || database_from_yaml || database_from_env
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def database_from_yaml
|
21
|
+
return unless database_yaml
|
22
|
+
|
23
|
+
case database_adapter
|
24
|
+
when 'mysql2', 'trilogy'
|
25
|
+
MYSQL
|
26
|
+
when 'postgresql', 'postgis'
|
27
|
+
POSTGRESQL
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def database_from_env
|
32
|
+
url = ENV['DATABASE_URL'].presence
|
33
|
+
return unless url
|
34
|
+
|
35
|
+
case url
|
36
|
+
when %r{\A(mysql2|trilogy)://}
|
37
|
+
MYSQL
|
38
|
+
when %r{\Apostgres(ql)?://}
|
39
|
+
POSTGRESQL
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def database_yaml
|
44
|
+
return unless File.exist?('config/database.yml')
|
45
|
+
|
46
|
+
yaml = if YAML.respond_to?(:unsafe_load_file)
|
47
|
+
YAML.unsafe_load_file('config/database.yml')
|
48
|
+
else
|
49
|
+
YAML.load_file('config/database.yml')
|
50
|
+
end
|
51
|
+
return unless yaml.is_a? Hash
|
52
|
+
|
53
|
+
config = yaml['development']
|
54
|
+
return unless config.is_a?(Hash)
|
55
|
+
|
56
|
+
config
|
57
|
+
rescue Psych::SyntaxError
|
58
|
+
# noop
|
59
|
+
end
|
60
|
+
|
61
|
+
def database_adapter
|
62
|
+
database_yaml['adapter'] || database_yaml.first.last['adapter']
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -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
|
@@ -85,7 +85,7 @@ module RuboCop
|
|
85
85
|
|
86
86
|
def inherit_action_controller_base?(node)
|
87
87
|
class_node = find_ancestor(node, type: :class)
|
88
|
-
return unless class_node
|
88
|
+
return false unless class_node
|
89
89
|
|
90
90
|
action_controller?(class_node)
|
91
91
|
end
|
@@ -99,6 +99,8 @@ module RuboCop
|
|
99
99
|
|
100
100
|
def use_redirect_to?(context)
|
101
101
|
context.right_siblings.compact.any? do |sibling|
|
102
|
+
# Unwrap `return redirect_to :index`
|
103
|
+
sibling = sibling.children.first if sibling.return_type? && sibling.children.one?
|
102
104
|
sibling.send_type? && sibling.method?(:redirect_to)
|
103
105
|
end
|
104
106
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Rails
|
6
|
-
# Using `ActionController::TestCase
|
7
|
-
# `ActionDispatch::IntegrationTest
|
6
|
+
# Using `ActionController::TestCase` is discouraged and should be replaced by
|
7
|
+
# `ActionDispatch::IntegrationTest`. Controller tests are too close to the
|
8
8
|
# internals of a controller whereas integration tests mimic the browser/user.
|
9
9
|
#
|
10
10
|
# @safety
|
@@ -8,6 +8,9 @@ module RuboCop
|
|
8
8
|
# The cop is configurable and can enforce the use of the older
|
9
9
|
# something_filter methods or the newer something_action methods.
|
10
10
|
#
|
11
|
+
# IMPORTANT: This cop is deprecated. Because the `*_filter` methods were removed in Rails 4.2,
|
12
|
+
# and that Rails version is no longer supported by RuboCop Rails. This cop will be removed in RuboCop Rails 3.0.
|
13
|
+
#
|
11
14
|
# @example EnforcedStyle: action (default)
|
12
15
|
# # bad
|
13
16
|
# after_filter :do_stuff
|
@@ -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
|
@@ -27,13 +27,13 @@ module RuboCop
|
|
27
27
|
|
28
28
|
ALIASES = {
|
29
29
|
starts_with?: {
|
30
|
-
original: :start_with?, matcher: '(
|
30
|
+
original: :start_with?, matcher: '(call str :starts_with? _)'
|
31
31
|
},
|
32
32
|
ends_with?: {
|
33
|
-
original: :end_with?, matcher: '(
|
33
|
+
original: :end_with?, matcher: '(call str :ends_with? _)'
|
34
34
|
},
|
35
|
-
append: { original: :<<, matcher: '(
|
36
|
-
prepend: { original: :unshift, matcher: '(
|
35
|
+
append: { original: :<<, matcher: '(call array :append _)' },
|
36
|
+
prepend: { original: :unshift, matcher: '(call array :prepend _)' }
|
37
37
|
}.freeze
|
38
38
|
|
39
39
|
ALIASES.each do |aliased_method, options|
|
@@ -47,13 +47,14 @@ module RuboCop
|
|
47
47
|
preferred_method = ALIASES[aliased_method][:original]
|
48
48
|
message = format(MSG, prefer: preferred_method, current: aliased_method)
|
49
49
|
|
50
|
-
add_offense(node, message: message) do |corrector|
|
50
|
+
add_offense(node.loc.selector.join(node.source_range.end), message: message) do |corrector|
|
51
51
|
next if append(node)
|
52
52
|
|
53
53
|
corrector.replace(node.loc.selector, preferred_method)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
|
+
alias on_csend on_send
|
57
58
|
end
|
58
59
|
end
|
59
60
|
end
|
@@ -55,15 +55,35 @@ module RuboCop
|
|
55
55
|
'ActiveSupport::TestCase' => 'active_support_test_case'
|
56
56
|
}.freeze
|
57
57
|
|
58
|
+
RAILS_5_2_LOAD_HOOKS = {
|
59
|
+
'ActiveRecord::ConnectionAdapters::SQLite3Adapter' => 'active_record_sqlite3adapter'
|
60
|
+
}.freeze
|
61
|
+
|
62
|
+
RAILS_7_1_LOAD_HOOKS = {
|
63
|
+
'ActiveRecord::TestFixtures' => 'active_record_fixtures',
|
64
|
+
'ActiveModel::Model' => 'active_model',
|
65
|
+
'ActionText::EncryptedRichText' => 'action_text_encrypted_rich_text',
|
66
|
+
'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter' => 'active_record_postgresqladapter',
|
67
|
+
'ActiveRecord::ConnectionAdapters::Mysql2Adapter' => 'active_record_mysql2adapter',
|
68
|
+
'ActiveRecord::ConnectionAdapters::TrilogyAdapter' => 'active_record_trilogyadapter'
|
69
|
+
}.freeze
|
70
|
+
|
58
71
|
def on_send(node)
|
59
72
|
receiver, method, arguments = *node # rubocop:disable InternalAffairs/NodeDestructuring
|
60
|
-
return unless
|
73
|
+
return unless arguments && (hook = hook_for_const(receiver&.const_name))
|
61
74
|
|
62
75
|
preferred = "ActiveSupport.on_load(:#{hook}) { #{method} #{arguments.source} }"
|
63
76
|
add_offense(node, message: format(MSG, prefer: preferred, current: node.source)) do |corrector|
|
64
77
|
corrector.replace(node, preferred)
|
65
78
|
end
|
66
79
|
end
|
80
|
+
|
81
|
+
def hook_for_const(const_name)
|
82
|
+
hook = LOAD_HOOKS[const_name]
|
83
|
+
hook ||= RAILS_5_2_LOAD_HOOKS[const_name] if target_rails_version >= 5.2
|
84
|
+
hook ||= RAILS_7_1_LOAD_HOOKS[const_name] if target_rails_version >= 7.1
|
85
|
+
hook
|
86
|
+
end
|
67
87
|
end
|
68
88
|
end
|
69
89
|
end
|
@@ -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.
|
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
|
@@ -12,8 +12,9 @@ module RuboCop
|
|
12
12
|
# The `bulk` option is only supported on the MySQL and
|
13
13
|
# the PostgreSQL (5.2 later) adapter; thus it will
|
14
14
|
# automatically detect an adapter from `development` environment
|
15
|
-
# in `config/database.yml`
|
16
|
-
#
|
15
|
+
# in `config/database.yml` or the environment variable `DATABASE_URL`
|
16
|
+
# when the `Database` option is not set.
|
17
|
+
# If the adapter is not `mysql2`, `trilogy`, `postgresql`, or `postgis`,
|
17
18
|
# this Cop ignores offenses.
|
18
19
|
#
|
19
20
|
# @example
|
@@ -63,6 +64,8 @@ module RuboCop
|
|
63
64
|
# end
|
64
65
|
# end
|
65
66
|
class BulkChangeTable < Base
|
67
|
+
include DatabaseTypeResolvable
|
68
|
+
|
66
69
|
MSG_FOR_CHANGE_TABLE = <<~MSG.chomp
|
67
70
|
You can combine alter queries using `bulk: true` options.
|
68
71
|
MSG
|
@@ -70,9 +73,6 @@ module RuboCop
|
|
70
73
|
You can use `change_table :%<table>s, bulk: true` to combine alter queries.
|
71
74
|
MSG
|
72
75
|
|
73
|
-
MYSQL = 'mysql'
|
74
|
-
POSTGRESQL = 'postgresql'
|
75
|
-
|
76
76
|
MIGRATION_METHODS = %i[change up down].freeze
|
77
77
|
|
78
78
|
COMBINABLE_TRANSFORMATIONS = %i[
|
@@ -174,39 +174,6 @@ module RuboCop
|
|
174
174
|
options.hash_type? && options.keys.any? { |key| key.sym_type? && key.value == :bulk }
|
175
175
|
end
|
176
176
|
|
177
|
-
def database
|
178
|
-
cop_config['Database'] || database_from_yaml
|
179
|
-
end
|
180
|
-
|
181
|
-
def database_from_yaml
|
182
|
-
return nil unless database_yaml
|
183
|
-
|
184
|
-
case database_yaml['adapter']
|
185
|
-
when 'mysql2'
|
186
|
-
MYSQL
|
187
|
-
when 'postgresql'
|
188
|
-
POSTGRESQL
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
def database_yaml
|
193
|
-
return nil unless File.exist?('config/database.yml')
|
194
|
-
|
195
|
-
yaml = if YAML.respond_to?(:unsafe_load_file)
|
196
|
-
YAML.unsafe_load_file('config/database.yml')
|
197
|
-
else
|
198
|
-
YAML.load_file('config/database.yml')
|
199
|
-
end
|
200
|
-
return nil unless yaml.is_a? Hash
|
201
|
-
|
202
|
-
config = yaml['development']
|
203
|
-
return nil unless config.is_a?(Hash)
|
204
|
-
|
205
|
-
config
|
206
|
-
rescue Psych::SyntaxError
|
207
|
-
nil
|
208
|
-
end
|
209
|
-
|
210
177
|
def support_bulk_alter?
|
211
178
|
case database
|
212
179
|
when MYSQL
|
@@ -245,7 +212,7 @@ module RuboCop
|
|
245
212
|
# @param node [RuboCop::AST::SendNode]
|
246
213
|
def add_offense_for_alter_methods(node)
|
247
214
|
# arguments: [{(sym :table)(str "table")} ...]
|
248
|
-
table_node = node.
|
215
|
+
table_node = node.first_argument
|
249
216
|
return unless table_node.is_a? RuboCop::AST::BasicLiteralNode
|
250
217
|
|
251
218
|
message = format(MSG_FOR_ALTER_METHODS, table: table_node.value)
|
@@ -267,10 +234,10 @@ module RuboCop
|
|
267
234
|
# @param new_node [RuboCop::AST::SendNode]
|
268
235
|
def process(new_node)
|
269
236
|
# arguments: [{(sym :table)(str "table")} ...]
|
270
|
-
table_node = new_node.
|
237
|
+
table_node = new_node.first_argument
|
271
238
|
if table_node.is_a? RuboCop::AST::BasicLiteralNode
|
272
239
|
flush unless @nodes.all? do |node|
|
273
|
-
node.
|
240
|
+
node.first_argument.value.to_s == table_node.value.to_s
|
274
241
|
end
|
275
242
|
@nodes << new_node
|
276
243
|
else
|
@@ -7,7 +7,7 @@ module RuboCop
|
|
7
7
|
#
|
8
8
|
# NOTE: Allow `tag` when the first argument is a variable because
|
9
9
|
# `tag(name)` is simpler rather than `tag.public_send(name)`.
|
10
|
-
# And this cop will be renamed to something like `LegacyTag` in the future. (e.g. RuboCop Rails
|
10
|
+
# And this cop will be renamed to something like `LegacyTag` in the future. (e.g. RuboCop Rails 3.0)
|
11
11
|
#
|
12
12
|
# @example
|
13
13
|
# # bad
|