rubocop-rails 2.12.4 → 2.13.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +34 -6
  3. data/lib/rubocop/cop/mixin/active_record_migrations_helper.rb +34 -0
  4. data/lib/rubocop/cop/rails/active_record_aliases.rb +4 -0
  5. data/lib/rubocop/cop/rails/application_controller.rb +5 -1
  6. data/lib/rubocop/cop/rails/application_job.rb +5 -1
  7. data/lib/rubocop/cop/rails/application_mailer.rb +5 -1
  8. data/lib/rubocop/cop/rails/application_record.rb +6 -1
  9. data/lib/rubocop/cop/rails/arel_star.rb +6 -0
  10. data/lib/rubocop/cop/rails/blank.rb +5 -4
  11. data/lib/rubocop/cop/rails/compact_blank.rb +98 -0
  12. data/lib/rubocop/cop/rails/content_tag.rb +2 -2
  13. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +2 -7
  14. data/lib/rubocop/cop/rails/duration_arithmetic.rb +97 -0
  15. data/lib/rubocop/cop/rails/dynamic_find_by.rb +4 -0
  16. data/lib/rubocop/cop/rails/http_positional_arguments.rb +1 -1
  17. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +8 -7
  18. data/lib/rubocop/cop/rails/mailer_name.rb +4 -0
  19. data/lib/rubocop/cop/rails/negate_include.rb +3 -2
  20. data/lib/rubocop/cop/rails/output.rb +4 -0
  21. data/lib/rubocop/cop/rails/pick.rb +7 -0
  22. data/lib/rubocop/cop/rails/pluck_id.rb +3 -0
  23. data/lib/rubocop/cop/rails/pluck_in_where.rb +7 -6
  24. data/lib/rubocop/cop/rails/rake_environment.rb +5 -0
  25. data/lib/rubocop/cop/rails/redundant_presence_validation_on_belongs_to.rb +192 -0
  26. data/lib/rubocop/cop/rails/reflection_class_name.rb +4 -2
  27. data/lib/rubocop/cop/rails/relative_date_constant.rb +3 -0
  28. data/lib/rubocop/cop/rails/reversible_migration.rb +1 -1
  29. data/lib/rubocop/cop/rails/root_join_chain.rb +72 -0
  30. data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +12 -3
  31. data/lib/rubocop/cop/rails/save_bang.rb +19 -0
  32. data/lib/rubocop/cop/rails/schema_comment.rb +104 -0
  33. data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +4 -2
  34. data/lib/rubocop/cop/rails/time_zone.rb +3 -0
  35. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +29 -35
  36. data/lib/rubocop/cop/rails/where_equals.rb +4 -0
  37. data/lib/rubocop/cop/rails/where_exists.rb +9 -8
  38. data/lib/rubocop/cop/rails_cops.rb +6 -0
  39. data/lib/rubocop/rails/version.rb +1 -1
  40. metadata +11 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c247cc795386a013c8f1a9dd7a76a08ef8fbd3c729ebe69e2f99bcb28a7baf6
4
- data.tar.gz: f85139a9ef4a5f1666672431285e6d34ca9a8c0a367bf6c1e2b8ed2d3d0acf63
3
+ metadata.gz: f12ec262c68bd72f514b80f2140b51278a947f21726ef6307e6267eaec7df4ae
4
+ data.tar.gz: 2a09b4db338465d1904a19e8d4af871ba485e75244613299fabe473854125e4c
5
5
  SHA512:
6
- metadata.gz: cd4893d903809e187a9094f84a14209aecfc931e4773df64e1c5a05c94fce22305ca0b0c899881545e697ceae8c6facb3400d0dc41415fed57a3b07244b7fdff
7
- data.tar.gz: 91832638f61072047b0cf11b300d7be679a8fc7f708dc47cb5769eb1cd7852c8caf70452d6297cca122af4a53fd0599605d7221a8fc647e96352934fb0828684
6
+ metadata.gz: fbf73dc2e978bc210e2dc190b8042720f24e6e374962b2873e6c29ec989ed2a7c1b05646c22a38d57f28e753104ac40a0e592730e63703d99dbb80fc6b498651
7
+ data.tar.gz: b70e78355a3fa5b09f3a2a1603c71b16547c3f2f80c0ce7c2dbbc3c38cae0a0ca9464a50895eb54ac8ccd558c9259bf28a1e4ebebb9e3d4f05102832f178fc11
data/config/default.yml CHANGED
@@ -180,6 +180,12 @@ Rails/BulkChangeTable:
180
180
  Include:
