rubocop-rails 2.15.2 → 2.20.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +23 -2
  4. data/config/default.yml +181 -13
  5. data/config/obsoletion.yml +10 -0
  6. data/lib/rubocop/cop/mixin/active_record_helper.rb +3 -6
  7. data/lib/rubocop/cop/mixin/active_record_migrations_helper.rb +1 -3
  8. data/lib/rubocop/cop/mixin/enforce_superclass.rb +1 -1
  9. data/lib/rubocop/cop/mixin/index_method.rb +7 -17
  10. data/lib/rubocop/cop/mixin/migrations_helper.rb +1 -1
  11. data/lib/rubocop/cop/rails/action_controller_flash_before_render.rb +112 -0
  12. data/lib/rubocop/cop/rails/action_controller_test_case.rb +2 -2
  13. data/lib/rubocop/cop/rails/action_filter.rb +1 -1
  14. data/lib/rubocop/cop/rails/action_order.rb +116 -0
  15. data/lib/rubocop/cop/rails/active_record_aliases.rb +3 -4
  16. data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +6 -3
  17. data/lib/rubocop/cop/rails/active_record_override.rb +2 -5
  18. data/lib/rubocop/cop/rails/active_support_on_load.rb +70 -0
  19. data/lib/rubocop/cop/rails/add_column_index.rb +2 -5
  20. data/lib/rubocop/cop/rails/application_controller.rb +1 -1
  21. data/lib/rubocop/cop/rails/application_job.rb +2 -2
  22. data/lib/rubocop/cop/rails/application_mailer.rb +1 -1
  23. data/lib/rubocop/cop/rails/application_record.rb +1 -1
  24. data/lib/rubocop/cop/rails/arel_star.rb +1 -1
  25. data/lib/rubocop/cop/rails/assert_not.rb +1 -2
  26. data/lib/rubocop/cop/rails/belongs_to.rb +1 -4
  27. data/lib/rubocop/cop/rails/blank.rb +6 -7
  28. data/lib/rubocop/cop/rails/bulk_change_table.rb +7 -24
  29. data/lib/rubocop/cop/rails/compact_blank.rb +5 -1
  30. data/lib/rubocop/cop/rails/content_tag.rb +5 -6
  31. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +16 -3
  32. data/lib/rubocop/cop/rails/date.rb +15 -11
  33. data/lib/rubocop/cop/rails/delegate.rb +19 -8
  34. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
  35. data/lib/rubocop/cop/rails/deprecated_active_model_errors_methods.rb +18 -14
  36. data/lib/rubocop/cop/rails/dot_separated_keys.rb +2 -2
  37. data/lib/rubocop/cop/rails/duration_arithmetic.rb +3 -3
  38. data/lib/rubocop/cop/rails/dynamic_find_by.rb +25 -13
  39. data/lib/rubocop/cop/rails/eager_evaluation_log_message.rb +5 -1
  40. data/lib/rubocop/cop/rails/enum_hash.rb +1 -1
  41. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -5
  42. data/lib/rubocop/cop/rails/environment_comparison.rb +2 -3
  43. data/lib/rubocop/cop/rails/file_path.rb +154 -27
  44. data/lib/rubocop/cop/rails/find_by_id.rb +2 -2
  45. data/lib/rubocop/cop/rails/find_each.rb +15 -5
  46. data/lib/rubocop/cop/rails/freeze_time.rb +79 -0
  47. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +4 -6
  48. data/lib/rubocop/cop/rails/helper_instance_variable.rb +1 -1
  49. data/lib/rubocop/cop/rails/http_positional_arguments.rb +22 -11
  50. data/lib/rubocop/cop/rails/http_status.rb +6 -11
  51. data/lib/rubocop/cop/rails/i18n_lazy_lookup.rb +2 -0
  52. data/lib/rubocop/cop/rails/i18n_locale_texts.rb +7 -3
  53. data/lib/rubocop/cop/rails/ignored_columns_assignment.rb +50 -0
  54. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +23 -12
  55. data/lib/rubocop/cop/rails/index_by.rb +1 -1
  56. data/lib/rubocop/cop/rails/index_with.rb +1 -1
  57. data/lib/rubocop/cop/rails/inverse_of.rb +3 -9
  58. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +21 -15
  59. data/lib/rubocop/cop/rails/link_to_blank.rb +1 -4
  60. data/lib/rubocop/cop/rails/mailer_name.rb +4 -4
  61. data/lib/rubocop/cop/rails/migration_class_name.rb +1 -1
  62. data/lib/rubocop/cop/rails/negate_include.rb +1 -1
  63. data/lib/rubocop/cop/rails/not_null_column.rb +9 -6
  64. data/lib/rubocop/cop/rails/output.rb +6 -8
  65. data/lib/rubocop/cop/rails/output_safety.rb +5 -1
  66. data/lib/rubocop/cop/rails/pluck.rb +44 -12
  67. data/lib/rubocop/cop/rails/pluck_id.rb +1 -1
  68. data/lib/rubocop/cop/rails/pluralization_grammar.rb +1 -2
  69. data/lib/rubocop/cop/rails/presence.rb +21 -12
  70. data/lib/rubocop/cop/rails/present.rb +8 -11
  71. data/lib/rubocop/cop/rails/rake_environment.rb +2 -2
  72. data/lib/rubocop/cop/rails/read_write_attribute.rb +1 -1
  73. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +5 -7
  74. data/lib/rubocop/cop/rails/redundant_foreign_key.rb +2 -2
  75. data/lib/rubocop/cop/rails/redundant_presence_validation_on_belongs_to.rb +3 -3
  76. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +30 -26
  77. data/lib/rubocop/cop/rails/reflection_class_name.rb +34 -1
  78. data/lib/rubocop/cop/rails/refute_methods.rb +1 -6
  79. data/lib/rubocop/cop/rails/relative_date_constant.rb +4 -7
  80. data/lib/rubocop/cop/rails/request_referer.rb +1 -2
  81. data/lib/rubocop/cop/rails/require_dependency.rb +1 -1
  82. data/lib/rubocop/cop/rails/response_parsed_body.rb +57 -0
  83. data/lib/rubocop/cop/rails/reversible_migration.rb +14 -62
  84. data/lib/rubocop/cop/rails/reversible_migration_method_definition.rb +1 -2
  85. data/lib/rubocop/cop/rails/root_join_chain.rb +1 -1
  86. data/lib/rubocop/cop/rails/root_pathname_methods.rb +238 -0
  87. data/lib/rubocop/cop/rails/safe_navigation.rb +1 -1
  88. data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +1 -3
  89. data/lib/rubocop/cop/rails/save_bang.rb +10 -22
  90. data/lib/rubocop/cop/rails/short_i18n.rb +2 -5
  91. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -3
  92. data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +9 -7
  93. data/lib/rubocop/cop/rails/three_state_boolean_column.rb +71 -0
  94. data/lib/rubocop/cop/rails/time_zone.rb +27 -25
  95. data/lib/rubocop/cop/rails/time_zone_assignment.rb +1 -1
  96. data/lib/rubocop/cop/rails/to_s_with_argument.rb +78 -0
  97. data/lib/rubocop/cop/rails/top_level_hash_with_indifferent_access.rb +49 -0
  98. data/lib/rubocop/cop/rails/transaction_exit_statement.rb +8 -3
  99. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +3 -6
  100. data/lib/rubocop/cop/rails/unique_validation_without_index.rb +22 -19
  101. data/lib/rubocop/cop/rails/unknown_env.rb +2 -4
  102. data/lib/rubocop/cop/rails/unused_ignored_columns.rb +6 -1
  103. data/lib/rubocop/cop/rails/validation.rb +4 -12
  104. data/lib/rubocop/cop/rails/where_equals.rb +1 -1
  105. data/lib/rubocop/cop/rails/where_exists.rb +1 -1
  106. data/lib/rubocop/cop/rails/where_missing.rb +118 -0
  107. data/lib/rubocop/cop/rails/where_not.rb +1 -1
  108. data/lib/rubocop/cop/rails/where_not_with_multiple_conditions.rb +55 -0
  109. data/lib/rubocop/cop/rails_cops.rb +12 -0
  110. data/lib/rubocop/rails/schema_loader/schema.rb +4 -4
  111. data/lib/rubocop/rails/version.rb +1 -1
  112. data/lib/rubocop/rails.rb +1 -1
  113. data/lib/rubocop-rails.rb +11 -0
  114. metadata +19 -9
  115. data/bin/console +0 -11
  116. data/bin/setup +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 169ed04b1f5378e9e08fbffdca151afaf4b84fd54b1867a173740aadaede60b3
