rubocop-rails 2.7.1 → 2.10.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +18 -2
  4. data/config/default.yml +144 -6
  5. data/config/obsoletion.yml +7 -0
  6. data/lib/rubocop/cop/mixin/active_record_helper.rb +16 -3
  7. data/lib/rubocop/cop/mixin/enforce_superclass.rb +40 -0
  8. data/lib/rubocop/cop/mixin/index_method.rb +25 -11
  9. data/lib/rubocop/cop/rails/action_filter.rb +10 -14
  10. data/lib/rubocop/cop/rails/active_record_aliases.rb +13 -17
  11. data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +19 -16
  12. data/lib/rubocop/cop/rails/active_record_override.rb +1 -1
  13. data/lib/rubocop/cop/rails/active_support_aliases.rb +12 -21
  14. data/lib/rubocop/cop/rails/after_commit_override.rb +91 -0
  15. data/lib/rubocop/cop/rails/application_controller.rb +3 -7
  16. data/lib/rubocop/cop/rails/application_job.rb +2 -1
  17. data/lib/rubocop/cop/rails/application_mailer.rb +2 -7
  18. data/lib/rubocop/cop/rails/application_record.rb +2 -7
  19. data/lib/rubocop/cop/rails/arel_star.rb +41 -0
  20. data/lib/rubocop/cop/rails/assert_not.rb +8 -10
  21. data/lib/rubocop/cop/rails/attribute_default_block_value.rb +90 -0
  22. data/lib/rubocop/cop/rails/belongs_to.rb +10 -19
  23. data/lib/rubocop/cop/rails/blank.rb +31 -27
  24. data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -1
  25. data/lib/rubocop/cop/rails/content_tag.rb +34 -19
  26. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +2 -1
  27. data/lib/rubocop/cop/rails/date.rb +10 -11
  28. data/lib/rubocop/cop/rails/default_scope.rb +11 -4
  29. data/lib/rubocop/cop/rails/delegate.rb +9 -9
  30. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +7 -8
  31. data/lib/rubocop/cop/rails/dynamic_find_by.rb +15 -12
  32. data/lib/rubocop/cop/rails/enum_hash.rb +11 -10
  33. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -1
  34. data/lib/rubocop/cop/rails/environment_comparison.rb +18 -14
  35. data/lib/rubocop/cop/rails/environment_variable_access.rb +67 -0
  36. data/lib/rubocop/cop/rails/exit.rb +4 -10
  37. data/lib/rubocop/cop/rails/file_path.rb +7 -8
  38. data/lib/rubocop/cop/rails/find_by.rb +13 -13
  39. data/lib/rubocop/cop/rails/find_by_id.rb +12 -21
  40. data/lib/rubocop/cop/rails/find_each.rb +19 -18
  41. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
  42. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +37 -10
  43. data/lib/rubocop/cop/rails/helper_instance_variable.rb +30 -2
  44. data/lib/rubocop/cop/rails/http_positional_arguments.rb +32 -21
  45. data/lib/rubocop/cop/rails/http_status.rb +7 -9
  46. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +8 -6
  47. data/lib/rubocop/cop/rails/index_by.rb +11 -2
  48. data/lib/rubocop/cop/rails/index_with.rb +11 -2
  49. data/lib/rubocop/cop/rails/inquiry.rb +7 -2
  50. data/lib/rubocop/cop/rails/inverse_of.rb +3 -2
  51. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +17 -15
  52. data/lib/rubocop/cop/rails/link_to_blank.rb +25 -23
  53. data/lib/rubocop/cop/rails/mailer_name.rb +19 -13
  54. data/lib/rubocop/cop/rails/match_route.rb +14 -13
  55. data/lib/rubocop/cop/rails/negate_include.rb +10 -8
  56. data/lib/rubocop/cop/rails/not_null_column.rb +2 -1
  57. data/lib/rubocop/cop/rails/order_by_id.rb +52 -0
  58. data/lib/rubocop/cop/rails/output.rb +5 -2
  59. data/lib/rubocop/cop/rails/output_safety.rb +3 -2
  60. data/lib/rubocop/cop/rails/pick.rb +14 -12
  61. data/lib/rubocop/cop/rails/pluck.rb +6 -9
  62. data/lib/rubocop/cop/rails/pluck_id.rb +4 -6
  63. data/lib/rubocop/cop/rails/pluck_in_where.rb +39 -5
  64. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -14
  65. data/lib/rubocop/cop/rails/presence.rb +12 -13
  66. data/lib/rubocop/cop/rails/present.rb +30 -24
  67. data/lib/rubocop/cop/rails/rake_environment.rb +8 -10
  68. data/lib/rubocop/cop/rails/read_write_attribute.rb +12 -11
  69. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +29 -31
  70. data/lib/rubocop/cop/rails/redundant_foreign_key.rb +9 -12
  71. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +11 -10
  72. data/lib/rubocop/cop/rails/reflection_class_name.rb +18 -4
  73. data/lib/rubocop/cop/rails/refute_methods.rb +9 -10
  74. data/lib/rubocop/cop/rails/relative_date_constant.rb +34 -22
  75. data/lib/rubocop/cop/rails/render_inline.rb +2 -1
  76. data/lib/rubocop/cop/rails/render_plain_text.rb +9 -14
  77. data/lib/rubocop/cop/rails/request_referer.rb +7 -7
  78. data/lib/rubocop/cop/rails/require_dependency.rb +38 -0
  79. data/lib/rubocop/cop/rails/reversible_migration.rb +83 -8
  80. data/lib/rubocop/cop/rails/reversible_migration_method_definition.rb +75 -0
  81. data/lib/rubocop/cop/rails/safe_navigation.rb +30 -11
  82. data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +5 -10
  83. data/lib/rubocop/cop/rails/save_bang.rb +19 -22
  84. data/lib/rubocop/cop/rails/scope_args.rb +2 -1
  85. data/lib/rubocop/cop/rails/short_i18n.rb +7 -9
  86. data/lib/rubocop/cop/rails/skips_model_validations.rb +4 -4
  87. data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +82 -0
  88. data/lib/rubocop/cop/rails/time_zone.rb +35 -25
  89. data/lib/rubocop/cop/rails/time_zone_assignment.rb +37 -0
  90. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +6 -6
  91. data/lib/rubocop/cop/rails/unique_validation_without_index.rb +18 -8
  92. data/lib/rubocop/cop/rails/unknown_env.rb +3 -3
  93. data/lib/rubocop/cop/rails/validation.rb +15 -14
  94. data/lib/rubocop/cop/rails/where_equals.rb +98 -0
  95. data/lib/rubocop/cop/rails/where_exists.rb +85 -16
  96. data/lib/rubocop/cop/rails/where_not.rb +101 -0
  97. data/lib/rubocop/cop/rails_cops.rb +12 -0
  98. data/lib/rubocop/rails.rb +2 -0
  99. data/lib/rubocop/rails/schema_loader.rb +4 -4
  100. data/lib/rubocop/rails/schema_loader/schema.rb +4 -8
  101. data/lib/rubocop/rails/version.rb +5 -1
  102. metadata +33 -14
