class Object

Constants

REALISTIC_RUSSIAN_FEMALE_FIRST_NAMES

(see realistic_russian_female_first_names)

REALISTIC_RUSSIAN_MALE_FIRST_NAMES

(see realistic_russian_male_first_names)

REALISTIC_RUSSIAN_MALE_LAST_NAMES

(see realistic_russian_male_last_names)

RUSSIAN_PATRONYMICS

@api private @note Used by {#russian_patronymic} only.

Public Instance Methods

realistic_russian_female_first_names() click to toggle source

@return [WeighedDistribution<String>]

# File lib/realistic_russian_female_first_names.rb, line 13
def realistic_russian_female_first_names
  REALISTIC_RUSSIAN_FEMALE_FIRST_NAMES
end
realistic_russian_female_last_names() click to toggle source

@return [WeighedDistribution<String>]

# File lib/realistic_russian_female_last_names.rb, line 5
def realistic_russian_female_last_names
  realistic_russian_male_last_names.map { |n| russian_female_last_name(n) }
end
realistic_russian_female_patronymics() click to toggle source

@return [WeighedDistribution<String>]

# File lib/realistic_russian_female_patronymics.rb, line 4
def realistic_russian_female_patronymics
  realistic_russian_patronymics(:female)
end
realistic_russian_first_names(gender) click to toggle source

@param [:male, :female] gender @return [WeighedDistribution<String>]

# File lib/realistic_russian_first_names.rb, line 6
def realistic_russian_first_names(gender)
  case gender
  when :male then realistic_russian_male_first_names
  when :female then realistic_russian_female_first_names
  end
end
realistic_russian_last_names(gender) click to toggle source

@param [:male, :female] gender @return [WeighedDistribution<String>]

# File lib/realistic_russian_last_names.rb, line 6
def realistic_russian_last_names(gender)
  case gender
  when :male then realistic_russian_male_last_names
  when :female then realistic_russian_female_last_names
  end
end
realistic_russian_male_first_names() click to toggle source

@return [WeighedDistribution<String>]

# File lib/realistic_russian_male_first_names.rb, line 13
def realistic_russian_male_first_names
  REALISTIC_RUSSIAN_MALE_FIRST_NAMES
end
realistic_russian_male_last_names() click to toggle source

@return [WeighedDistribution<String>]

# File lib/realistic_russian_male_last_names.rb, line 13
def realistic_russian_male_last_names
  REALISTIC_RUSSIAN_MALE_LAST_NAMES
end
realistic_russian_male_patronymics() click to toggle source

@return [WeighedDistribution<String>]

# File lib/realistic_russian_male_patronymics.rb, line 4
def realistic_russian_male_patronymics
  realistic_russian_patronymics(:male)
end
realistic_russian_patronymics(gender) click to toggle source

@param [:male, :female] gender @return [WeighedDistribution<String>]

# File lib/realistic_russian_patronymics.rb, line 6
def realistic_russian_patronymics(gender)
  realistic_russian_male_first_names.map { |n| russian_patronymic(n, gender) }
end
russian_female_last_name(male_last_name) click to toggle source

@param [String] male_last_name last name in the male form. @return [String, nil] female last name derived from the

<tt>male_last_name</tt>.
# File lib/russian_female_last_name.rb, line 7
def russian_female_last_name(male_last_name)
  name = male_last_name
  if name.include? "-" then
    return name.split("-", -1).
      map { |part| russian_female_last_name(part) or return nil }.
      join("-")
  end
  case name
  when /(ой|ый)$/ then name.chompn(2) + "ая"
  when /[гжкцчшщ]ий$/ then name.chompn(2) + "ая"
  when /ий$/ then name.chompn(2) + "яя"
  when /(ов|ев|ёв|ын|ин)$/ then name + "а"
  when /[бвгджзйклмнпрстфхцчшщьаеиоуыэюя]$/ then name
  else return nil
  end
end
russian_last_name(family_name, gender) click to toggle source

@param [String] family_name the person's family name in the male gender. @param [:male, :female] gender @return [String, nil] the person's family name in the specified gender.

# File lib/russian_last_name.rb, line 6
def russian_last_name(family_name, gender)
  case gender
  when :male then family_name
  when :female then russian_female_last_name(family_name)
  end
end
russian_patronymic(father_name, gender) click to toggle source

@param [String] father_name @param [:male, :female] gender @return [String, nil] Russian patronymic of the person which has:

1) specified <tt>gender</tt>; 2) father's first name = <tt>father_name</tt>.
It returns nil if the patronymic can not be calculated (e. g. due to the
incomplete implementation).
# File lib/russian_patronymic.rb, line 18
def russian_patronymic(father_name, gender)
  # Try known russian patronymics.
  gender_index =
    case gender
    when :male then 0
    when :female then 1
    end
  (RUSSIAN_PATRONYMICS[father_name] || [])[gender_index] or
  # Try to calculate the patronymic.
  # NOTE: Sorry for the algorithm's description in Russian, it is just
  #   copy-pasted from open sources.
  begin
    name = father_name
    #
    genderize = lambda do |for_male, for_female|
      case gender
      when :male then for_male
      when :female then for_female
      else raise ArgumentError, "invalid gender: #{gender}"
      end
    end
    case name
    # Если имя оканчивается на твёрдый согласный (кроме ж, ш, ч, щ, ц), добавляется -ович / овна: Александр + ович/овна, Иван + ович/овна, Гамзат + ович/овна.
    when /[бвгдзклмнпрстфх]$/ then name + genderize.("ович", "овна")
    # К именам, оканчивающимся на ж, ш, ч, щ, ц, добавляется -евич / евна : Жорж + евич/евна, Януш + евич/евна, Милич + евич/евна, Франц + евич/евна.
    when /[жшчщц]$/ then name + genderize.("евич", "евна")
    # Если имя оканчивается на неударный гласный а, у, ы, к нему добавляется -ович / овна, причём конечные гласные имени отбрасываются: Антипа - Антипович/Антиповна, Вавила - Вавилович/ Вавиловна.
    # Исключение: от русских имён Аникита, Никита, Мина, Савва, Сила, Фока образуются традиционные формы отчеств на -ич / ична: Никита - Никитич/ Никитична, Мина - Минич/Минична, Савва — Саввич/Саввична.
    when "Аникита", "Никита", "Мина", "Савва", "Сила", "Фока" then name.chompn(1) + genderize.("ич", "ична")
    when /[ауы]$/ then nil # needs accent to be known: name.chompn(1) + genderize.("ович", "овна")
    # Если имя оканчивается на неударный гласный о, к нему добавляется -ович / овна, причём конечный гласный имени и начальный суффикса сливаются в один звук [о]: Василько + ович/овна, Михайло + ович/овна, Отто + ович/овна.
    when /о$/ then nil # needs accent to be known: name + genderize.("вич", "вна")
    # Если неударному конечному гласному предшествует ж или ш, ч, щ, ц, то добавляется -евич / евна, а гласный отбрасывается: Важа - Важевич/Важевна, Гоча - Гочевич/Гочевна.
    when /[жшчщц][аеиоуыэюя]$/ then nil # needs accent to be known: name.chompn(1) + genderize.("евич", "евна")
    # Если имя оканчивается на мягкий согласный, т. е. на согласный + ь, к нему добавляется -евич / евна, а конечный ь отбрасывается: Игорь - Игоревич/Игоревна, Цезарь - Цезаревич/Цезаревна, Виль - Вилевич/Вилевна, Камиль — Камилевич/Камилевна.
    when /ь$/ then name.chompn(1) + genderize.("евич", "евна")
    # Если имя оканчивается на неударный гласный е, к нему добавляется -евич / евна, причём конечный гласный имени и начальный суффикса сливаются: Аарне - Аарневич/Аарневна, Григоре - Григоревич/Григоревна, Вилье — Вильевич/Вильевна.
    when /е$/ then nil # needs accent to be known: name + genderize.("вич", "вна")
    # Если имя оканчивается на неударный гласный и, к нему добавляется -евич / евна, при этом конечный гласный сохраняется: Вилли - Виллиевич/Виллиевна, Илмари - Илмариевич/Илмариевна.
    when /и$/ then nil # needs accent to be known: name + genderize.("евич", "евна")
    # Если имя оканчивается на неударное сочетание ий, к нему добавляется -евич / евна, причём конечный й отбрасывается, а предпоследний и либо переходит в ь, либо остаётся:
    when /ий$/ then nil # needs accent to be known
      # а) переходит в ь после одного согласного или группы нт: Василий - Васильевич/Васильевна, Марий - Марьевич/Марьевна, Юлий — Юльевич/Юльевна.
      # б) остаётся после к, х, ц, а также после двух согласных (кроме группы нт ): Никий - Никиевич/Никиевна, Люций - Люциевич/ Люциевна, Стахий — Стахиевич/Стахиевна.
    # Старые русские имена, оканчивающиеся на сочетания ея и ия , образуют отчества прибавлением -евич / евна, при этом конечное я отбрасывается, а и или е сохраняется: Менея - Менеевич/ Менеевна, Захария — Захариевич/Захариевна.
    when /[еи]я$/ then name.chompn(1) + genderize.("евич", "евна")
    # К именам, оканчивающимся на ударные гласные а, я, е, э, и, ы, ё, о, у, ю, добавляется -евич / евна, при этом конечный гласный сохраняется: Айбу - Айбуевич/Айбуевна, Бадма - Бадмаевич/Бадмаевна, Бату - Бутуевич/Батуевна, Вали - Валиевич/Валиевна, Дакко - Даккоевич/Даккоевна, Исе — Исеевич/Исеевна.
    when /[аяеэиыёоую]$/ then nil # needs accent to be known: name + genderize.("евич", "евна")
    # Имена, оканчивающиеся на ударные сочетания ай, яй, ей, эй, ий, ый, ой, уй, юй, образуют отчества прибавлением -евич / евна, причём конечный й отбрасывается: Акбай - Акбаевич/Акбаевна, Кий - Киевич/Киевна, Матвей — Матвеевич/Матвеевна.
    when /[аяеэиыоую]й$/ then nil # needs accent to be known: name.chompn(1) + genderize.("евич", "евна")
    # Имена, оканчивающиеся на два гласных аа, ау, еу, ээ, ии, уу сохраняют их, образуя отчества прибавлением -евич / евна: Бимбии - Бимбииевич/Бимбииевна, Бобоо-Бобооевич/Бобооевна,Бурбээ — Бурбээевич/Бурбээевна.
    when /[аеёиоуыэюя]{2}$/ then name + genderize.("евич", "евна")
    end
  end
end
simple_yaml_load(file) click to toggle source

Reads YAML file of the form of:

key1: int1
key2: int2
...

@return [Array<Array<(Object, Integer)>>]

# File lib/simple_yaml_load.rb, line 9
def simple_yaml_load(file)
  simple_yaml_load1(file).
    map { |k, v| [k, Integer(v)] }
end
simple_yaml_load1(file) click to toggle source

Reads YAML file of the form of:

key1: str1
key2: str2
...

@return [Array<Array<(Object, Object)>>]

# File lib/simple_yaml_load.rb, line 21
def simple_yaml_load1(file)
  r = []
  File.read(file).split("\n").each do |line|
    e = line.split(": ", 2).map(&:strip)
    next if e.size != 2
    r.push(e)
  end
  return r
end