class Gendered::Guesser

Constants

ENDPOINT
USAGE_HEADERS

Attributes

names[RW]
options[RW]
usage[R]

Public Class Methods

new(names, options = {}) click to toggle source
# File lib/gendered/guesser.rb, line 15
def initialize(names, options = {})
  @names = Array(names)
  raise ArgumentError, "names cannot be empty" if @names.empty?

  @options = Gendered.config.merge(options || {})
  @options[:connection] ||= {}
  @usage = { :limit => nil, :remaining => nil, :reset => nil }
end

Public Instance Methods

guess!() click to toggle source
# File lib/gendered/guesser.rb, line 24
def guess!
  response = request(request_options)
  update_usage(response)
  body = parse(response.body)
  case response.code
  when 200
    create_names(body)
  when 429
    raise RateLimitError.new(body["error"], *@usage.values_at(:limit, :remaining, :reset))
  else
    raise GenderedError.new(body["error"])
  end
end

Private Instance Methods

create_names(guesses) click to toggle source
# File lib/gendered/guesser.rb, line 44
def create_names(guesses)
  names.collect do |name|
    name = Name.new(name) if name.is_a?(String)
    guess = case
            when guesses.is_a?(Array)
              guesses.find { |g| g["name"] == name.value }
            else
              guesses
            end

    if guess["gender"]
      name.gender = guess["gender"].to_sym
      name.probability = guess["probability"]
      name.sample_size = guess["count"]
    end

    name
  end
end
parse(response) click to toggle source
# File lib/gendered/guesser.rb, line 78
def parse(response)
  JSON.parse(response)
rescue JSON::ParserError => e
  raise GenderedError, "cannot parse response JSON: #{e}"
end
request(options) click to toggle source
# File lib/gendered/guesser.rb, line 72
def request(options)
  HTTP.get(ENDPOINT, options)
rescue => e
  raise GenderedError, "request failed: #{e}"
end
request_options() click to toggle source
# File lib/gendered/guesser.rb, line 64
def request_options
  options = {}
  options[:params] = @options.reject { |k, v| k == :connection || v.nil? }
  options[:params]["name[]"] = @names
  options[:connection] = @options[:connection] unless @options[:connection].empty?
  options
end
update_usage(response) click to toggle source
# File lib/gendered/guesser.rb, line 40
def update_usage(response)
  USAGE_HEADERS.each { |header, key| @usage[key] = response[header].to_i }
end