russian_inflect 0.0.4 → 1.0.0
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +19 -8
- data/lib/russian_inflect.rb +34 -26
- data/lib/russian_inflect/rules.rb +80 -62
- data/lib/russian_inflect/rules.yml +83 -82
- data/lib/russian_inflect/version.rb +1 -1
- data/russian_inflect.gemspec +3 -5
- data/spec/spec_helper.rb +2 -2
- metadata +16 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5381c2481facf07752dd9021d46a529f59c0c948
|
4
|
+
data.tar.gz: 145b237507fcf48233128505432a5d606b24478e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 652c3c75efa74eae5cf7fadeeb070aaa019d788c5f31cffefb25cddfa0489c3f3954262fa50edb48d4e71ac3df76df09de6b0494bf4cc1bebc5eefc80c5661ad
|
7
|
+
data.tar.gz: 8d6bfbc904c7f181775a15bfc2af9d27178fb19f9e61cb865097370663fdbf31a30d3d622b6dd65abdef584203ae8b242dba966d2948fa74c121e3d3f7ce430f
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -20,15 +20,26 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
```ruby
|
24
|
+
RussianInflect.inflect("Хорошая погода", :nominative) # => Хорошая погода
|
25
|
+
RussianInflect.inflect("Хорошая погода", :genitive) # => Хорошей погоды
|
26
|
+
RussianInflect.inflect("Хорошая погода", :dative) # => Хорошей погоде
|
27
|
+
RussianInflect.inflect("Хорошая погода", :accusative) # => Хорошую погоду
|
28
|
+
RussianInflect.inflect("Хорошая погода", :instrumental) # => Хорошей погодой
|
29
|
+
RussianInflect.inflect("Хорошая погода", :prepositional) # => Хорошей погоде
|
30
|
+
```
|
31
|
+
|
32
|
+
или
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
words = RussianInflect.new("Хорошая погода")
|
36
|
+
words.to_case :genitive # => Хорошей погоды
|
37
|
+
words.to_case :dative # => Хорошей погоде
|
38
|
+
# etc...
|
39
|
+
```
|
29
40
|
|
30
41
|
## Помощь гему
|
31
42
|
* Нужны тесты для всяких окончаний, исключений и т.п.
|
32
43
|
Дополнять их просто: в [spec/lib/russian_inflect_spec.rb](/estum/russian_inflect/blob/master/spec/lib/russian_inflect_spec.rb) нужно добавить пример словосочетания и правильные результаты склонения по аналогии с уже добавленными примерами.
|
33
|
-
* Правила склонения пока далеки от идеала и тоже ждут своего Розенталя. Они похожи на правила из гема [petrovich](https://github.com/rocsci/petrovich) и находятся в [lib/russian_inflect/rules.yml](/
|
34
|
-
* Как видите, ридми тоже не мешало бы переписать.
|
44
|
+
* Правила склонения пока далеки от идеала и тоже ждут своего Розенталя. Они похожи на правила из гема [petrovich](https://github.com/rocsci/petrovich) и находятся в [lib/russian_inflect/rules.yml](/lib/russian_inflect/rules.yml).
|
45
|
+
* Как видите, ридми тоже не мешало бы переписать.
|
data/lib/russian_inflect.rb
CHANGED
@@ -1,70 +1,78 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
1
|
require 'yaml'
|
4
2
|
require 'unicode_utils'
|
5
|
-
require 'active_support'
|
6
|
-
require 'active_support/core_ext'
|
7
3
|
require 'russian_inflect/rules'
|
8
4
|
require "russian_inflect/version"
|
9
5
|
|
10
6
|
class RussianInflect
|
11
|
-
CASES = [:nominative, :genitive, :dative, :accusative, :instrumental, :prepositional]
|
12
|
-
GROUPS = [nil, :first, :second, :third]
|
13
|
-
|
14
7
|
NOMINATIVE = :nominative # именительный
|
15
8
|
GENITIVE = :genitive # родительный
|
16
9
|
DATIVE = :dative # дательный
|
17
10
|
ACCUSATIVE = :accusative # винительный
|
18
11
|
INSTRUMENTAL = :instrumental # творительный
|
19
12
|
PREPOSITIONAL = :prepositional # предложный
|
20
|
-
|
13
|
+
|
14
|
+
CASES = [NOMINATIVE, GENITIVE, DATIVE, ACCUSATIVE, INSTRUMENTAL, PREPOSITIONAL]
|
15
|
+
GROUPS = [nil, :first, :second, :third]
|
16
|
+
|
21
17
|
attr_accessor :source, :words, :noun, :case_group
|
22
|
-
|
23
|
-
def initialize(source, options =
|
18
|
+
|
19
|
+
def initialize(source, options = nil)
|
20
|
+
options ||= {}
|
21
|
+
|
24
22
|
@source = source
|
25
|
-
@words
|
23
|
+
@words = source.split
|
24
|
+
|
26
25
|
@noun = case options[:noun]
|
27
26
|
when String then options[:noun]
|
28
27
|
when Fixnum then @words[options[:noun]]
|
29
|
-
else @words
|
28
|
+
else @words.detect { |w| self.class.detect_type(w) == :noun }
|
30
29
|
end
|
31
|
-
group = options
|
30
|
+
group = options.fetch(:group) { self.class.detect_case_group(@noun) }
|
32
31
|
@case_group = GROUPS[group]
|
33
32
|
end
|
34
|
-
|
35
|
-
def to_case(gcase)
|
33
|
+
|
34
|
+
def to_case(gcase, force_downcase: false)
|
36
35
|
after_prepositions = false
|
36
|
+
|
37
37
|
inflected_words = words.map do |word|
|
38
|
-
result = word
|
39
38
|
unless after_prepositions
|
40
|
-
|
39
|
+
downcased = UnicodeUtils.downcase(word)
|
40
|
+
if Rules.prepositions.include?(downcased)
|
41
41
|
after_prepositions = true
|
42
42
|
else
|
43
|
-
result = Rules
|
43
|
+
result = Rules[case_group].inflect(downcased, gcase)
|
44
|
+
word = if force_downcase
|
45
|
+
result
|
46
|
+
else
|
47
|
+
len = downcased.each_char.take_while.with_index { |x, n| x == result[n] }.size
|
48
|
+
word[0, len] << result[len..-1]
|
49
|
+
end
|
44
50
|
end
|
45
51
|
end
|
46
|
-
|
52
|
+
|
53
|
+
word
|
47
54
|
end
|
55
|
+
|
48
56
|
inflected_words.join(' ')
|
49
57
|
end
|
50
|
-
|
58
|
+
|
51
59
|
def self.inflect(text, gcase)
|
52
|
-
|
60
|
+
new(text).to_case(gcase)
|
53
61
|
end
|
54
|
-
|
62
|
+
|
55
63
|
def self.detect_case_group(noun)
|
56
64
|
case noun
|
57
65
|
when /(а|я|и)$/i then 1
|
58
66
|
when /(о|е|ы)$/i then 2
|
59
|
-
when /(мя|ь)$/i
|
60
|
-
|
67
|
+
when /(мя|ь)$/i then 3
|
68
|
+
else 2
|
61
69
|
end
|
62
70
|
end
|
63
|
-
|
71
|
+
|
64
72
|
def self.detect_type(word)
|
65
73
|
case word
|
66
74
|
when /(ая|яя|ые|ие|ый|ой|[^р]ий|ое|ее)$/i then :adjective
|
67
|
-
|
75
|
+
else :noun
|
68
76
|
end
|
69
77
|
end
|
70
78
|
end
|
@@ -1,93 +1,111 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
1
|
class RussianInflect
|
4
|
-
|
5
|
-
|
6
|
-
class UnknownCaseException < Exception;;end
|
7
|
-
class UnknownRuleException < Exception;;end
|
2
|
+
UnknownError = Class.new(StandardError)
|
8
3
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@group = args
|
4
|
+
class UnknownCaseException < UnknownError
|
5
|
+
def initialize(gcase)
|
6
|
+
super "Unknown grammatical case: `#{gcase}'."
|
13
7
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
end
|
9
|
+
|
10
|
+
class UnknownRuleException < UnknownError
|
11
|
+
def initialize(name)
|
12
|
+
super "Can't find rule for `#{name}'."
|
18
13
|
end
|
19
|
-
|
20
|
-
protected
|
14
|
+
end
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
Rules = Struct.new(:group, :rules)
|
17
|
+
|
18
|
+
# Набор методов для нахождения и применения правил к имени, фамилии и отчеству.
|
19
|
+
class Rules
|
20
|
+
class << self
|
21
|
+
def prepositions
|
22
|
+
@prepositions ||= []
|
27
23
|
end
|
28
24
|
|
29
|
-
|
30
|
-
|
25
|
+
def dictionary
|
26
|
+
@dictionary ||= {}
|
27
|
+
end
|
31
28
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
name += char
|
29
|
+
def [](group)
|
30
|
+
dictionary.fetch(group)
|
31
|
+
end
|
32
|
+
|
33
|
+
def load_dictionary(hash)
|
34
|
+
@prepositions = Array(hash[:prepositions])
|
35
|
+
hash[:rules].each do |group, rules|
|
36
|
+
dictionary[group] = new(group, rules)
|
41
37
|
end
|
42
38
|
end
|
39
|
+
end
|
43
40
|
|
44
|
-
|
41
|
+
load_dictionary YAML.load_file(File.expand_path('../rules.yml', __FILE__))
|
42
|
+
|
43
|
+
def inflect(word, gcase)
|
44
|
+
type = RussianInflect.detect_type(word)
|
45
|
+
find_and_apply(word, gcase, type)
|
45
46
|
end
|
46
47
|
|
48
|
+
protected
|
49
|
+
|
47
50
|
# Найти правило и применить к имени с учетом склонения
|
48
|
-
def find_and_apply(name, gcase,
|
49
|
-
|
50
|
-
apply(name, gcase, rule)
|
51
|
+
def find_and_apply(name, gcase, type)
|
52
|
+
apply(name, gcase, find_for(name, type))
|
51
53
|
rescue UnknownRuleException
|
52
|
-
# Если не найдено правило для имени, возвращаем неизмененное имя.
|
53
54
|
name
|
54
55
|
end
|
55
56
|
|
56
57
|
# Найти подходящее правило в исключениях или суффиксах
|
57
|
-
def find_for(name,
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
def find_for(name, type)
|
59
|
+
if scoped_rules = rules[type][:exceptions]
|
60
|
+
ex = find(name, scoped_rules, true)
|
61
|
+
return ex if ex
|
62
|
+
else
|
63
|
+
scoped_rules = rules[type][:suffixes]
|
62
64
|
end
|
63
65
|
|
64
|
-
|
65
|
-
|
66
|
-
|
66
|
+
find(name, scoped_rules) || fail(UnknownRuleException, name)
|
67
|
+
end
|
68
|
+
|
69
|
+
def find(name, scoped_rules, match_whole_word = false)
|
70
|
+
scoped_rules.detect { |rule| match?(name, rule, match_whole_word) }
|
71
|
+
end
|
72
|
+
|
73
|
+
# Проверить правило
|
74
|
+
def match?(word, rule, match_whole_word = false)
|
75
|
+
# word = UnicodeUtils.downcase(word)
|
76
|
+
|
77
|
+
rule[:test].any? do |chars|
|
78
|
+
test = match_whole_word ? word : word.slice([word.length - chars.length, 0].max .. -1)
|
79
|
+
test == chars
|
80
|
+
end
|
67
81
|
end
|
68
82
|
|
69
|
-
#
|
70
|
-
def
|
71
|
-
|
83
|
+
# Применить правило
|
84
|
+
def apply(word, gcase, rule)
|
85
|
+
modificator = modificator_for(gcase, rule)
|
86
|
+
result = word.dup
|
87
|
+
|
88
|
+
modificator.each_char do |char|
|
89
|
+
case char
|
90
|
+
when '.'
|
91
|
+
when '-' then result.slice!(-1)
|
92
|
+
else result << char
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
result
|
72
97
|
end
|
73
98
|
|
74
99
|
# Получить модификатор из указанного правиля для указанного склонения
|
75
100
|
def modificator_for(gcase, rule)
|
76
101
|
case gcase.to_sym
|
77
|
-
when NOMINATIVE
|
78
|
-
|
79
|
-
when
|
80
|
-
|
81
|
-
when
|
82
|
-
|
83
|
-
|
84
|
-
rule['mods'][2]
|
85
|
-
when INSTRUMENTAL
|
86
|
-
rule['mods'][3]
|
87
|
-
when PREPOSITIONAL
|
88
|
-
rule['mods'][4]
|
89
|
-
else
|
90
|
-
raise UnknownCaseException, "Unknown grammatic case: #{gcase}"
|
102
|
+
when NOMINATIVE then '.'
|
103
|
+
when GENITIVE then rule[:mods][0]
|
104
|
+
when DATIVE then rule[:mods][1]
|
105
|
+
when ACCUSATIVE then rule[:mods][2]
|
106
|
+
when INSTRUMENTAL then rule[:mods][3]
|
107
|
+
when PREPOSITIONAL then rule[:mods][4]
|
108
|
+
else fail UnknownCaseException, gcase
|
91
109
|
end
|
92
110
|
end
|
93
111
|
end
|
@@ -1,85 +1,86 @@
|
|
1
|
-
prepositions: [в, без, до, из, к, на, по, о, от, перед, при, через, у, за, над, об, под, про, для, с, со, без]
|
1
|
+
:prepositions: [в, без, до, из, к, на, по, о, от, перед, при, через, у, за, над, об, под, про, для, с, со, без]
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
3
|
+
:rules:
|
4
|
+
:first:
|
5
|
+
:adjective:
|
6
|
+
:suffixes:
|
7
|
+
-
|
8
|
+
:test: [шая]
|
9
|
+
:mods: [--ей, --ей, --ую, --ей, --ей]
|
10
|
+
-
|
11
|
+
:test: [ая]
|
12
|
+
:mods: [--ой, --ой, --ую, --ой, --ой]
|
13
|
+
-
|
14
|
+
:test: [яя]
|
15
|
+
:mods: [--ей, --ей, --юю, --ей, --ей]
|
16
|
+
-
|
17
|
+
:test: [ые, ие]
|
18
|
+
:mods: [-х, -м, ., -ми, -х]
|
19
|
+
:noun:
|
20
|
+
:suffixes:
|
21
|
+
-
|
22
|
+
:test: [га, ка, ха, ча, ша, ща]
|
23
|
+
:mods: [-и, -е, -у, -ой, -е]
|
24
|
+
-
|
25
|
+
:test: [ба, ва, да, жа, за, ла, ма, на, па, ра, са, та, фа, ца]
|
26
|
+
:mods: [-ы, -е, -у, -ой, -е]
|
27
|
+
-
|
28
|
+
:test: [я]
|
29
|
+
:mods: [-и, -е, -ю, -ей, -е]
|
30
|
+
-
|
31
|
+
:test: [и]
|
32
|
+
:mods: [--ок, -ам, ., -ами, -ах]
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
34
|
+
:second:
|
35
|
+
:adjective:
|
36
|
+
:suffixes:
|
37
|
+
-
|
38
|
+
:test: [шое, шый, шой]
|
39
|
+
:mods: [--ого, --ому, ., --им, --ом]
|
40
|
+
-
|
41
|
+
:test: [ое, ый, ой]
|
42
|
+
:mods: [--ого, --ому, ., --ым, --ом]
|
43
|
+
-
|
44
|
+
:test: [ее, ий]
|
45
|
+
:mods: [--его, --ему, ., --им, --ем]
|
46
|
+
:noun:
|
47
|
+
:suffixes:
|
48
|
+
-
|
49
|
+
:test: [б, в, г, д, ж, з, к, л, м, н, п, р, с, т, ф, х, ц, ч, щ]
|
50
|
+
:mods: [а, у, ., ом, е]
|
51
|
+
-
|
52
|
+
:test: [ш]
|
53
|
+
:mods: [а, у, ., ем, е]
|
54
|
+
-
|
55
|
+
:test: [о]
|
56
|
+
:mods: [-а, -у, ., м, -е]
|
57
|
+
-
|
58
|
+
:test: [е]
|
59
|
+
:mods: [-я, -ю, ., м, .]
|
60
|
+
-
|
61
|
+
:test: [ы]
|
62
|
+
:mods: [-ов, -ам, ., -ами, -ах]
|
63
|
+
-
|
64
|
+
:test: [ий]
|
65
|
+
:mods: [-я, -ю, ., -ем, -и]
|
65
66
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
67
|
+
:third:
|
68
|
+
:adjective:
|
69
|
+
:suffixes:
|
70
|
+
-
|
71
|
+
:test: [ая]
|
72
|
+
:mods: [--ой, --ой, --ую, --ой, --ой]
|
73
|
+
-
|
74
|
+
:test: [яя]
|
75
|
+
:mods: [--ей, --ей, --юю, --ей, --ей]
|
76
|
+
-
|
77
|
+
:test: [ые, ие]
|
78
|
+
:mods: [-х, -м, ., -ми, -х]
|
79
|
+
:noun:
|
80
|
+
:suffixes:
|
81
|
+
-
|
82
|
+
:test: [ь]
|
83
|
+
:mods: [-и, -и, ., -ью, -и]
|
84
|
+
-
|
85
|
+
:test: [мя]
|
86
|
+
:mods: [-ени, --ени, ., -енем, -ени]
|
data/russian_inflect.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
1
|
lib = File.expand_path('../lib', __FILE__)
|
4
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
5
4
|
require 'russian_inflect/version'
|
6
5
|
|
7
6
|
Gem::Specification.new do |spec|
|
@@ -19,9 +18,8 @@ Gem::Specification.new do |spec|
|
|
19
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
19
|
spec.require_paths = ["lib"]
|
21
20
|
|
22
|
-
spec.add_dependency "
|
23
|
-
spec.
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.3"
|
21
|
+
spec.add_dependency "unicode_utils", ">= 1.4"
|
22
|
+
spec.add_development_dependency "bundler"
|
25
23
|
spec.add_development_dependency "rake"
|
26
24
|
spec.add_development_dependency "rspec"
|
27
25
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,11 +4,11 @@ class RussianInflect
|
|
4
4
|
def self.each_case(&block)
|
5
5
|
CASES.each_with_index &block
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
def test_each_case(*answers)
|
9
9
|
puts ''
|
10
10
|
RussianInflect.each_case do |c, index|
|
11
|
-
result =
|
11
|
+
result = to_case(c)
|
12
12
|
puts %{RussianInflect.inflect("#{source}", :#{c}) # #{result}}
|
13
13
|
result.should == answers[index]
|
14
14
|
end
|
metadata
CHANGED
@@ -1,83 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: russian_inflect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tõnis Simo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: activesupport
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 3.0.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 3.0.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: unicode_utils
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
|
-
- -
|
17
|
+
- - ">="
|
32
18
|
- !ruby/object:Gem::Version
|
33
19
|
version: '1.4'
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- -
|
24
|
+
- - ">="
|
39
25
|
- !ruby/object:Gem::Version
|
40
26
|
version: '1.4'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
|
-
- -
|
31
|
+
- - ">="
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
33
|
+
version: '0'
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- -
|
38
|
+
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
40
|
+
version: '0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: rake
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- -
|
45
|
+
- - ">="
|
60
46
|
- !ruby/object:Gem::Version
|
61
47
|
version: '0'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- -
|
52
|
+
- - ">="
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: rspec
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- -
|
59
|
+
- - ">="
|
74
60
|
- !ruby/object:Gem::Version
|
75
61
|
version: '0'
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- -
|
66
|
+
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '0'
|
83
69
|
description: Склонение по падежам заголовков на русском языке
|
@@ -87,7 +73,7 @@ executables: []
|
|
87
73
|
extensions: []
|
88
74
|
extra_rdoc_files: []
|
89
75
|
files:
|
90
|
-
- .gitignore
|
76
|
+
- ".gitignore"
|
91
77
|
- Gemfile
|
92
78
|
- LICENSE.txt
|
93
79
|
- README.md
|
@@ -109,17 +95,17 @@ require_paths:
|
|
109
95
|
- lib
|
110
96
|
required_ruby_version: !ruby/object:Gem::Requirement
|
111
97
|
requirements:
|
112
|
-
- -
|
98
|
+
- - ">="
|
113
99
|
- !ruby/object:Gem::Version
|
114
100
|
version: '0'
|
115
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
102
|
requirements:
|
117
|
-
- -
|
103
|
+
- - ">="
|
118
104
|
- !ruby/object:Gem::Version
|
119
105
|
version: '0'
|
120
106
|
requirements: []
|
121
107
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
108
|
+
rubygems_version: 2.5.1
|
123
109
|
signing_key:
|
124
110
|
specification_version: 4
|
125
111
|
summary: Склоняет заданный заголовок по падежам
|