petrovich 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+

|
2
|
+
|
3
|
+
Склонение падежей русских имён, фамилий и отчеств. Вы задаёте начальное имя в именительном падеже, а получаете в нужном вам.
|
4
|
+
|
5
|
+
[](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: []
|