class Object
Constants
- REALISTIC_RUSSIAN_FEMALE_FIRST_NAMES
- REALISTIC_RUSSIAN_MALE_FIRST_NAMES
- REALISTIC_RUSSIAN_MALE_LAST_NAMES
- RUSSIAN_PATRONYMICS
@api private @note Used by {#russian_patronymic} only.
Public Instance Methods
@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
@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
@return [WeighedDistribution<String>]
# File lib/realistic_russian_female_patronymics.rb, line 4 def realistic_russian_female_patronymics realistic_russian_patronymics(:female) end
@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
@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
@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
@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
@return [WeighedDistribution<String>]
# File lib/realistic_russian_male_patronymics.rb, line 4 def realistic_russian_male_patronymics realistic_russian_patronymics(:male) end
@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
@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
@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
@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
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
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