petrovich 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +22 -0
- data/README.md +124 -0
- data/Rakefile +18 -0
- data/lib/petrovich.rb +88 -0
- data/lib/petrovich/extension.rb +133 -0
- data/lib/petrovich/rules.rb +109 -0
- data/lib/petrovich/rules.yml +269 -0
- metadata +149 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 tanraya
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
![Petrovich Logo](https://raw.github.com/rocsci/petrovich/master/petrovich.png)
|
2
|
+
|
3
|
+
Склонение падежей русских имён, фамилий и отчеств. Вы задаёте начальное имя в именительном падеже, а получаете в нужном вам.
|
4
|
+
|
5
|
+
[![Build Status](https://secure.travis-ci.org/rocsci/petrovich.png)](http://travis-ci.org/rocsci/petrovich)
|
6
|
+
|
7
|
+
## Установка
|
8
|
+
|
9
|
+
Добавьте в Gemfile:
|
10
|
+
|
11
|
+
gem 'petrovich'
|
12
|
+
|
13
|
+
Установите гем:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Или, установите отдельно:
|
18
|
+
|
19
|
+
$ gem install petrovich
|
20
|
+
|
21
|
+
## Использование
|
22
|
+
|
23
|
+
Вы задаёте начальные значения (фамилию, имя и отчество) в именительном падеже. Самое простое использование выглядит так:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# Указание пола снижает количество отказов
|
27
|
+
p = Petrovich.new(:male)
|
28
|
+
p.lastname('Иванов', :dative) # => Иванову
|
29
|
+
p.firstname('Пётр', :dative) # => Петру
|
30
|
+
p.lastname('Сергеевич', :dative) # => Сергеевичу
|
31
|
+
```
|
32
|
+
|
33
|
+
Конструктор класса +Petrovich+ принимает в качестве единственного аргумента пол. Пол может иметь значения +:male+, +:female+ или +:both+. Последнее означает, что имя не склоняется по родам (обычно, это не нужно).
|
34
|
+
|
35
|
+
### Продвинутое использование
|
36
|
+
|
37
|
+
Вы можете подмешать модуль +Petrovich::Extension+ в любой класс. Это особенно полезно при использовании +ActiveRecord+, и подобных ORM.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
class User < ActiveRecord::Base
|
41
|
+
include Petrovich::Extension
|
42
|
+
|
43
|
+
petrovich :firstname => :my_firstname,
|
44
|
+
:middlename => :my_middlename,
|
45
|
+
:lastname => :my_lastname
|
46
|
+
|
47
|
+
def my_firstname
|
48
|
+
'Пётр'
|
49
|
+
end
|
50
|
+
|
51
|
+
def my_middlename
|
52
|
+
'Петрович'
|
53
|
+
end
|
54
|
+
|
55
|
+
def my_lastname
|
56
|
+
'Петренко'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
Или, подмешиваем в обычный класс:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
class Person
|
65
|
+
|
66
|
+
petrovich :firstname => :name,
|
67
|
+
:middlename => :patronymic,
|
68
|
+
:lastname => :surname
|
69
|
+
|
70
|
+
def name
|
71
|
+
'Иван'
|
72
|
+
end
|
73
|
+
|
74
|
+
def patronymic
|
75
|
+
'Олегович'
|
76
|
+
end
|
77
|
+
|
78
|
+
def surname
|
79
|
+
'Сафронов'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
```
|
83
|
+
|
84
|
+
В примерах выше, вы указываете при помощи метода `petrovich` соответствие фамилии, имени и отчества соответствующим методам или аттрибутам класса. После этого, вы легко можете склонять имена, используя следующий синтаксис вызовов:
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
user = User.new
|
88
|
+
user.my_firstname # => Пётр
|
89
|
+
user.my_firstname_dative => Петру
|
90
|
+
```
|
91
|
+
|
92
|
+
и для второго примера:
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
person = User.new
|
96
|
+
person.name # => Иван
|
97
|
+
person.name_dative => Ивану
|
98
|
+
```
|
99
|
+
|
100
|
+
Вы просто добавляете `_падеж` в конец имени оригинального метода и получаете нужное значение. Вот список суффиксов, которые вы можете добавить к имени оригинального метода, чтобы получить имя в нужном падаже:
|
101
|
+
|
102
|
+
* nominative - именительный
|
103
|
+
* genitive - родительный
|
104
|
+
* dative - дательный
|
105
|
+
* accusative - винительный
|
106
|
+
* instrumentative - творительный
|
107
|
+
* prepositional - предложный
|
108
|
+
|
109
|
+
## Разработчики
|
110
|
+
|
111
|
+
* [Андрей Козлов](https://github.com/tanraya) - идея, реализация
|
112
|
+
* [Дмитрий Усталов](https://github.com/eveel) - неоценимая помощь
|
113
|
+
|
114
|
+
## Содействие
|
115
|
+
|
116
|
+
Если вы нашли баги, как программной части, так и в словаре, вы всегда можете форкнуть репозиторий и внести необходимые правки. Ваша помощь не останется незамеченной. Если вы заметили ошибки при склонении падежей имён, фамилий или отчеств, можете написать об этом в issues. Проблема будет сразу же исследована и решена.
|
117
|
+
|
118
|
+
Как всегда, чтобы помочь, вам нужно:
|
119
|
+
|
120
|
+
1. Fork it
|
121
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
122
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
123
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
124
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
# Run tests by default
|
16
|
+
task :default => :spec
|
17
|
+
|
18
|
+
Bundler::GemHelper.install_tasks
|
data/lib/petrovich.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'yaml'
|
3
|
+
require 'petrovich/rules'
|
4
|
+
require 'petrovich/extension'
|
5
|
+
|
6
|
+
# Склонение падежей русских имён фамилий и отчеств. Вы задаёте начальное имя в именительном падеже,
|
7
|
+
# а получаете в нужном вам.
|
8
|
+
#
|
9
|
+
# Использование
|
10
|
+
#
|
11
|
+
# # Склонение в дательном падеже
|
12
|
+
# rn = Petrovich.new
|
13
|
+
# puts rn.firstname('Иван', :dative) # => Ивану
|
14
|
+
# puts rn.middlename('Сергеевич', :dative) # => Сергеевичу
|
15
|
+
# puts rn.lastname('Воронов', :dative) # => Воронову
|
16
|
+
#
|
17
|
+
#
|
18
|
+
# Если известен пол, то его можно передать в конструктор. Это повышает точность склонений
|
19
|
+
#
|
20
|
+
# rn = Petrovich.new('male')
|
21
|
+
#
|
22
|
+
# Если пол не известен, его можно определить по отчеству, при помощи метода +detect_gender+
|
23
|
+
#
|
24
|
+
# gender = Petrovich.detect_gender('Сергеевич')
|
25
|
+
# rn = Petrovich.new(gender)
|
26
|
+
#
|
27
|
+
# Возможные падежи
|
28
|
+
#
|
29
|
+
# * +:nominative+ - именительный
|
30
|
+
# * +:genitive+ - родительный
|
31
|
+
# * +:dative+ - дательный
|
32
|
+
# * +:accusative+ - винительный
|
33
|
+
# * +:instrumentative+ - творительный
|
34
|
+
# * +:prepositional+ - предложный
|
35
|
+
#
|
36
|
+
class Petrovich
|
37
|
+
CASES = [:nominative, :genitive, :dative, :accusative, :instrumentative, :prepositional]
|
38
|
+
|
39
|
+
NOMINATIVE = :nominative # именительный
|
40
|
+
GENITIVE = :genitive # родительный
|
41
|
+
DATIVE = :dative # дательный
|
42
|
+
ACCUSATIVE = :accusative # винительный
|
43
|
+
INSTRUMENTATIVE = :instrumentative # творительный
|
44
|
+
PREPOSITIONAL = :prepositional # предложный
|
45
|
+
|
46
|
+
def initialize(gender = nil)
|
47
|
+
@gender = gender.to_s
|
48
|
+
end
|
49
|
+
|
50
|
+
def lastname(name, gcase)
|
51
|
+
Rules.new(@gender).lastname(name, gcase)
|
52
|
+
end
|
53
|
+
|
54
|
+
def firstname(name, gcase)
|
55
|
+
Rules.new(@gender).firstname(name, gcase)
|
56
|
+
end
|
57
|
+
|
58
|
+
def middlename(name, gcase)
|
59
|
+
Rules.new(@gender).middlename(name, gcase)
|
60
|
+
end
|
61
|
+
|
62
|
+
alias :patronymic :middlename
|
63
|
+
|
64
|
+
def gender
|
65
|
+
@gender
|
66
|
+
end
|
67
|
+
|
68
|
+
class << self
|
69
|
+
# Определение пола по отчеству
|
70
|
+
#
|
71
|
+
# detect_gender('Алексеевич') # => male
|
72
|
+
#
|
73
|
+
# Если пол не был определён, метод возвращает значение +both+
|
74
|
+
#
|
75
|
+
# detect_gender('блаблабла') # => both
|
76
|
+
#
|
77
|
+
def detect_gender(midname)
|
78
|
+
case midname[-2, 2].mb_chars.downcase
|
79
|
+
when 'ич'
|
80
|
+
'male'
|
81
|
+
when 'на'
|
82
|
+
'female'
|
83
|
+
else
|
84
|
+
'both'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Petrovich
|
4
|
+
# Этот модуль разработан для возможности его подмешивания в класс Ruby.
|
5
|
+
# Его можно подмешать в любой класс, например, в модель ActiveRecord.
|
6
|
+
#
|
7
|
+
# При помощи вызова метода +petrovich+ вы указываете, какие аттрибуты или методы класса
|
8
|
+
# будут возвращать фамилию, имя и отчество.
|
9
|
+
#
|
10
|
+
# Опции:
|
11
|
+
#
|
12
|
+
# [:+firstname+]
|
13
|
+
# Указывает метод, возвращающий имя
|
14
|
+
#
|
15
|
+
# [:+middlename+]
|
16
|
+
# Указывает метод, возвращающий отчество
|
17
|
+
#
|
18
|
+
# [:+lastname+]
|
19
|
+
# Указывает метод, возвращающий фамилию
|
20
|
+
#
|
21
|
+
# [:+order+]
|
22
|
+
# Задаёт порядок составляющих имени для их установки или вывода при использовании +:fullname+
|
23
|
+
#
|
24
|
+
# [:+fullname+]
|
25
|
+
# Задаёт или возвращает полное имя. Используется совместно с +:order+.
|
26
|
+
#
|
27
|
+
# petrovich :fullname => :my_fullname
|
28
|
+
# :order => [:firstname, :middlename, :lastname]
|
29
|
+
#
|
30
|
+
# def my_fullname
|
31
|
+
# 'Аркадий Семёнович Дичко'
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# Далее при вызове метода вы получите:
|
35
|
+
#
|
36
|
+
# my_fullname_dative # => Аркадию Семёновичу Дичко
|
37
|
+
#
|
38
|
+
#
|
39
|
+
# [:+delimeter+]
|
40
|
+
# Задаёт разделитель для +:fullname+. По-умолчанию равен +/\s+/+
|
41
|
+
#
|
42
|
+
# Пример использования
|
43
|
+
#
|
44
|
+
# class User
|
45
|
+
# include Petrovich::Extension
|
46
|
+
#
|
47
|
+
# petrovich :firstname => :my_firstname,
|
48
|
+
# :middlename => :my_middlename,
|
49
|
+
# :lastname => :my_lastname
|
50
|
+
#
|
51
|
+
# def my_firstname
|
52
|
+
# 'Пётр'
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# def my_middlename
|
56
|
+
# 'Александрович'
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# def my_lastname
|
60
|
+
# 'Ларин'
|
61
|
+
# end
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# Вы получите следующие методы
|
65
|
+
#
|
66
|
+
# user = User.new
|
67
|
+
# user.my_lastname_dative # => Ларину
|
68
|
+
# user.my_firstname_dative # => Петру
|
69
|
+
# user.my_middlename_dative # => Александровичу
|
70
|
+
#
|
71
|
+
# Вышеперечисленные методы доступны и внутри класса User.
|
72
|
+
#
|
73
|
+
module Extension
|
74
|
+
def self.included(base)
|
75
|
+
base.extend ClassMethods
|
76
|
+
end
|
77
|
+
|
78
|
+
module ClassMethods
|
79
|
+
def petrovich(options)
|
80
|
+
class_eval do
|
81
|
+
class << self
|
82
|
+
attr_accessor :petrovich_configuration
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
self.petrovich_configuration = {
|
87
|
+
:fullname => nil,
|
88
|
+
:firstname => nil,
|
89
|
+
:middlename => nil,
|
90
|
+
:lastname => nil,
|
91
|
+
:order => [:lastname, :firstname, :middlename],
|
92
|
+
:delimeter => /\s+/
|
93
|
+
}.merge(options)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def petrovich_create_getter(method_name, attribute, gcase, name)
|
98
|
+
options = self.class.petrovich_configuration
|
99
|
+
reflection = options.key(attribute.to_sym) or raise "No reflection for attribute '#{attribute}'!"
|
100
|
+
|
101
|
+
self.class.send(:define_method, method_name) do
|
102
|
+
rn = Petrovich.new
|
103
|
+
rn.send(reflection, name, gcase)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def method_missing(method_name, *args, &block)
|
108
|
+
if match = method_name.to_s.match(petrovich_method_regex)
|
109
|
+
attribute = match[1]
|
110
|
+
name = send(attribute)
|
111
|
+
gcase = match[2]
|
112
|
+
|
113
|
+
petrovich_create_getter(method_name, attribute, gcase, name).call
|
114
|
+
else
|
115
|
+
super
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def respond_to?(method_name, include_private = false)
|
120
|
+
if match = method_name.to_s.match(petrovich_method_regex)
|
121
|
+
true
|
122
|
+
else
|
123
|
+
super
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def petrovich_method_regex
|
128
|
+
%r{(.+)_(#{Petrovich::CASES.join('|')})$}
|
129
|
+
end
|
130
|
+
|
131
|
+
protected :petrovich_method_regex
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
|
3
|
+
class Petrovich
|
4
|
+
# Загрузка правил происходит один раз
|
5
|
+
RULES = YAML.load_file(File.dirname(__FILE__) + '/rules.yml')
|
6
|
+
|
7
|
+
# Набор методов для нахождения и применения правил к имени, фамилии и отчеству.
|
8
|
+
class Rules
|
9
|
+
def initialize(gender = nil)
|
10
|
+
@gender = gender
|
11
|
+
end
|
12
|
+
|
13
|
+
# Определяет методы +lastname_<i>case</i>+, +firstname_<i>case</i>+ и +middlename_<i>case</i>+
|
14
|
+
# для получения имени, фамилии и отчества в нужном падеже.
|
15
|
+
#
|
16
|
+
# Использование:
|
17
|
+
#
|
18
|
+
# # Дательный падеж
|
19
|
+
# lastname_dative('Комаров') # => Комарову
|
20
|
+
#
|
21
|
+
# # Винительный падеж
|
22
|
+
# lastname_accusative('Комаров') # => Комарова
|
23
|
+
#
|
24
|
+
[:lastname, :firstname, :middlename].each do |m|
|
25
|
+
define_method(m) { |name, gcase| find_and_apply(name, gcase, Petrovich::RULES[__method__.to_s]) }
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def match?(name, rule, match_whole_word)
|
31
|
+
return false if rule['gender'] == 'male' && female? || rule['gender'] == 'female' && !female?
|
32
|
+
|
33
|
+
name = name.mb_chars.downcase
|
34
|
+
rule['test'].each do |chars|
|
35
|
+
test = match_whole_word ? name : name.slice([name.size - chars.size, 0].max .. -1)
|
36
|
+
return true if test == chars
|
37
|
+
end
|
38
|
+
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
def male?
|
43
|
+
@gender == 'male'
|
44
|
+
end
|
45
|
+
|
46
|
+
def female?
|
47
|
+
@gender == 'female'
|
48
|
+
end
|
49
|
+
|
50
|
+
# Применить правило
|
51
|
+
def apply(name, gcase, rule)
|
52
|
+
modificator_for(gcase, rule).each_char do |char|
|
53
|
+
case char
|
54
|
+
when '.'
|
55
|
+
when '-'
|
56
|
+
name = name.slice(0, name.size - 1)
|
57
|
+
else
|
58
|
+
name += char
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
name
|
63
|
+
end
|
64
|
+
|
65
|
+
# Найти правило и применить к имени с учетом склонения
|
66
|
+
def find_and_apply(name, gcase, rules)
|
67
|
+
apply(name, gcase, find_for(name, rules))
|
68
|
+
end
|
69
|
+
|
70
|
+
# Найти подходящее правило в исключениях или суффиксах
|
71
|
+
def find_for(name, rules)
|
72
|
+
# Сначала пытаемся найти исключения
|
73
|
+
if rules.has_key?('exceptions')
|
74
|
+
p = find(name, rules['exceptions'], true)
|
75
|
+
return p if p
|
76
|
+
end
|
77
|
+
|
78
|
+
# Не получилось, ищем в суффиксах. Если не получилось найти и в них,
|
79
|
+
# возвращаем неизмененное имя.
|
80
|
+
find(name, rules['suffixes'], false) || name
|
81
|
+
end
|
82
|
+
|
83
|
+
# Найти подходящее правило в конкретном списке правил
|
84
|
+
def find(name, rules, match_whole_word)
|
85
|
+
rules.find { |rule| match?(name, rule, match_whole_word) }
|
86
|
+
end
|
87
|
+
|
88
|
+
# Получить модификатор из указанного правиля для указанного склонения
|
89
|
+
def modificator_for(gcase, rule)
|
90
|
+
case gcase.to_sym
|
91
|
+
when NOMINATIVE
|
92
|
+
'.'
|
93
|
+
when GENITIVE
|
94
|
+
rule['mods'][0]
|
95
|
+
when DATIVE
|
96
|
+
rule['mods'][1]
|
97
|
+
when ACCUSATIVE
|
98
|
+
rule['mods'][2]
|
99
|
+
when INSTRUMENTATIVE
|
100
|
+
rule['mods'][3]
|
101
|
+
when PREPOSITIONAL
|
102
|
+
rule['mods'][4]
|
103
|
+
else
|
104
|
+
raise "Unknown grammatic case: #{gcase}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,269 @@
|
|
1
|
+
# Набор правил для склонения русских имён, фамилий и отчеств по падежам.
|
2
|
+
#
|
3
|
+
# = Описание формата файла
|
4
|
+
#
|
5
|
+
# Файл содержит 3 группы правил. Это +lastname+, +firstname+ и +middlename+. Каждая группа
|
6
|
+
# содержит подгруппы с правилами:
|
7
|
+
#
|
8
|
+
# * Подгруппа +exceptions+ (её может не быть)
|
9
|
+
# * Подгруппа +suffixes+
|
10
|
+
#
|
11
|
+
# == Правила
|
12
|
+
#
|
13
|
+
# В свою очередь, каждая подгруппа содержит набор правил. Каждое правило содержит 3 составляющие:
|
14
|
+
#
|
15
|
+
# * Пол (gender). Допустимые значения: +male+, +female+, +both+
|
16
|
+
# * Что заменять (test). Массив суффиксов для замены.
|
17
|
+
# * На что заменять (mods). Массив модификаторов. Модификатор может иметь впереди один или
|
18
|
+
# дефис, он означает количество символов, которые нужно будет вырезать из слова.
|
19
|
+
#
|
20
|
+
# Правила отделяются друг от друга переносом строки для лучшего восприятия.
|
21
|
+
#
|
22
|
+
# === Из чего состоят суффиксы
|
23
|
+
#
|
24
|
+
# === Из чего состоят модификаторы
|
25
|
+
#
|
26
|
+
# [родительный, дательный, винительный, творительный, предложный]
|
27
|
+
#
|
28
|
+
# == Как добавить новое правило
|
29
|
+
#
|
30
|
+
lastname:
|
31
|
+
exceptions:
|
32
|
+
- gender: both
|
33
|
+
test: [дюма, тома, дега, люка, ферма, гамарра, петипа, шандра]
|
34
|
+
mods: [., ., ., ., .]
|
35
|
+
|
36
|
+
- gender: both
|
37
|
+
test: [гусь, ремень, камень, онук, богода, нечипас, долгопалец, маненок, рева, кива]
|
38
|
+
mods: [., ., ., ., .]
|
39
|
+
|
40
|
+
- gender: both
|
41
|
+
test: [вий, сой, цой, хой]
|
42
|
+
mods: [-я, -ю, -я, -ем, -е]
|
43
|
+
|
44
|
+
suffixes:
|
45
|
+
- gender: female
|
46
|
+
test: [б, в, г, д, ж, з, й, к, л, м, н, п, р, с, т, ф, х, ц, ч, ш, щ, ъ, ь]
|
47
|
+
mods: [., ., ., ., .]
|
48
|
+
|
49
|
+
- gender: female
|
50
|
+
test: [ска, цка]
|
51
|
+
mods: [-ой, -ой, -ую, -ой, -ой]
|
52
|
+
|
53
|
+
- gender: female
|
54
|
+
test: [ая]
|
55
|
+
mods: [--ой, --ой, --ую, --ой, --ой]
|
56
|
+
|
57
|
+
- gender: both
|
58
|
+
test: [ская]
|
59
|
+
mods: [--ой, --ой, --ую, --ой, --ой]
|
60
|
+
|
61
|
+
- gender: female
|
62
|
+
test: [на]
|
63
|
+
mods: [-ой, -ой, -у, -ой, -ой]
|
64
|
+
|
65
|
+
- gender: both
|
66
|
+
test: [иной]
|
67
|
+
mods: [-я, -ю, -я, -ем, -е]
|
68
|
+
|
69
|
+
- gender: both
|
70
|
+
test: [уй]
|
71
|
+
mods: [-я, -ю, -я, -ем, -е]
|
72
|
+
|
73
|
+
- gender: both
|
74
|
+
test: [ца]
|
75
|
+
mods: [-ы, -е, -у, -ей, -е]
|
76
|
+
|
77
|
+
- gender: both
|
78
|
+
test: [рих]
|
79
|
+
mods: [а, у, а, ом, е]
|
80
|
+
|
81
|
+
- gender: both
|
82
|
+
test: [ия]
|
83
|
+
mods: [., ., ., ., .]
|
84
|
+
|
85
|
+
- gender: both
|
86
|
+
test: [иа, аа, оа, уа, ыа, еа, юа, эа]
|
87
|
+
mods: [., ., ., ., .]
|
88
|
+
|
89
|
+
- gender: both
|
90
|
+
test: [их, ых]
|
91
|
+
mods: [., ., ., ., .]
|
92
|
+
|
93
|
+
- gender: both
|
94
|
+
test: [о, е, э, и, ы, у, ю]
|
95
|
+
mods: [., ., ., ., .]
|
96
|
+
|
97
|
+
- gender: both
|
98
|
+
test: [ова, ева]
|
99
|
+
mods: [-ой, -ой, -у, -ой, -ой]
|
100
|
+
|
101
|
+
- gender: both
|
102
|
+
test: [га, ка, ха, ча, ща, жа]
|
103
|
+
mods: [-и, -е, -у, -ой, -е]
|
104
|
+
|
105
|
+
- gender: both
|
106
|
+
test: [ца]
|
107
|
+
mods: [-и, -е, -у, -ей, -е]
|
108
|
+
|
109
|
+
- gender: both
|
110
|
+
test: [а]
|
111
|
+
mods: [-ы, -е, -у, -ой, -е]
|
112
|
+
|
113
|
+
- gender: both
|
114
|
+
test: [ь]
|
115
|
+
mods: [-я, -ю, -я, -ем, -е]
|
116
|
+
|
117
|
+
- gender: both
|
118
|
+
test: [ия]
|
119
|
+
mods: [-и, -и, -ю, -ей, -и]
|
120
|
+
|
121
|
+
- gender: both
|
122
|
+
test: [я]
|
123
|
+
mods: [-и, -е, -ю, -ей, -е]
|
124
|
+
|
125
|
+
- gender: both
|
126
|
+
test: [ей]
|
127
|
+
mods: [-я, -ю, -я, -ем, -е]
|
128
|
+
|
129
|
+
- gender: both
|
130
|
+
test: [ян, ан, йн]
|
131
|
+
mods: [а, у, а, ом, е]
|
132
|
+
|
133
|
+
- gender: both
|
134
|
+
test: [ынец, обец]
|
135
|
+
mods: [--ца, --цу, --ца, --цем, --це]
|
136
|
+
|
137
|
+
- gender: both
|
138
|
+
test: [онец, овец]
|
139
|
+
mods: [--ца, --цу, --ца, --цом, --це]
|
140
|
+
|
141
|
+
- gender: both
|
142
|
+
test: [ай]
|
143
|
+
mods: [-я, -ю, -я, -ем, -е]
|
144
|
+
|
145
|
+
- gender: both
|
146
|
+
test: [гой, кой]
|
147
|
+
mods: [-го, -му, -го, --им, -м]
|
148
|
+
|
149
|
+
- gender: both
|
150
|
+
test: [ой]
|
151
|
+
mods: [-го, -му, -го, --ым, -м]
|
152
|
+
|
153
|
+
- gender: both
|
154
|
+
test: [ах, ив]
|
155
|
+
mods: [а, у, а, ом, е]
|
156
|
+
|
157
|
+
- gender: both
|
158
|
+
test: [ший, щий, жий, ний]
|
159
|
+
mods: [--его, --ему, --его, -м, --ем]
|
160
|
+
|
161
|
+
- gender: both
|
162
|
+
test: [кий, ый]
|
163
|
+
mods: [--ого, --ому, --ого, -м, --ом]
|
164
|
+
|
165
|
+
- gender: both
|
166
|
+
test: [ий]
|
167
|
+
mods: [-я, -ю, -я, -ем, -и]
|
168
|
+
|
169
|
+
- gender: both
|
170
|
+
test: [ок]
|
171
|
+
mods: [--ка, --ку, --ка, --ком, --ке]
|
172
|
+
|
173
|
+
- gender: both
|
174
|
+
test: [ец]
|
175
|
+
mods: [--ца, --цу, --ца, --цом, --це]
|
176
|
+
|
177
|
+
- gender: both
|
178
|
+
test: [ц, ч, ш, щ]
|
179
|
+
mods: [а, у, а, ем, е]
|
180
|
+
|
181
|
+
- gender: both
|
182
|
+
test: [в, н]
|
183
|
+
mods: [а, у, а, ым, е]
|
184
|
+
|
185
|
+
- gender: both
|
186
|
+
test: [б, г, д, ж, з, к, л, м, п, р, с, т, ф, х]
|
187
|
+
mods: [а, у, а, ом, е]
|
188
|
+
|
189
|
+
firstname:
|
190
|
+
exceptions:
|
191
|
+
- gender: both
|
192
|
+
test: [лев]
|
193
|
+
mods: [--ьва, --ьву, --ьва, --ьвом, --ьве]
|
194
|
+
|
195
|
+
- gender: both
|
196
|
+
test: [пётр]
|
197
|
+
mods: [---етра, ---етру, ---етра, ---етром, ---етре]
|
198
|
+
|
199
|
+
- gender: both
|
200
|
+
test: [павел]
|
201
|
+
mods: [--ла, --лу, --ла, --лом, --ле]
|
202
|
+
|
203
|
+
- gender: male
|
204
|
+
test: [шота]
|
205
|
+
mods: [., ., ., ., .]
|
206
|
+
|
207
|
+
- gender: female
|
208
|
+
test: [рашель, нинель, николь, габриэль, даниэль]
|
209
|
+
mods: [., ., ., ., .]
|
210
|
+
|
211
|
+
suffixes:
|
212
|
+
- gender: both
|
213
|
+
test: [е, ё, и, о, у, ы, э, ю]
|
214
|
+
mods: [., ., ., ., .]
|
215
|
+
|
216
|
+
- gender: female
|
217
|
+
test: [б, в, г, д, ж, з, й, к, л, м, н, п, р, с, т, ф, х, ц, ч, ш, щ, ъ]
|
218
|
+
mods: [., ., ., ., .]
|
219
|
+
|
220
|
+
- gender: female
|
221
|
+
test: [ь]
|
222
|
+
mods: [-и, -и, ., ю, -и]
|
223
|
+
|
224
|
+
- gender: male
|
225
|
+
test: [ь]
|
226
|
+
mods: [-я, -ю, -я, -ем, -е]
|
227
|
+
|
228
|
+
- gender: both
|
229
|
+
test: [га, ка, ха, ча, ща, жа]
|
230
|
+
mods: [-и, -е, -у, -ой, -е]
|
231
|
+
|
232
|
+
- gender: both
|
233
|
+
test: [а]
|
234
|
+
mods: [-ы, -е, -у, -ой, -е]
|
235
|
+
|
236
|
+
- gender: both
|
237
|
+
test: [ия]
|
238
|
+
mods: [-и, -и, -ю, -ей, -и]
|
239
|
+
|
240
|
+
- gender: both
|
241
|
+
test: [я]
|
242
|
+
mods: [-и, -е, -ю, -ей, -е]
|
243
|
+
|
244
|
+
- gender: both
|
245
|
+
test: [ей]
|
246
|
+
mods: [-я, -ю, -я, -ем, -е]
|
247
|
+
|
248
|
+
- gender: both
|
249
|
+
test: [ий]
|
250
|
+
mods: [-я, -ю, -я, -ем, -и]
|
251
|
+
|
252
|
+
- gender: both
|
253
|
+
test: [й]
|
254
|
+
mods: [-я, -ю, -я, -ем, -е]
|
255
|
+
|
256
|
+
- gender: both
|
257
|
+
test: [б, в, г, д, ж, з, к, л, м, н, п, р, с, т, ф, х, ц, ч]
|
258
|
+
mods: [а, у, а, ом, е]
|
259
|
+
|
260
|
+
middlename:
|
261
|
+
suffixes:
|
262
|
+
- gender: both
|
263
|
+
test: [ич]
|
264
|
+
mods: [а, у, а, ем, е]
|
265
|
+
|
266
|
+
- gender: both
|
267
|
+
test: [на]
|
268
|
+
mods: [-ы, -е, -у, -ой, -е]
|
269
|
+
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: petrovich
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Kozloff
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: i18n
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.6.4
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.6.4
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.2.12
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.2.12
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: sqlite3
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: activerecord
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 3.2.12
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 3.2.12
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: gem-release
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.4.1
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.4.1
|
110
|
+
description: Вы задаёте начальное имя в именительном падеже, а получаете в нужном
|
111
|
+
вам
|
112
|
+
email:
|
113
|
+
- demerest@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- lib/petrovich/extension.rb
|
119
|
+
- lib/petrovich/rules.rb
|
120
|
+
- lib/petrovich/rules.yml
|
121
|
+
- lib/petrovich.rb
|
122
|
+
- MIT-LICENSE
|
123
|
+
- Rakefile
|
124
|
+
- README.md
|
125
|
+
homepage: https://github.com/tanraya/papillon
|
126
|
+
licenses: []
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options: []
|
129
|
+
require_paths:
|
130
|
+
- lib
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
none: false
|
133
|
+
requirements:
|
134
|
+
- - ! '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
requirements: []
|
144
|
+
rubyforge_project:
|
145
|
+
rubygems_version: 1.8.24
|
146
|
+
signing_key:
|
147
|
+
specification_version: 3
|
148
|
+
summary: Склонение падежей русских имён, фамилий и отчеств
|
149
|
+
test_files: []
|