@@ -13,9 +13,12 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # Rails.logger.debug 'A debug message'
16
- class Output < Cop
16
+ class Output < Base
17
17
  MSG = 'Do not write to stdout. ' \
18
18
  "Use Rails's logger if you want to log."
19
+ RESTRICT_ON_SEND = %i[
20
+ ap p pp pretty_print print puts binwrite syswrite write write_nonblock
21
+ ].freeze
19
22
 
20
23
  def_node_matcher :output?, <<~PATTERN
21
24
  (send nil? {:ap :p :pp :pretty_print :print :puts} ...)
@@ -35,7 +38,7 @@ module RuboCop
35
38
  return unless (output?(node) || io_output?(node)) &&
36
39
  node.arguments?
37
40
 
38
- add_offense(node, location: :selector)
41
+ add_offense(node.loc.selector)
39
42
  end
40
43
 
41
44
  private
@@ -62,8 +62,9 @@ module RuboCop
62
62
  # safe_join([user_content, " ", content_tag(:span, user_content)])
63
63
  # # => ActiveSupport::SafeBuffer
64
64
  # # "&lt;b&gt;hi&lt;/b&gt; <span>&lt;b&gt;hi&lt;/b&gt;</span>"
65
- class OutputSafety < Cop
65
+ class OutputSafety < Base
66
66
  MSG = 'Tagging a string as html safe may be a security risk.'
