Class: RuboCop::Cop::Rails::ActiveSupportAliases

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/rails/active_support_aliases.rb

Overview

Checks that ActiveSupport aliases to core ruby methods are not used.

Examples:

# good
'some_string'.start_with?('prefix')
'some_string'.end_with?('suffix')
[1, 2, 'a'] << 'b'
[1, 2, 'a'].unshift('b')

# bad
'some_string'.starts_with?('prefix')
'some_string'.ends_with?('suffix')
[1, 2, 'a'].append('b')
[1, 2, 'a'].prepend('b')

Constant Summary collapse

MSG =
'Use `%<prefer>s` instead of `%<current>s`.'
RESTRICT_ON_SEND =
%i[starts_with? ends_with? append prepend].freeze
ALIASES =
{
  starts_with?: {
    original: :start_with?, matcher: '(call str :starts_with? _)'
  },
  ends_with?: {
    original: :end_with?, matcher: '(call str :ends_with? _)'
  },
  append: { original: :<<, matcher: '(call array :append _)' },
  prepend: { original: :unshift, matcher: '(call array :prepend _)' }
}.freeze

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object Also known as: on_csend



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/rubocop/cop/rails/active_support_aliases.rb', line 43

def on_send(node)
  ALIASES.each_key do |aliased_method|
    next unless public_send(aliased_method, node)

    preferred_method = ALIASES[aliased_method][:original]
    message = format(MSG, prefer: preferred_method, current: aliased_method)

    add_offense(node.loc.selector.join(node.source_range.end), message: message) do |corrector|
      next if append(node)

      corrector.replace(node.loc.selector, preferred_method)
    end
  end
end