4
- data.tar.gz: 1a2ac75c313cfcdeec1814d7e3aff4777c5013527d2cf4a2aa4f95aeb45446bf
3
+ metadata.gz: 227ce5b698e456412c24917c5644b2a938531440ab8c64e2b5036d6f2857a548
4
+ data.tar.gz: 41c6157da73215cca0b5d56ffa254711c2f9f4f5399c8aa3d85ac7c719958b28
5
5
  SHA512:
6
- metadata.gz: 51d495edd3e825db49ece8f51bfc118c73887681f414b86d31cd47d85dc5a1a22a385a2a17ed4ebf7d1c6332989795e2cde999a364d911c60f452993dc926c4b
7
- data.tar.gz: 4546785b39af93e6c7fe5a6a3b637fa5c21d4b358c38ea8ad3ebd5c272d1d0a504e8206e8201cfe3771af9199c336649d033e32b324f16b06fc7d150054dc488
6
+ metadata.gz: afafd2f9293f4592cc914fdb42c6742900681574d5d0a27dc2031eddb3446b419ac04a77a149e0169ab89a0bb7afe4e0481b3ff889631345a0227b0d24a2c185
7
+ data.tar.gz: a90108eed94c1cedbe1b9a059b60cae51465cffd5a8612f56a0548182b6f992e3e626125e4a4f2f74ceda491a91cdcacb0bd8206ebf94d7d245841572639b556
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-22 Bozhidar Batsov
1
+ Copyright (c) 2012-23 Bozhidar Batsov
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
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,27 @@ 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
+ parsable_files = files.filter { |file| file.end_with?('.rb') }
75
+ system("bundle exec rubocop -A --fail-level=E #{parsable_files.shelljoin}", exception: true)
76
+ end
77
+ end
78
+ end
79
+ ```
80
+
81
+ It uses `rubocop -A` to apply `Style/FrozenStringLiteralComment` and other unsafe autocorretion cops.
82
+ `rubocop -A` is unsafe autocorrection, but code generated by default is simple and less likely to
83
+ be incompatible with `rubocop -A`. If you have problems you can replace it with `rubocop -a` instead.
84
+
64
85
  ## The Cops
65
86
 
66
87
  All cops are located under
data/config/default.yml CHANGED
@@ -6,10 +6,17 @@ inherit_mode:
6
6
 
7
7
  AllCops:
8
8
  Exclude:
9
+ - app/assets/**/*
9
10
  - bin/*
10
11
  # Exclude db/schema.rb and db/[CONFIGURATION_NAMESPACE]_schema.rb by default.
11
12
  # See: https://guides.rubyonrails.org/active_record_multiple_databases.html#setting-up-your-application
12
13
  - db/*schema.rb
14
+ - log/**/*
15
+ - public/**/*
16
+ - storage/**/*
17
+ # Enable checking Active Support extensions.
18
+ # See: https://docs.rubocop.org/rubocop/configuration.html#enable-checking-active-support-extensions
19
+ ActiveSupportExtensionsEnabled: true
13
20
  # What version of Rails is the inspected code using? If a value is specified
14
21
  # for TargetRailsVersion then it is used. Acceptable values are specified
15
22
  # as a float (i.e. 5.1); the patch version of Rails should not be included.
@@ -23,7 +30,7 @@ Lint/NumberConversion:
23
30
  # Add Rails' duration methods to the ignore list for `Lint/NumberConversion`
24
31
  # so that calling `to_i` on one of these does not register an offense.
25
32
  # See: https://github.com/rubocop/rubocop/issues/8950
26
- IgnoredMethods:
33
+ AllowedMethods:
27
34
  - ago
28
35
  - from_now
29
36
  - second
@@ -39,13 +46,37 @@ Lint/NumberConversion:
39
46
  - fortnight
40
47
  - fortnights
41
48
  - in_milliseconds
49
+ AllowedPatterns: []
50
+
51
+ Lint/RedundantSafeNavigation:
52
+ # Add `presence` and `present?` methods to the default of the RuboCop core.
53
+ # https://github.com/rubocop/rubocop/blob/v1.51.0/config/default.yml#L2148-L2159
54
+ AllowedMethods:
55
+ - instance_of?
56
+ - kind_of?
57
+ - is_a?
58
+ - eql?
59
+ - respond_to?
60
+ - equal?
61
+ - presence
62
+ - present?
63
+
64
+ Rails:
65
+ Enabled: true
66
+ DocumentationBaseURL: https://docs.rubocop.org/rubocop-rails
67
+
68
+ Rails/ActionControllerFlashBeforeRender:
69
+ Description: 'Use `flash.now` instead of `flash` before `render`.'
70
+ Enabled: 'pending'
71
+ SafeAutoCorrect: false
72
+ VersionAdded: '2.16'
42
73
 
43
74
  Rails/ActionControllerTestCase:
44
75
  Description: 'Use `ActionDispatch::IntegrationTest` instead of `ActionController::TestCase`.'
45
76
  StyleGuide: 'https://rails.rubystyle.guide/#integration-testing'
46
77
  Reference: 'https://api.rubyonrails.org/classes/ActionController/TestCase.html'
47
78
  Enabled: 'pending'
48
- SafeAutocorrect: false
79
+ SafeAutoCorrect: false
49
80
  VersionAdded: '2.14'
50
81
  Include:
51
82
  - '**/test/**/*.rb'
@@ -62,6 +93,21 @@ Rails/ActionFilter:
62
93
  - app/controllers/**/*.rb
63
94
  - app/mailers/**/*.rb
64
95
 
96
+ Rails/ActionOrder:
97
+ Description: 'Enforce consistent ordering of controller actions.'
98
+ Enabled: pending
99
+ VersionAdded: '2.17'
100
+ ExpectedOrder:
101
+ - index
102
+ - show
103
+ - new
104
+ - edit
105
+ - create
106
+ - update
107
+ - destroy
108
+ Include:
109
+ - app/controllers/**/*.rb
110
+
65
111
  Rails/ActiveRecordAliases:
66
112
  Description: >-
67
113
  Avoid Active Record aliases:
@@ -84,7 +130,9 @@ Rails/ActiveRecordOverride:
84
130
  Check for overriding Active Record methods instead of using
85
131
  callbacks.
86
132
  Enabled: true
133
+ Severity: warning
87
134
  VersionAdded: '0.67'
135
+ VersionChanged: '2.18'
88
136
  Include:
89
137
  - app/models/**/*.rb
90
138
 
@@ -96,6 +144,15 @@ Rails/ActiveSupportAliases:
96
144
  Enabled: true
97
145
  VersionAdded: '0.48'
98
146
 
147
+ Rails/ActiveSupportOnLoad:
148
+ Description: 'Use `ActiveSupport.on_load(...)` to patch Rails framework classes.'
149
+ Enabled: 'pending'
150
+ Reference:
151
+ - 'https://api.rubyonrails.org/classes/ActiveSupport/LazyLoadHooks.html'
152
+ - 'https://guides.rubyonrails.org/engines.html#available-load-hooks'
153
+ SafeAutoCorrect: false
154
+ VersionAdded: '2.16'
155
+
99
156
  Rails/AddColumnIndex:
100
157
  Description: >-
101
158
  Rails migrations don't make use of a given `index` key, but also
@@ -103,8 +160,9 @@ Rails/AddColumnIndex:
103
160
  index might be used.
104
161
  Enabled: pending
105
162
  VersionAdded: '2.11'
163
+ VersionChanged: '2.20'
106
164
  Include:
107
- - db/migrate/*.rb
165
+ - db/**/*.rb
108
166
 
109
167
  Rails/AfterCommitOverride:
110
168
  Description: >-
@@ -166,6 +224,9 @@ Rails/BelongsTo:
166
224
  Description: >-
167
225
  Use `optional: true` instead of `required: false` for
168
226
  `belongs_to` relations.
227
+ Reference:
228
+ - https://guides.rubyonrails.org/5_0_release_notes.html
229
+ - https://github.com/rails/rails/pull/18937
169
230
  Enabled: true
170
231
  VersionAdded: '0.62'
171
232
 
@@ -184,14 +245,18 @@ Rails/Blank:
184
245
 
185
246
  Rails/BulkChangeTable:
186
247
  Description: 'Check whether alter queries are combinable.'
248
+ Reference:
249
+ - https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table
250
+ - https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html
187
251
  Enabled: true
188
252
  VersionAdded: '0.57'
253
+ VersionChanged: '2.20'
189
254
  Database: null
190
255
  SupportedDatabases:
191
256
  - mysql
192
257
  - postgresql
193
258
  Include:
194
- - db/migrate/*.rb
259
+ - db/**/*.rb
195
260
 
196
261
  Rails/CompactBlank:
197
262
  Description: 'Checks if collection can be blank-compacted with `compact_blank`.'
@@ -221,18 +286,22 @@ Rails/CreateTableWithTimestamps:
221
286
  when creating a new table.
222
287
  Enabled: true
223
288
  VersionAdded: '0.52'
289
+ VersionChanged: '2.20'
224
290
  Include:
225
- - db/migrate/*.rb
291
+ - db/**/*.rb
226
292
  Exclude:
227
293
  # Respect the `active_storage_variant_records` table of `*_create_active_storage_tables.active_storage.rb`
294
+ # and `*_create_active_storage_variant_records.active_storage.rb`
228
295
  # auto-generated by `bin/rails active_storage:install` even if `created_at` is not specified.
229
- - db/migrate/*_create_active_storage_tables.active_storage.rb
296
+ - db/**/*_create_active_storage_tables.active_storage.rb
297
+ - db/**/*_create_active_storage_variant_records.active_storage.rb
230
298
 
231
299
  Rails/Date:
232
300
  Description: >-
233
301
  Checks the correct usage of date aware methods,
234
302
  such as Date.today, Date.current etc.
235
303
  Enabled: true
304
+ SafeAutoCorrect: false
236
305
  VersionAdded: '0.30'
237
306
  VersionChanged: '2.11'
238
307
  # The value `strict` disallows usage of `Date.today`, `Date.current`,
@@ -270,9 +339,10 @@ Rails/DelegateAllowBlank:
270
339
  Rails/DeprecatedActiveModelErrorsMethods:
271
340
  Description: 'Avoid manipulating ActiveModel errors hash directly.'
272
341
  Enabled: pending
342
+ Severity: warning
273
343
  Safe: false
274
344
  VersionAdded: '2.14'
275
- VersionChanged: '2.15'
345
+ VersionChanged: '2.18'
276
346
 
277
347
  Rails/DotSeparatedKeys:
278
348
  Description: 'Enforces the use of dot-separated keys instead of `:scope` options in `I18n` translation methods.'
@@ -283,12 +353,16 @@ Rails/DotSeparatedKeys:
283
353
  Rails/DuplicateAssociation:
284
354
  Description: "Don't repeat associations in a model."
285
355
  Enabled: pending
356
+ Severity: warning
286
357
  VersionAdded: '2.14'
358
+ VersionChanged: '2.18'
287
359
 
288
360
  Rails/DuplicateScope:
289
361
  Description: 'Multiple scopes share this same where clause.'
290
362
  Enabled: pending
363
+ Severity: warning
291
364
  VersionAdded: '2.14'
365
+ VersionChanged: '2.18'
292
366
 
293
367
  Rails/DurationArithmetic:
294
368
  Description: 'Do not use duration as arithmetic operand with `Time.current`.'
@@ -306,10 +380,13 @@ Rails/DynamicFindBy:
306
380
  # The `Whitelist` has been deprecated, Please use `AllowedMethods` instead.
307
381
  Whitelist:
308
382
  - find_by_sql
383
+ - find_by_token_for
309
384
  AllowedMethods:
310
385
  - find_by_sql
386
+ - find_by_token_for
311
387
  AllowedReceivers:
312
388
  - Gem::Specification
389
+ - page # Prevents a warning for `page.find_by_id`. See: https://github.com/rubocop/rubocop-rails/issues/778
313
390
 
314
391
  Rails/EagerEvaluationLogMessage:
315
392
  Description: 'Checks that blocks are used for interpolated strings passed to `Rails.logger.debug`.'
@@ -400,19 +477,28 @@ Rails/FindById:
400
477
  VersionAdded: '2.7'
401
478
 
402
479
  Rails/FindEach:
403
- Description: 'Prefer all.find_each over all.find.'
480
+ Description: 'Prefer all.find_each over all.each.'
404
481
  StyleGuide: 'https://rails.rubystyle.guide#find-each'
405
482
  Enabled: true
483
+ Safe: false
406
484
  VersionAdded: '0.30'
407
- VersionChanged: '2.9'
485
+ VersionChanged: '2.19'
408
486
  Include:
409
487
  - app/models/**/*.rb
410
- IgnoredMethods:
488
+ AllowedMethods:
411
489
  # Methods that don't work well with `find_each`.
412
490
  - order
413
491
  - limit
414
492
  - select
415
493
  - lock
494
+ AllowedPatterns: []
495
+
496
+ Rails/FreezeTime:
497
+ Description: 'Prefer `freeze_time` over `travel_to` with an argument of the current time.'
498
+ StyleGuide: 'https://rails.rubystyle.guide/#freeze-time'
499
+ Enabled: pending
500
+ VersionAdded: '2.16'
501
+ SafeAutoCorrect: false
416
502
 
417
503
  Rails/HasAndBelongsToMany:
418
504
  Description: 'Prefer has_many :through to has_and_belongs_to_many.'
@@ -462,7 +548,7 @@ Rails/I18nLazyLookup:
462
548
  Enabled: pending
463
549
  VersionAdded: '2.14'
464
550
  Include:
465
- - 'controllers/**/*'
551
+ - 'app/controllers/**/*.rb'
466
552
 
467
553
  Rails/I18nLocaleAssignment:
468
554
  Description: 'Prefer the usage of `I18n.with_locale` instead of manually updating `I18n.locale` value.'
@@ -478,6 +564,13 @@ Rails/I18nLocaleTexts:
478
564
  Enabled: pending
479
565
  VersionAdded: '2.14'
480
566
 
567
+ Rails/IgnoredColumnsAssignment:
568
+ Description: 'Looks for assignments of `ignored_columns` that override previous assignments.'
569
+ StyleGuide: 'https://rails.rubystyle.guide/#append-ignored-columns'
570
+ Enabled: pending
571
+ SafeAutoCorrect: false
572
+ VersionAdded: '2.17'
573
+
481
574
  Rails/IgnoredSkipActionFilterOption:
482
575
  Description: 'Checks that `if` and `only` (or `except`) are not used together as options of `skip_*` action filter.'
483
576
  Reference: 'https://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-_normalize_callback_options'
@@ -507,6 +600,9 @@ Rails/Inquiry:
507
600
 
508
601
  Rails/InverseOf:
509
602
  Description: 'Checks for associations where the inverse cannot be determined automatically.'
603
+ Reference:
604
+ - https://guides.rubyonrails.org/association_basics.html#bi-directional-associations
605
+ - https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Setting+Inverses
510
606
  Enabled: true
511
607
  VersionAdded: '0.52'
512
608
  IgnoreScopes: false
@@ -556,8 +652,9 @@ Rails/MigrationClassName:
556
652
  Description: 'The class name of the migration should match its file name.'
557
653
  Enabled: pending
558
654
  VersionAdded: '2.14'
655
+ VersionChanged: '2.20'
559
656
  Include:
560
- - db/migrate/*.rb
657
+ - db/**/*.rb
561
658
 
562
659
  Rails/NegateInclude:
563
660
  Description: 'Prefer `collection.exclude?(obj)` over `!collection.include?(obj)`.'
@@ -571,8 +668,9 @@ Rails/NotNullColumn:
571
668
  Description: 'Do not add a NOT NULL column without a default value.'
572
669
  Enabled: true
573
670
  VersionAdded: '0.43'
671
+ VersionChanged: '2.20'
574
672
  Include:
575
- - db/migrate/*.rb
673
+ - db/**/*.rb
576
674
 
577
675
  Rails/OrderById:
578
676
  Description: >-
@@ -610,7 +708,9 @@ Rails/Pluck:
610
708
  Description: 'Prefer `pluck` over `map { ... }`.'
611
709
  StyleGuide: 'https://rails.rubystyle.guide#pluck'
612
710
  Enabled: 'pending'
711
+ Safe: false
613
712
  VersionAdded: '2.7'
713
+ VersionChanged: '2.18'
614
714
 
615
715
  Rails/PluckId:
616
716
  Description: 'Use `ids` instead of `pluck(:id)` or `pluck(primary_key)`.'
@@ -762,6 +862,18 @@ Rails/RequireDependency:
762
862
  Enabled: false
763
863
  VersionAdded: '2.10'
764
864
 
865
+ Rails/ResponseParsedBody:
866
+ Description: Prefer `response.parsed_body` to `JSON.parse(response.body)`.
867
+ Enabled: pending
868
+ Safe: false
869
+ VersionAdded: '2.18'
870
+ VersionChanged: '2.19'
871
+ Include:
872
+ - spec/controllers/**/*.rb
873
+ - spec/requests/**/*.rb
874
+ - test/controllers/**/*.rb
875
+ - test/integration/**/*.rb
876
+
765
877
  Rails/ReversibleMigration:
766
878
  Description: 'Checks whether the change method of the migration file is reversible.'
767
879
  StyleGuide: 'https://rails.rubystyle.guide#reversible-migration'
@@ -785,6 +897,12 @@ Rails/RootJoinChain:
785
897
  Enabled: pending
786
898
  VersionAdded: '2.13'
787
899
 
900
+ Rails/RootPathnameMethods:
901
+ Description: 'Use `Rails.root` IO methods instead of passing it to `File`.'
902
+ Enabled: pending
903
+ SafeAutoCorrect: false
904
+ VersionAdded: '2.16'
905
+
788
906
  Rails/RootPublicPath:
789
907
  Description: "Favor `Rails.public_path` over `Rails.root` with `'public'`."
790
908
  Enabled: pending
@@ -901,6 +1019,14 @@ Rails/TableNameAssignment:
901
1019
  Include:
902
1020
  - app/models/**/*.rb
903
1021
 
1022
+ Rails/ThreeStateBooleanColumn:
1023
+ Description: 'Add a default value and a `NOT NULL` constraint to boolean columns.'
1024
+ StyleGuide: 'https://rails.rubystyle.guide/#three-state-boolean'
1025
+ Enabled: pending
1026
+ VersionAdded: '2.19'
1027
+ Include:
1028
+ - db/**/*.rb
1029
+
904
1030
  Rails/TimeZone:
905
1031
  Description: 'Checks the correct usage of time zone aware methods.'
906
1032
  StyleGuide: 'https://rails.rubystyle.guide#time'
@@ -937,8 +1063,24 @@ Rails/ToFormattedS:
937
1063
  - to_formatted_s
938
1064
  VersionAdded: '2.15'
939
1065
 
1066
+ Rails/ToSWithArgument:
1067
+ Description: 'Identifies passing any argument to `#to_s`.'
1068
+ Enabled: pending
1069
+ Safe: false
1070
+ VersionAdded: '2.16'
1071
+
1072
+ Rails/TopLevelHashWithIndifferentAccess:
1073
+ Description: 'Identifies top-level `HashWithIndifferentAccess`.'
1074
+ Reference: 'https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#top-level-hashwithindifferentaccess-is-soft-deprecated'
1075
+ Enabled: pending
1076
+ Severity: warning
1077
+ VersionAdded: '2.16'
1078
+ VersionChanged: '2.18'
1079
+
940
1080
  Rails/TransactionExitStatement:
