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 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