rubocop-rails 2.6.0 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -0
  3. data/config/default.yml +189 -6
  4. data/lib/rubocop/cop/mixin/active_record_helper.rb +12 -3
  5. data/lib/rubocop/cop/mixin/enforce_superclass.rb +40 -0
  6. data/lib/rubocop/cop/mixin/index_method.rb +25 -11
  7. data/lib/rubocop/cop/rails/action_filter.rb +10 -14
  8. data/lib/rubocop/cop/rails/active_record_aliases.rb +13 -17
  9. data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +148 -0
  10. data/lib/rubocop/cop/rails/active_record_override.rb +1 -1
  11. data/lib/rubocop/cop/rails/active_support_aliases.rb +12 -21
  12. data/lib/rubocop/cop/rails/after_commit_override.rb +91 -0
  13. data/lib/rubocop/cop/rails/application_controller.rb +3 -7
  14. data/lib/rubocop/cop/rails/application_job.rb +2 -1
  15. data/lib/rubocop/cop/rails/application_mailer.rb +2 -7
  16. data/lib/rubocop/cop/rails/application_record.rb +2 -7
  17. data/lib/rubocop/cop/rails/arel_star.rb +41 -0
  18. data/lib/rubocop/cop/rails/assert_not.rb +8 -10
  19. data/lib/rubocop/cop/rails/attribute_default_block_value.rb +90 -0
  20. data/lib/rubocop/cop/rails/belongs_to.rb +9 -18
  21. data/lib/rubocop/cop/rails/blank.rb +27 -27
  22. data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -1
  23. data/lib/rubocop/cop/rails/content_tag.rb +20 -33
  24. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +2 -1
  25. data/lib/rubocop/cop/rails/date.rb +10 -11
  26. data/lib/rubocop/cop/rails/default_scope.rb +61 -0
  27. data/lib/rubocop/cop/rails/delegate.rb +10 -10
  28. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +7 -8
  29. data/lib/rubocop/cop/rails/dynamic_find_by.rb +13 -11
  30. data/lib/rubocop/cop/rails/enum_hash.rb +11 -10
  31. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -1
  32. data/lib/rubocop/cop/rails/environment_comparison.rb +18 -14
  33. data/lib/rubocop/cop/rails/exit.rb +4 -10
  34. data/lib/rubocop/cop/rails/file_path.rb +5 -4
  35. data/lib/rubocop/cop/rails/find_by.rb +13 -13
  36. data/lib/rubocop/cop/rails/find_by_id.rb +94 -0
  37. data/lib/rubocop/cop/rails/find_each.rb +16 -14
  38. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
  39. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +4 -7
  40. data/lib/rubocop/cop/rails/helper_instance_variable.rb +4 -2
  41. data/lib/rubocop/cop/rails/http_positional_arguments.rb +25 -21
  42. data/lib/rubocop/cop/rails/http_status.rb +7 -9
  43. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +8 -6
  44. data/lib/rubocop/cop/rails/index_by.rb +11 -2
  45. data/lib/rubocop/cop/rails/index_with.rb +11 -2
  46. data/lib/rubocop/cop/rails/inquiry.rb +39 -0
  47. data/lib/rubocop/cop/rails/inverse_of.rb +3 -2
  48. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +17 -15
  49. data/lib/rubocop/cop/rails/link_to_blank.rb +20 -20
  50. data/lib/rubocop/cop/rails/mailer_name.rb +86 -0
  51. data/lib/rubocop/cop/rails/match_route.rb +120 -0
  52. data/lib/rubocop/cop/rails/negate_include.rb +41 -0
  53. data/lib/rubocop/cop/rails/not_null_column.rb +2 -1
  54. data/lib/rubocop/cop/rails/order_by_id.rb +52 -0
  55. data/lib/rubocop/cop/rails/output.rb +5 -2
  56. data/lib/rubocop/cop/rails/output_safety.rb +3 -2
  57. data/lib/rubocop/cop/rails/pick.rb +21 -15
  58. data/lib/rubocop/cop/rails/pluck.rb +56 -0
  59. data/lib/rubocop/cop/rails/pluck_id.rb +56 -0
  60. data/lib/rubocop/cop/rails/pluck_in_where.rb +70 -0
  61. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -14
  62. data/lib/rubocop/cop/rails/presence.rb +12 -13
  63. data/lib/rubocop/cop/rails/present.rb +30 -24
  64. data/lib/rubocop/cop/rails/rake_environment.rb +9 -11
  65. data/lib/rubocop/cop/rails/read_write_attribute.rb +12 -11
  66. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +29 -31
  67. data/lib/rubocop/cop/rails/redundant_foreign_key.rb +9 -12
  68. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +11 -10
  69. data/lib/rubocop/cop/rails/reflection_class_name.rb +4 -3
  70. data/lib/rubocop/cop/rails/refute_methods.rb +9 -10
  71. data/lib/rubocop/cop/rails/relative_date_constant.rb +20 -9
  72. data/lib/rubocop/cop/rails/render_inline.rb +41 -0
  73. data/lib/rubocop/cop/rails/render_plain_text.rb +71 -0
  74. data/lib/rubocop/cop/rails/request_referer.rb +7 -7
  75. data/lib/rubocop/cop/rails/reversible_migration.rb +82 -7
  76. data/lib/rubocop/cop/rails/safe_navigation.rb +12 -11
  77. data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +5 -10
  78. data/lib/rubocop/cop/rails/save_bang.rb +19 -22
  79. data/lib/rubocop/cop/rails/scope_args.rb +2 -1
  80. data/lib/rubocop/cop/rails/short_i18n.rb +74 -0
  81. data/lib/rubocop/cop/rails/skips_model_validations.rb +46 -11
  82. data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +82 -0
  83. data/lib/rubocop/cop/rails/time_zone.rb +22 -20
  84. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +10 -10
  85. data/lib/rubocop/cop/rails/unique_validation_without_index.rb +18 -8
  86. data/lib/rubocop/cop/rails/unknown_env.rb +15 -4
  87. data/lib/rubocop/cop/rails/validation.rb +15 -14
  88. data/lib/rubocop/cop/rails/where_equals.rb +94 -0
  89. data/lib/rubocop/cop/rails/where_exists.rb +126 -0
  90. data/lib/rubocop/cop/rails/where_not.rb +97 -0
  91. data/lib/rubocop/cop/rails_cops.rb +22 -0
  92. data/lib/rubocop/rails/schema_loader.rb +4 -4
  93. data/lib/rubocop/rails/schema_loader/schema.rb +5 -5
  94. data/lib/rubocop/rails/version.rb +5 -1
  95. metadata +37 -9