941
1081
  Description: 'Avoid the usage of `return`, `break` and `throw` in transaction blocks.'
1082
+ Reference:
1083
+ - https://github.com/rails/rails/commit/15aa4200e083
942
1084
  Enabled: pending
943
1085
  VersionAdded: '2.14'
944
1086
 
@@ -963,7 +1105,9 @@ Rails/UniqueValidationWithoutIndex:
963
1105
  Rails/UnknownEnv:
964
1106
  Description: 'Use correct environment name.'
965
1107
  Enabled: true
1108
+ Severity: warning
966
1109
  VersionAdded: '0.51'
1110
+ VersionChanged: '2.18'
967
1111
  Environments:
968
1112
  - development
969
1113
  - test
@@ -1003,12 +1147,36 @@ Rails/WhereExists:
1003
1147
  VersionAdded: '2.7'
1004
1148
  VersionChanged: '2.10'
1005
1149
 
1150
+ Rails/WhereMissing:
1151
+ Description: 'Use `where.missing(...)` to find missing relationship records.'
1152
+ StyleGuide: 'https://rails.rubystyle.guide/#finding-missing-relationship-records'
1153
+ Enabled: pending
1154
+ VersionAdded: '2.16'
1155
+
1006
1156
  Rails/WhereNot:
1007
1157
  Description: 'Use `where.not(...)` instead of manually constructing negated SQL in `where`.'