181
181
  - db/migrate/*.rb
182
182
 
183
+ Rails/CompactBlank:
184
+ Description: 'Checks if collection can be blank-compacted with `compact_blank`.'
185
+ Enabled: pending
186
+ Safe: false
187
+ VersionAdded: '2.13'
188
+
183
189
  Rails/ContentTag:
184
190
  Description: 'Use `tag.something` instead of `tag(:something)`.'
185
191
  Reference:
@@ -245,6 +251,12 @@ Rails/DelegateAllowBlank:
245
251
  Enabled: true
246
252
  VersionAdded: '0.44'
247
253
 
254
+ Rails/DurationArithmetic:
255
+ Description: 'Do not use duration as arithmetic operand with `Time.current`.'
256
+ StyleGuide: 'https://rails.rubystyle.guide#duration-arithmetic'
257
+ Enabled: pending
258
+ VersionAdded: '2.13'
259
+
248
260
  Rails/DynamicFindBy:
249
261
  Description: 'Use `find_by` instead of dynamic `find_by_*`.'
250
262
  StyleGuide: 'https://rails.rubystyle.guide#find_by'
@@ -612,6 +624,11 @@ Rails/RedundantForeignKey:
612
624
  Enabled: true
613
625
  VersionAdded: '2.6'
614
626
 
627
+ Rails/RedundantPresenceValidationOnBelongsTo:
628
+ Description: 'Checks for redundant presence validation on belongs_to association.'
629
+ Enabled: pending
630
+ VersionAdded: '2.13'
631
+
615
632
  Rails/RedundantReceiverInWithOptions:
616
633
  Description: 'Checks for redundant receiver in `with_options`.'
617
634
  Enabled: true
@@ -646,9 +663,9 @@ Rails/RefuteMethods:
646
663
  Rails/RelativeDateConstant:
647
664
  Description: 'Do not assign relative date to constants.'
648
665
  Enabled: true
666
+ SafeAutoCorrect: false
649
667
  VersionAdded: '0.48'
650
- VersionChanged: '0.59'
651
- AutoCorrect: false
668
+ VersionChanged: '2.13'
652
669
 
653
670
  Rails/RenderInline:
654
671
  Description: 'Prefer using a template over inline rendering.'
@@ -695,6 +712,11 @@ Rails/ReversibleMigrationMethodDefinition:
695
712
  Include:
696
713
  - db/migrate/*.rb
697
714
 
715
+ Rails/RootJoinChain:
716
+ Description: 'Use a single `#join` instead of chaining on `Rails.root` or `Rails.public_path`.'
717
+ Enabled: pending
718
+ VersionAdded: '2.13'
719
+
698
720
  Rails/SafeNavigation:
699
721
  Description: "Use Ruby's safe navigation operator (`&.`) instead of `try!`."
700
722
  Enabled: true
@@ -727,6 +749,13 @@ Rails/SaveBang:
727
749
  AllowedReceivers: []
728
750
  SafeAutoCorrect: false
729
751
 
752
+ Rails/SchemaComment:
753
+ Description: >-
754
+ This cop enforces the use of the `comment` option when adding a new table or column
755
+ to the database during a migration.
756
+ Enabled: false
757
+ VersionAdded: '2.13'
758
+
730
759
  Rails/ScopeArgs:
731
760
  Description: 'Checks the arguments of ActiveRecord scopes.'
732
761
  Enabled: true
@@ -789,9 +818,9 @@ Rails/TimeZone:
789
818
  StyleGuide: 'https://rails.rubystyle.guide#time'
790
819
  Reference: 'http://danilenko.org/2012/7/6/rails_timezones'
791
820
  Enabled: true
792
- Safe: false
821
+ SafeAutoCorrect: false
793
822
  VersionAdded: '0.30'
794
- VersionChanged: '2.10'
823
+ VersionChanged: '2.13'
795
824
  # The value `strict` means that `Time` should be used with `zone`.
796
825
  # The value `flexible` allows usage of `in_time_zone` instead of `zone`.
797
826
  EnforcedStyle: flexible
@@ -814,13 +843,12 @@ Rails/UniqBeforePluck:
814
843
  Description: 'Prefer the use of uniq or distinct before pluck.'
815
844
  Enabled: true
816
845
  VersionAdded: '0.40'
817
- VersionChanged: '2.8'
846
+ VersionChanged: '2.13'
818
847
  EnforcedStyle: conservative
819
848
  SupportedStyles:
820
849
  - conservative
821
850
  - aggressive
822
851
  SafeAutoCorrect: false
823
- AutoCorrect: false
824
852
 
825
853
  Rails/UniqueValidationWithoutIndex:
826
854
  Description: 'Uniqueness validation should have a unique index on the database column.'
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # A mixin to extend cops for Active Record features
6
+ module ActiveRecordMigrationsHelper
7
+ extend NodePattern::Macros
8
+
9
+ RAILS_ABSTRACT_SCHEMA_DEFINITIONS = %i[
10
+ bigint binary boolean date datetime decimal float integer json string
11
+ text time timestamp virtual
12
+ ].freeze
13
+ RAILS_ABSTRACT_SCHEMA_DEFINITIONS_HELPERS = %i[
14
+ column references belongs_to primary_key numeric
15
+ ].freeze
16
+ POSTGRES_SCHEMA_DEFINITIONS = %i[
17
+ bigserial bit bit_varying cidr citext daterange hstore inet interval
18
+ int4range int8range jsonb ltree macaddr money numrange oid point line
19
+ lseg box path polygon circle serial tsrange tstzrange tsvector uuid xml
20
+ ].freeze
21
+ MYSQL_SCHEMA_DEFINITIONS = %i[
22
+ blob tinyblob mediumblob longblob tinytext mediumtext longtext
23
+ unsigned_integer unsigned_bigint unsigned_float unsigned_decimal
24
+ ].freeze
25
+
26
+ def_node_matcher :create_table_with_block?, <<~PATTERN
27
+ (block
28
+ (send nil? :create_table ...)
29
+ (args (arg _var))
30
+ _)
31
+ PATTERN
32
+ end
33
+ end
34
+ end
@@ -6,6 +6,10 @@ module RuboCop
6
6
  # Checks that ActiveRecord aliases are not used. The direct method names
7
7
  # are more clear and easier to read.
8
8
  #
9
+ # @safety
10
+ # This cop is unsafe because custom `update_attributes` method call was changed to
11
+ # `update` but the method name remained same in the method definition.
12
+ #
9
13
  # @example
10
14
  # #bad
11
15
  # book.update_attributes!(author: 'Alice')
@@ -3,7 +3,11 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks that controllers subclass ApplicationController.
6
+ # This cop checks that controllers subclass `ApplicationController`.
7
+ #
8
+ # @safety
9
+ # This cop's autocorrection is unsafe because it may let the logic from `ApplicationController`
10
+ # sneak into a controller that is not purposed to inherit logic common among other controllers.
7
11
  #
8
12
  # @example
9
13
  #
@@ -3,7 +3,11 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks that jobs subclass ApplicationJob with Rails 5.0.
6
+ # This cop checks that jobs subclass `ApplicationJob` with Rails 5.0.
7
+ #
8
+ # @safety
9
+ # This cop's autocorrection is unsafe because it may let the logic from `ApplicationJob`
10
+ # sneak into a job that is not purposed to inherit logic common among other jobs.
7
11
  #
8
12
  # @example
9
13
  #
@@ -3,7 +3,11 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks that mailers subclass ApplicationMailer with Rails 5.0.
6
+ # This cop checks that mailers subclass `ApplicationMailer` with Rails 5.0.
7
+ #
8
+ # @safety
9
+ # This cop's autocorrection is unsafe because it may let the logic from `ApplicationMailer`
10
+ # sneak into a mailer that is not purposed to inherit logic common among other mailers.
7
11
  #
8
12
  # @example
9
13
  #
@@ -3,7 +3,12 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks that models subclass ApplicationRecord with Rails 5.0.
6
+ # This cop checks that models subclass `ApplicationRecord` with Rails 5.0.
7
+ #
8
+ # @safety
9
+ # This cop's autocorrection is unsafe because it may let the logic from `ApplicationRecord`
10
+ # sneak into an Active Record model that is not purposed to inherit logic common among other
11
+ # Active Record models.
7
12
  #
8
13
  # @example
9
14
  #
@@ -10,6 +10,12 @@ module RuboCop
10
10
  # database to look for a column named <tt>`*`</tt> (or `"*"`) as opposed
11
11
  # to expanding the column list as one would likely expect.
12
12
  #
13
+ # @safety
14
+ # This cop's autocorrection is unsafe because it turns a quoted `*` into
15
+ # an SQL `*`, unquoted. `*` is a valid column name in certain databases
16
+ # supported by Rails, and even though it is usually a mistake,
17
+ # it might denote legitimate access to a column named `*`.
18
+ #
13
19
  # @example
14
20
  # # bad
15
21
  # MyTable.arel_table["*"]
@@ -6,15 +6,16 @@ module RuboCop
6
6
  # This cop checks for code that can be written with simpler conditionals
7
7
  # using `Object#blank?` defined by Active Support.
8
8
  #
9
- # This cop is marked as unsafe auto-correction, because `' '.empty?` returns false,
10
- # but `' '.blank?` returns true. Therefore, auto-correction is not compatible
11
- # if the receiver is a non-empty blank string, tab, or newline meta characters.
12
- #
13
9
  # Interaction with `Style/UnlessElse`:
14
10
  # The configuration of `NotPresent` will not produce an offense in the
15
11
  # context of `unless else` if `Style/UnlessElse` is inabled. This is
16
12
  # to prevent interference between the auto-correction of the two cops.
17
13
  #
14
+ # @safety
15
+ # This cop is unsafe auto-correction, because `' '.empty?` returns false,
16
+ # but `' '.blank?` returns true. Therefore, auto-correction is not compatible
17
+ # if the receiver is a non-empty blank string, tab, or newline meta characters.
18
+ #
18
19
  # @example NilOrEmpty: true (default)
19
20
  # # Converts usages of `nil? || empty?` to `blank?`
20
21
  #
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # Checks if collection can be blank-compacted with `compact_blank`.
7
+ #
8
+ # @safety
9
+ # It is unsafe by default because false positives may occur in the
10
+ # blank check of block arguments to the receiver object.
11
+ #
12
+ # For example, `[[1, 2], [3, nil]].reject { |first, second| second.blank? }` and
13
+ # `[[1, 2], [3, nil]].compact_blank` are not compatible. The same is true for `empty?`.
14
+ # This will work fine when the receiver is a hash object.
15
+ #
16
+ # @example
17
+ #
18
+ # # bad
19
+ # collection.reject(&:blank?)
20
+ # collection.reject(&:empty?)
21
+ # collection.reject { |_k, v| v.blank? }
22
+ # collection.reject { |_k, v| v.empty? }
23
+ #
24
+ # # good
25
+ # collection.compact_blank
26
+ #
27
+ # # bad
28
+ # collection.reject!(&:blank?)
29
+ # collection.reject!(&:empty?)
30
+ # collection.reject! { |_k, v| v.blank? }
31
+ # collection.reject! { |_k, v| v.empty? }
32
+ #
33
+ # # good
34
+ # collection.compact_blank!
35
+ #
36
+ class CompactBlank < Base
37
+ include RangeHelp
38
+ extend AutoCorrector
39
+ extend TargetRailsVersion
40
+
41
+ MSG = 'Use `%<preferred_method>s` instead.'
42
+ RESTRICT_ON_SEND = %i[reject reject!].freeze
43
+
44
+ minimum_target_rails_version 6.1
45
+
46
+ def_node_matcher :reject_with_block?, <<~PATTERN
47
+ (block
48
+ (send _ {:reject :reject!})
49
+ $(args ...)
50
+ (send
51
+ $(lvar _) {:blank? :empty?}))
52
+ PATTERN
53
+
54
+ def_node_matcher :reject_with_block_pass?, <<~PATTERN
55
+ (send _ {:reject :reject!}
56
+ (block_pass
57
+ (sym {:blank? :empty?})))
58
+ PATTERN
59
+
60
+ def on_send(node)
61
+ return unless bad_method?(node)
62
+
63
+ range = offense_range(node)
64
+ preferred_method = preferred_method(node)
65
+ add_offense(range, message: format(MSG, preferred_method: preferred_method)) do |corrector|
66
+ corrector.replace(range, preferred_method)
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def bad_method?(node)
73
+ return true if reject_with_block_pass?(node)
74
+
75
+ if (arguments, receiver_in_block = reject_with_block?(node.parent))
76
+ return arguments.length == 1 || use_hash_value_block_argument?(arguments, receiver_in_block)
77
+ end
78
+
79
+ false
80
+ end
81
+
82
+ def use_hash_value_block_argument?(arguments, receiver_in_block)
83
+ arguments.length == 2 && arguments[1].source == receiver_in_block.source
84
+ end
85
+
86
+ def offense_range(node)
87
+ end_pos = node.parent&.block_type? ? node.parent.loc.expression.end_pos : node.loc.expression.end_pos
88
+
89
+ range_between(node.loc.selector.begin_pos, end_pos)
90
+ end
91
+
92
+ def preferred_method(node)
93
+ node.method?(:reject) ? 'compact_blank' : 'compact_blank!'
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -6,8 +6,8 @@ module RuboCop
6
6
  # This cop checks legacy syntax usage of `tag`
7
7
  #
8
8
  # NOTE: Allow `tag` when the first argument is a variable because
9
- # `tag(name)` is simpler rather than `tag.public_send(name)`.
10
- # And this cop will be renamed to something like `LegacyTag` in the future. (e.g. RuboCop Rails 2.0)
9
+ # `tag(name)` is simpler rather than `tag.public_send(name)`.
10
+ # And this cop will be renamed to something like `LegacyTag` in the future. (e.g. RuboCop Rails 2.0)
11
11
  #
12
12
  # @example
13
13
  # # bad
@@ -41,16 +41,11 @@ module RuboCop
41
41
  # t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP' }
42
42
  # end
43
43
  class CreateTableWithTimestamps < Base
44
+ include ActiveRecordMigrationsHelper
45
+
44
46
  MSG = 'Add timestamps when creating a new table.'
45
47
  RESTRICT_ON_SEND = %i[create_table].freeze
46
48
 
47
- def_node_matcher :create_table_with_block?, <<~PATTERN
48
- (block
49
- (send nil? :create_table ...)
50
- (args (arg _var))
51
- _)
52
- PATTERN
53
-
54
49
  def_node_matcher :create_table_with_timestamps_proc?, <<~PATTERN
55
50
  (send nil? :create_table (sym _) ... (block-pass (sym :timestamps)))
56
51
  PATTERN
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks if a duration is added to or subtracted from `Time.current`.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # Time.current - 1.minute
11
+ # Time.current + 2.days
12
+ #
13
+ # # good - using relative would make it harder to express and read
14
+ # Date.yesterday + 3.days
15
+ # created_at - 1.minute
16
+ # 3.days - 1.hour
17
+ #
18
+ # # good
19
+ # 1.minute.ago
20
+ # 2.days.from_now
21
+ class DurationArithmetic < Base
22
+ extend AutoCorrector
23
+
24
+ MSG = 'Do not add or subtract duration.'
25
+
26
+ RESTRICT_ON_SEND = %i[+ -].freeze
27
+
28
+ DURATIONS = Set[:second, :seconds, :minute, :minutes, :hour, :hours,
29
+ :day, :days, :week, :weeks, :fortnight, :fortnights]
30
+
31
+ # @!method duration_arithmetic_argument?(node)
32
+ # Match duration subtraction or addition with current time.
33
+ #
34
+ # @example source that matches
35
+ # Time.current - 1.hour
36
+ #
37
+ # @example source that matches
38
+ # ::Time.zone.now + 1.hour
39
+ #
40
+ # @param node [RuboCop::AST::Node]
41
+ # @yield operator and duration
42
+ def_node_matcher :duration_arithmetic_argument?, <<~PATTERN
43
+ (send #time_current? ${ :+ :- } $#duration?)
44
+ PATTERN
45
+
46
+ # @!method duration?(node)
47
+ # Match a literal Duration
48
+ #
49
+ # @example source that matches
50
+ # 1.hour
51
+ #
52
+ # @example source that matches
53
+ # 9.5.weeks
54
+ #
55
+ # @param node [RuboCop::AST::Node]
56
+ # @return [Boolean] true if matches
57
+ def_node_matcher :duration?, '(send { int float (send nil _) } DURATIONS)'
58
+
59
+ # @!method time_current?(node)
60
+ # Match Time.current
61
+ #
62
+ # @example source that matches
63
+ # Time.current
64
+ #
65
+ # @example source that matches
66
+ # ::Time.zone.now
67
+ #
68
+ # @param node [RuboCop::AST::Node]
69
+ # @return [Boolean] true if matches
70
+ def_node_matcher :time_current?, <<~PATTERN
71
+ {
72
+ (send (const _ :Time) :current)
73
+ (send (send (const _ :Time) :zone) :now)
74
+ }
75
+ PATTERN
76
+
77
+ def on_send(node)
78
+ duration_arithmetic_argument?(node) do |*operation|
79
+ add_offense(node) do |corrector|
80
+ corrector.replace(node.source_range, corrected_source(*operation))
81
+ end
82
+ end
83
+ end
84
+
85
+ private
86
+
87
+ def corrected_source(operator, duration)
88
+ if operator == :-
89
+ "#{duration.source}.ago"
90
+ else
91
+ "#{duration.source}.from_now"
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -7,6 +7,10 @@ module RuboCop
7
7
  # Use `find_by` instead of dynamic method.
8
8
  # See. https://rails.rubystyle.guide#find_by
9
9
  #
10
+ # @safety
11
+ # It is certainly unsafe when not configured properly, i.e. user-defined `find_by_xxx`
12
+ # method is not added to cop's `AllowedMethods`.
13
+ #
10
14
  # @example
11
15
  # # bad
12
16
  # User.find_by_name(name)
@@ -67,7 +67,7 @@ module RuboCop
67
67
  private
68
68
 
69
69
  def in_routing_block?(node)
70
- !!node.each_ancestor(:block).detect { |block| ROUTING_METHODS.include?(block.send_node.method_name) }
70
+ !!node.each_ancestor(:block).detect { |block| ROUTING_METHODS.include?(block.method_name) }
71
71
  end
72
72
 
73
73
  def needs_conversion?(data)
@@ -6,13 +6,14 @@ module RuboCop
6
6
  # This cop checks that methods specified in the filter's `only` or
7
7
  # `except` options are defined within the same class or module.
8
8
  #
9
- # You can technically specify methods of superclass or methods added by
10
- # mixins on the filter, but these can confuse developers. If you specify
11
- # methods that are defined in other classes or modules, you should
12
- # define the filter in that class or module.
13
- #
14
- # If you rely on behaviour defined in the superclass actions, you must
15
- # remember to invoke `super` in the subclass actions.
9
+ # @safety
10
+ # You can technically specify methods of superclass or methods added by
11
+ # mixins on the filter, but these can confuse developers. If you specify
12
+ # methods that are defined in other classes or modules, you should
13
+ # define the filter in that class or module.
14
+ #
15
+ # If you rely on behaviour defined in the superclass actions, you must
16
+ # remember to invoke `super` in the subclass actions.
16
17
  #
17
18
  # @example
18
19
  # # bad
@@ -8,6 +8,10 @@ module RuboCop
8
8
  # Without the `Mailer` suffix it isn't immediately apparent what's a mailer
9
9
  # and which views are related to the mailer.
10
10
  #
11
+ # @safety
12
+ # This cop's autocorrection is unsafe because renaming a constant is
13
+ # always an unsafe operation.
14
+ #
11
15
  # @example
12
16
  # # bad
13
17
  # class User < ActionMailer::Base
@@ -6,8 +6,9 @@ module RuboCop
6
6
  # This cop enforces the use of `collection.exclude?(obj)`
7
7
  # over `!collection.include?(obj)`.
8
8
  #
9
- # It is marked as unsafe by default because false positive will occur for
10
- # a receiver object that do not have `exclude?` method. (e.g. `IPAddr`)
9
+ # @safety
10
+ # This cop is unsafe because false positive will occur for
11
+ # receiver objects that do not have an `exclude?` method. (e.g. `IPAddr`)
11
12
  #
12
13
  # @example
13
14
  # # bad
@@ -5,6 +5,10 @@ module RuboCop
5
5
  module Rails
6
6
  # This cop checks for the use of output calls like puts and print
7
7
  #
8
+ # @safety
9
+ # This cop's autocorrection is unsafe because depending on the Rails log level configuration,
10
+ # changing from `puts` to `Rails.logger.debug` could result in no output being shown.
11
+ #
8
12
  # @example
9
13
  # # bad
10
14
  # puts 'A debug message'
@@ -9,6 +9,13 @@ module RuboCop
9
9
  # `pick` avoids. When called on an Active Record relation, `pick` adds a
10
10
  # limit to the query so that only one value is fetched from the database.
11
11
  #
12
+ # @safety
13
+ # This cop is unsafe because `pluck` is defined on both `ActiveRecord::Relation` and `Enumerable`,
14
+ # whereas `pick` is only defined on `ActiveRecord::Relation` in Rails 6.0. This was addressed
15
+ # in Rails 6.1 via rails/rails#38760, at which point the cop is safe.
16
+ #
17
+ # See: https://github.com/rubocop/rubocop-rails/pull/249
18
+ #
12
19
  # @example
13
20
  # # bad
14
21
  # Model.pluck(:a).first
@@ -5,6 +5,9 @@ module RuboCop
5
5
  module Rails
6
6
  # This cop enforces the use of `ids` over `pluck(:id)` and `pluck(primary_key)`.
7
7
  #
8
+ # @safety
9
+ # This cop is unsafe if the receiver object is not an Active Record object.
10
+ #
8
11
  # @example
9
12
  # # bad
10
13
  # User.pluck(:id)
@@ -9,14 +9,15 @@ module RuboCop
9
9
  # Since `pluck` is an eager method and hits the database immediately,
10
10
  # using `select` helps to avoid additional database queries.
11
11
  #
12
- # This cop has two different enforcement modes. When the EnforcedStyle
13
- # is conservative (the default) then only calls to `pluck` on a constant
12
+ # This cop has two different enforcement modes. When the `EnforcedStyle`
13
+ # is `conservative` (the default) then only calls to `pluck` on a constant
14
14
  # (i.e. a model class) in the `where` is used as offenses.
15
15
  #
16
- # When the EnforcedStyle is aggressive then all calls to `pluck` in the
17
- # `where` is used as offenses. This may lead to false positives
18
- # as the cop cannot replace to `select` between calls to `pluck` on an
19
- # `ActiveRecord::Relation` instance vs a call to `pluck` on an `Array` instance.
16
+ # @safety
17
+ # When the `EnforcedStyle` is `aggressive` then all calls to `pluck` in the
18
+ # `where` is used as offenses. This may lead to false positives
19
+ # as the cop cannot replace to `select` between calls to `pluck` on an
20
+ # `ActiveRecord::Relation` instance vs a call to `pluck` on an `Array` instance.
20
21
  #
21
22
  # @example
22
23
  # # bad
@@ -14,6 +14,11 @@ module RuboCop
14
14
  # * The task does not need application code.
15
15
  # * The task invokes the `:environment` task.
16
16
  #
17
+ # @safety
18
+ # Probably not a problem in most cases, but it is possible that calling `:environment` task
19
+ # will break a behavior. It's also slower. E.g. some task that only needs one gem to be
20
+ # loaded to run will run significantly faster without loading the whole application.
21
+ #
17
22
  # @example
18
23
  # # bad
19
24
  # task :foo do