class MaleOrFemale::Detector

Public Class Methods

new(name, options = {}) click to toggle source
# File lib/male_or_female.rb, line 20
def initialize(name, options = {})
  source = options[:source] || 'compiled'
  @name = prepare_name(name)
  @data = load_data(@name[0], source.to_sym)
  @result = detect
end

Public Instance Methods

format() click to toggle source
# File lib/male_or_female.rb, line 33
def format
  result = nil
  FORMATS.each { |format| return format if @result =~ /[_](#{format})/i }
  result.nil? ? UNKNOWN : result
end
gender() click to toggle source
# File lib/male_or_female.rb, line 27
def gender
  result = nil
  GENDERS.each { |gender| result = gender if @result =~ /(\s|^)(#{gender})[_]/i  }
  result.nil? ? UNKNOWN : result
end

Private Instance Methods

detect() click to toggle source

Проверет имя (возьмет первую букву от имени, проверит значение в в хеше @data).

Вернет: 'male_formal', 'female_formal', 'unisex' etc.

# File lib/male_or_female.rb, line 59
def detect
  result = nil

  return result if @data.nil? || @data[@name[0]].nil?

  # ["male_formal", "Август Авдей Аверкий ... "]
  @data[@name[0]].each do |sex|
    next if sex[1].nil?
    result = sex[0] if sex[1] =~ /(\s|^)(#{@name})(\s|$)/i
  end
  result
end
load_data(letter, source = :source) click to toggle source

PRIVATE

# File lib/male_or_female.rb, line 42
def load_data(letter, source = :source)
  case source
    when :source
      source = "#{SOURCE_DIR}/ru/#{UnicodeUtils.downcase(letter)}.yaml"
      return nil unless File.exist?(source)
      YAML.load_file(File.open(source))
    when :compiled
      YAML.load_file(File.open("#{COMPILED_DIR}/ru.yaml"))
    else
      raise ArgumentError.new("Invalid source option: #{source}")
  end
end
prepare_name(name) click to toggle source
# File lib/male_or_female.rb, line 72
def prepare_name(name)
  name = UnicodeUtils.downcase(name).strip
  name = name.gsub(/[ё]/i, 'е')
  name[0] = UnicodeUtils.upcase(name[0])
  name
rescue
  raise ArgumentError.new('Name should be a string')
end