67
+ RESTRICT_ON_SEND = %i[html_safe raw safe_concat].freeze
67
68
 
68
69
  def on_send(node)
69
70
  return if non_interpolated_string?(node)
@@ -72,7 +73,7 @@ module RuboCop
72
73
  looks_like_rails_raw?(node) ||
73
74
  looks_like_rails_safe_concat?(node)
74
75
 
75
- add_offense(node, location: :selector)
76
+ add_offense(node.loc.selector)
76
77
  end
77
78
  alias on_csend on_send
78
79
 
@@ -17,10 +17,12 @@ module RuboCop
17
17
  # # good
18
18
  # Model.pick(:a)
19
19
  # [{ a: :b, c: :d }].pick(:a, :b)
20
- class Pick < Cop
20
+ class Pick < Base
21
+ extend AutoCorrector
21
22
  extend TargetRailsVersion
22
23
 
23
24
  MSG = 'Prefer `pick(%<args>s)` over `pluck(%<args>s).first`.'
25
+ RESTRICT_ON_SEND = %i[first].freeze
24
26
 
25
27
  minimum_target_rails_version 6.0
26
28
 
@@ -30,24 +32,24 @@ module RuboCop
30
32
 
31
33
  def on_send(node)
32
34
  pick_candidate?(node) do
33
- range = node.receiver.loc.selector.join(node.loc.selector)
34
- add_offense(node, location: range)
35
- end
36
- end
35
+ receiver = node.receiver
36
+ receiver_selector = receiver.loc.selector
37
+ node_selector = node.loc.selector
38
+ range = receiver_selector.join(node_selector)
37
39
 
38
- def autocorrect(node)
39
- first_range = node.receiver.source_range.end.join(node.loc.selector)
40
+ add_offense(range, message: message(receiver)) do |corrector|
41
+ first_range = receiver.source_range.end.join(node_selector)
40
42
 
41
- lambda do |corrector|
42
- corrector.remove(first_range)
43
- corrector.replace(node.receiver.loc.selector, 'pick')
43
+ corrector.remove(first_range)
44
+ corrector.replace(receiver_selector, 'pick')
45
+ end
44
46
  end
45
47
  end
46
48
 
47
49
  private
48
50
 
49
- def message(node)
50
- format(MSG, args: node.receiver.arguments.map(&:source).join(', '))
51
+ def message(receiver)
52
+ format(MSG, args: receiver.arguments.map(&:source).join(', '))
51
53
  end
52
54
  end
53
55
  end
@@ -17,7 +17,8 @@ module RuboCop
17
17
  # # good
18
18
  # Post.published.pluck(:title)
19
19
  # [{ a: :b, c: :d }].pluck(:a)
20
- class Pluck < Cop
20
+ class Pluck < Base
21
+ extend AutoCorrector
21
22
  extend TargetRailsVersion
22
23
 
23
24
  MSG = 'Prefer `pluck(:%<value>s)` over `%<method>s { |%<argument>s| %<element>s[:%<value>s] }`.'
@@ -32,15 +33,11 @@ module RuboCop
32
33
  pluck_candidate?(node) do |method, argument, element, value|
33
34
  next unless argument == element
34
35
 
35
- add_offense(node, location: offense_range(node), message: message(method, argument, element, value))
36
- end
37
- end
38
-
39
- def autocorrect(node)
40
- _method, _argument, _element, value = pluck_candidate?(node)
36
+ message = message(method, argument, element, value)
41
37
 
42
- lambda do |corrector|
43
- corrector.replace(offense_range(node), "pluck(:#{value})")
38
+ add_offense(offense_range(node), message: message) do |corrector|
39
+ corrector.replace(offense_range(node), "pluck(:#{value})")
40
+ end
44
41
  end