@@ -16,7 +16,8 @@ module RuboCop
16
16
  # class Rails4Model < ActiveRecord::Base
17
17
  # # ...
18
18
  # end
19
- class ApplicationRecord < Cop
19
+ class ApplicationRecord < Base
20
+ extend AutoCorrector
20
21
  extend TargetRailsVersion
21
22
 
22
23
  minimum_target_rails_version 5.0
@@ -28,12 +29,6 @@ module RuboCop
28
29
  # rubocop:disable Layout/ClassStructure
29
30
  include RuboCop::Cop::EnforceSuperclass
30
31
  # rubocop:enable Layout/ClassStructure
31
-
32
- def autocorrect(node)
33
- lambda do |corrector|
34
- corrector.replace(node.source_range, self.class::SUPERCLASS)
35
- end
36
- end
37
32
  end
38
33
  end
39
34
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop prevents usage of `"*"` on an Arel::Table column reference.
7
+ #
8
+ # Using `arel_table["*"]` causes the outputted string to be a literal
9
+ # quoted asterisk (e.g. <tt>`my_model`.`*`</tt>). This causes the
10
+ # database to look for a column named <tt>`*`</tt> (or `"*"`) as opposed
11
+ # to expanding the column list as one would likely expect.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # MyTable.arel_table["*"]
16
+ #
17
+ # # good
18
+ # MyTable.arel_table[Arel.star]
19
+ #
20
+ class ArelStar < Base
21
+ extend AutoCorrector
22
+
23
+ MSG = 'Use `Arel.star` instead of `"*"` for expanded column lists.'
24
+
25
+ RESTRICT_ON_SEND = %i[[]].freeze
26
+
27
+ def_node_matcher :star_bracket?, <<~PATTERN
28
+ (send {const (send _ :arel_table)} :[] $(str "*"))
29
+ PATTERN
30
+
31
+ def on_send(node)
32
+ return unless (star = star_bracket?(node))
33
+
34
+ add_offense(star) do |corrector|
35
+ corrector.replace(star.loc.expression, 'Arel.star')
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -13,23 +13,21 @@ module RuboCop
13
13
  # # good
