respanol 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +50 -0
- data/.rspec +2 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +95 -0
- data/Guardfile +122 -0
- data/README.md +21 -0
- data/lib/respanol/ano.rb +8 -0
- data/lib/respanol/examenes/ano_examen.rb +20 -0
- data/lib/respanol/examenes/conjugacion_examen.rb +20 -0
- data/lib/respanol/examenes/examen_base.rb +53 -0
- data/lib/respanol/examenes/fecha_examen.rb +22 -0
- data/lib/respanol/examenes/hora_examen.rb +25 -0
- data/lib/respanol/examenes/numero_examen.rb +38 -0
- data/lib/respanol/examenes/semana_examen.rb +20 -0
- data/lib/respanol/fecha.rb +12 -0
- data/lib/respanol/hora.rb +43 -0
- data/lib/respanol/impresion.rb +23 -0
- data/lib/respanol/numero.rb +102 -0
- data/lib/respanol/pronombre.rb +81 -0
- data/lib/respanol/semana.rb +14 -0
- data/lib/respanol/traducir.rb +32 -0
- data/lib/respanol/traductor.rb +15 -0
- data/lib/respanol/verbos/aprender.rb +7 -0
- data/lib/respanol/verbos/caminar.rb +7 -0
- data/lib/respanol/verbos/dormir.rb +7 -0
- data/lib/respanol/verbos/entender.rb +7 -0
- data/lib/respanol/verbos/hablar.rb +7 -0
- data/lib/respanol/verbos/hacer.rb +7 -0
- data/lib/respanol/verbos/jugar.rb +7 -0
- data/lib/respanol/verbos/leer.rb +7 -0
- data/lib/respanol/verbos/poder.rb +7 -0
- data/lib/respanol/verbos/ser.rb +7 -0
- data/lib/respanol/verbos/subir.rb +7 -0
- data/lib/respanol/verbos/tener.rb +7 -0
- data/lib/respanol/verbos/tocar.rb +7 -0
- data/lib/respanol/verbos/verbo_base.rb +7 -0
- data/lib/respanol/verbos/viajar.rb +7 -0
- data/lib/respanol/verbos/vivir.rb +7 -0
- data/lib/respanol/version.rb +3 -0
- data/lib/respanol.rb +11 -0
- data/respanol.gemspec +30 -0
- data/spec/respanol/fecha_spec.rb +7 -0
- data/spec/respanol/hora_spec.rb +28 -0
- data/spec/respanol/impresion_spec.rb +15 -0
- data/spec/respanol/numero_spec.rb +99 -0
- data/spec/respanol_spec.rb +0 -0
- data/spec/spec_helper.rb +110 -0
- metadata +181 -0
@@ -0,0 +1,102 @@
|
|
1
|
+
module Respanol
|
2
|
+
class Numero
|
3
|
+
UNIDADES = %w( cero uno dos tres cuatro cinco seis siete ocho nueve )
|
4
|
+
DECENA = %w( diez once doce trece catorce quince dieciseis diecisiete dieciocho diecinueve )
|
5
|
+
DECENAS = %W( #{''} diez viente treinta cuarenta cincuenta sesenta setenta ochenta noventa )
|
6
|
+
CENTENARES = %W( #{''} ciento doscientos trescientos cuatrocientos quinientos seiscientos setecientos ochocientos novecientos )
|
7
|
+
UNO_APOCOPE = 'un'
|
8
|
+
MILLONS = %W( #{''} millon billon trillon cuatrillon quintillon sextillon septillon octillon nonillon decillon undecillon duodecillon tredecillon cuatordecillon quindecillon sexdecillon septendecillon octodecillon novendecillon vigintillon )
|
9
|
+
UNIDAD_1K = 'mil'
|
10
|
+
DECIMAL = 'coma'
|
11
|
+
|
12
|
+
def self.feminino
|
13
|
+
FemininoNumero
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.unirse_palabras(*ps)
|
17
|
+
ps.flatten.join(' ').gsub(/\s+/, ' ').strip
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.numero_en_palabras(numero)
|
21
|
+
return self::UNIDADES[0] if numero == 0
|
22
|
+
|
23
|
+
num = numero
|
24
|
+
millons = []
|
25
|
+
s_millons = []
|
26
|
+
es_unidad = true
|
27
|
+
i_millon = 0
|
28
|
+
loop do
|
29
|
+
# Obteno el millone
|
30
|
+
millon = num % 1_000_000
|
31
|
+
millons.push millon
|
32
|
+
# Escribo el millone
|
33
|
+
s_millons.push("#{MILLONS[i_millon]}#{'es' if millon > 1}") if !es_unidad && millon >= 1
|
34
|
+
s_millons.push millon_en_palabras(millon, es_unidad)
|
35
|
+
# Preparo a continuacion
|
36
|
+
es_unidad = false
|
37
|
+
i_millon += 1
|
38
|
+
num = num / 1_000_000
|
39
|
+
|
40
|
+
break if num == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
unirse_palabras(s_millons.reverse)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.millon_en_palabras(numero, es_unidad = true)
|
47
|
+
num = numero % 1_000_000
|
48
|
+
|
49
|
+
s_ultimos_3 = tres_ultimos_en_palabras(num, es_unidad)
|
50
|
+
|
51
|
+
if num >= 1000
|
52
|
+
mil = (num % 1_000_000) / 1000
|
53
|
+
s_mil = case mil
|
54
|
+
when 0
|
55
|
+
''
|
56
|
+
when 1
|
57
|
+
UNIDAD_1K
|
58
|
+
else
|
59
|
+
"#{tres_ultimos_en_palabras(mil, false)} #{UNIDAD_1K}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
unirse_palabras(s_mil, s_ultimos_3)
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.dos_ultimos_en_palabras(num, es_unidad = true)
|
67
|
+
ultimos_2 = num % 100
|
68
|
+
ultimo = ultimos_2 % 10
|
69
|
+
case ultimos_2 / 10
|
70
|
+
when 2
|
71
|
+
ultimo == 0 ? DECENAS[2] : "vienti#{unidad(ultimo, es_unidad)}"
|
72
|
+
when 1
|
73
|
+
DECENA[ultimo]
|
74
|
+
else
|
75
|
+
s = "#{DECENAS[ultimos_2 / 10]}"
|
76
|
+
s = s + "#{' y ' if (ultimos_2 / 10 >= 3)}#{unidad(ultimo, es_unidad)}" if ultimo > 0
|
77
|
+
s
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.tres_ultimos_en_palabras(num, es_unidad = true)
|
82
|
+
return 'cien' if (num % 1000) == 100
|
83
|
+
|
84
|
+
s_ultimos_2 = dos_ultimos_en_palabras(num, es_unidad)
|
85
|
+
s_centenar = self::CENTENARES[(num % 1000) / 100] if num >= 100
|
86
|
+
unirse_palabras(s_centenar, s_ultimos_2)
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.unidad(num, es_unidad = true)
|
90
|
+
ultimo = num % 10
|
91
|
+
return self::UNO_APOCOPE if !es_unidad && ultimo == 1
|
92
|
+
|
93
|
+
self::UNIDADES[ultimo]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
class FemininoNumero < Numero
|
98
|
+
UNIDADES = %w( cero una dos tres cuatro cinco seis siete ocho nueve )
|
99
|
+
CENTENARES = %W( #{''} ciento doscientas trescientas cuatrocientas quinientas seiscientas setecientas ochocientas novecientas )
|
100
|
+
UNO_APOCOPE = 'una'
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Respanol
|
2
|
+
class Pronombre
|
3
|
+
YO = 'Yo'
|
4
|
+
TU = 'Tu'
|
5
|
+
EL = 'El'
|
6
|
+
ELLA = 'Ella'
|
7
|
+
USTED = 'Usted'
|
8
|
+
NOSOTROS = 'Nosotros'
|
9
|
+
NOSOTRAS = 'Nosotras'
|
10
|
+
VOSOTROS = 'Vosotros'
|
11
|
+
VOSOTRAS = 'Vosotras'
|
12
|
+
ELLOS = 'Ellos'
|
13
|
+
ELLAS = 'Ellas'
|
14
|
+
USTEDES = 'Ustedes'
|
15
|
+
|
16
|
+
def self.todos
|
17
|
+
@all ||= [YO, TU, EL, ELLA, USTED, NOSOTROS, NOSOTRAS, VOSOTROS, VOSOTRAS, ELLOS, ELLAS, USTEDES]
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.plurals
|
21
|
+
@plurals ||= [NOSOTROS, NOSOTRAS, VOSOTROS, VOSOTRAS, ELLOS, ELLAS, USTEDES]
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.plural?(pro)
|
25
|
+
plurals.include?(pro)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.singulars
|
29
|
+
@singulars ||= [YO, TU, EL, ELLA, USTED]
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.singular?(pro)
|
33
|
+
singulars.include?(pro)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.primera?(pro)
|
37
|
+
[YO, NOSOTROS, NOSOTRAS].include?(pro)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.segunda?(pro)
|
41
|
+
[TU, VOSOTROS, VOSOTRAS].include?(pro)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.tercera?(pro)
|
45
|
+
[El, ELLA, USTED, ELLOS, ELLAS, USTEDES].include?(pro)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.singular_primera?(pro)
|
49
|
+
pro == YO
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.singular_segunda?(pro)
|
53
|
+
pro == TU
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.singular_tercera?(pro)
|
57
|
+
[EL, ELLA, USTED].include?(pro)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.plural_primera?(pro)
|
61
|
+
[NOSOTROS, NOSOTRAS].include?(pro)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.plural_segunda?(pro)
|
65
|
+
[VOSOTROS, VOSOTRAS].include?(pro)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.plural_tercera?(pro)
|
69
|
+
[ELLOS, ELLAS, USTEDES].include?(pro)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.verbo_indice(pro)
|
73
|
+
metodos = [
|
74
|
+
:singular_primera?, :singular_segunda?, :singular_tercera?,
|
75
|
+
:plural_primera?, :plural_segunda?, :plural_tercera?
|
76
|
+
]
|
77
|
+
|
78
|
+
metodos.find_index { |m| self.send(m, pro) }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Respanol
|
2
|
+
module Traducir
|
3
|
+
module ClassMethods
|
4
|
+
def definicion
|
5
|
+
nombre = self.name.split('::').last.downcase
|
6
|
+
@definicion ||= Traductor.traducir_y_definicion(nombre)
|
7
|
+
|
8
|
+
tpl = " | %s"
|
9
|
+
o = ["=> #{@definicion[:translated]}"]
|
10
|
+
o << " *---INGLÉS----------"
|
11
|
+
@definicion[:target_definitions].each do |d|
|
12
|
+
o << tpl % d
|
13
|
+
end
|
14
|
+
o << " *---ESPAÑOL----------"
|
15
|
+
@definicion[:source_definitions].each do |d|
|
16
|
+
o << tpl % d
|
17
|
+
end
|
18
|
+
|
19
|
+
puts o.join("\n")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.included(receiver)
|
28
|
+
receiver.extend ClassMethods
|
29
|
+
receiver.send :include, InstanceMethods
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Respanol
|
2
|
+
class Traductor
|
3
|
+
def self.traductor
|
4
|
+
@traductor ||= Glosbe::Translate.new('es', 'en')
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.traducir(*args)
|
8
|
+
traductor.translate(*args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.traducir_y_definicion(*args)
|
12
|
+
traductor.translate_and_definition(*args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/respanol.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'readline'
|
2
|
+
require 'glosbe'
|
3
|
+
|
4
|
+
require 'respanol/version'
|
5
|
+
require 'respanol/impresion'
|
6
|
+
require 'respanol/traducir'
|
7
|
+
|
8
|
+
require 'respanol/verbos/verbo_base'
|
9
|
+
require 'respanol/examenes/examen_base'
|
10
|
+
|
11
|
+
Dir['./lib/**/*.rb'].each { |file| require file }
|
data/respanol.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
3
|
+
require 'respanol/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'respanol'
|
7
|
+
s.version = Respanol::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.licenses = ['MIT']
|
10
|
+
s.authors = ['Drake Tran']
|
11
|
+
s.email = ['tievdrake@gmail.com']
|
12
|
+
s.summary = 'Makes learning Spanish fun and easy!'
|
13
|
+
s.description = 'Makes learning Spanish fun and easy! With all the core and tests'
|
14
|
+
s.homepage = 'https://github.com/tiev/respanol'
|
15
|
+
|
16
|
+
|
17
|
+
s.required_ruby_version = '>= 1.9.0'
|
18
|
+
|
19
|
+
s.add_runtime_dependency 'glosbe', '~> 0.0'
|
20
|
+
s.add_development_dependency 'guard', '~> 2.0'
|
21
|
+
s.add_development_dependency 'guard-bundler', '~> 2.0'
|
22
|
+
s.add_development_dependency 'guard-rspec', '~> 4.7'
|
23
|
+
s.add_development_dependency 'rspec', '~> 3.5'
|
24
|
+
s.add_development_dependency 'simplecov', '~> 0.14'
|
25
|
+
|
26
|
+
s.files = `git ls-files`.split("\n")
|
27
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
28
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
29
|
+
s.require_paths = ["lib"]
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
RSpec.describe Respanol::Hora do
|
2
|
+
describe '.comienzo' do
|
3
|
+
context 'when time at 1 hour' do
|
4
|
+
it { expect(Respanol::Hora.comienzo(Time.parse('1:0'))).to eq('Es la') }
|
5
|
+
end
|
6
|
+
context 'when time at more than 1:30' do
|
7
|
+
it { expect(Respanol::Hora.comienzo(Time.parse('1:31'))).to eq('Son las') }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.hora_en_palabras' do
|
12
|
+
context 'at exact hour' do
|
13
|
+
it { expect(Respanol::Hora.hora_en_palabras(Time.parse('2:0'))).to include('en punto') }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'at a quarter' do
|
17
|
+
it { expect(Respanol::Hora.hora_en_palabras(Time.parse('2:15'))).to include('y cuarto') }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'at half hour' do
|
21
|
+
it { expect(Respanol::Hora.hora_en_palabras(Time.parse('2:30'))).to include('y media') }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'at minus hour' do
|
25
|
+
it { expect(Respanol::Hora.hora_en_palabras(Time.parse('2:31'))).to include('menos') }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
RSpec.describe Respanol::Impresion do
|
2
|
+
before :all do
|
3
|
+
Klase = Class.new.include(Respanol::Impresion)
|
4
|
+
Respanol::KlaseInterna = Class.new.include(Respanol::Impresion)
|
5
|
+
end
|
6
|
+
|
7
|
+
describe '.prefijo' do
|
8
|
+
it { expect { Klase.prefijo }.to output('Klase:: ').to_stdout }
|
9
|
+
it { expect { Respanol::KlaseInterna.prefijo }.to output('KlaseInterna:: ').to_stdout }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.impresion' do
|
13
|
+
it { expect { Klase.impresion('test') }.to output('Klase:: test').to_stdout }
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
RSpec.describe Respanol::Numero do
|
2
|
+
describe '.numero_en_palabras' do
|
3
|
+
it 'works' do
|
4
|
+
expect(Respanol::Numero.numero_en_palabras(rand(100))).to be_instance_of(String)
|
5
|
+
end
|
6
|
+
|
7
|
+
context 'for number 0' do
|
8
|
+
it { expect(Respanol::Numero.numero_en_palabras(0)).to eq('cero') }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.unirse_palabras' do
|
13
|
+
it 'accepts list of strings' do
|
14
|
+
expect(Respanol::Numero.unirse_palabras('a', 'b', 'c')).to eq('a b c')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.unidad' do
|
19
|
+
context 'with 1 at end of number string' do
|
20
|
+
let(:object) { Respanol::Numero.unidad(1) }
|
21
|
+
it { expect(object).to eq('uno') }
|
22
|
+
end
|
23
|
+
context 'with 1 at middle of number string' do
|
24
|
+
let(:object) { Respanol::Numero.unidad(1, false) }
|
25
|
+
it { expect(object).to eq('un') }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.tres_ultimos_en_palabras' do
|
30
|
+
context 'for number 100' do
|
31
|
+
let(:object) { Respanol::Numero.tres_ultimos_en_palabras(100) }
|
32
|
+
it { expect(object).to eq('cien') }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '.dos_ultimos_en_palabras' do
|
37
|
+
context 'for number 1..9' do
|
38
|
+
let(:object) {
|
39
|
+
(1..9).map { |v| Respanol::Numero.dos_ultimos_en_palabras(v) }
|
40
|
+
}
|
41
|
+
it {
|
42
|
+
expect(object).to satisfy('be correct') do |o|
|
43
|
+
o.map.with_index(1) do |v, i|
|
44
|
+
v == Respanol::Numero::UNIDADES[i]
|
45
|
+
end.all?
|
46
|
+
end
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'for number 1x' do
|
51
|
+
let(:object) {
|
52
|
+
(11..19).map do |v|
|
53
|
+
Respanol::Numero.dos_ultimos_en_palabras(v)
|
54
|
+
end
|
55
|
+
}
|
56
|
+
it {
|
57
|
+
expect(object).to satisfy('be correct') do |o|
|
58
|
+
o.map.with_index(1) { |v, i| v == Respanol::Numero::DECENA[i] }.all?
|
59
|
+
end
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'for number 2x' do
|
64
|
+
let(:object) {
|
65
|
+
(21..29).map do |v|
|
66
|
+
Respanol::Numero.dos_ultimos_en_palabras(v)
|
67
|
+
end
|
68
|
+
}
|
69
|
+
it { expect(object).to all(include('vienti')) }
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'for numbers >= 3x' do
|
73
|
+
let(:object) { Respanol::Numero.dos_ultimos_en_palabras(32) }
|
74
|
+
it { expect(object).to include(' y ') }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '.feminino' do
|
79
|
+
it { expect(Respanol::Numero.feminino).to equal(Respanol::FemininoNumero) }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
RSpec.describe Respanol::FemininoNumero do
|
84
|
+
describe '.unidad' do
|
85
|
+
context 'with 1' do
|
86
|
+
let(:object) { [Respanol::FemininoNumero.unidad(1), Respanol::FemininoNumero.unidad(1, false)] }
|
87
|
+
it { expect(object).to all(eq('una')) }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '.tres_ultimos_en_palabras' do
|
92
|
+
context 'with hundred numbers' do
|
93
|
+
let(:object) {
|
94
|
+
(200..900).step(100).map { |v| Respanol::FemininoNumero.tres_ultimos_en_palabras(v) }
|
95
|
+
}
|
96
|
+
it { expect(object).to all(end_with('ientas')) }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
File without changes
|