numbers_and_words 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +15 -0
  2. data/README.rdoc +90 -1
  3. data/lib/numbers_and_words.rb +4 -3
  4. data/lib/numbers_and_words/core_ext.rb +1 -0
  5. data/lib/numbers_and_words/core_ext/array.rb +1 -1
  6. data/lib/numbers_and_words/core_ext/float.rb +5 -0
  7. data/lib/numbers_and_words/core_ext/integer.rb +2 -9
  8. data/lib/numbers_and_words/helper_classes.rb +2 -0
  9. data/lib/numbers_and_words/helper_classes/array_extensions/helpers.rb +81 -0
  10. data/lib/numbers_and_words/helper_classes/array_extensions/validations.rb +19 -0
  11. data/lib/numbers_and_words/helper_classes/figures_array.rb +18 -0
  12. data/lib/numbers_and_words/helper_classes/words_array.rb +11 -0
  13. data/lib/numbers_and_words/i18n/locales/numbers.en.yml +48 -0
  14. data/lib/numbers_and_words/i18n/locales/numbers.es.yml +15 -0
  15. data/lib/numbers_and_words/i18n/locales/numbers.hu.yml +16 -0
  16. data/lib/numbers_and_words/i18n/locales/numbers.ru.yml +27 -3
  17. data/lib/numbers_and_words/i18n/locales/numbers.se.yml +7 -0
  18. data/lib/numbers_and_words/i18n/locales/numbers.ua.yml +14 -2
  19. data/lib/numbers_and_words/i18n/pluralization.rb +1 -0
  20. data/lib/numbers_and_words/i18n/plurals/es.rb +11 -0
  21. data/lib/numbers_and_words/strategies.rb +16 -11
  22. data/lib/numbers_and_words/strategies/array_joiner.rb +31 -0
  23. data/lib/numbers_and_words/strategies/figures_converter.rb +33 -0
  24. data/lib/numbers_and_words/strategies/figures_converter/decorators.rb +39 -0
  25. data/lib/numbers_and_words/strategies/figures_converter/decorators/base.rb +18 -0
  26. data/lib/numbers_and_words/strategies/figures_converter/decorators/en.rb +3 -0
  27. data/lib/numbers_and_words/strategies/figures_converter/decorators/en/base.rb +12 -0
  28. data/lib/numbers_and_words/strategies/figures_converter/decorators/en/fractional.rb +38 -0
  29. data/lib/numbers_and_words/strategies/figures_converter/decorators/en/integral.rb +12 -0
  30. data/lib/numbers_and_words/strategies/figures_converter/decorators/hu.rb +3 -0
  31. data/lib/numbers_and_words/strategies/figures_converter/decorators/hu/base.rb +12 -0
  32. data/lib/numbers_and_words/strategies/figures_converter/decorators/hu/fractional.rb +38 -0
  33. data/lib/numbers_and_words/strategies/figures_converter/decorators/hu/integral.rb +12 -0
  34. data/lib/numbers_and_words/strategies/figures_converter/decorators/ru.rb +3 -0
  35. data/lib/numbers_and_words/strategies/figures_converter/decorators/ru/base.rb +12 -0
  36. data/lib/numbers_and_words/strategies/figures_converter/decorators/ru/fractional.rb +39 -0
  37. data/lib/numbers_and_words/strategies/figures_converter/decorators/ru/integral.rb +27 -0
  38. data/lib/numbers_and_words/strategies/figures_converter/decorators/ua.rb +3 -0
  39. data/lib/numbers_and_words/strategies/figures_converter/decorators/ua/base.rb +12 -0
  40. data/lib/numbers_and_words/strategies/figures_converter/decorators/ua/fractional.rb +39 -0
  41. data/lib/numbers_and_words/strategies/figures_converter/decorators/ua/integral.rb +27 -0
  42. data/lib/numbers_and_words/strategies/figures_converter/languages.rb +39 -0
  43. data/lib/numbers_and_words/strategies/figures_converter/languages/base.rb +29 -0
  44. data/lib/numbers_and_words/strategies/figures_converter/languages/en.rb +48 -0
  45. data/lib/numbers_and_words/strategies/figures_converter/languages/es.rb +37 -0
  46. data/lib/numbers_and_words/strategies/figures_converter/languages/families/base.rb +77 -0
  47. data/lib/numbers_and_words/strategies/figures_converter/languages/families/cyrillic.rb +34 -0
  48. data/lib/numbers_and_words/strategies/figures_converter/languages/families/helpers.rb +36 -0
  49. data/lib/numbers_and_words/strategies/figures_converter/languages/families/latin.rb +13 -0
  50. data/lib/numbers_and_words/strategies/figures_converter/languages/fr.rb +37 -0
  51. data/lib/numbers_and_words/strategies/figures_converter/languages/hu.rb +63 -0
  52. data/lib/numbers_and_words/strategies/figures_converter/languages/it.rb +11 -0
  53. data/lib/numbers_and_words/strategies/figures_converter/languages/nl.rb +26 -0
  54. data/lib/numbers_and_words/strategies/figures_converter/languages/ru.rb +11 -0
  55. data/lib/numbers_and_words/strategies/figures_converter/languages/se.rb +11 -0
  56. data/lib/numbers_and_words/strategies/figures_converter/languages/tr.rb +11 -0
  57. data/lib/numbers_and_words/strategies/figures_converter/languages/ua.rb +11 -0
  58. data/lib/numbers_and_words/strategies/figures_converter/options.rb +41 -0
  59. data/lib/numbers_and_words/strategies/figures_converter/options/en.rb +4 -0
  60. data/lib/numbers_and_words/strategies/figures_converter/options/en/hundreds_with_union.rb +33 -0
  61. data/lib/numbers_and_words/strategies/figures_converter/options/en/ordinal.rb +60 -0
  62. data/lib/numbers_and_words/strategies/figures_converter/options/en/remove_hyphen.rb +29 -0
  63. data/lib/numbers_and_words/strategies/figures_converter/options/en/remove_zero.rb +29 -0
  64. data/lib/numbers_and_words/strategies/figures_converter/options/hu.rb +1 -0
  65. data/lib/numbers_and_words/strategies/figures_converter/options/hu/ordinal.rb +60 -0
  66. data/lib/numbers_and_words/strategies/figures_converter/options/ru.rb +1 -0
  67. data/lib/numbers_and_words/strategies/figures_converter/options/ru/gender.rb +28 -0
  68. data/lib/numbers_and_words/strategies/figures_converter/options/ua.rb +1 -0
  69. data/lib/numbers_and_words/strategies/figures_converter/options/ua/gender.rb +28 -0
  70. data/lib/numbers_and_words/translations.rb +25 -0
  71. data/lib/numbers_and_words/{translations_helpers → translations}/base.rb +2 -2
  72. data/lib/numbers_and_words/translations/en.rb +8 -0
  73. data/lib/numbers_and_words/translations/es.rb +37 -0
  74. data/lib/numbers_and_words/translations/extensions/fraction_significance.rb +25 -0
  75. data/lib/numbers_and_words/translations/families/base.rb +33 -0
  76. data/lib/numbers_and_words/translations/families/cyrillic.rb +29 -0
  77. data/lib/numbers_and_words/translations/families/latin.rb +23 -0
  78. data/lib/numbers_and_words/translations/fr.rb +29 -0
  79. data/lib/numbers_and_words/translations/hu.rb +26 -0
  80. data/lib/numbers_and_words/translations/it.rb +15 -0
  81. data/lib/numbers_and_words/translations/nl.rb +15 -0
  82. data/lib/numbers_and_words/translations/ru.rb +25 -0
  83. data/lib/numbers_and_words/translations/se.rb +11 -0
  84. data/lib/numbers_and_words/translations/tr.rb +11 -0
  85. data/lib/numbers_and_words/translations/ua.rb +21 -0
  86. data/lib/numbers_and_words/version.rb +1 -1
  87. data/lib/numbers_and_words/wrappers.rb +2 -0
  88. data/lib/numbers_and_words/wrappers/float.rb +60 -0
  89. data/lib/numbers_and_words/wrappers/integer.rb +21 -0
  90. metadata +81 -44
  91. data/lib/numbers_and_words/array_additions.rb +0 -2
  92. data/lib/numbers_and_words/array_additions/helpers.rb +0 -44
  93. data/lib/numbers_and_words/array_additions/validations.rb +0 -9
  94. data/lib/numbers_and_words/figures_array.rb +0 -15
  95. data/lib/numbers_and_words/strategies/base.rb +0 -18
  96. data/lib/numbers_and_words/strategies/en.rb +0 -8
  97. data/lib/numbers_and_words/strategies/families/base.rb +0 -71
  98. data/lib/numbers_and_words/strategies/families/cyrillic.rb +0 -18
  99. data/lib/numbers_and_words/strategies/families/latin.rb +0 -9
  100. data/lib/numbers_and_words/strategies/fr.rb +0 -32
  101. data/lib/numbers_and_words/strategies/it.rb +0 -8
  102. data/lib/numbers_and_words/strategies/nl.rb +0 -23
  103. data/lib/numbers_and_words/strategies/ru.rb +0 -8
  104. data/lib/numbers_and_words/strategies/tr.rb +0 -8
  105. data/lib/numbers_and_words/strategies/ua.rb +0 -8
  106. data/lib/numbers_and_words/translations_helpers.rb +0 -11
  107. data/lib/numbers_and_words/translations_helpers/en.rb +0 -12
  108. data/lib/numbers_and_words/translations_helpers/families/base.rb +0 -30
  109. data/lib/numbers_and_words/translations_helpers/families/cyrillic.rb +0 -28
  110. data/lib/numbers_and_words/translations_helpers/families/latin.rb +0 -23
  111. data/lib/numbers_and_words/translations_helpers/fr.rb +0 -34
  112. data/lib/numbers_and_words/translations_helpers/it.rb +0 -16
  113. data/lib/numbers_and_words/translations_helpers/nl.rb +0 -18
  114. data/lib/numbers_and_words/translations_helpers/ru.rb +0 -8
  115. data/lib/numbers_and_words/translations_helpers/tr.rb +0 -8
  116. data/lib/numbers_and_words/translations_helpers/ua.rb +0 -8