1008
1158
  StyleGuide: 'https://rails.rubystyle.guide/#hash-conditions'
1009
1159
  Enabled: 'pending'
1010
1160
  VersionAdded: '2.8'
1011
1161
 
1162
+ Rails/WhereNotWithMultipleConditions:
1163
+ Description: 'Do not use `where.not(...)` with multiple conditions.'
1164
+ StyleGuide: 'https://rails.rubystyle.guide/#where-not-with-multiple-attributes'
1165
+ Enabled: 'pending'
1166
+ Severity: warning
1167
+ VersionAdded: '2.17'
1168
+ VersionChanged: '2.18'
1169
+
1012
1170
  # Accept `redirect_to(...) and return` and similar cases.
1013
1171
  Style/AndOr:
1014
1172
  EnforcedStyle: conditionals
1173
+
1174
+ Style/FormatStringToken:
1175
+ AllowedMethods:
1176
+ - redirect
1177
+
1178
+ Style/SymbolProc:
1179
+ AllowedMethods:
1180
+ - define_method
1181
+ - mail
1182
+ - respond_to
@@ -5,3 +5,13 @@
5
5
  #
6
6
  extracted:
7
7
  Rails/*: ~
8
+
9
+ # Cop parameters that have been changed
10
+ # Can be treated as a warning instead of a failure with `severity: warning`
11
+ changed_parameters:
12
+ - cops: Rails/FindEach
13
+ parameters: IgnoredMethods
14
+ alternatives:
15
+ - AllowedMethods
16
+ - AllowedPatterns
17
+ severity: warning
@@ -10,8 +10,8 @@ module RuboCop
10
10
 
11
11
  def_node_matcher :active_record?, <<~PATTERN
12
12
  {
13
- (const nil? :ApplicationRecord)
14
- (const (const nil? :ActiveRecord) :Base)
13
+ (const {nil? cbase} :ApplicationRecord)
14
+ (const (const {nil? cbase} :ActiveRecord) :Base)
15
15
  }
16
16
  PATTERN
17
17
 
@@ -48,10 +48,7 @@ module RuboCop
48
48
 
49
49
  class_nodes = class_node.defined_module.each_node
50
50
  namespaces = class_node.each_ancestor(:class, :module).map(&:identifier)
51
- [*class_nodes, *namespaces]
52
- .reverse
53
- .map { |node| node.children[1] }.join('_')
54
- .tableize
51
+ [*class_nodes, *namespaces].reverse.map { |node| node.children[1] }.join('_').tableize
55
52
  end
56
53
 
57
54
  # Resolve relation into column name.
@@ -10,9 +10,7 @@ module RuboCop
10
10
  bigint binary boolean date datetime decimal float integer json string
11
11
  text time timestamp virtual
12
12
  ].freeze
13
- RAILS_ABSTRACT_SCHEMA_DEFINITIONS_HELPERS = %i[
14
- column references belongs_to primary_key numeric
15
- ].freeze
13
+ RAILS_ABSTRACT_SCHEMA_DEFINITIONS_HELPERS = %i[column references belongs_to primary_key numeric].freeze
16
14
  POSTGRES_SCHEMA_DEFINITIONS = %i[
17
15
  bigserial bit bit_varying cidr citext daterange hstore inet interval
18
16
  int4range int8range jsonb ltree macaddr money numrange oid point line
@@ -32,7 +32,7 @@ module RuboCop
32
32
 
33
33
  def register_offense(offense_node)
34
34
  add_offense(offense_node) do |corrector|
35
- corrector.replace(offense_node.source_range, self.class::SUPERCLASS)
35
+ corrector.replace(offense_node, self.class::SUPERCLASS)
36
36
  end
37
37
  end
38
38
  end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  module IndexMethod # rubocop:disable Metrics/ModuleLength
7
7
  RESTRICT_ON_SEND = %i[each_with_object to_h map collect []].freeze
8
8
 
9
- def on_block(node)
9
+ def on_block(node) # rubocop:todo InternalAffairs/NumblockHandler
10
10
  on_bad_each_with_object(node) do |*match|
11
11
  handle_possible_offense(node, match, 'each_with_object')
12
12
  end
@@ -98,10 +98,7 @@ module RuboCop
98
98
 
99
99
  captures = extract_captures(correction.match)
100
100
  correction.set_new_arg_name(captures.transformed_argname, corrector)
101
- correction.set_new_body_expression(
102
- captures.transforming_body_expr,
103
- corrector
104
- )
101
+ correction.set_new_body_expression(captures.transforming_body_expr, corrector)
105
102
  end
106
103
 
107
104
  # Internal helper class to hold match data
@@ -110,8 +107,7 @@ module RuboCop
110
107
  :transforming_body_expr
111
108
  ) do
112
109
  def noop_transformation?
113
- transforming_body_expr.lvar_type? &&
114
- transforming_body_expr.children == [transformed_argname]
110
+ transforming_body_expr.lvar_type? && transforming_body_expr.children == [transformed_argname]
115
111
  end
116
112
  end
117
113
 
@@ -138,11 +134,11 @@ module RuboCop
138
134
  end
139
135
 
140
136
  def self.from_hash_brackets_map(node, match)
141
- new(match, node.children.last, 'Hash['.length, ']'.length)
137
+ new(match, node.children.last, "#{node.receiver.source}[".length, ']'.length)
142
138
  end
143
139
 
144
140
  def strip_prefix_and_suffix(node, corrector)
145
- expression = node.loc.expression
141
+ expression = node.source_range
146
142
  corrector.remove_leading(expression, leading)
147
143
  corrector.remove_trailing(expression, trailing)
148
144
  end
@@ -157,17 +153,11 @@ module RuboCop
157
153
  end
158
154
 
159
155
  def set_new_arg_name(transformed_argname, corrector)
160
- corrector.replace(
161
- block_node.arguments.loc.expression,
162
- "|#{transformed_argname}|"
163
- )
156
+ corrector.replace(block_node.arguments, "|#{transformed_argname}|")
164
157
  end
165
158
 
166
159
  def set_new_body_expression(transforming_body_expr, corrector)
167
- corrector.replace(
168
- block_node.body.loc.expression,
169
- transforming_body_expr.loc.expression.source
170
- )
160
+ corrector.replace(block_node.body, transforming_body_expr.source)
171
161
  end
172
162
  end
173
163
  end
@@ -8,7 +8,7 @@ module RuboCop
8
8
 
9
9
  def_node_matcher :migration_class?, <<~PATTERN
10
10
  (class
11
- (const nil? _)
11
+ (const {nil? cbase} _)
12
12
  (send
13
13
  (const (const {nil? cbase} :ActiveRecord) :Migration)
14
14
  :[]