rubocop-rails 2.17.4 → 2.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +22 -2
- data/config/default.yml +54 -29
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +1 -1
- data/lib/rubocop/cop/mixin/index_method.rb +3 -3
- data/lib/rubocop/cop/rails/action_controller_flash_before_render.rb +10 -2
- data/lib/rubocop/cop/rails/action_controller_test_case.rb +1 -1
- data/lib/rubocop/cop/rails/action_order.rb +5 -6
- data/lib/rubocop/cop/rails/active_record_aliases.rb +2 -0
- data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +6 -3
- data/lib/rubocop/cop/rails/add_column_index.rb +2 -2
- data/lib/rubocop/cop/rails/application_job.rb +1 -1
- data/lib/rubocop/cop/rails/arel_star.rb +1 -1
- data/lib/rubocop/cop/rails/assert_not.rb +1 -1
- data/lib/rubocop/cop/rails/belongs_to.rb +1 -4
- data/lib/rubocop/cop/rails/blank.rb +5 -5
- data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -4
- data/lib/rubocop/cop/rails/compact_blank.rb +2 -2
- data/lib/rubocop/cop/rails/content_tag.rb +1 -1
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +16 -3
- data/lib/rubocop/cop/rails/delegate.rb +17 -3
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
- data/lib/rubocop/cop/rails/deprecated_active_model_errors_methods.rb +1 -1
- data/lib/rubocop/cop/rails/duration_arithmetic.rb +1 -1
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -1
- data/lib/rubocop/cop/rails/eager_evaluation_log_message.rb +1 -1
- data/lib/rubocop/cop/rails/enum_hash.rb +1 -1
- data/lib/rubocop/cop/rails/environment_comparison.rb +1 -1
- data/lib/rubocop/cop/rails/file_path.rb +31 -15
- data/lib/rubocop/cop/rails/find_by_id.rb +2 -2
- data/lib/rubocop/cop/rails/find_each.rb +6 -2
- data/lib/rubocop/cop/rails/freeze_time.rb +3 -0
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +2 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +18 -2
- data/lib/rubocop/cop/rails/http_status.rb +1 -1
- data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +0 -2
- data/lib/rubocop/cop/rails/inverse_of.rb +0 -3
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +17 -7
- data/lib/rubocop/cop/rails/link_to_blank.rb +1 -1
- data/lib/rubocop/cop/rails/mailer_name.rb +1 -1
- data/lib/rubocop/cop/rails/negate_include.rb +1 -1
- data/lib/rubocop/cop/rails/not_null_column.rb +9 -6
- data/lib/rubocop/cop/rails/output.rb +3 -2
- data/lib/rubocop/cop/rails/output_safety.rb +5 -1
- data/lib/rubocop/cop/rails/pluck.rb +13 -1
- data/lib/rubocop/cop/rails/pluck_id.rb +1 -1
- data/lib/rubocop/cop/rails/presence.rb +3 -3
- data/lib/rubocop/cop/rails/present.rb +5 -5
- data/lib/rubocop/cop/rails/rake_environment.rb +1 -1
- data/lib/rubocop/cop/rails/read_write_attribute.rb +1 -1
- data/lib/rubocop/cop/rails/redundant_allow_nil.rb +3 -3
- data/lib/rubocop/cop/rails/redundant_foreign_key.rb +1 -1
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -1
- data/lib/rubocop/cop/rails/reflection_class_name.rb +17 -1
- data/lib/rubocop/cop/rails/relative_date_constant.rb +2 -2
- data/lib/rubocop/cop/rails/response_parsed_body.rb +57 -0
- data/lib/rubocop/cop/rails/reversible_migration.rb +4 -29
- data/lib/rubocop/cop/rails/root_join_chain.rb +1 -1
- data/lib/rubocop/cop/rails/root_pathname_methods.rb +1 -1
- data/lib/rubocop/cop/rails/safe_navigation.rb +1 -1
- data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +8 -1
- data/lib/rubocop/cop/rails/three_state_boolean_column.rb +71 -0
- data/lib/rubocop/cop/rails/time_zone.rb +2 -2
- data/lib/rubocop/cop/rails/transaction_exit_statement.rb +0 -2
- data/lib/rubocop/cop/rails/unique_validation_without_index.rb +1 -1
- data/lib/rubocop/cop/rails/unused_ignored_columns.rb +6 -1
- data/lib/rubocop/cop/rails/validation.rb +1 -1
- data/lib/rubocop/cop/rails/where_equals.rb +1 -1
- data/lib/rubocop/cop/rails/where_exists.rb +1 -1
- data/lib/rubocop/cop/rails/where_missing.rb +3 -3
- data/lib/rubocop/cop/rails/where_not.rb +1 -1
- data/lib/rubocop/cop/rails/where_not_with_multiple_conditions.rb +2 -2
- data/lib/rubocop/cop/rails_cops.rb +2 -0
- data/lib/rubocop/rails/version.rb +1 -1
- data/lib/rubocop/rails.rb +1 -1
- data/lib/rubocop-rails.rb +1 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 327dd4bed957b6be1d52e47a9087f43abf7f7361ddaf8b0c3b13dbb0bf7bbb52
|
4
|
+
data.tar.gz: cf2c5747f8abab6e65ff8ffc9d31693c42c0515e8751a1d5b0651c12c7ceb93a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4114a576ae595944cd0ec1b673e8f706fa975a643fb9d56e25b5498b7964f5141e2724aeb2dc24c6b63f6d501c7e1a85469a32333be69862e054fdb10874f09c
|
7
|
+
data.tar.gz: c87e88b3de8ea166a68a0be6a08e70e387790b3d705648145a8d769978f1c92e03ea18fe510b1ce5543c6f1fefe59be1f0fd583ba392dd2274b1dde58a21ca61
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -12,7 +12,7 @@ Note: This repository manages rubocop-rails gem (>= 2.0.0). rubocop-rails gem (<
|
|
12
12
|
Just install the `rubocop-rails` gem
|
13
13
|
|
14
14
|
```sh
|
15
|
-
gem install rubocop-rails
|
15
|
+
$ gem install rubocop-rails
|
16
16
|
```
|
17
17
|
|
18
18
|
or if you use bundler put this in your `Gemfile`
|
@@ -48,7 +48,7 @@ cops together with the standard cops.
|
|
48
48
|
### Command line
|
49
49
|
|
50
50
|
```sh
|
51
|
-
rubocop --require rubocop-rails
|
51
|
+
$ rubocop --require rubocop-rails
|
52
52
|
```
|
53
53
|
|
54
54
|
Note: `--rails` option is required while `rubocop` command supports `--rails` option.
|
@@ -61,6 +61,26 @@ RuboCop::RakeTask.new do |task|
|
|
61
61
|
end
|
62
62
|
```
|
63
63
|
|
64
|
+
## Rails configuration tip
|
65
|
+
|
66
|
+
If you are using Rails 6.1 or newer, add the following `config.generators.after_generate` setting to
|
67
|
+
your config/application.rb to apply RuboCop autocorrection to code generated by `bin/rails g`.
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
# config/application.rb
|
71
|
+
module YourCoolApp
|
72
|
+
class Application < Rails::Application
|
73
|
+
config.generators.after_generate do |files|
|
74
|
+
system("bundle exec rubocop -A --fail-level=E #{files.shelljoin}", exception: true)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
```
|
79
|
+
|
80
|
+
It uses `rubocop -A` to apply `Style/FrozenStringLiteralComment` and other unsafe autocorretion cops.
|
81
|
+
`rubocop -A` is unsafe autocorrection, but code generated by default is simple and less likely to
|
82
|
+
be incompatible with `rubocop -A`. If you have problems you can replace it with `rubocop -a` instead.
|
83
|
+
|
64
84
|
## The Cops
|
65
85
|
|
66
86
|
All cops are located under
|
data/config/default.yml
CHANGED
@@ -46,23 +46,6 @@ Lint/NumberConversion:
|
|
46
46
|
- fortnights
|
47
47
|
- in_milliseconds
|
48
48
|
AllowedPatterns: []
|
49
|
-
# Deprecated.
|
50
|
-
IgnoredMethods:
|
51
|
-
- ago
|
52
|
-
- from_now
|
53
|
-
- second
|
54
|
-
- seconds
|
55
|
-
- minute
|
56
|
-
- minutes
|
57
|
-
- hour
|
58
|
-
- hours
|
59
|
-
- day
|
60
|
-
- days
|
61
|
-
- week
|
62
|
-
- weeks
|
63
|
-
- fortnight
|
64
|
-
- fortnights
|
65
|
-
- in_milliseconds
|
66
49
|
|
67
50
|
Rails:
|
68
51
|
Enabled: true
|
@@ -70,8 +53,6 @@ Rails:
|
|
70
53
|
|
71
54
|
Rails/ActionControllerFlashBeforeRender:
|
72
55
|
Description: 'Use `flash.now` instead of `flash` before `render`.'
|
73
|
-
StyleGuide: 'https://rails.rubystyle.guide/#flash-before-render'
|
74
|
-
Reference: 'https://api.rubyonrails.org/classes/ActionController/FlashBeforeRender.html'
|
75
56
|
Enabled: 'pending'
|
76
57
|
SafeAutoCorrect: false
|
77
58
|
VersionAdded: '2.16'
|
@@ -135,7 +116,9 @@ Rails/ActiveRecordOverride:
|
|
135
116
|
Check for overriding Active Record methods instead of using
|
136
117
|
callbacks.
|
137
118
|
Enabled: true
|
119
|
+
Severity: warning
|
138
120
|
VersionAdded: '0.67'
|
121
|
+
VersionChanged: '2.18'
|
139
122
|
Include:
|
140
123
|
- app/models/**/*.rb
|
141
124
|
|
@@ -226,6 +209,9 @@ Rails/BelongsTo:
|
|
226
209
|
Description: >-
|
227
210
|
Use `optional: true` instead of `required: false` for
|
228
211
|
`belongs_to` relations.
|
212
|
+
Reference:
|
213
|
+
- https://guides.rubyonrails.org/5_0_release_notes.html
|
214
|
+
- https://github.com/rails/rails/pull/18937
|
229
215
|
Enabled: true
|
230
216
|
VersionAdded: '0.62'
|
231
217
|
|
@@ -244,6 +230,9 @@ Rails/Blank:
|
|
244
230
|
|
245
231
|
Rails/BulkChangeTable:
|
246
232
|
Description: 'Check whether alter queries are combinable.'
|
233
|
+
Reference:
|
234
|
+
- https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table
|
235
|
+
- https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html
|
247
236
|
Enabled: true
|
248
237
|
VersionAdded: '0.57'
|
249
238
|
Database: null
|
@@ -330,9 +319,10 @@ Rails/DelegateAllowBlank:
|
|
330
319
|
Rails/DeprecatedActiveModelErrorsMethods:
|
331
320
|
Description: 'Avoid manipulating ActiveModel errors hash directly.'
|
332
321
|
Enabled: pending
|
322
|
+
Severity: warning
|
333
323
|
Safe: false
|
334
324
|
VersionAdded: '2.14'
|
335
|
-
VersionChanged: '2.
|
325
|
+
VersionChanged: '2.18'
|
336
326
|
|
337
327
|
Rails/DotSeparatedKeys:
|
338
328
|
Description: 'Enforces the use of dot-separated keys instead of `:scope` options in `I18n` translation methods.'
|
@@ -343,12 +333,16 @@ Rails/DotSeparatedKeys:
|
|
343
333
|
Rails/DuplicateAssociation:
|
344
334
|
Description: "Don't repeat associations in a model."
|
345
335
|
Enabled: pending
|
336
|
+
Severity: warning
|
346
337
|
VersionAdded: '2.14'
|
338
|
+
VersionChanged: '2.18'
|
347
339
|
|
348
340
|
Rails/DuplicateScope:
|
349
341
|
Description: 'Multiple scopes share this same where clause.'
|
350
342
|
Enabled: pending
|
343
|
+
Severity: warning
|
351
344
|
VersionAdded: '2.14'
|
345
|
+
VersionChanged: '2.18'
|
352
346
|
|
353
347
|
Rails/DurationArithmetic:
|
354
348
|
Description: 'Do not use duration as arithmetic operand with `Time.current`.'
|
@@ -463,11 +457,12 @@ Rails/FindById:
|
|
463
457
|
VersionAdded: '2.7'
|
464
458
|
|
465
459
|
Rails/FindEach:
|
466
|
-
Description: 'Prefer all.find_each over all.
|
460
|
+
Description: 'Prefer all.find_each over all.each.'
|
467
461
|
StyleGuide: 'https://rails.rubystyle.guide#find-each'
|
468
462
|
Enabled: true
|
463
|
+
Safe: false
|
469
464
|
VersionAdded: '0.30'
|
470
|
-
VersionChanged: '2.
|
465
|
+
VersionChanged: '2.19'
|
471
466
|
Include:
|
472
467
|
- app/models/**/*.rb
|
473
468
|
AllowedMethods:
|
@@ -477,13 +472,6 @@ Rails/FindEach:
|
|
477
472
|
- select
|
478
473
|
- lock
|
479
474
|
AllowedPatterns: []
|
480
|
-
# Deprecated.
|
481
|
-
IgnoredMethods:
|
482
|
-
# Methods that don't work well with `find_each`.
|
483
|
-
- order
|
484
|
-
- limit
|
485
|
-
- select
|
486
|
-
- lock
|
487
475
|
|
488
476
|
Rails/FreezeTime:
|
489
477
|
Description: 'Prefer `freeze_time` over `travel_to` with an argument of the current time.'
|
@@ -592,6 +580,9 @@ Rails/Inquiry:
|
|
592
580
|
|
593
581
|
Rails/InverseOf:
|
594
582
|
Description: 'Checks for associations where the inverse cannot be determined automatically.'
|
583
|
+
Reference:
|
584
|
+
- https://guides.rubyonrails.org/association_basics.html#bi-directional-associations
|
585
|
+
- https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Setting+Inverses
|
595
586
|
Enabled: true
|
596
587
|
VersionAdded: '0.52'
|
597
588
|
IgnoreScopes: false
|
@@ -695,7 +686,9 @@ Rails/Pluck:
|
|
695
686
|
Description: 'Prefer `pluck` over `map { ... }`.'
|
696
687
|
StyleGuide: 'https://rails.rubystyle.guide#pluck'
|
697
688
|
Enabled: 'pending'
|
689
|
+
Safe: false
|
698
690
|
VersionAdded: '2.7'
|
691
|
+
VersionChanged: '2.18'
|
699
692
|
|
700
693
|
Rails/PluckId:
|
701
694
|
Description: 'Use `ids` instead of `pluck(:id)` or `pluck(primary_key)`.'
|
@@ -847,6 +840,18 @@ Rails/RequireDependency:
|
|
847
840
|
Enabled: false
|
848
841
|
VersionAdded: '2.10'
|
849
842
|
|
843
|
+
Rails/ResponseParsedBody:
|
844
|
+
Description: Prefer `response.parsed_body` to `JSON.parse(response.body)`.
|
845
|
+
Enabled: pending
|
846
|
+
Safe: false
|
847
|
+
VersionAdded: '2.18'
|
848
|
+
VersionChanged: '2.19'
|
849
|
+
Include:
|
850
|
+
- spec/controllers/**/*.rb
|
851
|
+
- spec/requests/**/*.rb
|
852
|
+
- test/controllers/**/*.rb
|
853
|
+
- test/integration/**/*.rb
|
854
|
+
|
850
855
|
Rails/ReversibleMigration:
|
851
856
|
Description: 'Checks whether the change method of the migration file is reversible.'
|
852
857
|
StyleGuide: 'https://rails.rubystyle.guide#reversible-migration'
|
@@ -992,6 +997,14 @@ Rails/TableNameAssignment:
|
|
992
997
|
Include:
|
993
998
|
- app/models/**/*.rb
|
994
999
|
|
1000
|
+
Rails/ThreeStateBooleanColumn:
|
1001
|
+
Description: 'Add a default value and a `NOT NULL` constraint to boolean columns.'
|
1002
|
+
StyleGuide: 'https://rails.rubystyle.guide/#three-state-boolean'
|
1003
|
+
Enabled: pending
|
1004
|
+
VersionAdded: '2.19'
|
1005
|
+
Include:
|
1006
|
+
- db/**/*.rb
|
1007
|
+
|
995
1008
|
Rails/TimeZone:
|
996
1009
|
Description: 'Checks the correct usage of time zone aware methods.'
|
997
1010
|
StyleGuide: 'https://rails.rubystyle.guide#time'
|
@@ -1038,10 +1051,14 @@ Rails/TopLevelHashWithIndifferentAccess:
|
|
1038
1051
|
Description: 'Identifies top-level `HashWithIndifferentAccess`.'
|
1039
1052
|
Reference: 'https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#top-level-hashwithindifferentaccess-is-soft-deprecated'
|
1040
1053
|
Enabled: pending
|
1054
|
+
Severity: warning
|
1041
1055
|
VersionAdded: '2.16'
|
1056
|
+
VersionChanged: '2.18'
|
1042
1057
|
|
1043
1058
|
Rails/TransactionExitStatement:
|
1044
1059
|
Description: 'Avoid the usage of `return`, `break` and `throw` in transaction blocks.'
|
1060
|
+
Reference:
|
1061
|
+
- https://github.com/rails/rails/commit/15aa4200e083
|
1045
1062
|
Enabled: pending
|
1046
1063
|
VersionAdded: '2.14'
|
1047
1064
|
|
@@ -1066,7 +1083,9 @@ Rails/UniqueValidationWithoutIndex:
|
|
1066
1083
|
Rails/UnknownEnv:
|
1067
1084
|
Description: 'Use correct environment name.'
|
1068
1085
|
Enabled: true
|
1086
|
+
Severity: warning
|
1069
1087
|
VersionAdded: '0.51'
|
1088
|
+
VersionChanged: '2.18'
|
1070
1089
|
Environments:
|
1071
1090
|
- development
|
1072
1091
|
- test
|
@@ -1121,12 +1140,18 @@ Rails/WhereNot:
|
|
1121
1140
|
Rails/WhereNotWithMultipleConditions:
|
1122
1141
|
Description: 'Do not use `where.not(...)` with multiple conditions.'
|
1123
1142
|
Enabled: 'pending'
|
1143
|
+
Severity: warning
|
1124
1144
|
VersionAdded: '2.17'
|
1145
|
+
VersionChanged: '2.18'
|
1125
1146
|
|
1126
1147
|
# Accept `redirect_to(...) and return` and similar cases.
|
1127
1148
|
Style/AndOr:
|
1128
1149
|
EnforcedStyle: conditionals
|
1129
1150
|
|
1151
|
+
Style/FormatStringToken:
|
1152
|
+
AllowedMethods:
|
1153
|
+
- redirect
|
1154
|
+
|
1130
1155
|
Style/SymbolProc:
|
1131
1156
|
AllowedMethods:
|
1132
1157
|
- define_method
|
@@ -138,7 +138,7 @@ module RuboCop
|
|
138
138
|
end
|
139
139
|
|
140
140
|
def strip_prefix_and_suffix(node, corrector)
|
141
|
-
expression = node.
|
141
|
+
expression = node.source_range
|
142
142
|
corrector.remove_leading(expression, leading)
|
143
143
|
corrector.remove_trailing(expression, trailing)
|
144
144
|
end
|
@@ -153,11 +153,11 @@ module RuboCop
|
|
153
153
|
end
|
154
154
|
|
155
155
|
def set_new_arg_name(transformed_argname, corrector)
|
156
|
-
corrector.replace(block_node.arguments
|
156
|
+
corrector.replace(block_node.arguments, "|#{transformed_argname}|")
|
157
157
|
end
|
158
158
|
|
159
159
|
def set_new_body_expression(transforming_body_expr, corrector)
|
160
|
-
corrector.replace(block_node.body
|
160
|
+
corrector.replace(block_node.body, transforming_body_expr.source)
|
161
161
|
end
|
162
162
|
end
|
163
163
|
end
|
@@ -67,9 +67,11 @@ module RuboCop
|
|
67
67
|
private
|
68
68
|
|
69
69
|
def followed_by_render?(flash_node)
|
70
|
-
|
71
|
-
context =
|
70
|
+
flash_assignment_node = find_ancestor(flash_node, type: :send)
|
71
|
+
context = flash_assignment_node
|
72
72
|
if (node = context.each_ancestor(:if, :rescue).first)
|
73
|
+
return false if use_redirect_to?(context)
|
74
|
+
|
73
75
|
context = node
|
74
76
|
elsif context.right_siblings.empty?
|
75
77
|
return true
|
@@ -95,6 +97,12 @@ module RuboCop
|
|
95
97
|
def_node || block_node
|
96
98
|
end
|
97
99
|
|
100
|
+
def use_redirect_to?(context)
|
101
|
+
context.right_siblings.compact.any? do |sibling|
|
102
|
+
sibling.send_type? && sibling.method?(:redirect_to)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
98
106
|
def find_ancestor(node, type:)
|
99
107
|
node.each_ancestor(type).first
|
100
108
|
end
|
@@ -92,12 +92,11 @@ module RuboCop
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def range_with_comments(node)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
].map
|
99
|
-
|
100
|
-
end
|
95
|
+
# rubocop:todo InternalAffairs/LocationExpression
|
96
|
+
# Using `RuboCop::Ext::Comment#source_range` requires RuboCop > 1.46,
|
97
|
+
# which introduces https://github.com/rubocop/rubocop/pull/11630.
|
98
|
+
ranges = [node, *processed_source.ast_with_comments[node]].map { |comment| comment.loc.expression }
|
99
|
+
# rubocop:enable InternalAffairs/LocationExpression
|
101
100
|
ranges.reduce do |result, range|
|
102
101
|
add_range(result, range)
|
103
102
|
end
|
@@ -104,7 +104,7 @@ module RuboCop
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def end_position_for(node)
|
107
|
-
end_line = buffer.line_for_position(node.
|
107
|
+
end_line = buffer.line_for_position(node.source_range.end_pos)
|
108
108
|
buffer.line_range(end_line).end_pos
|
109
109
|
end
|
110
110
|
|
@@ -112,8 +112,7 @@ module RuboCop
|
|
112
112
|
annotation_line = node.first_line - 1
|
113
113
|
first_comment = nil
|
114
114
|
|
115
|
-
processed_source.
|
116
|
-
.reverse_each do |comment|
|
115
|
+
processed_source.each_comment_in_lines(0..annotation_line).reverse_each do |comment|
|
117
116
|
if comment.location.line == annotation_line && !inline_comment?(comment)
|
118
117
|
first_comment = comment
|
119
118
|
annotation_line -= 1
|
@@ -124,7 +123,11 @@ module RuboCop
|
|
124
123
|
end
|
125
124
|
|
126
125
|
def inline_comment?(comment)
|
126
|
+
# rubocop:todo InternalAffairs/LocationExpression
|
127
|
+
# Using `RuboCop::Ext::Comment#source_range` requires RuboCop > 1.46,
|
128
|
+
# which introduces https://github.com/rubocop/rubocop/pull/11630.
|
127
129
|
!comment_line?(comment.loc.expression.source_line)
|
130
|
+
# rubocop:enable InternalAffairs/LocationExpression
|
128
131
|
end
|
129
132
|
|
130
133
|
def start_line_position(node)
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
add_index_opts = ''
|
43
43
|
|
44
44
|
if value.hash_type?
|
45
|
-
hash = value.
|
45
|
+
hash = value.source_range.adjust(begin_pos: 1, end_pos: -1).source.strip
|
46
46
|
add_index_opts = ", #{hash}"
|
47
47
|
end
|
48
48
|
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
private
|
54
54
|
|
55
55
|
def index_range(pair_node)
|
56
|
-
range_with_surrounding_comma(range_with_surrounding_space(pair_node.
|
56
|
+
range_with_surrounding_comma(range_with_surrounding_space(pair_node.source_range, side: :left), :left)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
@@ -47,9 +47,6 @@ module RuboCop
|
|
47
47
|
# class Post < ApplicationRecord
|
48
48
|
# belongs_to :blog, optional: false
|
49
49
|
# end
|
50
|
-
#
|
51
|
-
# @see https://guides.rubyonrails.org/5_0_release_notes.html
|
52
|
-
# @see https://github.com/rails/rails/pull/18937
|
53
50
|
class BelongsTo < Base
|
54
51
|
extend AutoCorrector
|
55
52
|
extend TargetRailsVersion
|
@@ -83,7 +80,7 @@ module RuboCop
|
|
83
80
|
end
|
84
81
|
|
85
82
|
add_offense(node.loc.selector, message: message) do |corrector|
|
86
|
-
corrector.replace(option_node
|
83
|
+
corrector.replace(option_node, replacement)
|
87
84
|
end
|
88
85
|
end
|
89
86
|
end
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# Interaction with `Style/UnlessElse`:
|
10
10
|
# The configuration of `NotPresent` will not produce an offense in the
|
11
|
-
# context of `unless else` if `Style/UnlessElse` is
|
11
|
+
# context of `unless else` if `Style/UnlessElse` is enabled. This is
|
12
12
|
# to prevent interference between the autocorrection of the two cops.
|
13
13
|
#
|
14
14
|
# @safety
|
@@ -142,10 +142,10 @@ module RuboCop
|
|
142
142
|
|
143
143
|
if method_call
|
144
144
|
corrector.replace(node.loc.keyword, 'if')
|
145
|
-
range = method_call.
|
145
|
+
range = method_call.source_range
|
146
146
|
else
|
147
147
|
variable1, _variable2 = nil_or_empty?(node) || not_present?(node)
|
148
|
-
range = node.
|
148
|
+
range = node.source_range
|
149
149
|
end
|
150
150
|
|
151
151
|
corrector.replace(range, replacement(variable1))
|
@@ -153,9 +153,9 @@ module RuboCop
|
|
153
153
|
|
154
154
|
def unless_condition(node, method_call)
|
155
155
|
if node.modifier_form?
|
156
|
-
node.loc.keyword.join(node.
|
156
|
+
node.loc.keyword.join(node.source_range.end)
|
157
157
|
else
|
158
|
-
node.
|
158
|
+
node.source_range.begin.join(method_call.source_range)
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
@@ -62,9 +62,6 @@ module RuboCop
|
|
62
62
|
# t.string :nickname
|
63
63
|
# end
|
64
64
|
# end
|
65
|
-
#
|
66
|
-
# @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table
|
67
|
-
# @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html
|
68
65
|
class BulkChangeTable < Base
|
69
66
|
MSG_FOR_CHANGE_TABLE = <<~MSG.chomp
|
70
67
|
You can combine alter queries using `bulk: true` options.
|
@@ -216,7 +213,7 @@ module RuboCop
|
|
216
213
|
true
|
217
214
|
when POSTGRESQL
|
218
215
|
# Add bulk alter support for PostgreSQL in 5.2.0
|
219
|
-
#
|
216
|
+
# See: https://github.com/rails/rails/pull/31331
|
220
217
|
target_rails_version >= 5.2
|
221
218
|
else
|
222
219
|
false
|
@@ -94,9 +94,9 @@ module RuboCop
|
|
94
94
|
|
95
95
|
def offense_range(node)
|
96
96
|
end_pos = if node.parent&.block_type? && node.parent&.send_node == node
|
97
|
-
node.parent.
|
97
|
+
node.parent.source_range.end_pos
|
98
98
|
else
|
99
|
-
node.
|
99
|
+
node.source_range.end_pos
|
100
100
|
end
|
101
101
|
|
102
102
|
range_between(node.loc.selector.begin_pos, end_pos)
|
@@ -3,10 +3,12 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Rails
|
6
|
-
# Checks the migration for which timestamps are not included
|
7
|
-
# when creating a new table.
|
6
|
+
# Checks the migration for which timestamps are not included when creating a new table.
|
8
7
|
# In many cases, timestamps are useful information and should be added.
|
9
8
|
#
|
9
|
+
# NOTE: Allow `timestamps` not written when `id: false` because this emphasizes respecting
|
10
|
+
# user's editing intentions.
|
11
|
+
#
|
10
12
|
# @example
|
11
13
|
# # bad
|
12
14
|
# create_table :users
|
@@ -40,12 +42,23 @@ module RuboCop
|
|
40
42
|
#
|
41
43
|
# t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP' }
|
42
44
|
# end
|
45
|
+
#
|
46
|
+
# # good
|
47
|
+
# create_table :users, articles, id: false do |t|
|
48
|
+
# t.integer :user_id
|
49
|
+
# t.integer :article_id
|
50
|
+
# end
|
51
|
+
#
|
43
52
|
class CreateTableWithTimestamps < Base
|
44
53
|
include ActiveRecordMigrationsHelper
|
45
54
|
|
46
55
|
MSG = 'Add timestamps when creating a new table.'
|
47
56
|
RESTRICT_ON_SEND = %i[create_table].freeze
|
48
57
|
|
58
|
+
def_node_search :use_id_false_option?, <<~PATTERN
|
59
|
+
(pair (sym :id) (false))
|
60
|
+
PATTERN
|
61
|
+
|
49
62
|
def_node_matcher :create_table_with_timestamps_proc?, <<~PATTERN
|
50
63
|
(send nil? :create_table (sym _) ... (block-pass (sym :timestamps)))
|
51
64
|
PATTERN
|
@@ -61,7 +74,7 @@ module RuboCop
|
|
61
74
|
PATTERN
|
62
75
|
|
63
76
|
def on_send(node)
|
64
|
-
return
|
77
|
+
return if !node.command?(:create_table) || use_id_false_option?(node)
|
65
78
|
|
66
79
|
parent = node.parent
|
67
80
|
|
@@ -24,6 +24,14 @@ module RuboCop
|
|
24
24
|
# # good
|
25
25
|
# delegate :bar, to: :foo
|
26
26
|
#
|
27
|
+
# # bad
|
28
|
+
# def bar
|
29
|
+
# self.bar
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# delegate :bar, to: :self
|
34
|
+
#
|
27
35
|
# # good
|
28
36
|
# def bar
|
29
37
|
# foo&.bar
|
@@ -60,7 +68,7 @@ module RuboCop
|
|
60
68
|
|
61
69
|
def_node_matcher :delegate?, <<~PATTERN
|
62
70
|
(def _method_name _args
|
63
|
-
(send (send nil? _) _ ...))
|
71
|
+
(send {(send nil? _) (self)} _ ...))
|
64
72
|
PATTERN
|
65
73
|
|
66
74
|
def on_def(node)
|
@@ -74,10 +82,14 @@ module RuboCop
|
|
74
82
|
|
75
83
|
def register_offense(node)
|
76
84
|
add_offense(node.loc.keyword) do |corrector|
|
77
|
-
|
85
|
+
body = node.body
|
86
|
+
|
87
|
+
receiver = body.receiver.self_type? ? 'self' : ":#{body.receiver.method_name}"
|
88
|
+
|
89
|
+
delegation = ["delegate :#{body.method_name}", "to: #{receiver}"]
|
78
90
|
delegation << ['prefix: true'] if node.method?(prefixed_method_name(node.body))
|
79
91
|
|
80
|
-
corrector.replace(node
|
92
|
+
corrector.replace(node, delegation.join(', '))
|
81
93
|
end
|
82
94
|
end
|
83
95
|
|
@@ -106,6 +118,8 @@ module RuboCop
|
|
106
118
|
end
|
107
119
|
|
108
120
|
def prefixed_method_name(body)
|
121
|
+
return '' if body.receiver.self_type?
|
122
|
+
|
109
123
|
[body.receiver.method_name, body.method_name].join('_').to_sym
|
110
124
|
end
|
111
125
|
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
27
27
|
return unless (offending_node = allow_blank_option(node))
|
28
28
|
|
29
29
|
add_offense(offending_node) do |corrector|
|
30
|
-
corrector.replace(offending_node.key
|
30
|
+
corrector.replace(offending_node.key, 'allow_nil')
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|