kabal 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8222532ce70bc4277e557311bb3b92c789211a20
4
- data.tar.gz: 0a3dfce8f30ec6db359a022cfe22c360f97cfb0f
3
+ metadata.gz: 161b4c5b4dffadd7c6f4b1646bad9f812ffbbd75
4
+ data.tar.gz: 827cf85130f5c2e630feaa72b2fa38d0761b0ea6
5
5
  SHA512:
6
- metadata.gz: f8f45ed8a597586f73eb2fbc7b7d4d14dc0260a3d2e44b0e857b67b57e8c0832a5337804719fb4d3043d4de7e8f2285bd8d3b508e2236890a61965329a14e141
7
- data.tar.gz: 60593e22d43fb7bccb32d0de52f5a1e8d6069f0bdca06f5db7782e588b5d5c1e24a8cd447f3c61f6e09546bd44f657ac45474d801996c13e0399b4f84abda332
6
+ metadata.gz: 77e8aacada18961448705cec34164e4d7dc705330349dc21f8e7f5ffaa00d6e0619eaffa0efd8aa284aac2b39e9bad19c0450f955e91ce158fa1b6cb5274228a
7
+ data.tar.gz: fd265f580a42da518ea712130cd7bd61bad020b193a9bc361f42740b894d4de6bfb6627cf684072efeb4b9e5522f555257729c4fe3e8a7427adfd9ece09ea5cf
@@ -1,3 +1,3 @@
1
1
  module Kabal::Config
2
- require "kabal/config/yaml_loader.rb"
2
+ autoload :YamlLoader, "kabal/config/yaml_loader.rb"
3
3
  end
@@ -1,8 +1,7 @@
1
1
  require 'kabal/languages/language'
2
2
 
3
3
  class Kabal::English < Kabal::Language
4
- def convert(number)
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[lang]["single"][number]
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[lang]["two_words"][number / 10]
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[lang]["ten_powers"][2]
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[lang]["ten_powers"][number_order(number)]
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[lang]["ten_powers"][number_order(number)]
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 = YamlLoader.yaml_object "support"
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 = YamlLoader.yaml_object "support"
17
- supports["support"][lang]["fractional"]
33
+ @supports["fractional"]
18
34
  end
19
35
 
20
36
  def names
21
- YamlLoader.yaml_object "languages/#{lang}"
37
+ @names[lang]
22
38
  end
23
39
 
24
40
  def minus
25
- YamlLoader.yaml_object("languages/#{lang}")[lang]["minus"]
41
+ names["minus"]
26
42
  end
27
43
 
28
44
  def whole
29
- YamlLoader.yaml_object("languages/#{lang}")[lang]["whole"]
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 fractional?(number)
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 convert(number)
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
- ten_powers_name = names[lang]["fractional_pre_words"][fractional_number_order(number) % 3] + names[lang]["fractional_ten_powers"][fractional_number_order(number) - (fractional_number_order(number) % 3)]
11
+ ten_powers_name = fractional_pre_word(number) + fractional_order_word(number)
12
12
  else
13
- ten_powers_name = names[lang]["fractional_ten_powers"][fractional_number_order(number)]
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
- feminine_natural_number_name(((fractional_part) * (10 ** fractional_number_order(number))).to_s.split('.')[0].to_i) + " " + Declinations.name_with_declination(fractional_ten_powers_name(number), fractional_part)
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[lang]["single_feminine"][count(number) % 10] if count(number) % 10 == 1 or count(number) % 10 == 2
13
+ return names["single_feminine"][count(number) % 10] if count(number) % 10 == 1 or count(number) % 10 == 2
21
14
  end
22
- names[lang]["single"][number]
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[lang]["two_words"][number / 10]
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[lang]["three_words"][number / 100]
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[lang]["ten_powers"][100] if number_is_google? number
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[lang]["ten_powers"][number_order(number)], count(number))
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[lang]["ten_powers"][number_order(number)], count(number))
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
 
@@ -1,6 +1,5 @@
1
1
  module Kabal
2
2
  module SupportedLanguages
3
- #FIXME add autoload
4
3
  require 'kabal/languages/russian'
5
4
  require 'kabal/languages/english'
6
5
  end
@@ -1,3 +1,3 @@
1
1
  module Kabal
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -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
@@ -2,8 +2,10 @@ support:
2
2
  ru:
3
3
  natural:
4
4
  min: "-(10 ** 102)"
5
- max: "-(10 ** 102)"
5
+ max: "10 ** 102"
6
6
  fractional:
7
7
  symbols: 16
8
8
  en:
9
- natural: true
9
+ natural:
10
+ min: "0"
11
+ max: "10 ** 12"
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.1
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-04 00:00:00.000000000 Z
11
+ date: 2014-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler