rubocop-rails 2.17.4 → 2.19.0
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.
- 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
|