trange_frange 0.1.1 → 0.1.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 +7 -0
- data/.document +0 -0
- data/.gitignore +0 -0
- data/.rspec +0 -0
- data/ChangeLog.md +5 -0
- data/LICENSE.txt +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/lib/trange_frange.rb +16 -16
- data/lib/trange_frange/amount.rb +70 -0
- data/lib/trange_frange/base.rb +18 -0
- data/lib/trange_frange/base_helper.rb +15 -0
- data/lib/trange_frange/bilion.rb +16 -0
- data/lib/trange_frange/hundred.rb +25 -0
- data/lib/trange_frange/member.rb +17 -0
- data/lib/trange_frange/milion.rb +15 -0
- data/lib/trange_frange/one.rb +39 -0
- data/lib/trange_frange/order_condition.rb +22 -0
- data/lib/trange_frange/shaper.rb +25 -0
- data/lib/trange_frange/suffix.rb +17 -0
- data/lib/trange_frange/suffix_helper.rb +15 -0
- data/lib/trange_frange/ten.rb +41 -0
- data/lib/trange_frange/thousand.rb +15 -0
- data/lib/trange_frange/version.rb +3 -3
- data/spec/spec_helper.rb +3 -1
- data/spec/trange_frange_spec.rb +1 -1
- data/trange_frange.gemspec +0 -0
- metadata +21 -15
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dd7beb170cf74ed9d4dc440203e51cb6ecef193f
|
4
|
+
data.tar.gz: fcc6e6e1212435abe120c9cb200e178e00c3c9f0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4bfb655e2159d28817c3345c642cd24921dc0ff7c795495d5ea3362df99b5592ff4e9eb7b3a17209b9c6511860bd2249fc9b943933074e61143925e9a569e09d
|
7
|
+
data.tar.gz: d7bfe0d0f749b0d57c53ba50a23b91fb9eb6ffac148deb84b8b7fc291f6460ec870bed6b35c9fcee52badf438abd0a3452cbc01912b87882707c7a5225efe280
|
data/.document
CHANGED
File without changes
|
data/.gitignore
CHANGED
File without changes
|
data/.rspec
CHANGED
File without changes
|
data/ChangeLog.md
CHANGED
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
File without changes
|
data/Rakefile
CHANGED
File without changes
|
data/lib/trange_frange.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
3
|
+
require_relative 'trange_frange/version'
|
4
|
+
require_relative 'trange_frange/member'
|
5
|
+
require_relative 'trange_frange/base'
|
6
|
+
require_relative 'trange_frange/suffix'
|
7
|
+
require_relative 'trange_frange/order_condition'
|
8
|
+
require_relative 'trange_frange/base_helper'
|
9
|
+
require_relative 'trange_frange/suffix_helper'
|
10
|
+
require_relative 'trange_frange/one'
|
11
|
+
require_relative 'trange_frange/ten'
|
12
|
+
require_relative 'trange_frange/hundred'
|
13
|
+
require_relative 'trange_frange/thousand'
|
14
|
+
require_relative 'trange_frange/milion'
|
15
|
+
require_relative 'trange_frange/bilion'
|
16
|
+
require_relative 'trange_frange/shaper'
|
17
|
+
require_relative 'trange_frange/amount'
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Amount
|
5
|
+
attr_reader :amount
|
6
|
+
|
7
|
+
MAX_AMOUNT_SIZE = 12
|
8
|
+
BASES = [TrangeFrange::Hundred, TrangeFrange::Ten, TrangeFrange::One]
|
9
|
+
SUFFIXES = [TrangeFrange::Thousand, TrangeFrange::Milion, TrangeFrange::Bilion]
|
10
|
+
|
11
|
+
def initialize(amount)
|
12
|
+
unless amount.is_a?(Fixnum) || amount.is_a?(Float)
|
13
|
+
raise TypeError, 'Amount must be of type Fixnum or Float.'
|
14
|
+
end
|
15
|
+
|
16
|
+
if max_amount_size?(amount)
|
17
|
+
raise NotImplementedError, 'I can only work with amounts up to 999 bilions.'
|
18
|
+
end
|
19
|
+
|
20
|
+
@amount = amount
|
21
|
+
end
|
22
|
+
|
23
|
+
def spell!(options={})
|
24
|
+
TrangeFrange::Shaper.new(generate_words!, fraction, options).shape!
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def max_amount_size?(amount)
|
30
|
+
amount.to_s.split('.')[0].size > MAX_AMOUNT_SIZE
|
31
|
+
end
|
32
|
+
|
33
|
+
def split!
|
34
|
+
@splitted ||= ('%.2f' % amount).split('.')
|
35
|
+
end
|
36
|
+
|
37
|
+
def whole_number
|
38
|
+
@whole_number ||= split![0]
|
39
|
+
end
|
40
|
+
|
41
|
+
def fraction
|
42
|
+
@fraction ||= split![1]
|
43
|
+
end
|
44
|
+
|
45
|
+
def members
|
46
|
+
@members ||= whole_number.reverse.scan(/.{1,3}/).reverse.map(&:reverse)
|
47
|
+
end
|
48
|
+
|
49
|
+
def generate_base!(member, magnitude)
|
50
|
+
BASES.map do |base|
|
51
|
+
base == One ? base.new(member, magnitude).word : base.new(member).word
|
52
|
+
end.join(' ').strip.squeeze
|
53
|
+
end
|
54
|
+
|
55
|
+
def generate_suffix!(member, magnitude)
|
56
|
+
magnitude > 0 ? SUFFIXES[magnitude.pred].new(member).word : String.new
|
57
|
+
end
|
58
|
+
|
59
|
+
def generate_words!
|
60
|
+
magnitude = members.size.pred
|
61
|
+
Array.new.tap do |words|
|
62
|
+
members.map do |member|
|
63
|
+
words << generate_base!(member, magnitude)
|
64
|
+
words << generate_suffix!(member, magnitude) unless words.last.empty?
|
65
|
+
magnitude -= 1
|
66
|
+
end
|
67
|
+
end.join(' ').strip.squeeze
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Base < Struct.new :base
|
5
|
+
# range [10-19]
|
6
|
+
def teen?
|
7
|
+
member.ten == '1'
|
8
|
+
end
|
9
|
+
|
10
|
+
def gender?
|
11
|
+
%w[1 2].include? member.one
|
12
|
+
end
|
13
|
+
|
14
|
+
def member
|
15
|
+
@member ||= TrangeFrange::Member.new base
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Bilion < Struct.new :base
|
5
|
+
include TrangeFrange::SuffixHelper
|
6
|
+
|
7
|
+
BILIONS = %w[milijarda milijarde milijardi]
|
8
|
+
|
9
|
+
def word
|
10
|
+
order_condition.add { BILIONS[0] if suffix.one? and !suffix.suffix_base.teen? }
|
11
|
+
order_condition.add { BILIONS[1] if suffix.gender? and !suffix.suffix_base.teen? }
|
12
|
+
order_condition.add { BILIONS[2] }
|
13
|
+
order_condition.match!
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Hundred < Struct.new :base
|
5
|
+
include TrangeFrange::BaseHelper
|
6
|
+
|
7
|
+
HUNDREDS = {
|
8
|
+
'0' => '',
|
9
|
+
'1' => 'jedna stotina',
|
10
|
+
'2' => 'dve stotine',
|
11
|
+
'3' => 'tri stotine',
|
12
|
+
'4' => 'četiri stotine',
|
13
|
+
'5' => 'pet stotina',
|
14
|
+
'6' => 'šest stotina',
|
15
|
+
'7' => 'sedam stotina',
|
16
|
+
'8' => 'osam stotina',
|
17
|
+
'9' => 'devet stotina'
|
18
|
+
}
|
19
|
+
|
20
|
+
def word
|
21
|
+
order_condition.add { HUNDREDS[object_base.member.hundred] }
|
22
|
+
order_condition.match!
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Milion < Struct.new :base
|
5
|
+
include TrangeFrange::SuffixHelper
|
6
|
+
|
7
|
+
MILIONS = %w[milion miliona]
|
8
|
+
|
9
|
+
def word
|
10
|
+
order_condition.add { MILIONS[0] if suffix.one? and !suffix.suffix_base.teen? }
|
11
|
+
order_condition.add { MILIONS[1] }
|
12
|
+
order_condition.match!
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class One < Struct.new :base, :magnitude
|
5
|
+
include TrangeFrange::BaseHelper
|
6
|
+
|
7
|
+
ONES = {
|
8
|
+
'0' => '', # not printed
|
9
|
+
'1' => {
|
10
|
+
:m => 'jedan', # male gender
|
11
|
+
:f => 'jedna' # female gender
|
12
|
+
},
|
13
|
+
'2' => {
|
14
|
+
:m => 'dva',
|
15
|
+
:f => 'dve'
|
16
|
+
},
|
17
|
+
'3' => 'tri',
|
18
|
+
'4' => 'četiri',
|
19
|
+
'5' => 'pet',
|
20
|
+
'6' => 'šest',
|
21
|
+
'7' => 'sedam',
|
22
|
+
'8' => 'osam',
|
23
|
+
'9' => 'devet'
|
24
|
+
}
|
25
|
+
|
26
|
+
def word
|
27
|
+
order_condition.add { String.new if object_base.teen? }
|
28
|
+
order_condition.add { ONES[object_base.member.one][gender] if object_base.gender? }
|
29
|
+
order_condition.add { ONES[object_base.member.one] }
|
30
|
+
order_condition.match!
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def gender
|
36
|
+
magnitude.odd? ? :f : :m
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class OrderCondition
|
5
|
+
def initialize
|
6
|
+
@conditions = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def add
|
10
|
+
@conditions << Proc.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def match!
|
14
|
+
@conditions.map(&:call).map do |condition|
|
15
|
+
return condition if condition
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
attr_reader :conditions
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Shaper < Struct.new :words, :fraction, :options
|
5
|
+
OPTIONS = [:bald, :squeeze, :show_fraction]
|
6
|
+
|
7
|
+
def shape!
|
8
|
+
OPTIONS.each { |option| send(option) if options[option] } and return words
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def show_fraction
|
14
|
+
words << " i #{fraction}/100"
|
15
|
+
end
|
16
|
+
|
17
|
+
def squeeze
|
18
|
+
words.delete!(' ')
|
19
|
+
end
|
20
|
+
|
21
|
+
def bald
|
22
|
+
words.tr!('čćšđž', 'ccsdz')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Suffix < Struct.new :base
|
5
|
+
def gender?
|
6
|
+
('2'..'4').include? suffix_base.member.one
|
7
|
+
end
|
8
|
+
|
9
|
+
def one?
|
10
|
+
suffix_base.member.one == '1'
|
11
|
+
end
|
12
|
+
|
13
|
+
def suffix_base
|
14
|
+
@suffix_base ||= TrangeFrange::Base.new base
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Ten < Struct.new :base
|
5
|
+
include TrangeFrange::BaseHelper
|
6
|
+
|
7
|
+
TENS = {
|
8
|
+
'0' => '',
|
9
|
+
'10' => 'deset',
|
10
|
+
'11' => 'jedanaest',
|
11
|
+
'12' => 'dvanaest',
|
12
|
+
'13' => 'trinaest',
|
13
|
+
'14' => 'četrnaest',
|
14
|
+
'15' => 'petnaest',
|
15
|
+
'16' => 'šesnaest',
|
16
|
+
'17' => 'sedamnaest',
|
17
|
+
'18' => 'osamnaest',
|
18
|
+
'19' => 'devetnaest',
|
19
|
+
'2' => 'dvadeset',
|
20
|
+
'3' => 'trideset',
|
21
|
+
'4' => 'četrdeset',
|
22
|
+
'5' => 'pedeset',
|
23
|
+
'6' => 'šezdeset',
|
24
|
+
'7' => 'sedamdeset',
|
25
|
+
'8' => 'osamdeset',
|
26
|
+
'9' => 'devedeset'
|
27
|
+
}
|
28
|
+
|
29
|
+
def word
|
30
|
+
order_condition.add { TENS[teen_base_member] if object_base.teen? }
|
31
|
+
order_condition.add { TENS[object_base.member.ten] }
|
32
|
+
order_condition.match!
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def teen_base_member
|
38
|
+
object_base.member.ten + object_base.member.one
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TrangeFrange
|
4
|
+
class Thousand < Struct.new :base
|
5
|
+
include TrangeFrange::SuffixHelper
|
6
|
+
|
7
|
+
THOUSANDS = %w[hiljada hiljade]
|
8
|
+
|
9
|
+
def word
|
10
|
+
order_condition.add { THOUSANDS[1] if suffix.gender? and !suffix.suffix_base.teen? }
|
11
|
+
order_condition.add { THOUSANDS[0] }
|
12
|
+
order_condition.match!
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/trange_frange_spec.rb
CHANGED
data/trange_frange.gemspec
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trange_frange
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ninoslav Milenovic
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-12-16 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rdoc
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rubygems-tasks
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ~>
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ~>
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -73,6 +66,20 @@ files:
|
|
73
66
|
- README.md
|
74
67
|
- Rakefile
|
75
68
|
- lib/trange_frange.rb
|
69
|
+
- lib/trange_frange/amount.rb
|
70
|
+
- lib/trange_frange/base.rb
|
71
|
+
- lib/trange_frange/base_helper.rb
|
72
|
+
- lib/trange_frange/bilion.rb
|
73
|
+
- lib/trange_frange/hundred.rb
|
74
|
+
- lib/trange_frange/member.rb
|
75
|
+
- lib/trange_frange/milion.rb
|
76
|
+
- lib/trange_frange/one.rb
|
77
|
+
- lib/trange_frange/order_condition.rb
|
78
|
+
- lib/trange_frange/shaper.rb
|
79
|
+
- lib/trange_frange/suffix.rb
|
80
|
+
- lib/trange_frange/suffix_helper.rb
|
81
|
+
- lib/trange_frange/ten.rb
|
82
|
+
- lib/trange_frange/thousand.rb
|
76
83
|
- lib/trange_frange/version.rb
|
77
84
|
- spec/spec_helper.rb
|
78
85
|
- spec/trange_frange_spec.rb
|
@@ -80,27 +87,26 @@ files:
|
|
80
87
|
homepage: https://github.com/pythogorian/trange_frange#readme
|
81
88
|
licenses:
|
82
89
|
- MIT
|
90
|
+
metadata: {}
|
83
91
|
post_install_message:
|
84
92
|
rdoc_options: []
|
85
93
|
require_paths:
|
86
94
|
- lib
|
87
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
89
96
|
requirements:
|
90
|
-
- -
|
97
|
+
- - '>='
|
91
98
|
- !ruby/object:Gem::Version
|
92
99
|
version: '0'
|
93
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
-
none: false
|
95
101
|
requirements:
|
96
|
-
- -
|
102
|
+
- - '>='
|
97
103
|
- !ruby/object:Gem::Version
|
98
104
|
version: '0'
|
99
105
|
requirements: []
|
100
106
|
rubyforge_project:
|
101
|
-
rubygems_version: 1.
|
107
|
+
rubygems_version: 2.1.9
|
102
108
|
signing_key:
|
103
|
-
specification_version:
|
109
|
+
specification_version: 4
|
104
110
|
summary: Tool for spelling amounts
|
105
111
|
test_files:
|
106
112
|
- spec/spec_helper.rb
|