45
42
  end
46
43
 
@@ -22,11 +22,13 @@ module RuboCop
22
22
  # ids
23
23
  # end
24
24
  #
25
- class PluckId < Cop
25
+ class PluckId < Base
26
26
  include RangeHelp
27
27
  include ActiveRecordHelper
28
+ extend AutoCorrector
28
29
 
29
30
  MSG = 'Use `ids` instead of `%<bad_method>s`.'
31
+ RESTRICT_ON_SEND = %i[pluck].freeze
30
32
 
31
33
  def_node_matcher :pluck_id_call?, <<~PATTERN
32
34
  (send _ :pluck {(sym :id) (send nil? :primary_key)})
@@ -38,11 +40,7 @@ module RuboCop
38
40
  range = offense_range(node)
39
41
  message = format(MSG, bad_method: range.source)
40
42
 
41
- add_offense(node, location: range, message: message)
42
- end
43
-
44
- def autocorrect(node)
45
- lambda do |corrector|
43
+ add_offense(range, message: message) do |corrector|
46
44
  corrector.replace(offense_range(node), 'ids')
47
45
  end
48
46
  end
@@ -9,25 +9,59 @@ 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
14
+ # (i.e. a model class) in the `where` is used as offenses.
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.
20
+ #
12
21
  # @example
13
22
  # # bad
14
23
  # Post.where(user_id: User.active.pluck(:id))
15
24
  #
16
25
  # # good
17
26
  # Post.where(user_id: User.active.select(:id))
27
+ # Post.where(user_id: active_users.select(:id))
28
+ #
29
+ # @example EnforcedStyle: conservative (default)
30
+ # # good
31
+ # Post.where(user_id: active_users.pluck(:id))
32
+ #
33
+ # @example EnforcedStyle: aggressive
34
+ # # bad
35
+ # Post.where(user_id: active_users.pluck(:id))
18
36
  #
19
- class PluckInWhere < Cop
37
+ class PluckInWhere < Base
20
38
  include ActiveRecordHelper
39
+ include ConfigurableEnforcedStyle
40
+ extend AutoCorrector
21
41
 
22
42
  MSG = 'Use `select` instead of `pluck` within `where` query method.'
43
+ RESTRICT_ON_SEND = %i[pluck].freeze
23
44
 
24
45
  def on_send(node)
25
- add_offense(node, location: :selector) if node.method?(:pluck) && in_where?(node)
46
+ return unless in_where?(node)
47
+ return if style == :conservative && !root_receiver(node)&.const_type?
48
+
49
+ range = node.loc.selector
50
+
51
+ add_offense(range) do |corrector|
52
+ corrector.replace(range, 'select')
53
+ end
26
54
  end
27
55
 
28
- def autocorrect(node)
29
- lambda do |corrector|
30
- corrector.replace(node.loc.selector, 'select')
56
+ private
57
+
58
+ def root_receiver(node)
59
+ receiver = node.receiver
60
+
61
+ if receiver&.send_type?
62
+ root_receiver(receiver)
63
+ else
64
+ receiver
31
65
  end
32
66
  end
33
67
  end
@@ -14,7 +14,9 @@ module RuboCop
14
14
  # # good
15
15
  # 3.days.ago
16
16
  # 1.month.ago
17
- class PluralizationGrammar < Cop
17
+ class PluralizationGrammar < Base
18
+ extend AutoCorrector
19
+
18
20
  SINGULAR_DURATION_METHODS = { second: :seconds,
19
21
  minute: :minutes,
20
22
  hour: :hours,
@@ -24,21 +26,18 @@ module RuboCop
24
26
  month: :months,
25
27
  year: :years }.freeze
26
28
 
29
+ RESTRICT_ON_SEND = SINGULAR_DURATION_METHODS.keys + SINGULAR_DURATION_METHODS.values
30
+
27
31
  PLURAL_DURATION_METHODS = SINGULAR_DURATION_METHODS.invert.freeze
28
32
 
29
33
  MSG = 'Prefer `%<number>s.%<correct>s`.'
30
34
 