@@ -0,0 +1,13 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ module Families
6
+ module Latin
7
+ include Base
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class Fr < Base
6
+ include Families::Latin
7
+
8
+ private
9
+
10
+ def capacity_iteration
11
+ words = []
12
+ capacity_words = words_in_capacity(@current_capacity)
13
+ words.push(megs) unless capacity_words.empty?
14
+ words += capacity_words unless is_a_thousand? and is_a_one?
15
+ words
16
+ end
17
+
18
+ def is_a_one?
19
+ [translations.ones(1)] == words_in_capacity(@current_capacity)
20
+ end
21
+
22
+ def is_a_thousand?
23
+ FiguresArray::THOUSAND_CAPACITY == @current_capacity
24
+ end
25
+
26
+ def hundreds
27
+ super({:pluralize => simple_number_to_words.empty?})
28
+ end
29
+
30
+ def megs
31
+ super({:number => @figures.number_in_capacity(@current_capacity)})
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,63 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class Hu < Base
6
+ include Families::Latin
7
+
8
+ def print_words
9
+ inner_reverse_words.reverse.join(greater_than_2000? && '-' || '')
10
+ end
11
+
12
+ def inner_reverse_words
13
+ @strings.collect { |iteration| iteration.reverse.join }
14
+ end
15
+
16
+ def greater_than_2000?
17
+ @figures.length > 4 || (@figures.length == 4 && @figures.last >= 2)
18
+ end
19
+
20
+ def strings_logic
21
+ if @figures.capacity_count
22
+ number_without_capacity_to_words + complex_number_to_words
23
+ elsif @figures.hundreds
24
+ [hundreds_number_to_words]
25
+ elsif @figures.tens or @figures.ones
26
+ [simple_number_to_words]
27
+ else
28
+ []
29
+ end
30
+ end
31
+
32
+ def complex_number_to_words
33
+ count = @figures.capacity_count
34
+ (1..count).map { |capacity|
35
+ @current_capacity = capacity
36
+ capacity_iteration.flatten
37
+ }.reject(&:empty?)
38
+ end
39
+
40
+ def simple_number_to_words
41
+ if @figures.teens || @figures.tens
42
+ [complex_tens]
43
+ elsif @figures.ones
44
+ [ones]
45
+ else
46
+ []
47
+ end
48
+ end
49
+
50
+ [:zero, :ones, :teens, :tens, :tens_with_ones, :hundreds, :megs].each do |method_name|
51
+ define_method(method_name) {
52
+ super({:prefix => maybe_ordinal(method_name)})
53
+ }
54
+ end
55
+
56
+ def maybe_ordinal type
57
+ @options.ordinal.result type
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,11 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class It < Base
6
+ include Families::Latin
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class Nl < Base
6
+ include Families::Latin
7
+
8
+ def hundreds_number_to_words
9
+ [super.reverse.join]
10
+ end
11
+
12
+ def capacity_iteration
13
+ if FiguresArray::THOUSAND_CAPACITY == @current_capacity
14
+ words = []
15
+ capacity_words = words_in_capacity(@current_capacity)
16
+ words.push megs unless capacity_words.empty?
17
+ capacity_words.empty? ? [] : [capacity_words, words].join
18
+ else
19
+ super
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class Ru < Base
6
+ include Families::Cyrillic
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class Se < Base
6
+ include Families::Latin
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class Tr < Base
6
+ include Families::Latin
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Languages
5
+ class Ua < Base
6
+ include Families::Cyrillic
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,41 @@
1
+ require 'numbers_and_words/strategies/figures_converter/options/en'
2
+ require 'numbers_and_words/strategies/figures_converter/options/ru'
3
+ require 'numbers_and_words/strategies/figures_converter/options/ua'
4
+ require 'numbers_and_words/strategies/figures_converter/options/hu'
5
+
6
+ module NumbersAndWords
7
+ module Strategies
8
+ module FiguresConverter
9
+ module Options
10
+ class Proxy
11
+ attr_accessor :strategy, :options
12
+
13
+ def initialize strategy, options
14
+ @strategy = strategy
15
+ @options = options
16
+ end
17
+
18
+ def method_missing method_name, *args, &block
19
+ proxy_class_name(method_name).constantize.new self, args, block
20
+ rescue NameError
21
+ return nil
22
+ end
23
+
24
+ private
25
+
26
+ def proxy_class_name method_name
27
+ "#{module_name}::#{language_class_name}::#{method_name.to_s.camelcase}"
28
+ end
29
+
30
+ def language_class_name
31
+ ::I18n.locale.to_s.titleize.gsub ' ', '::'
32
+ end
33
+
34
+ def module_name
35
+ self.class.name.split('::')[0..-2].join '::'
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+ require 'numbers_and_words/strategies/figures_converter/options/en/hundreds_with_union'
2
+ require 'numbers_and_words/strategies/figures_converter/options/en/remove_hyphen'
3
+ require 'numbers_and_words/strategies/figures_converter/options/en/ordinal'
4
+ require 'numbers_and_words/strategies/figures_converter/options/en/remove_zero'
@@ -0,0 +1,33 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Options
5
+ module En
6
+ class HundredsWithUnion
7
+ attr_accessor :strategy, :options
8
+
9
+ def initialize proxy, *args, &block
10
+ @strategy = proxy.strategy
11
+ @options = proxy.options
12
+ end
13
+
14
+ def modify_or_leave hundreds
15
+ hundreds = "#{hundreds} #{translations.union}" if active?
16
+ hundreds
17
+ end
18
+
19
+ private
20
+
21
+ def active?
22
+ @options[:hundreds_with_union]
23
+ end
24
+
25
+ def translations
26
+ @strategy.translations
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,60 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Options
5
+ module En
6
+ class Ordinal
7
+ ZERO_TYPE = :zero
8
+ HUNDRED_TYPE = :hundreds
9
+ MEGS_TYPE = :megs
10
+
11
+ def initialize proxy, *args, &block
12
+ @strategy = proxy.strategy
13
+ @options = proxy.options
14
+ end
15
+
16
+ def result type
17
+ @type = type
18
+ MEGS_TYPE != type ? check_simple_numbers : check_megs_numbers
19
+ end
20
+
21
+ private
22
+
23
+ def active?
24
+ @options[:ordinal]
25
+ end
26
+
27
+ def check_simple_numbers
28
+ :ordinal if simple_numbers_condition && active?
29
+ end
30
+
31
+ def check_megs_numbers
32
+ :ordinal if megs_numbers_condition && active?
33
+ end
34
+
35
+ def simple_numbers_condition
36
+ current_capacity.nil? &&
37
+ (HUNDRED_TYPE != @type || (HUNDRED_TYPE == @type && simple_number_to_words.empty?))
38
+ end
39
+
40
+ def megs_numbers_condition
41
+ current_capacity == language_figures.ordinal_capacity
42
+ end
43
+
44
+ def simple_number_to_words
45
+ @strategy.language.simple_number_to_words
46
+ end
47
+
48
+ def current_capacity
49
+ @strategy.language.current_capacity
50
+ end
51
+
52
+ def language_figures
53
+ @strategy.language.parent_figures
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,29 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Options
5
+ module En
6
+ class RemoveHyphen
7
+ attr_accessor :strategy, :options
8
+
9
+ def initialize proxy, *args, &block
10
+ @strategy = proxy.strategy
11
+ @options = proxy.options
12
+ end
13
+
14
+
15
+ def result
16
+ active? ? ' ' : '-'
17
+ end
18
+
19
+ private
20
+
21
+ def active?
22
+ @options[:remove_hyphen]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Options
5
+ module En
6
+ class RemoveZero
7
+ attr_accessor :strategy, :options
8
+
9
+ def initialize proxy, *args, &block
10
+ @strategy = proxy.strategy
11
+ @options = proxy.options
12
+ end
13
+
14
+
15
+ def result
16
+ active?
17
+ end
18
+
19
+ private
20
+
21
+ def active?
22
+ @options[:remove_zero]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1 @@
1
+ require 'numbers_and_words/strategies/figures_converter/options/hu/ordinal'
@@ -0,0 +1,60 @@
1
+ module NumbersAndWords
2
+ module Strategies
3
+ module FiguresConverter
4
+ module Options
5
+ module Hu
6
+ class Ordinal
7
+ ZERO_TYPE = :zero
8
+ HUNDRED_TYPE = :hundreds
9
+ MEGS_TYPE = :megs
10
+
11
+ def initialize proxy, *args, &block
12
+ @strategy = proxy.strategy
13
+ @options = proxy.options
14
+ end
15
+
16
+ def result type
17
+ @type = type
18
+ MEGS_TYPE != type ? check_simple_numbers : check_megs_numbers
19
+ end
20
+
21
+ private
22
+
23
+ def active?
24
+ @options[:ordinal]
25
+ end
26
+
27
+ def check_simple_numbers
28
+ :ordinal if simple_numbers_condition && active?
29
+ end
30
+
31
+ def check_megs_numbers
32
+ :ordinal if megs_numbers_condition && active?
33
+ end
34
+
35
+ def simple_numbers_condition
36
+ current_capacity.nil? &&
37
+ (HUNDRED_TYPE != @type || (HUNDRED_TYPE == @type && simple_number_to_words.empty?))
38
+ end
39
+
40
+ def megs_numbers_condition
41
+ current_capacity == language_figures.ordinal_capacity
42
+ end
43
+
44
+ def simple_number_to_words
45
+ @strategy.language.simple_number_to_words
46
+ end
47
+
48
+ def current_capacity
49
+ @strategy.language.current_capacity
50
+ end
51
+
52
+ def language_figures
53
+ @strategy.language.parent_figures
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end