module Petrovich::Gender

Methods of determining gender by the name

Public Class Methods

detect(name) click to toggle source
# File lib/petrovich/gender.rb, line 4
def self.detect(name)
  # Accept hash and convert it to ostruct object
  name     = Petrovich.normalize_name(name)
  rule_set = Petrovich.rule_set
  genders  = {}

  Petrovich.assert_name!(name)

  [:lastname, :firstname, :middlename].each do |name_part|
    next unless name.respond_to?(name_part) && name.send(name_part)

    rules = rule_set.find_all_gender_rules(name.send(name_part), name_part)

    rules.each do |rule|
      genders[name_part] = rule.nil? ? :androgynous : rule.gender
    end
  end

  # Return gender if middlename is specified and gender is determined.
  return genders[:middlename] if genders[:middlename] && genders[:middlename] != :androgynous

  if genders.values.uniq.size > 1
    if genders[:firstname] != :androgynous && genders[:lastname] == :androgynous
      return genders[:firstname]
    end

    if genders[:lastname] != :androgynous && genders[:firstname] == :androgynous
      return genders[:lastname]
    end
  end

  # Otherwise, it returns what recognized
  return genders.values.uniq.first if genders.values.uniq.size == 1
end