14
14
  # assert_not x
15
15
  #
16
- class AssertNot < RuboCop::Cop::Cop
16
+ class AssertNot < Base
17
+ extend AutoCorrector
18
+
17
19
  MSG = 'Prefer `assert_not` over `assert !`.'
20
+ RESTRICT_ON_SEND = %i[assert].freeze
18
21
 
19
22
  def_node_matcher :offensive?, '(send nil? :assert (send ... :!) ...)'
20
23
 
21
24
  def on_send(node)
22
- add_offense(node) if offensive?(node)
23
- end
25
+ return unless offensive?(node)
24
26
 
25
- def autocorrect(node)
26
- expression = node.loc.expression
27
+ add_offense(node) do |corrector|
28
+ expression = node.loc.expression
27
29
 
28
- lambda do |corrector|
29
- corrector.replace(
30
- expression,
31
- corrected_source(expression.source)
32
- )
30
+ corrector.replace(expression, corrected_source(expression.source))
33
31
  end
34
32
  end
35
33
 
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop looks for `attribute` class methods that specify a `:default` option
7
+ # which value is an array, string literal or method call without a block.
8
+ # It will accept all other values, such as string, symbol, integer and float literals
9
+ # as well as constants.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # class User < ApplicationRecord
14
+ # attribute :confirmed_at, :datetime, default: Time.zone.now
15
+ # end
16
+ #
17
+ # # good
18
+ # class User < ApplicationRecord
19
+ # attribute :confirmed_at, :datetime, default: -> { Time.zone.now }
20
+ # end
21
+ #
22
+ # # bad
23
+ # class User < ApplicationRecord
24
+ # attribute :roles, :string, array: true, default: []
25
+ # end
26
+ #
27
+ # # good
28
+ # class User < ApplicationRecord
29
+ # attribute :roles, :string, array: true, default: -> { [] }
30
+ # end
31
+ #
32
+ # # bad
33
+ # class User < ApplicationRecord
34
+ # attribute :configuration, default: {}
35
+ # end
36
+ #
37
+ # # good
38
+ # class User < ApplicationRecord
39
+ # attribute :configuration, default: -> { {} }
40
+ # end
41
+ #
42
+ # # good
43
+ # class User < ApplicationRecord
44
+ # attribute :role, :string, default: :customer
45
+ # end
46
+ #
47
+ # # good
48
+ # class User < ApplicationRecord
49
+ # attribute :activated, :boolean, default: false
50
+ # end
51
+ #
52
+ # # good
53
+ # class User < ApplicationRecord
54
+ # attribute :login_count, :integer, default: 0
55
+ # end
56
+ #
57
+ # # good
58
+ # class User < ApplicationRecord
59
+ # FOO = 123
60
+ # attribute :custom_attribute, :integer, default: FOO
61
+ # end
62
+ class AttributeDefaultBlockValue < Base
63
+ extend AutoCorrector
64
+
65
+ MSG = 'Pass method in a block to `:default` option.'
66
+ RESTRICT_ON_SEND = %i[attribute].freeze
67
+ TYPE_OFFENDERS = %i[send array hash].freeze
68
+
69
+ def_node_matcher :default_attribute, <<~PATTERN
70
+ (send nil? :attribute _ ?_ (hash <$#attribute ...>))
71
+ PATTERN
72
+
73
+ def_node_matcher :attribute, '(pair (sym :default) $_)'
74
+
75
+ def on_send(node)
76
+ default_attribute(node) do |attribute|
77
+ value = attribute.children.last
78
+ return unless TYPE_OFFENDERS.any? { |type| value.type == type }
79
+
80
+ add_offense(value) do |corrector|
81
+ expression = default_attribute(node).children.last
82
+
83
+ corrector.replace(value, "-> { #{expression.source} }")
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -50,7 +50,8 @@ module RuboCop
50
50
  #
51
51
  # @see https://guides.rubyonrails.org/5_0_release_notes.html
52
52
  # @see https://github.com/rails/rails/pull/18937
53
- class BelongsTo < Cop
53
+ class BelongsTo < Base
54
+ extend AutoCorrector
54
55
  extend TargetRailsVersion
55
56
 
56
57
  minimum_target_rails_version 5.0
@@ -64,6 +65,7 @@ module RuboCop
64
65
  'option is deprecated and you want to use `optional: false`. ' \
65
66
  'In most configurations, this is the default and you can omit ' \
66
67
  'this option altogether'
68
+ RESTRICT_ON_SEND = %i[belongs_to].freeze
67
69
 
68
70
  def_node_matcher :match_belongs_to_with_options, <<~PATTERN
69
71
  (send _ :belongs_to _
@@ -72,27 +74,16 @@ module RuboCop
72
74
  PATTERN
73
75
 
74
76
  def on_send(node)
75
- match_belongs_to_with_options(node) do |_option_node, option_value|
76
- message =
77
+ match_belongs_to_with_options(node) do |option_node, option_value|
78
+ message, replacement =
77
79
  if option_value.true_type?
78
- SUPERFLOUS_REQUIRE_TRUE_MSG
80
+ [SUPERFLOUS_REQUIRE_TRUE_MSG, 'optional: false']
79
81
  elsif option_value.false_type?
80
- SUPERFLOUS_REQUIRE_FALSE_MSG
82
+ [SUPERFLOUS_REQUIRE_FALSE_MSG, 'optional: true']
81
83
  end
82
84
 
83
- add_offense(node, message: message, location: :selector)
84
- end
85
- end
86
-
87
- def autocorrect(node)
88
- option_node, option_value = match_belongs_to_with_options(node)
89
- return unless option_node
90
-
91
- lambda do |corrector|
92
- if option_value.true_type?
93
- corrector.replace(option_node.loc.expression, 'optional: false')
94
- elsif option_value.false_type?
95
- corrector.replace(option_node.loc.expression, 'optional: true')
85
+ add_offense(node.loc.selector, message: message) do |corrector|
86
+ corrector.replace(option_node.loc.expression, replacement)
96
87
  end
97
88
  end
98
89
  end
@@ -53,11 +53,14 @@ module RuboCop
53
53
  # def blank?
54
54
  # !present?
55
55
  # end
56
- class Blank < Cop
56
+ class Blank < Base
57
+ extend AutoCorrector
58
+
57
59
  MSG_NIL_OR_EMPTY = 'Use `%<prefer>s` instead of `%<current>s`.'
58
60
  MSG_NOT_PRESENT = 'Use `%<prefer>s` instead of `%<current>s`.'
59
61
  MSG_UNLESS_PRESENT = 'Use `if %<prefer>s` instead of ' \
60
62
  '`%<current>s`.'
63
+ RESTRICT_ON_SEND = %i[!].freeze
61
64
 
62
65
  # `(send nil $_)` is not actually a valid match for an offense. Nodes
63
66
  # that have a single method call on the left hand side
@@ -93,10 +96,10 @@ module RuboCop
93
96
  # accepts !present? if its in the body of a `blank?` method
94
97
  next if defining_blank?(node.parent)
95
98
 
96
- add_offense(node,
97
- message: format(MSG_NOT_PRESENT,
98
- prefer: replacement(receiver),
99
- current: node.source))
99
+ message = format(MSG_NOT_PRESENT, prefer: replacement(receiver), current: node.source)
100
+ add_offense(node, message: message) do |corrector|
101
+ autocorrect(corrector, node)
102
+ end
100
103
  end
101
104
  end
102
105
 
@@ -106,10 +109,10 @@ module RuboCop
106
109
  nil_or_empty?(node) do |var1, var2|
107
110
  return unless var1 == var2
108
111
 
109
- add_offense(node,
110
- message: format(MSG_NIL_OR_EMPTY,
111
- prefer: replacement(var1),
112
- current: node.source))
112
+ message = format(MSG_NIL_OR_EMPTY, prefer: replacement(var1), current: node.source)
113
+ add_offense(node, message: message) do |corrector|
114
+ autocorrect(corrector, node)
115
+ end
113
116
  end
114
117
  end
115
118
 
@@ -121,31 +124,28 @@ module RuboCop
121
124
  unless_present?(node) do |method_call, receiver|
122
125
  range = unless_condition(node, method_call)
123
126
 
124
- add_offense(node,
125
- location: range,
126
- message: format(MSG_UNLESS_PRESENT,
127
- prefer: replacement(receiver),
128
- current: range.source))
127
+ message = format(MSG_UNLESS_PRESENT, prefer: replacement(receiver), current: range.source)
128
+ add_offense(range, message: message) do |corrector|
129
+ autocorrect(corrector, node)
130
+ end
129
131
  end
130
132
  end
131
133
 
132
- def autocorrect(node)
133
- lambda do |corrector|
134
- method_call, variable1 = unless_present?(node)
134
+ private
135
135
 
136
- if method_call
137
- corrector.replace(node.loc.keyword, 'if')
138
- range = method_call.loc.expression
139
- else
140
- variable1, _variable2 = nil_or_empty?(node) || not_present?(node)
141
- range = node.loc.expression
142
- end
136
+ def autocorrect(corrector, node)
137
+ method_call, variable1 = unless_present?(node)
143
138
 
144
- corrector.replace(range, replacement(variable1))
139
+ if method_call
140
+ corrector.replace(node.loc.keyword, 'if')
141
+ range = method_call.loc.expression
142
+ else
143
+ variable1, _variable2 = nil_or_empty?(node) || not_present?(node)
144
+ range = node.loc.expression
145
145
  end
146
- end
147
146
 
148
- private
147
+ corrector.replace(range, replacement(variable1))
148
+ end
149
149
 
150
150
  def unless_condition(node, method_call)
151
151
  if node.modifier_form?
@@ -65,7 +65,7 @@ module RuboCop
65
65
  #
66
66
  # @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table
67
67
  # @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html
68
- class BulkChangeTable < Cop
68
+ class BulkChangeTable < Base
69
69
  MSG_FOR_CHANGE_TABLE = <<~MSG.chomp
70
70
  You can combine alter queries using `bulk: true` options.
71
71
  MSG
@@ -18,63 +18,50 @@ module RuboCop
18
18
  # tag.p('Hello world!')
19
19
  # tag.br
20
20
  # content_tag(name, 'Hello world!')
21
- class ContentTag < Cop
21
+ class ContentTag < Base
22
22
  include RangeHelp
23
+ extend AutoCorrector
23
24
  extend TargetRailsVersion
24
25
 
25
26
  minimum_target_rails_version 5.1
26
27
 
27
28
  MSG = 'Use `tag` instead of `content_tag`.'
29
+ RESTRICT_ON_SEND = %i[content_tag].freeze
28
30
 
29
31
  def on_send(node)
30
- return unless node.method?(:content_tag)
31
-
32
32
  first_argument = node.first_argument
33
33
  return unless first_argument
34
34
 
35
35
  return if first_argument.variable? || first_argument.send_type? || first_argument.const_type?
36
36
 
37
- add_offense(node)
38
- end
39
-
40
- def autocorrect(node)
41
- lambda do |corrector|
42
- if method_name?(node.first_argument)
43
- replace_method_with_tag_method(corrector, node)
44
- remove_first_argument(corrector, node)
45
- else
46
- corrector.replace(node.loc.selector, 'tag')
47
- end
37
+ add_offense(node) do |corrector|
38
+ autocorrect(corrector, node)
48
39
  end
49
40
  end
50
41
 
51
42
  private
52
43
 
53
- def method_name?(node)
54
- return false unless node.str_type? || node.sym_type?
44
+ def autocorrect(corrector, node)
45
+ if method_name?(node.first_argument)
46
+ range = correction_range(node)
55
47
 
56
- /^[a-zA-Z_][a-zA-Z_0-9]*$/.match?(node.value)
57
- end
48
+ rest_args = node.arguments.drop(1)
49
+ replacement = "tag.#{node.first_argument.value.to_s.underscore}(#{rest_args.map(&:source).join(', ')})"
58
50
 
59
- def replace_method_with_tag_method(corrector, node)
60
- corrector.replace(
61
- node.loc.selector,
62
- "tag.#{node.first_argument.value}"
63
- )
51
+ corrector.replace(range, replacement)
52
+ else
53
+ corrector.replace(node.loc.selector, 'tag')
54
+ end
64
55
  end
65
56
 
66
- def remove_first_argument(corrector, node)
67
- if node.arguments.length > 1
68
- corrector.remove(
69
- range_between(child_node_beg(node, 0), child_node_beg(node, 1))
70
- )
71
- elsif node.arguments.length == 1
72
- corrector.remove(node.arguments[0].loc.expression)
73
- end
57
+ def method_name?(node)
58
+ return false unless node.str_type? || node.sym_type?
59
+
60
+ /^[a-zA-Z_][a-zA-Z_\-0-9]*$/.match?(node.value)
74
61
  end
75
62
 
76
- def child_node_beg(node, index)
77
- node.arguments[index].loc.expression.begin_pos
63
+ def correction_range(node)
64
+ range_between(node.loc.selector.begin_pos, node.loc.expression.end_pos)
78
65
  end
79
66
  end
80
67
  end
@@ -40,8 +40,9 @@ module RuboCop
40
40
  #
41
41
  # t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP' }
42
42
  # end
43
- class CreateTableWithTimestamps < Cop
43
+ class CreateTableWithTimestamps < Base
44
44
  MSG = 'Add timestamps when creating a new table.'
45
+ RESTRICT_ON_SEND = %i[create_table].freeze
45
46
 
46
47
  def_node_matcher :create_table_with_block?, <<~PATTERN
47
48
  (block
@@ -43,7 +43,7 @@ module RuboCop
43
43
  # Date.yesterday
44
44
  # date.in_time_zone
45
45
  #
46
- class Date < Cop
46
+ class Date < Base
47
47
  include ConfigurableEnforcedStyle
48
48
 
49
49
  MSG = 'Do not use `Date.%<method_called>s` without zone. Use ' \
@@ -52,6 +52,8 @@ module RuboCop
52
52
  MSG_SEND = 'Do not use `%<method>s` on Date objects, because they ' \
53
53
  'know nothing about the time zone in use.'
54
54
 
55
+ RESTRICT_ON_SEND = %i[to_time to_time_in_current_zone].freeze
56
+
55
57
  BAD_DAYS = %i[today current yesterday tomorrow].freeze
56
58
 
57
59
  DEPRECATED_METHODS = [
@@ -76,8 +78,7 @@ module RuboCop
76
78
 
77
79
  check_deprecated_methods(node)
78
80
 
79
- add_offense(node, location: :selector,
80
- message: format(MSG_SEND, method: node.method_name))
81
+ add_offense(node.loc.selector, message: format(MSG_SEND, method: node.method_name))
81
82
  end
82
83
  alias on_csend on_send
83
84
 
@@ -87,10 +88,9 @@ module RuboCop
87
88
  DEPRECATED_METHODS.each do |method|
88
89
  next unless node.method?(method[:deprecated].to_sym)
89
90
 
90
- add_offense(node, location: :selector,
91
- message: format(DEPRECATED_MSG,
92
- deprecated: method[:deprecated],
93
- relevant: method[:relevant]))
91
+ message = format(DEPRECATED_MSG, deprecated: method[:deprecated], relevant: method[:relevant])
92
+
93
+ add_offense(node.loc.selector, message: message)
94
94
  end
95
95
  end
96
96
 
@@ -104,10 +104,9 @@ module RuboCop
104
104
  day = method_name
105
105
  day = 'today' if method_name == 'current'
106
106
 
107
- add_offense(node, location: :selector,
108
- message: format(MSG,
109
- method_called: method_name,
110
- day: day))
107
+ message = format(MSG, method_called: method_name, day: day)
108
+
109
+ add_offense(node.loc.selector, message: message)
111
110
  end
112
111
 
113
112
  def extract_method_chain(node)