rubocop-rails 2.20.2 → 2.22.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 +6 -2
- data/config/default.yml +68 -8
- 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 +1 -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/bulk_change_table.rb +5 -38
- data/lib/rubocop/cop/rails/dangerous_column_names.rb +447 -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/env_local.rb +46 -0
- data/lib/rubocop/cop/rails/file_path.rb +4 -1
- 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/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/rake_environment.rb +20 -4
- data/lib/rubocop/cop/rails/redundant_active_record_all_method.rb +207 -0
- data/lib/rubocop/cop/rails/redundant_presence_validation_on_belongs_to.rb +7 -0
- data/lib/rubocop/cop/rails/reversible_migration.rb +1 -1
- data/lib/rubocop/cop/rails/root_pathname_methods.rb +38 -4
- data/lib/rubocop/cop/rails/save_bang.rb +9 -4
- 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 +12 -5
- data/lib/rubocop/cop/rails/transaction_exit_statement.rb +29 -10
- data/lib/rubocop/cop/rails/unique_validation_without_index.rb +1 -1
- 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/where_exists.rb +0 -1
- data/lib/rubocop/cop/rails_cops.rb +6 -0
- data/lib/rubocop/rails/schema_loader.rb +1 -1
- data/lib/rubocop/rails/version.rb +1 -1
- data/lib/rubocop-rails.rb +8 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4d08f111893c16ea5c725b8da3b488a85d193366cdec6c876e780e794d66ba3
|
4
|
+
data.tar.gz: 40bd526fbf58ea8b3b45ab82ff5b7f809dcf29c7377991023fb30157dc66cc0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6dd91e7f4068bba386e8b66ce86ec18961bc6e346d000947220af3fccdaf076907a11d7367786702124370aa070aacadba96bde0c200303ad64eaf1b5de6f8d5
|
7
|
+
data.tar.gz: 783d1a9013524550b3bbd2271f3d244b13565038b1f0e73b7726565a6ea79e6e409b19f748e043fd7d850c623ea3f56c831f81f7d5bafd2cbd5e08d4181b1172
|
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
|
@@ -72,13 +74,15 @@ module YourCoolApp
|
|
72
74
|
class Application < Rails::Application
|
73
75
|
config.generators.after_generate do |files|
|
74
76
|
parsable_files = files.filter { |file| file.end_with?('.rb') }
|
75
|
-
|
77
|
+
unless parsable_files.empty?
|
78
|
+
system("bundle exec rubocop -A --fail-level=E #{parsable_files.shelljoin}", exception: true)
|
79
|
+
end
|
76
80
|
end
|
77
81
|
end
|
78
82
|
end
|
79
83
|
```
|
80
84
|
|
81
|
-
It uses `rubocop -A` to apply `Style/FrozenStringLiteralComment` and other unsafe
|
85
|
+
It uses `rubocop -A` to apply `Style/FrozenStringLiteralComment` and other unsafe autocorrection cops.
|
82
86
|
`rubocop -A` is unsafe autocorrection, but code generated by default is simple and less likely to
|
83
87
|
be incompatible with `rubocop -A`. If you have problems you can replace it with `rubocop -a` instead.
|
84
88
|
|
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
|
@@ -296,6 +309,15 @@ Rails/CreateTableWithTimestamps:
|
|
296
309
|
- db/**/*_create_active_storage_tables.active_storage.rb
|
297
310
|
- db/**/*_create_active_storage_variant_records.active_storage.rb
|
298
311
|
|
312
|
+
Rails/DangerousColumnNames:
|
313
|
+
Description: >-
|
314
|
+
Avoid dangerous column names.
|
315
|
+
Enabled: pending
|
316
|
+
Severity: warning
|
317
|
+
VersionAdded: '2.21'
|
318
|
+
Include:
|
319
|
+
- 'db/**/*.rb'
|
320
|
+
|
299
321
|
Rails/Date:
|
300
322
|
Description: >-
|
301
323
|
Checks the correct usage of date aware methods,
|
@@ -317,7 +339,6 @@ Rails/Date:
|
|
317
339
|
|
318
340
|
Rails/DefaultScope:
|
319
341
|
Description: 'Avoid use of `default_scope`.'
|
320
|
-
StyleGuide: 'https://rails.rubystyle.guide#avoid-default-scope'
|
321
342
|
Enabled: false
|
322
343
|
VersionAdded: '2.7'
|
323
344
|
|
@@ -409,6 +430,11 @@ Rails/EnumUniqueness:
|
|
409
430
|
Include:
|
410
431
|
- app/models/**/*.rb
|
411
432
|
|
433
|
+
Rails/EnvLocal:
|
434
|
+
Description: 'Use `Rails.env.local?` instead of `Rails.env.development? || Rails.env.test?`.'
|
435
|
+
Enabled: pending
|
436
|
+
VersionAdded: '2.22'
|
437
|
+
|
412
438
|
Rails/EnvironmentComparison:
|
413
439
|
Description: "Favor `Rails.env.production?` over `Rails.env == 'production'`."
|
414
440
|
Enabled: true
|
@@ -463,10 +489,8 @@ Rails/FindBy:
|
|
463
489
|
StyleGuide: 'https://rails.rubystyle.guide#find_by'
|
464
490
|
Enabled: true
|
465
491
|
VersionAdded: '0.30'
|
466
|
-
VersionChanged: '2.
|
492
|
+
VersionChanged: '2.21'
|
467
493
|
IgnoreWhereFirst: true
|
468
|
-
Include:
|
469
|
-
- app/models/**/*.rb
|
470
494
|
|
471
495
|
Rails/FindById:
|
472
496
|
Description: >-
|
@@ -482,9 +506,7 @@ Rails/FindEach:
|
|
482
506
|
Enabled: true
|
483
507
|
Safe: false
|
484
508
|
VersionAdded: '0.30'
|
485
|
-
VersionChanged: '2.
|
486
|
-
Include:
|
487
|
-
- app/models/**/*.rb
|
509
|
+
VersionChanged: '2.21'
|
488
510
|
AllowedMethods:
|
489
511
|
# Methods that don't work well with `find_each`.
|
490
512
|
- order
|
@@ -547,6 +569,10 @@ Rails/I18nLazyLookup:
|
|
547
569
|
Reference: 'https://guides.rubyonrails.org/i18n.html#lazy-lookup'
|
548
570
|
Enabled: pending
|
549
571
|
VersionAdded: '2.14'
|
572
|
+
EnforcedStyle: lazy
|
573
|
+
SupportedStyles:
|
574
|
+
- lazy
|
575
|
+
- explicit
|
550
576
|
Include:
|
551
577
|
- 'app/controllers/**/*.rb'
|
552
578
|
|
@@ -669,6 +695,9 @@ Rails/NotNullColumn:
|
|
669
695
|
Enabled: true
|
670
696
|
VersionAdded: '0.43'
|
671
697
|
VersionChanged: '2.20'
|
698
|
+
Database: null
|
699
|
+
SupportedDatabases:
|
700
|
+
- mysql
|
672
701
|
Include:
|
673
702
|
- db/**/*.rb
|
674
703
|
|
@@ -775,6 +804,16 @@ Rails/ReadWriteAttribute:
|
|
775
804
|
Include:
|
776
805
|
- app/models/**/*.rb
|
777
806
|
|
807
|
+
Rails/RedundantActiveRecordAllMethod:
|
808
|
+
Description: Detect redundant `all` used as a receiver for Active Record query methods.
|
809
|
+
StyleGuide: 'https://rails.rubystyle.guide/#redundant-all'
|
810
|
+
Enabled: pending
|
811
|
+
Safe: false
|
812
|
+
AllowedReceivers:
|
813
|
+
- ActionMailer::Preview
|
814
|
+
- ActiveSupport::TimeZone
|
815
|
+
VersionAdded: '2.21'
|
816
|
+
|
778
817
|
Rails/RedundantAllowNil:
|
779
818
|
Description: >-
|
780
819
|
Finds redundant use of `allow_nil` when `allow_blank` is set to
|
@@ -955,6 +994,12 @@ Rails/ScopeArgs:
|
|
955
994
|
Include:
|
956
995
|
- app/models/**/*.rb
|
957
996
|
|
997
|
+
Rails/SelectMap:
|
998
|
+
Description: 'Checks for uses of `select(:column_name)` with `map(&:column_name)`.'
|
999
|
+
Enabled: pending
|
1000
|
+
Safe: false
|
1001
|
+
VersionAdded: '2.21'
|
1002
|
+
|
958
1003
|
Rails/ShortI18n:
|
959
1004
|
Description: 'Use the short form of the I18n methods: `t` instead of `translate` and `l` instead of `localize`.'
|
960
1005
|
StyleGuide: 'https://rails.rubystyle.guide/#short-i18n'
|
@@ -1083,6 +1128,7 @@ Rails/TransactionExitStatement:
|
|
1083
1128
|
- https://github.com/rails/rails/commit/15aa4200e083
|
1084
1129
|
Enabled: pending
|
1085
1130
|
VersionAdded: '2.14'
|
1131
|
+
TransactionMethods: []
|
1086
1132
|
|
1087
1133
|
Rails/UniqBeforePluck:
|
1088
1134
|
Description: 'Prefer the use of uniq or distinct before pluck.'
|
@@ -1120,6 +1166,12 @@ Rails/UnusedIgnoredColumns:
|
|
1120
1166
|
Include:
|
1121
1167
|
- app/models/**/*.rb
|
1122
1168
|
|
1169
|
+
Rails/UnusedRenderContent:
|
1170
|
+
Description: 'Do not specify body content for a response with a non-content status code.'
|
1171
|
+
Enabled: pending
|
1172
|
+
Severity: warning
|
1173
|
+
VersionAdded: '2.21'
|
1174
|
+
|
1123
1175
|
Rails/Validation:
|
1124
1176
|
Description: 'Use validates :attribute, hash of validations.'
|
1125
1177
|
Enabled: true
|
@@ -1175,6 +1227,14 @@ Style/FormatStringToken:
|
|
1175
1227
|
AllowedMethods:
|
1176
1228
|
- redirect
|
1177
1229
|
|
1230
|
+
Style/InvertibleUnlessCondition:
|
1231
|
+
InverseMethods:
|
1232
|
+
# Active Support defines some common inverse methods. They are listed below:
|
1233
|
+
:present?: :blank?
|
1234
|
+
:blank?: :present?
|
1235
|
+
:include?: :exclude?
|
1236
|
+
:exclude?: :include?
|
1237
|
+
|
1178
1238
|
Style/SymbolProc:
|
1179
1239
|
AllowedMethods:
|
1180
1240
|
- define_method
|
@@ -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'
|
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
|
@@ -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
|
@@ -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`, or `postgresql`,
|
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
|