pascoale 0.2.1 → 0.3.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/.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
|