class RuboCop::Cop::Faker::DeprecatedArguments


Avatar.image(slug: slug, size: size, format: format)
# good
Avatar.image(slug, size, format)
# bad
@example
Use keyword arguments instead of positional arguments.
Checks that Faker arguments style is based on Faker 2.

def add_offense_for_arguments(node, argument, message)

def add_offense_for_arguments(node, argument, message)
  add_offense(
    argument,
    message: message
  ) do |corrector|
    autocorrect(corrector, node)
  end
end

def argument_keywords

def argument_keywords
  cop_config.fetch('ArgumentKeywords')
# Workaround for a problem that config/default.yml setting is not applied
# if .rubocop.yml does not exist when `rubocop --require rubocop-faker`
# option is used.
rescue KeyError
  config = File.read(
    File.join(File.dirname(__FILE__), '../../../../config/default.yml')
  )
  yaml = YAML.safe_load(config)
  yaml[cop_name].fetch('ArgumentKeywords', {})
end

def arguments_range(node)

def arguments_range(node)
  arguments = node.arguments
  range_between(
    arguments.first.source_range.begin_pos,
    arguments.last.source_range.end_pos
  )
end

def autocorrect(corrector, node)

def autocorrect(corrector, node)
  methods = argument_keywords[faker_class_name(node)]
  keywords = methods[node.method_name.to_s]
  kwargs = build_kwargs_style(node, keywords)
  corrector.replace(arguments_range(node), kwargs)
end

def build_kwargs_style(node, keywords)

def build_kwargs_style(node, keywords)
  node.arguments.map.with_index do |positional_argument, index|
    if positional_argument.hash_type?
      positional_argument.source
    else
      "#{keywords[index]}: #{positional_argument.source}"
    end
  end.join(', ')
end

def faker_class_name(node)

def faker_class_name(node)
  if node.children.first.send_type? && node.children.first.method?(:unique)
    node.children.first.receiver.source
  else
    node.receiver.source
  end
end

def format_message(keyword:, arg:, index:, class_name:, method_name:)

def format_message(keyword:, arg:, index:, class_name:, method_name:)
  i = case index
      when 0 then '1st'
      when 1 then '2nd'
      when 2 then '3rd'
      else "#{index + 1}th"
      end
  format(
    MSG,
    keyword: keyword,
    arg: arg,
    index: i,
    class_name: class_name,
    method_name: method_name
  )
end

def on_send(node)

def on_send(node)
  return unless node.receiver
  class_name = faker_class_name(node)
  return unless (methods = argument_keywords[class_name])
  node = node.parent if unique_generator_method?(node)
  return unless (keywords = methods[node.method_name.to_s])
  node.arguments.each_with_index do |argument, index|
    next if argument.hash_type?
    message = format_message(
      keyword: keywords[index], arg: argument.source,
      class_name: class_name, index: index,
      method_name: node.method_name
    )
    add_offense_for_arguments(node, argument, message)
  end
end

def unique_generator_method?(node)

def unique_generator_method?(node)
  node.method?(:unique) && node.arguments.empty?
end