31
35
  def on_send(node)
32
- return unless duration_method?(node.method_name)
33
- return unless literal_number?(node.receiver)
36
+ return unless duration_method?(node.method_name) && literal_number?(node.receiver) && offense?(node)
34
37
 
35
- return unless offense?(node)
36
-
37
- add_offense(node)
38
- end
38
+ number, = *node.receiver
39
39
 
40
- def autocorrect(node)
41
- lambda do |corrector|
40
+ add_offense(node, message: message(number, node.method_name)) do |corrector|
42
41
  method_name = node.loc.selector.source
43
42
 
44
43
  corrector.replace(node.loc.selector, correct_method(method_name))
@@ -47,11 +46,8 @@ module RuboCop
47
46
 
48
47
  private
49
48
 
50
- def message(node)
51
- number, = *node.receiver
52
-
53
- format(MSG, number: number,
54
- correct: correct_method(node.method_name.to_s))
49
+ def message(number, method_name)
50
+ format(MSG, number: number, correct: correct_method(method_name))
55
51
  end
56
52
 
57
53
  def correct_method(method_name)
@@ -37,8 +37,9 @@ module RuboCop
37
37
  #
38
38
  # # good
39
39
  # a.presence || b
40
- class Presence < Cop
40
+ class Presence < Base
41
41
  include RangeHelp
42
+ extend AutoCorrector
42
43
 
43
44
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
44
45
 
@@ -76,28 +77,26 @@ module RuboCop
76
77
  return if ignore_if_node?(node)
77
78
 
78
79
  redundant_receiver_and_other(node) do |receiver, other|
79
- add_offense(node, message: message(node, receiver, other)) unless ignore_other_node?(other) || receiver.nil?
80
+ return if ignore_other_node?(other) || receiver.nil?
81
+
82
+ register_offense(node, receiver, other)
80
83
  end
81
84
 
82
85
  redundant_negative_receiver_and_other(node) do |receiver, other|
83
- add_offense(node, message: message(node, receiver, other)) unless ignore_other_node?(other) || receiver.nil?
86
+ return if ignore_other_node?(other) || receiver.nil?
87
+
88
+ register_offense(node, receiver, other)
84
89
  end
85
90
  end
86
91
 
87
- def autocorrect(node)
88
- lambda do |corrector|
89
- redundant_receiver_and_other(node) do |receiver, other|
90
- corrector.replace(node.source_range, replacement(receiver, other))
91
- end
92
+ private
92
93
 
93
- redundant_negative_receiver_and_other(node) do |receiver, other|
94
- corrector.replace(node.source_range, replacement(receiver, other))
95
- end
94
+ def register_offense(node, receiver, other)
95
+ add_offense(node, message: message(node, receiver, other)) do |corrector|
96
+ corrector.replace(node.source_range, replacement(receiver, other))
96
97
  end
97
98
  end
98
99
 
99
- private
100
-
101
100
  def ignore_if_node?(node)
102
101
  node.elsif?
103
102
  end
@@ -43,12 +43,15 @@ module RuboCop
43
43
  #
44
44
  # # good
45
45
  # something if foo.present?
46
- class Present < Cop
46
+ class Present < Base
47
+ extend AutoCorrector
48
+
47
49
  MSG_NOT_BLANK = 'Use `%<prefer>s` instead of `%<current>s`.'
48
50
  MSG_EXISTS_AND_NOT_EMPTY = 'Use `%<prefer>s` instead of ' \
49
51
  '`%<current>s`.'
50
52
  MSG_UNLESS_BLANK = 'Use `if %<prefer>s` instead of ' \
51
53
  '`%<current>s`.'
54
+ RESTRICT_ON_SEND = %i[!].freeze
52
55
 
53
56
  def_node_matcher :exists_and_not_empty?, <<~PATTERN
