pascoale 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +13 -0
- data/Rakefile +14 -1
- data/data/everything.txt +14 -14
- data/lib/pascoale.rb +3 -1
- data/lib/pascoale/constants.rb +9 -1
- data/lib/pascoale/formatter.rb +1 -1
- data/lib/pascoale/inflector.rb +139 -0
- data/lib/pascoale/reflector.rb +29 -0
- data/lib/pascoale/syllable_separator.rb +24 -8
- data/lib/pascoale/syllable_separator_benchmark.rb +1 -1
- data/lib/pascoale/version.rb +1 -1
- data/pascoale.gemspec +2 -1
- data/spec/lib/pascoale/edits_spec.rb +2 -2
- data/spec/lib/pascoale/formatter_spec.rb +8 -8
- data/spec/lib/pascoale/inflector_spec.rb +371 -0
- data/spec/lib/pascoale/reflector_spec.rb +46 -0
- data/spec/lib/pascoale/syllable_separator_spec.rb +80 -17
- data/spec/spec_helper.rb +4 -0
- metadata +32 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df683dc0656ff42d733b197e6300a4307fb4fa9e
|
4
|
+
data.tar.gz: bde991b20736b57e50aa491be74db8468b900de0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b15fb0dbd2e3cafcf5b75e7dd6bb7434e36508ad79c3fbbdb86de50483778d71fc27616983f7a59da2fd34bfc0c822d36ef3ad20b3344fa0a2e5a440d0436c5
|
7
|
+
data.tar.gz: 8d032df4c2c4268daad83c7fcfdcc88df4267eb894c74d08957968a2680ea83bca7f4f34dabd1188e3d9d38b8060c68c3b850498ac9875935bddd9e94a1ee545
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.2
|
data/.travis.yml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.2.1
|
4
|
+
install:
|
5
|
+
- gem install bundler -v '~> 1.9' && bundle install
|
6
|
+
deploy:
|
7
|
+
provider: rubygems
|
8
|
+
api_key:
|
9
|
+
secure: MU7uLfXgToLsBwVVY6yWDVEwziQhGou7tTDFe5Wj21djanGNzj9KG12MyQgwiTzm6J2PKzu9aIKRh6EtBWZF69XxeLuUrdGeq/sqDoCXUenyysKhJMwGMQRzwCdO8JigzNOKpnVX7+FpPwap+6RmoKQze6ZZ3GG0zuOKLHyiI4Q=
|
10
|
+
gem: pascoale
|
11
|
+
on:
|
12
|
+
tags: true
|
13
|
+
repo: VAGAScom/pascoale
|
data/Rakefile
CHANGED
@@ -1 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
|
7
|
+
task :default => [:spec, :build]
|
8
|
+
rescue LoadError
|
9
|
+
end
|
10
|
+
|
11
|
+
desc 'Run benchmark against corpus'
|
12
|
+
task :benchmark do
|
13
|
+
`ruby -I lib lib/pascoale/syllable_separator_benchmark.rb`
|
14
|
+
end
|
data/data/everything.txt
CHANGED
@@ -149171,8 +149171,8 @@
|
|
149171
149171
|
["ressaque","nome masculino",["res","sa","que"]]
|
149172
149172
|
["ressarcimento","nome masculino",["res","sar","ci","men","to"]]
|
149173
149173
|
["ressarcir","verbo",["res","sar","cir"]]
|
149174
|
-
["ressaudação","nome feminino",["res","
|
149175
|
-
["ressaudar","verbo",["res","
|
149174
|
+
["ressaudação","nome feminino",["res","sau","da","ção"]]
|
149175
|
+
["ressaudar","verbo",["res","sau","dar"]]
|
149176
149176
|
["ressecação","nome feminino",["res","se","ca","ção"]]
|
149177
149177
|
["resseção","nome feminino",["res","se","ção"]]
|
149178
149178
|
["ressecar","verbo",["res","se","car"]]
|
@@ -154769,17 +154769,17 @@
|
|
154769
154769
|
["saucarismo","nome masculino",["sau","ca","ris","mo"]]
|
154770
154770
|
["saucar","nome masculino",["sau","car"]]
|
154771
154771
|
["saúco","nome masculino",["sa","ú","co"]]
|
154772
|
-
["saudação","nome feminino",["
|
154772
|
+
["saudação","nome feminino",["sau","da","ção"]]
|
154773
154773
|
["saudade-branca","nome feminino",["sau","da","de-bran","ca"]]
|
154774
|
-
["saudade","nome feminino",["
|
154774
|
+
["saudade","nome feminino",["sau","da","de"]]
|
154775
154775
|
["saudade-perpétua","nome feminino",["sau","da","de-per","pé","tu","a"]]
|
154776
154776
|
["saudade-roxa","nome feminino",["sau","da","de-ro","xa"]]
|
154777
|
-
["saudador","adjetivo",["
|
154778
|
-
["saudador","nome masculino",["
|
154777
|
+
["saudador","adjetivo",["sau","da","dor"]]
|
154778
|
+
["saudador","nome masculino",["sau","da","dor"]]
|
154779
154779
|
["saudante","adjetivo",["sau","dan","te"]]
|
154780
154780
|
["saudar","nome masculino",["sau","dar"]]
|
154781
|
-
["saudar","verbo",["
|
154782
|
-
["saudável","adjetivo",["
|
154781
|
+
["saudar","verbo",["sau","dar"]]
|
154782
|
+
["saudável","adjetivo",["sau","dá","vel"]]
|
154783
154783
|
["saudavelmente","advérbio",["sau","da","vel","men","te"]]
|
154784
154784
|
["saúde","interjeição",["sa","ú","de"]]
|
154785
154785
|
["saúde","nome feminino",["sa","ú","de"]]
|
@@ -154792,12 +154792,12 @@
|
|
154792
154792
|
["saudó","nome masculino",["sau","dó"]]
|
154793
154793
|
["saudosamente","advérbio",["sau","do","sa","men","te"]]
|
154794
154794
|
["saudosa","nome feminino",["sau","do","sa"]]
|
154795
|
-
["saudosismo","nome masculino",["
|
154796
|
-
["saudosista","adjetivo",["
|
154797
|
-
["saudosista","nome feminino",["
|
154798
|
-
["saudosista","nome masculino",["
|
154799
|
-
["saudoso","adjetivo",["
|
154800
|
-
["saudoso","nome masculino",["
|
154795
|
+
["saudosismo","nome masculino",["sau","do","sis","mo"]]
|
154796
|
+
["saudosista","adjetivo",["sau","do","sis","ta"]]
|
154797
|
+
["saudosista","nome feminino",["sau","do","sis","ta"]]
|
154798
|
+
["saudosista","nome masculino",["sau","do","sis","ta"]]
|
154799
|
+
["saudoso","adjetivo",["sau","do","so"]]
|
154800
|
+
["saudoso","nome masculino",["sau","do","so"]]
|
154801
154801
|
["sauiá","nome masculino",["sau","i","á"]]
|
154802
154802
|
["sauí","nome masculino",["sau","í"]]
|
154803
154803
|
["sauna","nome feminino",["sau","na"]]
|
data/lib/pascoale.rb
CHANGED
data/lib/pascoale/constants.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
module Pascoale
|
2
2
|
module Constants
|
3
|
-
|
3
|
+
ACCENTED = 'áâàéêíóôú'
|
4
|
+
NOT_ACCENTED = 'aaaeeioou'
|
5
|
+
AS = 'aáâãà'
|
6
|
+
ES = 'eéê'
|
7
|
+
IS = 'ií'
|
8
|
+
OS = 'oóôõ'
|
9
|
+
US = 'uú'
|
10
|
+
YS = 'y'
|
11
|
+
VOWELS = AS + ES + IS + OS + US + YS
|
4
12
|
SEMIVOWELS = 'iu'
|
5
13
|
CONSONANTS = 'bcdfghjklmnpqrstvwxzç'
|
6
14
|
LETTERS = VOWELS + CONSONANTS
|
data/lib/pascoale/formatter.rb
CHANGED
@@ -0,0 +1,139 @@
|
|
1
|
+
module Pascoale
|
2
|
+
class Inflector
|
3
|
+
include Constants
|
4
|
+
|
5
|
+
PLURAL_RULES = [
|
6
|
+
# Exceções
|
7
|
+
['qualquer', 'quaisquer'],
|
8
|
+
['avô', 'avós'],
|
9
|
+
['raiz', 'raízes'],
|
10
|
+
['júnior', 'juniores'],
|
11
|
+
['sênior', 'seniores'],
|
12
|
+
['caráter', 'caracteres'],
|
13
|
+
# ão => ães
|
14
|
+
['alemão', 'alemães'],
|
15
|
+
['capitão', 'capitães'],
|
16
|
+
['pão', 'pães'],
|
17
|
+
['cão', 'cães'],
|
18
|
+
['charlatão', 'charlatães'],
|
19
|
+
['sacristão', 'sacristães'],
|
20
|
+
['capelão', 'capelães'],
|
21
|
+
['escrivão', 'escrivães'],
|
22
|
+
['tabelião', 'tabeliães'],
|
23
|
+
# ão => ãos
|
24
|
+
['sótão', 'sótãos'],
|
25
|
+
['cidadão', 'cidadãos'],
|
26
|
+
['chão', 'chãos'],
|
27
|
+
['bênção', 'bênçãos'],
|
28
|
+
['cristão', 'cristãos'],
|
29
|
+
['grão', 'grãos'],
|
30
|
+
['órfão', 'órfãos'],
|
31
|
+
['irmão', 'irmãos'],
|
32
|
+
['mão', 'mãos'],
|
33
|
+
['refrão', 'refrãos'],
|
34
|
+
# S exceptions - no flex
|
35
|
+
['pires', 'pires'],
|
36
|
+
['vírus', 'vírus'],
|
37
|
+
['atlas', 'atlas'],
|
38
|
+
['lápis', 'lápis'],
|
39
|
+
['ônibus', 'ônibus'],
|
40
|
+
# S exceptions - accent change
|
41
|
+
['gás', 'gases'],
|
42
|
+
['mês', 'meses'],
|
43
|
+
# S general rule
|
44
|
+
[/(s)$/, '\1es'],
|
45
|
+
# L exceptions
|
46
|
+
['mal', 'males'],
|
47
|
+
['cônsul', 'cônsules'],
|
48
|
+
['gol', 'gols'],
|
49
|
+
# L rules (too many accents :p)
|
50
|
+
[/([#{ACCENTED}].*)[#{ES}]l$/, '\1eis'],
|
51
|
+
[/[#{ES}]l$/, 'éis'],
|
52
|
+
[/([#{ACCENTED}].*)[#{IS}]l$/, '\1eis'],
|
53
|
+
[/[#{IS}]l$/, 'is'],
|
54
|
+
[/([#{ACCENTED}].*)[#{OS}]l$/, '\1ois'],
|
55
|
+
[/[#{OS}]l$/, 'óis'],
|
56
|
+
[/([#{VOWELS}])l$/, '\1is'],
|
57
|
+
# General rules
|
58
|
+
[/ão$/, 'ões'],
|
59
|
+
[/^(.*zinho)$/, ->(match) { m = match.sub(/zinho$/, ''); Inflector.new(m).pluralize.sub(/s$/, '').tr(ACCENTED, NOT_ACCENTED) + 'zinhos'}],
|
60
|
+
[/^(.*zinha)$/, ->(match) { m = match.sub(/zinha$/, ''); Inflector.new(m).pluralize.sub(/s$/, '').tr(ACCENTED, NOT_ACCENTED) + 'zinhas'}],
|
61
|
+
[/^.*n$/, ->(match) { match.tr(ACCENTED, NOT_ACCENTED) + 's' }],
|
62
|
+
[/(m)$/, 'ns'],
|
63
|
+
[/([rz])$/, '\1es'],
|
64
|
+
[/([#{VOWELS}])$/, '\1s']
|
65
|
+
]
|
66
|
+
|
67
|
+
SINGULAR_RULES =[
|
68
|
+
# Exceptions
|
69
|
+
['papeizinhos', 'papelzinho'],
|
70
|
+
['avós', 'avô'],
|
71
|
+
['quaisquer', 'qualquer'],
|
72
|
+
['raízes', 'raiz'],
|
73
|
+
['juniores', 'júnior'],
|
74
|
+
['seniores', 'sênior'],
|
75
|
+
['caracteres', 'caráter'],
|
76
|
+
['males', 'mal'],
|
77
|
+
['cônsules', 'cônsul'],
|
78
|
+
# NS to N, not M
|
79
|
+
['abdomens', 'abdômen'],
|
80
|
+
['germens', 'gérmen'],
|
81
|
+
['hifens', 'hífen'],
|
82
|
+
['liquens', 'líquen'],
|
83
|
+
# S exceptions - no flex
|
84
|
+
['pires', 'pires'],
|
85
|
+
['vírus', 'vírus'],
|
86
|
+
['atlas', 'atlas'],
|
87
|
+
['lápis', 'lápis'],
|
88
|
+
['ônibus', 'ônibus'],
|
89
|
+
# S exceptions - accent change
|
90
|
+
['gases', 'gás'],
|
91
|
+
['meses', 'mês'],
|
92
|
+
# S general rule
|
93
|
+
[/ses$/, 's'],
|
94
|
+
# L general rules
|
95
|
+
[/áveis$/, 'ável'], # No good >_<, too specific
|
96
|
+
[/éis$/, 'el'],
|
97
|
+
[/óis$/, 'ol'],
|
98
|
+
[/eis$/, 'il'],
|
99
|
+
[/([aou])is$/, '\1l'],
|
100
|
+
# General rules
|
101
|
+
[/^(.*zinhos)$/, ->(match) { m = match.sub(/zinhos$/, ''); Inflector.new(m + 's').singularize + 'zinho'}],
|
102
|
+
[/^(.*zinhas)$/, ->(match) { m = match.sub(/zinhas$/, ''); Inflector.new(m + 's').singularize + 'zinha'}],
|
103
|
+
[/is$/, 'il'],
|
104
|
+
[/res$/, 'r'],
|
105
|
+
[/zes$/, 'z'],
|
106
|
+
[/ns$/, 'm'],
|
107
|
+
[/ães$/, 'ão'],
|
108
|
+
[/ões$/, 'ão'],
|
109
|
+
[/s$/, '']
|
110
|
+
]
|
111
|
+
|
112
|
+
def initialize(text)
|
113
|
+
@text = text
|
114
|
+
end
|
115
|
+
|
116
|
+
def pluralize
|
117
|
+
@pluralized ||= apply_rules_to(@text, PLURAL_RULES)
|
118
|
+
end
|
119
|
+
|
120
|
+
def singularize
|
121
|
+
@singularized ||= apply_rules_to(@text, SINGULAR_RULES)
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
def apply_rules_to(text, rules)
|
126
|
+
rslt = text.dup
|
127
|
+
rules.each do |regex, replace|
|
128
|
+
reg = Regexp === regex ? regex : /^#{regex}$/
|
129
|
+
case replace
|
130
|
+
when Proc
|
131
|
+
return rslt if rslt.sub!(reg, &replace)
|
132
|
+
else
|
133
|
+
return rslt if rslt.sub!(reg, replace)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
rslt
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pascoale
|
2
|
+
class Reflector
|
3
|
+
include Constants
|
4
|
+
|
5
|
+
def initialize(text)
|
6
|
+
@text = text
|
7
|
+
end
|
8
|
+
|
9
|
+
# ALWAYS have accents
|
10
|
+
def proparoxytone?
|
11
|
+
syllables = SyllableSeparator.new(@text).separate
|
12
|
+
return false if syllables.size < 3
|
13
|
+
syllables[-3] =~ /[#{ACCENTED}]/
|
14
|
+
end
|
15
|
+
|
16
|
+
# Most common case in portuguese
|
17
|
+
def paroxytone?
|
18
|
+
!proparoxytone? && !oxytone?
|
19
|
+
end
|
20
|
+
|
21
|
+
# Accends or specific terminators
|
22
|
+
def oxytone?
|
23
|
+
syllables = SyllableSeparator.new(@text).separate
|
24
|
+
return true if syllables.size == 1
|
25
|
+
return true if syllables[-1] =~ /[#{ACCENTED}]/
|
26
|
+
syllables[-1] =~ /(is?|im|ins?|us?|um|uns?|l|n|r|x|ps|ãs?|ãos?|ons?|ais?|eis?|ois?|aus?|eus?|ous?|ias?|ies?|ios?|uas?|ues?|uos?)$/
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -4,23 +4,36 @@ module Pascoale
|
|
4
4
|
|
5
5
|
ONSET = "(?:ch|lh|nh|gu|qu|[pbtdcgfv][lr]|[#{CONSONANTS}])"
|
6
6
|
|
7
|
-
|
8
|
-
# it slightly improves the the matches, but some of them causes more
|
9
|
-
# noise than fix things =\
|
10
|
-
#NUCLEUS = "(?:ãe|ão|õe|[#{VOWELS}](?:u|i(?!nh|r$|m$|dora?$|ção$|dade$))?)"
|
11
|
-
NUCLEUS = "(?:ãe|ão|õe|[#{VOWELS}](?:u|i(?!nh|r$|m$|ção$|dora?$))?)"
|
7
|
+
CODA = '[bcdfghjklmnpqrstvwxz]'
|
12
8
|
|
13
|
-
|
9
|
+
# Biggest problem are "sinéreses" and "diéreses".
|
10
|
+
# It seems some consonants like "n" and "m" in the next syllable can cause it.
|
11
|
+
NUCLEUS_RULES = ['ãe',
|
12
|
+
'ão',
|
13
|
+
'õe',
|
14
|
+
'au',
|
15
|
+
'ou',
|
16
|
+
'iu(?!m$)',
|
17
|
+
'[áâàãéêíóôú][iu]',
|
18
|
+
'[aieou][iu](?=[aeo])',
|
19
|
+
"ai(?!m$|ns$|r$|ç[ãõ]|[nm]#{ONSET}|nh)",
|
20
|
+
"eu(?![nm]#{ONSET})",
|
21
|
+
"ei(?![nm]#{ONSET})",
|
22
|
+
"ui(?!m$|ns$|ç[ãõ]|r$|dade$|z|[nm]#{ONSET}|nar$|d[ao]$|dora?$)",
|
23
|
+
"oi(?!m$|ns$|ç[ãõ]|r$|dade$|z|[nm]#{ONSET}|nar$|dora?$)",
|
24
|
+
'[aáâàãeéêiíoóôuúy]']
|
25
|
+
|
26
|
+
NUCLEUS = "(?:#{NUCLEUS_RULES.join('|')})"
|
14
27
|
|
15
28
|
# The concept of "rhyme" does not help in this algorithm. It seems the
|
16
|
-
# concept makes no sense for syllable separation in portuguese
|
29
|
+
# concept makes no sense for syllable separation in portuguese (by an algorithm, at least)
|
17
30
|
KERNEL = "#{ONSET}?#{NUCLEUS}"
|
18
31
|
|
19
32
|
def initialize(word)
|
20
33
|
@word = word
|
21
34
|
end
|
22
35
|
|
23
|
-
def
|
36
|
+
def separate
|
24
37
|
rest = @word
|
25
38
|
result = []
|
26
39
|
while rest && rest.size > 0
|
@@ -33,6 +46,8 @@ module Pascoale
|
|
33
46
|
if rest =~ /^([#{CONSONANTS}]#{KERNEL})(?:(#{KERNEL})|(#{CODA})(#{KERNEL})|(#{CODA}#{CODA})(#{KERNEL})|(#{CODA}#{CODA})|(#{CODA}))?(.*)$/
|
34
47
|
result << $1 + $3.to_s + $5.to_s + $7.to_s + $8.to_s
|
35
48
|
rest = $2.to_s + $4.to_s + $6.to_s + $9.to_s
|
49
|
+
else
|
50
|
+
raise %(Cannot separate "#{@word}". No rule match next syllable at "#{result.join('')}|>#{rest}")
|
36
51
|
end
|
37
52
|
else
|
38
53
|
raise %(Cannot separate "#{@word}". No rule match next syllable at "#{result.join('')}|>#{rest}")
|
@@ -40,5 +55,6 @@ module Pascoale
|
|
40
55
|
end
|
41
56
|
result
|
42
57
|
end
|
58
|
+
alias separated separate
|
43
59
|
end
|
44
60
|
end
|
data/lib/pascoale/version.rb
CHANGED
data/pascoale.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.add_development_dependency 'bundler'
|
21
21
|
spec.add_development_dependency 'rake'
|
22
|
-
spec.add_development_dependency 'rspec', '~> 3'
|
22
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
23
23
|
spec.add_development_dependency 'guard-rspec', '~> 4'
|
24
|
+
spec.add_development_dependency 'simplecov', '~> 0', '>= 0.9'
|
24
25
|
end
|
@@ -1,37 +1,37 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe Formatter do
|
4
4
|
describe '#as_title' do
|
5
5
|
it 'formats simple text' do
|
6
|
-
formatter =
|
6
|
+
formatter = Formatter.new('teste')
|
7
7
|
expect(formatter.as_title).to eq 'Teste'
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'formats simple text with accent' do
|
11
|
-
formatter =
|
11
|
+
formatter = Formatter.new('épico')
|
12
12
|
expect(formatter.as_title).to eq 'Épico'
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'formats multiple words' do
|
16
|
-
formatter =
|
16
|
+
formatter = Formatter.new('joão alves ferreira')
|
17
17
|
expect(formatter.as_title).to eq 'João Alves Ferreira'
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'formats prepositions and connect words as exceptions' do
|
21
|
-
formatter =
|
21
|
+
formatter = Formatter.new('josé da silva e santos dos anjos')
|
22
22
|
expect(formatter.as_title).to eq 'José da Silva e Santos dos Anjos'
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'formats first words always as capitalized' do
|
26
|
-
formatter =
|
26
|
+
formatter = Formatter.new('da vida e das coisas')
|
27
27
|
expect(formatter.as_title).to eq 'Da Vida e das Coisas'
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'formats acronyms' do
|
31
|
-
formatter =
|
31
|
+
formatter = Formatter.new('a ONU não gosta de violência')
|
32
32
|
expect(formatter.as_title).to eq 'A ONU Não Gosta de Violência'
|
33
33
|
|
34
|
-
formatter =
|
34
|
+
formatter = Formatter.new('IRQ é algo ultrapassado!')
|
35
35
|
expect(formatter.as_title).to eq 'IRQ É Algo Ultrapassado!'
|
36
36
|
end
|
37
37
|
end
|
@@ -0,0 +1,371 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Inflector do
|
4
|
+
describe '#pluralize' do
|
5
|
+
matcher :pluralize_as do |expected|
|
6
|
+
result = nil
|
7
|
+
match do |actual|
|
8
|
+
result = Inflector.new(actual).pluralize
|
9
|
+
result == expected
|
10
|
+
end
|
11
|
+
failure_message do |actual|
|
12
|
+
%(expected "#{actual}" to pluralize as "#{expected}", but was "#{result}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'pluralize simple cases' do
|
17
|
+
expect('teste').to pluralize_as 'testes'
|
18
|
+
expect('venda').to pluralize_as 'vendas'
|
19
|
+
expect('casa').to pluralize_as 'casas'
|
20
|
+
expect('peru').to pluralize_as 'perus'
|
21
|
+
expect('pai').to pluralize_as 'pais'
|
22
|
+
expect('lei').to pluralize_as 'leis'
|
23
|
+
expect('herói').to pluralize_as 'heróis'
|
24
|
+
expect('réu').to pluralize_as 'réus'
|
25
|
+
expect('troféu').to pluralize_as 'troféus'
|
26
|
+
expect('fogaréu').to pluralize_as 'fogaréus'
|
27
|
+
expect('degrau').to pluralize_as 'degraus'
|
28
|
+
expect('grau').to pluralize_as 'graus'
|
29
|
+
expect('sarau').to pluralize_as 'saraus'
|
30
|
+
expect('bacalhau').to pluralize_as 'bacalhaus'
|
31
|
+
expect('maçã').to pluralize_as 'maçãs'
|
32
|
+
expect('mãe').to pluralize_as 'mães'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'pluralize paroxytone "ão"' do
|
36
|
+
expect('sótão').to pluralize_as 'sótãos'
|
37
|
+
expect('cidadão').to pluralize_as 'cidadãos'
|
38
|
+
expect('chão').to pluralize_as 'chãos'
|
39
|
+
expect('bênção').to pluralize_as 'bênçãos'
|
40
|
+
expect('cristão').to pluralize_as 'cristãos'
|
41
|
+
expect('grão').to pluralize_as 'grãos'
|
42
|
+
expect('órfão').to pluralize_as 'órfãos'
|
43
|
+
expect('irmão').to pluralize_as 'irmãos'
|
44
|
+
expect('mão').to pluralize_as 'mãos'
|
45
|
+
expect('refrão').to pluralize_as 'refrãos' # OK also: refrães
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'pluralize "ão" to "ões"' do
|
49
|
+
expect('botão').to pluralize_as 'botões'
|
50
|
+
expect('guardião').to pluralize_as 'guardiões' # OK also: guardiães
|
51
|
+
expect('verão').to pluralize_as 'verões' # OK also: verãos
|
52
|
+
expect('anão').to pluralize_as 'anões' # OK also: anãos
|
53
|
+
expect('cirurgião').to pluralize_as 'cirurgiões' # OK also: cirurgiães
|
54
|
+
expect('corrimão').to pluralize_as 'corrimões' # OK also: corrimãos
|
55
|
+
expect('vilão').to pluralize_as 'vilões' # OK also: vilãos
|
56
|
+
expect('ancião').to pluralize_as 'anciões' # OK also: anciães, anciãos
|
57
|
+
expect('ermitão').to pluralize_as 'ermitões' # OK also: ermitães, ermitãos
|
58
|
+
expect('faisão').to pluralize_as 'faisões' # OK also: faisães
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'pluralize "ão" to "ães"' do
|
62
|
+
expect('alemão').to pluralize_as ('alemães')
|
63
|
+
expect('capitão').to pluralize_as ('capitães')
|
64
|
+
expect('pão').to pluralize_as ('pães')
|
65
|
+
expect('cão').to pluralize_as ('cães')
|
66
|
+
expect('charlatão').to pluralize_as ('charlatães')
|
67
|
+
expect('sacristão').to pluralize_as ('sacristães')
|
68
|
+
expect('capelão').to pluralize_as ('capelães')
|
69
|
+
expect('escrivão').to pluralize_as ('escrivães')
|
70
|
+
expect('tabelião').to pluralize_as ('tabeliães')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'pluralize "m" to "ns"' do
|
74
|
+
expect('homem').to pluralize_as 'homens'
|
75
|
+
expect('jardim').to pluralize_as 'jardins'
|
76
|
+
expect('som').to pluralize_as 'sons'
|
77
|
+
expect('atum').to pluralize_as 'atuns'
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'pluralize "r" or "z" to "es"' do
|
81
|
+
expect('mar').to pluralize_as 'mares'
|
82
|
+
expect('açúcar').to pluralize_as 'açúcares'
|
83
|
+
expect('hambúrguer').to pluralize_as 'hambúrgueres'
|
84
|
+
expect('flor').to pluralize_as 'flores'
|
85
|
+
expect('repórter').to pluralize_as 'repórteres'
|
86
|
+
expect('revólver').to pluralize_as 'revólveres'
|
87
|
+
expect('rapaz').to pluralize_as 'rapazes'
|
88
|
+
expect('cruz').to pluralize_as 'cruzes'
|
89
|
+
expect('luz').to pluralize_as 'luzes'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'pluralize "s" to "es"' do
|
93
|
+
expect('obus').to pluralize_as 'obuses'
|
94
|
+
expect('país').to pluralize_as 'países'
|
95
|
+
|
96
|
+
expect('pires').to pluralize_as 'pires'
|
97
|
+
expect('vírus').to pluralize_as 'vírus'
|
98
|
+
expect('lápis').to pluralize_as 'lápis'
|
99
|
+
expect('atlas').to pluralize_as 'atlas'
|
100
|
+
expect('ônibus').to pluralize_as 'ônibus'
|
101
|
+
|
102
|
+
# No accent
|
103
|
+
expect('gás').to pluralize_as 'gases'
|
104
|
+
expect('mês').to pluralize_as 'meses'
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'pluralize "l" to "is"' do
|
108
|
+
expect('animal').to pluralize_as 'animais'
|
109
|
+
expect('canal').to pluralize_as 'canais'
|
110
|
+
expect('vogal').to pluralize_as 'vogais'
|
111
|
+
expect('igual').to pluralize_as 'iguais'
|
112
|
+
expect('anel').to pluralize_as 'anéis'
|
113
|
+
expect('pastel').to pluralize_as 'pastéis'
|
114
|
+
expect('anzol').to pluralize_as 'anzóis'
|
115
|
+
expect('lençol').to pluralize_as 'lençóis'
|
116
|
+
expect('espanhol').to pluralize_as 'espanhóis'
|
117
|
+
|
118
|
+
expect('infantil').to pluralize_as 'infantis'
|
119
|
+
expect('gentil').to pluralize_as 'gentis'
|
120
|
+
expect('funil').to pluralize_as 'funis'
|
121
|
+
expect('barril').to pluralize_as 'barris'
|
122
|
+
expect('ardil').to pluralize_as 'ardis'
|
123
|
+
expect('fuzil').to pluralize_as 'fuzis'
|
124
|
+
|
125
|
+
expect('fóssil').to pluralize_as 'fósseis'
|
126
|
+
expect('hábil').to pluralize_as 'hábeis'
|
127
|
+
expect('útil').to pluralize_as 'úteis'
|
128
|
+
expect('fácil').to pluralize_as 'fáceis'
|
129
|
+
expect('difícil').to pluralize_as 'difíceis'
|
130
|
+
|
131
|
+
expect('projétil').to pluralize_as 'projéteis'
|
132
|
+
expect('réptil').to pluralize_as 'répteis'
|
133
|
+
|
134
|
+
# Yeah! Those are real words :)
|
135
|
+
expect('projetil').to pluralize_as 'projetis'
|
136
|
+
expect('reptil').to pluralize_as 'reptis'
|
137
|
+
|
138
|
+
expect('cruel').to pluralize_as 'cruéis'
|
139
|
+
expect('vil').to pluralize_as 'vis'
|
140
|
+
|
141
|
+
expect('álcool').to pluralize_as 'álcoois'
|
142
|
+
expect('afável').to pluralize_as 'afáveis'
|
143
|
+
expect('amável').to pluralize_as 'amáveis'
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'pluralize "n" to "ns"' do
|
147
|
+
expect('abdômen').to pluralize_as 'abdomens'
|
148
|
+
expect('gérmen').to pluralize_as 'germens'
|
149
|
+
expect('hífen').to pluralize_as 'hifens'
|
150
|
+
expect('líquen').to pluralize_as 'liquens'
|
151
|
+
end
|
152
|
+
|
153
|
+
it '"x" does not pluralize' do
|
154
|
+
expect('xerox').to pluralize_as 'xerox'
|
155
|
+
expect('tórax').to pluralize_as 'tórax'
|
156
|
+
expect('clímax').to pluralize_as 'clímax'
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'pluralize "zinho" to "pluraizinhos"' do
|
160
|
+
expect('pluralzinho').to pluralize_as 'pluraizinhos'
|
161
|
+
expect('botãozinho').to pluralize_as 'botõezinhos'
|
162
|
+
expect('balãozinho').to pluralize_as 'balõezinhos'
|
163
|
+
expect('pãozinho').to pluralize_as 'pãezinhos'
|
164
|
+
expect('papelzinho').to pluralize_as 'papeizinhos'
|
165
|
+
expect('anzolzinho').to pluralize_as 'anzoizinhos'
|
166
|
+
expect('colarzinho').to pluralize_as 'colarezinhos'
|
167
|
+
expect('florzinha').to pluralize_as 'florezinhas'
|
168
|
+
expect('molezinha').to pluralize_as 'molezinhas'
|
169
|
+
expect('luzinha').to pluralize_as 'luzinhas'
|
170
|
+
expect('cruzinha').to pluralize_as 'cruzinhas'
|
171
|
+
|
172
|
+
# Not diminutive ;)
|
173
|
+
expect('colarinho').to pluralize_as 'colarinhos'
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'pluralize exception' do
|
177
|
+
expect('avô').to pluralize_as 'avós'
|
178
|
+
expect('avó').to pluralize_as 'avós'
|
179
|
+
|
180
|
+
expect('qualquer').to pluralize_as 'quaisquer'
|
181
|
+
expect('raiz').to pluralize_as 'raízes'
|
182
|
+
expect('júnior').to pluralize_as 'juniores'
|
183
|
+
expect('sênior').to pluralize_as 'seniores'
|
184
|
+
expect('caráter').to pluralize_as 'caracteres'
|
185
|
+
|
186
|
+
expect('mal').to pluralize_as 'males'
|
187
|
+
expect('cônsul').to pluralize_as 'cônsules'
|
188
|
+
expect('gol').to pluralize_as 'gols'
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'pluralize interesting ones' do
|
192
|
+
expect('degrau').to pluralize_as 'degraus'
|
193
|
+
expect('chapéu').to pluralize_as 'chapéus'
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'pluralize is immutable' do
|
197
|
+
x = Inflector.new('teste')
|
198
|
+
x.pluralize
|
199
|
+
expect(x.pluralize).to eq 'testes'
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe '#singularize' do
|
204
|
+
matcher :singularize_as do |expected|
|
205
|
+
result = nil
|
206
|
+
match do |actual|
|
207
|
+
result = Inflector.new(actual).singularize
|
208
|
+
result == expected
|
209
|
+
end
|
210
|
+
failure_message do |actual|
|
211
|
+
%(expected "#{actual}" to singularize as "#{expected}", but was "#{result}")
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'singularize simple cases' do
|
216
|
+
expect('testes').to singularize_as 'teste'
|
217
|
+
expect('vendas').to singularize_as 'venda'
|
218
|
+
expect('casas').to singularize_as 'casa'
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'singularize paroxytone "ão"' do
|
222
|
+
expect('sótãos').to singularize_as 'sótão'
|
223
|
+
expect('cidadãos').to singularize_as 'cidadão'
|
224
|
+
expect('chãos').to singularize_as 'chão'
|
225
|
+
expect('bênçãos').to singularize_as 'bênção'
|
226
|
+
expect('cristãos').to singularize_as 'cristão'
|
227
|
+
expect('grãos').to singularize_as 'grão'
|
228
|
+
expect('órfãos').to singularize_as 'órfão'
|
229
|
+
expect('irmãos').to singularize_as 'irmão'
|
230
|
+
expect('mãos').to singularize_as 'mão'
|
231
|
+
expect('refrãos').to singularize_as 'refrão'
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'singularize "ões" to "ão" ' do
|
235
|
+
expect('botões').to singularize_as 'botão'
|
236
|
+
expect('guardiões').to singularize_as 'guardião' # OK also: guardiães
|
237
|
+
expect('verões').to singularize_as 'verão' # OK also: verãos
|
238
|
+
expect('anões').to singularize_as 'anão' # OK also: anãos
|
239
|
+
expect('cirurgiões').to singularize_as 'cirurgião' # OK also: cirurgiães
|
240
|
+
expect('corrimões').to singularize_as 'corrimão' # OK also: corrimãos
|
241
|
+
expect('vilões').to singularize_as 'vilão' # OK also: vilãos
|
242
|
+
expect('anciões').to singularize_as 'ancião' # OK also: anciães, anciãos
|
243
|
+
expect('ermitões').to singularize_as 'ermitão' # OK also: ermitães, ermitãos
|
244
|
+
expect('faisões').to singularize_as 'faisão' # OK also: faisães
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'singularize "ães" to "ão"' do
|
248
|
+
expect('alemães').to singularize_as 'alemão'
|
249
|
+
expect('capitães').to singularize_as 'capitão'
|
250
|
+
expect('pães').to singularize_as 'pão'
|
251
|
+
expect('cães').to singularize_as 'cão'
|
252
|
+
expect('charlatães').to singularize_as 'charlatão'
|
253
|
+
expect('sacristães').to singularize_as 'sacristão'
|
254
|
+
expect('capelães').to singularize_as 'capelão'
|
255
|
+
expect('escrivães').to singularize_as 'escrivão'
|
256
|
+
expect('tabeliães').to singularize_as 'tabelião'
|
257
|
+
end
|
258
|
+
|
259
|
+
it 'singularize "ns" to "m"' do
|
260
|
+
expect('homens').to singularize_as 'homem'
|
261
|
+
expect('jardins').to singularize_as 'jardim'
|
262
|
+
expect('sons').to singularize_as 'som'
|
263
|
+
expect('atuns').to singularize_as 'atum'
|
264
|
+
end
|
265
|
+
|
266
|
+
it 'singularize "es" to "r" or "z"' do
|
267
|
+
expect('mares').to singularize_as 'mar'
|
268
|
+
expect('açúcares').to singularize_as 'açúcar'
|
269
|
+
expect('hambúrgueres').to singularize_as 'hambúrguer'
|
270
|
+
expect('flores').to singularize_as 'flor'
|
271
|
+
expect('repórteres').to singularize_as 'repórter'
|
272
|
+
expect('revólveres').to singularize_as 'revólver'
|
273
|
+
expect('rapazes').to singularize_as 'rapaz'
|
274
|
+
expect('cruzes').to singularize_as 'cruz'
|
275
|
+
expect('luzes').to singularize_as 'luz'
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'singularize "es" to "s"' do
|
279
|
+
expect('obuses').to singularize_as 'obus'
|
280
|
+
expect('países').to singularize_as 'país'
|
281
|
+
|
282
|
+
expect('pires').to singularize_as 'pires'
|
283
|
+
expect('vírus').to singularize_as 'vírus'
|
284
|
+
expect('lápis').to singularize_as 'lápis'
|
285
|
+
expect('atlas').to singularize_as 'atlas'
|
286
|
+
expect('ônibus').to singularize_as 'ônibus'
|
287
|
+
|
288
|
+
# No accent
|
289
|
+
expect('gases').to singularize_as 'gás'
|
290
|
+
expect('meses').to singularize_as 'mês'
|
291
|
+
end
|
292
|
+
|
293
|
+
it 'singularize "is" to "l"' do
|
294
|
+
expect('animais').to singularize_as 'animal'
|
295
|
+
expect('canais').to singularize_as 'canal'
|
296
|
+
expect('vogais').to singularize_as 'vogal'
|
297
|
+
expect('iguais').to singularize_as 'igual'
|
298
|
+
expect('anéis').to singularize_as 'anel'
|
299
|
+
expect('pastéis').to singularize_as 'pastel'
|
300
|
+
expect('anzóis').to singularize_as 'anzol'
|
301
|
+
expect('lençóis').to singularize_as 'lençol'
|
302
|
+
expect('espanhóis').to singularize_as 'espanhol'
|
303
|
+
|
304
|
+
expect('infantis').to singularize_as 'infantil'
|
305
|
+
expect('gentis').to singularize_as 'gentil'
|
306
|
+
expect('funis').to singularize_as 'funil'
|
307
|
+
expect('barris').to singularize_as 'barril'
|
308
|
+
expect('ardis').to singularize_as 'ardil'
|
309
|
+
expect('fuzis').to singularize_as 'fuzil'
|
310
|
+
|
311
|
+
expect('fósseis').to singularize_as 'fóssil'
|
312
|
+
expect('hábeis').to singularize_as 'hábil'
|
313
|
+
expect('úteis').to singularize_as 'útil'
|
314
|
+
expect('fáceis').to singularize_as 'fácil'
|
315
|
+
expect('difíceis').to singularize_as 'difícil'
|
316
|
+
|
317
|
+
expect('projéteis').to singularize_as 'projétil'
|
318
|
+
expect('répteis').to singularize_as 'réptil'
|
319
|
+
|
320
|
+
# Yeah! Those are real words :)
|
321
|
+
expect('projetis').to singularize_as 'projetil'
|
322
|
+
expect('reptis').to singularize_as 'reptil'
|
323
|
+
|
324
|
+
expect('cruéis').to singularize_as 'cruel'
|
325
|
+
expect('vis').to singularize_as 'vil'
|
326
|
+
|
327
|
+
expect('álcoois').to singularize_as 'álcool'
|
328
|
+
expect('afáveis').to singularize_as 'afável'
|
329
|
+
expect('amáveis').to singularize_as 'amável'
|
330
|
+
expect('papéis').to singularize_as 'papel'
|
331
|
+
end
|
332
|
+
|
333
|
+
it 'singularize "ns" to "n"' do
|
334
|
+
expect('abdomens').to singularize_as 'abdômen'
|
335
|
+
expect('germens').to singularize_as 'gérmen'
|
336
|
+
expect('hifens').to singularize_as 'hífen'
|
337
|
+
expect('liquens').to singularize_as 'líquen'
|
338
|
+
end
|
339
|
+
|
340
|
+
it 'pluralize "pluraizinhos" to "zinho"' do
|
341
|
+
expect('pluraizinhos').to singularize_as 'pluralzinho'
|
342
|
+
expect('botõezinhos').to singularize_as 'botãozinho'
|
343
|
+
expect('balõezinhos').to singularize_as 'balãozinho'
|
344
|
+
expect('pãezinhos').to singularize_as 'pãozinho'
|
345
|
+
expect('anzoizinhos').to singularize_as 'anzolzinho'
|
346
|
+
expect('colarezinhos').to singularize_as 'colarzinho'
|
347
|
+
expect('florezinhas').to singularize_as 'florzinha'
|
348
|
+
expect('molezinhas').to singularize_as 'molezinha'
|
349
|
+
expect('luzinhas').to singularize_as 'luzinha'
|
350
|
+
expect('cruzinhas').to singularize_as 'cruzinha'
|
351
|
+
|
352
|
+
# Not diminutive ;)
|
353
|
+
expect('colarinhos').to singularize_as 'colarinho'
|
354
|
+
end
|
355
|
+
|
356
|
+
it 'singularize exception' do
|
357
|
+
expect('papeizinhos').to singularize_as 'papelzinho'
|
358
|
+
expect('avós').to singularize_as 'avô'
|
359
|
+
|
360
|
+
expect('quaisquer').to singularize_as 'qualquer'
|
361
|
+
expect('raízes').to singularize_as 'raiz'
|
362
|
+
expect('juniores').to singularize_as 'júnior'
|
363
|
+
expect('seniores').to singularize_as 'sênior'
|
364
|
+
expect('caracteres').to singularize_as 'caráter'
|
365
|
+
|
366
|
+
expect('males').to singularize_as 'mal'
|
367
|
+
expect('cônsules').to singularize_as 'cônsul'
|
368
|
+
expect('gols').to singularize_as 'gol'
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Reflector do
|
4
|
+
describe '#proparoxytone?' do
|
5
|
+
it 'detects proparoxytone words' do
|
6
|
+
expect(Reflector.new('dióxido')).to be_proparoxytone
|
7
|
+
expect(Reflector.new('pãozinho')).not_to be_proparoxytone
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#paroxytone?' do
|
12
|
+
it 'detects paroxytone words' do
|
13
|
+
expect(Reflector.new('jiboia')).to be_paroxytone
|
14
|
+
expect(Reflector.new('ideia')).to be_paroxytone
|
15
|
+
expect(Reflector.new('assembleia')).to be_paroxytone
|
16
|
+
expect(Reflector.new('heroico')).to be_paroxytone
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#oxytone?' do
|
21
|
+
it 'detects oxytone words' do
|
22
|
+
expect(Reflector.new('pão')).to be_oxytone
|
23
|
+
expect(Reflector.new('pé')).to be_oxytone
|
24
|
+
expect(Reflector.new('chulé')).to be_oxytone
|
25
|
+
expect(Reflector.new('parati')).to be_oxytone
|
26
|
+
expect(Reflector.new('urubu')).to be_oxytone
|
27
|
+
expect(Reflector.new('jabuti')).to be_oxytone
|
28
|
+
expect(Reflector.new('jesus')).to be_oxytone
|
29
|
+
expect(Reflector.new('tatu')).to be_oxytone
|
30
|
+
expect(Reflector.new('amor')).to be_oxytone
|
31
|
+
expect(Reflector.new('terror')).to be_oxytone
|
32
|
+
expect(Reflector.new('ruim')).to be_oxytone
|
33
|
+
expect(Reflector.new('condor')).to be_oxytone
|
34
|
+
expect(Reflector.new('anzol')).to be_oxytone
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'detects edge cases' do
|
39
|
+
expect(Reflector.new('cítara')).to be_proparoxytone
|
40
|
+
expect(Reflector.new('citara')).to be_paroxytone
|
41
|
+
expect(Reflector.new('citará')).to be_oxytone
|
42
|
+
|
43
|
+
expect(Reflector.new('pais')).to be_oxytone
|
44
|
+
expect(Reflector.new('país')).to be_oxytone
|
45
|
+
end
|
46
|
+
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
describe SyllableSeparator do
|
4
|
+
matcher :separate_as do |expected|
|
5
|
+
result = nil
|
6
|
+
match do |actual|
|
7
|
+
result = SyllableSeparator.new(actual).separate
|
8
|
+
result == expected
|
9
|
+
end
|
10
|
+
failure_message do |actual|
|
11
|
+
%( expected "#{actual}" to separate as "#{expected}", but was "#{result}")
|
12
|
+
end
|
8
13
|
end
|
9
|
-
failure_message do |actual|
|
10
|
-
%( expected "#{actual}" to separate as "#{expected}", but was "#{result}")
|
11
|
-
end
|
12
|
-
end
|
13
14
|
|
14
|
-
describe Pascoale::SyllableSeparator do
|
15
15
|
it 'separates simple words' do
|
16
16
|
expect('bola').to separate_as %w(bo la)
|
17
17
|
expect('batata').to separate_as %w(ba ta ta)
|
@@ -56,7 +56,7 @@ describe Pascoale::SyllableSeparator do
|
|
56
56
|
expect('falansterialismo').to separate_as %w(fa lans te ri a lis mo)
|
57
57
|
end
|
58
58
|
|
59
|
-
it 'separates single vowels at
|
59
|
+
it 'separates single vowels at beginning' do
|
60
60
|
expect('abacaxi').to separate_as %w(a ba ca xi)
|
61
61
|
expect('exceto').to separate_as %w(ex ce to)
|
62
62
|
expect('arrocho').to separate_as %w(ar ro cho)
|
@@ -94,6 +94,7 @@ describe Pascoale::SyllableSeparator do
|
|
94
94
|
expect('piropneumático').to separate_as %w(pi rop neu má ti co)
|
95
95
|
expect('mnemônica').to separate_as %w(mne mô ni ca)
|
96
96
|
expect('pseudônimo').to separate_as %w(pseu dô ni mo)
|
97
|
+
expect('psicólogo').to separate_as %w(psi có lo go)
|
97
98
|
expect('gnomo').to separate_as %w(gno mo)
|
98
99
|
end
|
99
100
|
|
@@ -101,9 +102,6 @@ describe Pascoale::SyllableSeparator do
|
|
101
102
|
expect('saudade').to separate_as %w(sau da de)
|
102
103
|
expect('vaidade').to separate_as %w(vai da de)
|
103
104
|
expect('suave').to separate_as %w(su a ve)
|
104
|
-
|
105
|
-
# Not sure how to deal with these
|
106
|
-
#expect('traidor').to separate_as %w(trai dor)
|
107
105
|
end
|
108
106
|
|
109
107
|
it 'separates "dieréses"' do
|
@@ -120,9 +118,6 @@ describe Pascoale::SyllableSeparator do
|
|
120
118
|
expect('construir').to separate_as %w(cons tru ir)
|
121
119
|
expect('destruir').to separate_as %w(des tru ir)
|
122
120
|
expect('destruição').to separate_as %w(des tru i ção)
|
123
|
-
|
124
|
-
#expect('acuidade').to separate_as %w(a cu i da de)
|
125
|
-
#expect('ajuizar').to separate_as %w(a ju i zar)
|
126
121
|
end
|
127
122
|
|
128
123
|
it 'separates random words' do
|
@@ -146,5 +141,73 @@ describe Pascoale::SyllableSeparator do
|
|
146
141
|
# For example, the word bellow is correctly separated
|
147
142
|
# (as the dictionary says). =\
|
148
143
|
expect('abrupção').to separate_as %w(a brup ção)
|
144
|
+
|
145
|
+
expect('pais').to separate_as %w(pais)
|
146
|
+
expect('país').to separate_as %w(pa ís)
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'separates "amanhã"' do
|
150
|
+
expect('amanhã').to separate_as %w(a ma nhã)
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
it 'separates "ainda"' do
|
155
|
+
expect('ainda').to separate_as %w(a in da)
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'separates "ruim"' do
|
159
|
+
expect('ruim').to separate_as %w(ru im)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'separates "acuidade" and "ajuizar"' do
|
163
|
+
expect('acuidade').to separate_as %w(a cu i da de)
|
164
|
+
expect('ajuizar').to separate_as %w(a ju i zar)
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'separates "traidor"' do
|
168
|
+
expect('traidor').to separate_as %w(trai dor)
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'separates "arruinar"' do
|
172
|
+
expect('arruinar').to separate_as %w(ar ru i nar)
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'separates "ou"' do
|
176
|
+
expect('cenoura').to separate_as %w(ce nou ra)
|
177
|
+
expect('roupa').to separate_as %w(rou pa)
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'separates "moinho"' do
|
181
|
+
expect('moinho').to separate_as %w(mo i nho)
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'separates "fluido"' do
|
185
|
+
expect('fluido').to separate_as %w(flu i do)
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'separates "cair"' do
|
189
|
+
expect('cair').to separate_as %w(ca ir)
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'separates "saudade" and "saudoso"' do
|
193
|
+
expect('saudade').to separate_as %w(sau da de)
|
194
|
+
expect('saudoso').to separate_as %w(sau do so)
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'separates "rein..." and "reim..."' do
|
198
|
+
expect('reimplantar').to separate_as %w(re im plan tar)
|
199
|
+
expect('reinventar').to separate_as %w(re in ven tar)
|
200
|
+
expect('reincidência').to separate_as %w(re in ci dên ci a)
|
201
|
+
expect('deixar').to separate_as %w(dei xar)
|
202
|
+
expect('pereira').to separate_as %w(pe rei ra)
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'separates "transeunte"' do
|
206
|
+
expect('transeunte').to separate_as %w(tran se un te)
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'separates "doido"' do
|
210
|
+
expect('doído').to separate_as %w(do í do)
|
211
|
+
expect('doido').to separate_as %w(doi do)
|
149
212
|
end
|
150
213
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pascoale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ronie Uliana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3'
|
47
|
+
version: '3.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3'
|
54
|
+
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: guard-rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,26 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '4'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0.9'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - "~>"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0.9'
|
69
89
|
description:
|
70
90
|
email:
|
71
91
|
- ronie.uliana@vagas.com.br
|
@@ -76,6 +96,7 @@ files:
|
|
76
96
|
- ".gitignore"
|
77
97
|
- ".ruby-gemset"
|
78
98
|
- ".ruby-version"
|
99
|
+
- ".travis.yml"
|
79
100
|
- Gemfile
|
80
101
|
- Guardfile
|
81
102
|
- LICENSE.txt
|
@@ -88,12 +109,16 @@ files:
|
|
88
109
|
- lib/pascoale/constants.rb
|
89
110
|
- lib/pascoale/edits.rb
|
90
111
|
- lib/pascoale/formatter.rb
|
112
|
+
- lib/pascoale/inflector.rb
|
113
|
+
- lib/pascoale/reflector.rb
|
91
114
|
- lib/pascoale/syllable_separator.rb
|
92
115
|
- lib/pascoale/syllable_separator_benchmark.rb
|
93
116
|
- lib/pascoale/version.rb
|
94
117
|
- pascoale.gemspec
|
95
118
|
- spec/lib/pascoale/edits_spec.rb
|
96
119
|
- spec/lib/pascoale/formatter_spec.rb
|
120
|
+
- spec/lib/pascoale/inflector_spec.rb
|
121
|
+
- spec/lib/pascoale/reflector_spec.rb
|
97
122
|
- spec/lib/pascoale/syllable_separator_spec.rb
|
98
123
|
- spec/spec_helper.rb
|
99
124
|
homepage: http://github.com/ruliana/pascoale
|
@@ -116,12 +141,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
141
|
version: '0'
|
117
142
|
requirements: []
|
118
143
|
rubyforge_project:
|
119
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.4.6
|
120
145
|
signing_key:
|
121
146
|
specification_version: 4
|
122
147
|
summary: Text processing utilities for Brazilian Portuguese
|
123
148
|
test_files:
|
124
149
|
- spec/lib/pascoale/edits_spec.rb
|
125
150
|
- spec/lib/pascoale/formatter_spec.rb
|
151
|
+
- spec/lib/pascoale/inflector_spec.rb
|
152
|
+
- spec/lib/pascoale/reflector_spec.rb
|
126
153
|
- spec/lib/pascoale/syllable_separator_spec.rb
|
127
154
|
- spec/spec_helper.rb
|