kabal 0.2.1 → 0.2.2
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/lib/kabal/config.rb +1 -1
- data/lib/kabal/languages/english.rb +6 -7
- data/lib/kabal/languages/language.rb +42 -9
- data/lib/kabal/languages/russian.rb +1 -3
- data/lib/kabal/languages/russian/fractional_numbers.rb +12 -3
- data/lib/kabal/languages/russian/natural_numbers.rb +7 -14
- data/lib/kabal/supported_languages.rb +0 -1
- data/lib/kabal/version.rb +1 -1
- data/test/lib/kabal/languages/english_test.rb +7 -0
- data/yaml/support.yml +4 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 161b4c5b4dffadd7c6f4b1646bad9f812ffbbd75
|
|
4
|
+
data.tar.gz: 827cf85130f5c2e630feaa72b2fa38d0761b0ea6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 77e8aacada18961448705cec34164e4d7dc705330349dc21f8e7f5ffaa00d6e0619eaffa0efd8aa284aac2b39e9bad19c0450f955e91ce158fa1b6cb5274228a
|
|
7
|
+
data.tar.gz: fd265f580a42da518ea712130cd7bd61bad020b193a9bc361f42740b894d4de6bfb6627cf684072efeb4b9e5522f555257729c4fe3e8a7427adfd9ece09ea5cf
|
data/lib/kabal/config.rb
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
require 'kabal/languages/language'
|
|
2
2
|
|
|
3
3
|
class Kabal::English < Kabal::Language
|
|
4
|
-
def
|
|
5
|
-
raise NumberOutRangeError.message if number < 0 or number >= 10 ** 12 or number % 1 != 0
|
|
4
|
+
def convert_number(number)
|
|
6
5
|
return single number if number >= 0 and number <= 19
|
|
7
6
|
return two_words number if number >= 0 and number <= 99
|
|
8
7
|
return three_words number if number >= 100 and number <= 999
|
|
@@ -10,19 +9,19 @@ class Kabal::English < Kabal::Language
|
|
|
10
9
|
end
|
|
11
10
|
|
|
12
11
|
def single(number)
|
|
13
|
-
names[
|
|
12
|
+
names["single"][number]
|
|
14
13
|
end
|
|
15
14
|
|
|
16
15
|
def two_words(number)
|
|
17
16
|
return single number if number <= 19
|
|
18
|
-
number_name = names[
|
|
17
|
+
number_name = names["two_words"][number / 10]
|
|
19
18
|
number_name += " " + single(number % 10) if (number % 10 != 0)
|
|
20
19
|
number_name
|
|
21
20
|
end
|
|
22
21
|
|
|
23
22
|
def three_words(number)
|
|
24
23
|
return two_words number if number <= 99
|
|
25
|
-
number_name = single(number / 100) + " " + names[
|
|
24
|
+
number_name = single(number / 100) + " " + names["ten_powers"][2]
|
|
26
25
|
number_name += " " + two_words(number % 100) if (number % 100 >= 10)
|
|
27
26
|
number_name += " and " + single(number % 100) if (number % 100 < 10)
|
|
28
27
|
number_name
|
|
@@ -45,9 +44,9 @@ class Kabal::English < Kabal::Language
|
|
|
45
44
|
|
|
46
45
|
def create_number_name(number)
|
|
47
46
|
if @number_name.nil?
|
|
48
|
-
@number_name = count_name(number) + " " + names[
|
|
47
|
+
@number_name = count_name(number) + " " + names["ten_powers"][number_order(number)]
|
|
49
48
|
elsif count(number) != 0
|
|
50
|
-
@number_name += " " + count_name(number) + " " + names[
|
|
49
|
+
@number_name += " " + count_name(number) + " " + names["ten_powers"][number_order(number)]
|
|
51
50
|
end
|
|
52
51
|
end
|
|
53
52
|
|
|
@@ -1,40 +1,73 @@
|
|
|
1
1
|
module Kabal
|
|
2
2
|
class Language
|
|
3
|
+
def initialize
|
|
4
|
+
@names = YamlLoader.yaml_object "languages/#{lang}"
|
|
5
|
+
@supports = YamlLoader.yaml_object("support")["support"][lang]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def convert(number)
|
|
9
|
+
check_supports_for number
|
|
10
|
+
convert_number number
|
|
11
|
+
end
|
|
12
|
+
|
|
3
13
|
def lang
|
|
4
14
|
languages = YamlLoader.yaml_object "languages"
|
|
5
15
|
@lang = languages[self.to_s.split(":")[-2]]
|
|
6
16
|
end
|
|
7
17
|
|
|
8
18
|
def supports_natural?
|
|
9
|
-
supports
|
|
10
|
-
supports["support"][lang]["natural"]
|
|
19
|
+
@supports["natural"]
|
|
11
20
|
end
|
|
12
21
|
|
|
13
22
|
#TODO реализовать метод supports_negative?
|
|
14
23
|
|
|
24
|
+
def min_value
|
|
25
|
+
eval @supports["natural"]["min"]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def max_value
|
|
29
|
+
eval @supports["natural"]["max"]
|
|
30
|
+
end
|
|
31
|
+
|
|
15
32
|
def supports_fractional?
|
|
16
|
-
supports
|
|
17
|
-
supports["support"][lang]["fractional"]
|
|
33
|
+
@supports["fractional"]
|
|
18
34
|
end
|
|
19
35
|
|
|
20
36
|
def names
|
|
21
|
-
|
|
37
|
+
@names[lang]
|
|
22
38
|
end
|
|
23
39
|
|
|
24
40
|
def minus
|
|
25
|
-
|
|
41
|
+
names["minus"]
|
|
26
42
|
end
|
|
27
43
|
|
|
28
44
|
def whole
|
|
29
|
-
|
|
45
|
+
names["whole"]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def fractional?(number)
|
|
49
|
+
number % 1 != 0
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def natural_number_name(number)
|
|
53
|
+
#FIXME switch case next lines
|
|
54
|
+
return single(number) if number >= 0 and number <= 19
|
|
55
|
+
return two_words(number) if number >= 20 and number <= 99
|
|
56
|
+
return three_words(number) if number >= 100 and number <= 999
|
|
57
|
+
ten_powers(number) if number >= 1000
|
|
30
58
|
end
|
|
31
59
|
|
|
32
60
|
def natural?(number)
|
|
33
61
|
number % 1 == 0
|
|
34
62
|
end
|
|
35
63
|
|
|
36
|
-
def
|
|
37
|
-
number % 1 != 0
|
|
64
|
+
def check_supports_for(number)
|
|
65
|
+
if number % 1 != 0 and not supports_fractional?
|
|
66
|
+
raise NoSupportForFractionalNumberOnCurrentLanguages.message
|
|
67
|
+
end
|
|
68
|
+
if number >= max_value or number <= min_value
|
|
69
|
+
raise NumberOutRangeError.message
|
|
70
|
+
end
|
|
38
71
|
end
|
|
39
72
|
end
|
|
40
73
|
end
|
|
@@ -7,9 +7,7 @@ class Kabal::Russian < Kabal::Language
|
|
|
7
7
|
include Kabal::RussianRules::NaturalNumbers
|
|
8
8
|
include Kabal::RussianRules::FractionalNumbers
|
|
9
9
|
|
|
10
|
-
def
|
|
11
|
-
#FIXME find way to get min and max from yml file
|
|
12
|
-
raise NumberOutRangeError.message if number <= -(10 ** 102) or number >= 10 ** 102
|
|
10
|
+
def convert_number(number)
|
|
13
11
|
#FIXME find better way
|
|
14
12
|
@number_name = nil
|
|
15
13
|
need_minus?(number) ? (minus + " " + number_words(-number)) : number_words(number)
|
|
@@ -8,12 +8,20 @@ module Kabal
|
|
|
8
8
|
def fractional_ten_powers_name(number)
|
|
9
9
|
ten_powers_name = ""
|
|
10
10
|
if need_pre_word? number
|
|
11
|
-
|
|
11
|
+
ten_powers_name = fractional_pre_word(number) + fractional_order_word(number)
|
|
12
12
|
else
|
|
13
|
-
ten_powers_name = names[
|
|
13
|
+
ten_powers_name = names["fractional_ten_powers"][fractional_number_order(number)]
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
+
def fractional_order_word(number)
|
|
18
|
+
names["fractional_ten_powers"][fractional_number_order(number) - (fractional_number_order(number) % 3)]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def fractional_pre_word(number)
|
|
22
|
+
names["fractional_pre_words"][fractional_number_order(number) % 3]
|
|
23
|
+
end
|
|
24
|
+
|
|
17
25
|
def need_pre_word?(number)
|
|
18
26
|
fractional_number_order(number) > 3 and fractional_number_order(number) % 3 != 0
|
|
19
27
|
end
|
|
@@ -24,7 +32,8 @@ module Kabal
|
|
|
24
32
|
|
|
25
33
|
def fractional_part_name(number)
|
|
26
34
|
fractional_part = (number % 1).round(fractional_number_order(number))
|
|
27
|
-
|
|
35
|
+
fractional_order = ((fractional_part) * (10 ** fractional_number_order(number))).to_s.split('.')[0].to_i
|
|
36
|
+
feminine_natural_number_name(fractional_order) + " " + Declinations.name_with_declination(fractional_ten_powers_name(number), fractional_part)
|
|
28
37
|
end
|
|
29
38
|
|
|
30
39
|
def whole_part_name(number)
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
module Kabal
|
|
2
2
|
module RussianRules
|
|
3
3
|
module NaturalNumbers
|
|
4
|
-
def natural_number_name(number)
|
|
5
|
-
#FIXME switch case next lines
|
|
6
|
-
return single(number) if number >= 0 and number <= 19
|
|
7
|
-
return two_words(number) if number >= 20 and number <= 99
|
|
8
|
-
return three_words(number) if number >= 100 and number <= 999
|
|
9
|
-
ten_powers(number) if number >= 1000
|
|
10
|
-
end
|
|
11
4
|
|
|
12
5
|
def feminine_natural_number_name(number)
|
|
13
6
|
@feminine_name = true
|
|
@@ -17,28 +10,28 @@ module Kabal
|
|
|
17
10
|
def single(number)
|
|
18
11
|
if @feminine_name
|
|
19
12
|
@feminine_name = false
|
|
20
|
-
return names[
|
|
13
|
+
return names["single_feminine"][count(number) % 10] if count(number) % 10 == 1 or count(number) % 10 == 2
|
|
21
14
|
end
|
|
22
|
-
names[
|
|
15
|
+
names["single"][number]
|
|
23
16
|
end
|
|
24
17
|
|
|
25
18
|
def two_words(number)
|
|
26
19
|
return single number if number <= 19
|
|
27
|
-
number_name = names[
|
|
20
|
+
number_name = names["two_words"][number / 10]
|
|
28
21
|
number_name += " " + single(number % 10) if (number % 10 != 0)
|
|
29
22
|
number_name
|
|
30
23
|
end
|
|
31
24
|
|
|
32
25
|
def three_words(number)
|
|
33
26
|
return two_words number if number / 100 == 0
|
|
34
|
-
number_name = names[
|
|
27
|
+
number_name = names["three_words"][number / 100]
|
|
35
28
|
return number_name += " " + two_words(number % 100) if (number % 100 >= 20)
|
|
36
29
|
return number_name += " " + single(number % 100) if (number % 100 != 0)
|
|
37
30
|
number_name
|
|
38
31
|
end
|
|
39
32
|
def ten_powers(number)
|
|
40
33
|
#FIXME find better way
|
|
41
|
-
return names[
|
|
34
|
+
return names["ten_powers"][100] if number_is_google? number
|
|
42
35
|
less_thousands number if number_is_thousands? number
|
|
43
36
|
return @number_name if number_is_thousands? number
|
|
44
37
|
create_number_name number
|
|
@@ -55,9 +48,9 @@ module Kabal
|
|
|
55
48
|
|
|
56
49
|
def create_number_name(number)
|
|
57
50
|
if @number_name.nil?
|
|
58
|
-
@number_name = count_name(number) + " " + Declinations.name_with_declination(names[
|
|
51
|
+
@number_name = count_name(number) + " " + Declinations.name_with_declination(names["ten_powers"][number_order(number)], count(number))
|
|
59
52
|
elsif count(number) != 0
|
|
60
|
-
@number_name += " " + count_name(number) + " " + Declinations.name_with_declination(names[
|
|
53
|
+
@number_name += " " + count_name(number) + " " + Declinations.name_with_declination(names["ten_powers"][number_order(number)], count(number))
|
|
61
54
|
end
|
|
62
55
|
end
|
|
63
56
|
|
data/lib/kabal/version.rb
CHANGED
|
@@ -36,4 +36,11 @@ class EnglishTest < TestCase
|
|
|
36
36
|
def test_hundred_millions_with_and
|
|
37
37
|
assert_equal @eng.convert(111150021), "one hundred eleven million one hundred fifty thousand and twenty one"
|
|
38
38
|
end
|
|
39
|
+
|
|
40
|
+
def test_fractional_number
|
|
41
|
+
exception = assert_raises RuntimeError do
|
|
42
|
+
@eng.convert 0.1
|
|
43
|
+
end
|
|
44
|
+
assert_equal NoSupportForFractionalNumberOnCurrentLanguages.message, exception.message
|
|
45
|
+
end
|
|
39
46
|
end
|
data/yaml/support.yml
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kabal
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pavel Kalashnikov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-05-
|
|
11
|
+
date: 2014-05-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|