54
57
  (and
@@ -74,10 +77,11 @@ module RuboCop
74
77
  return unless cop_config['NotBlank']
75
78
 
76
79
  not_blank?(node) do |receiver|
77
- add_offense(node,
78
- message: format(MSG_NOT_BLANK,
79
- prefer: replacement(receiver),
80
- current: node.source))
80
+ message = format(MSG_NOT_BLANK, prefer: replacement(receiver), current: node.source)
81
+
82
+ add_offense(node, message: message) do |corrector|
83
+ autocorrect(corrector, node)
84
+ end
81
85
  end
82
86
  end
83
87
 
@@ -87,10 +91,11 @@ module RuboCop
87
91
  exists_and_not_empty?(node) do |var1, var2|
88
92
  return unless var1 == var2
89
93
 
90
- add_offense(node,
91
- message: format(MSG_EXISTS_AND_NOT_EMPTY,
92
- prefer: replacement(var1),
93
- current: node.source))
94
+ message = format(MSG_EXISTS_AND_NOT_EMPTY, prefer: replacement(var1), current: node.source)
95
+
96
+ add_offense(node, message: message) do |corrector|
97
+ autocorrect(corrector, node)
98
+ end
94
99
  end
95
100
  end
96
101
 
@@ -100,7 +105,9 @@ module RuboCop
100
105
  exists_and_not_empty?(node) do |var1, var2|
101
106
  return unless var1 == var2
102
107
 
103
- add_offense(node, message: MSG_EXISTS_AND_NOT_EMPTY)
108
+ add_offense(node, message: MSG_EXISTS_AND_NOT_EMPTY) do |corrector|
109
+ autocorrect(corrector, node)
110
+ end
104
111
  end
105
112
  end
106
113
 
@@ -113,25 +120,24 @@ module RuboCop
113
120
  range = unless_condition(node, method_call)
114
121
  msg = format(MSG_UNLESS_BLANK, prefer: replacement(receiver),
115
122
  current: range.source)
116
- add_offense(node, location: range, message: msg)
123
+ add_offense(range, message: msg) do |corrector|
124
+ autocorrect(corrector, node)
125
+ end
117
126
  end
118
127
  end
119
128
 
120
- def autocorrect(node)
121
- lambda do |corrector|
122
- method_call, variable1 = unless_blank?(node)
123
-
124
- if method_call
125
- corrector.replace(node.loc.keyword, 'if')
126
- range = method_call.loc.expression
127
- else
128
- variable1, _variable2 =
129
- exists_and_not_empty?(node) || not_blank?(node)
130
- range = node.loc.expression
131
- end
129
+ def autocorrect(corrector, node)
130
+ method_call, variable1 = unless_blank?(node)
132
131
 
133
- corrector.replace(range, replacement(variable1))
132
+ if method_call
133
+ corrector.replace(node.loc.keyword, 'if')
134
+ range = method_call.loc.expression
135
+ else
136
+ variable1, _variable2 = exists_and_not_empty?(node) || not_blank?(node)
137
+ range = node.loc.expression
134
138
  end
139
+
140
+ corrector.replace(range, replacement(variable1))
135
141
  end
136
142
 
137
143
  private
@@ -25,7 +25,9 @@ module RuboCop
25
25
  # do_something
26
26
  # end
27
27
  #
28
- class RakeEnvironment < Cop
28
+ class RakeEnvironment < Base
29
+ extend AutoCorrector
30
+
29
31
  MSG = 'Include `:environment` task as a dependency for all Rake tasks.'
30
32
 
31
33
  def_node_matcher :task_definition?, <<~PATTERN
@@ -37,16 +39,12 @@ module RuboCop
37
39
  return if task_name(task_method) == :default
38
40
  return if with_dependencies?(task_method)
39
41
 
40
- add_offense(task_method)
41
- end
42
- end
42
+ add_offense(task_method) do |corrector|
43
+ task_name = task_method.arguments[0]
44
+ task_dependency = correct_task_dependency(task_name)
43
45
 
44
- def autocorrect(node)
45
- lambda do |corrector|
46
- task_name = node.arguments[0]
47
- task_dependency = correct_task_dependency(task_name)
48
-
49
- corrector.replace(task_name.loc.expression, task_dependency)
46
+ corrector.replace(task_name.loc.expression, task_dependency)
47
+ end
50
48
  end
51
49
  end
52
50