rubocop-rails 2.15.2 → 2.20.2

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.
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
  :[]