trange_frange 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -5,3 +5,8 @@
5
5
  ### 0.1.1 / 2013-09-01 ###
6
6
 
7
7
  * Refactoring
8
+
9
+ ### 0.1.2 / 2013-12-17 ###
10
+
11
+ * Refactoring
12
+ * Fixing 'require' bug
File without changes
data/README.md CHANGED
File without changes
data/Rakefile CHANGED
File without changes
@@ -1,17 +1,17 @@
1
- # -*- coding: utf-8 -*-
1
+ # encoding: utf-8
2
2
 
3
- require 'trange_frange/version'
4
- require 'trange_frange/member'
5
- require 'trange_frange/base'
6
- require 'trange_frange/suffix'
7
- require 'trange_frange/order_condition'
8
- require 'trange_frange/base_helper'
9
- require 'trange_frange/suffix_helper'
10
- require 'trange_frange/one'
11
- require 'trange_frange/ten'
12
- require 'trange_frange/hundred'
13
- require 'trange_frange/thousand'
14
- require 'trange_frange/milion'
15
- require 'trange_frange/bilion'
16
- require 'trange_frange/shaper'
17
- require 'trange_frange/amount'
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,15 @@
1
+ # encoding: utf-8
2
+
3
+ module TrangeFrange
4
+ module BaseHelper
5
+ private
6
+
7
+ def object_base
8
+ @object_base ||= TrangeFrange::Base.new base
9
+ end
10
+
11
+ def order_condition
12
+ @order_condition ||= TrangeFrange::OrderCondition.new
13
+ end
14
+ end
15
+ 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,17 @@
1
+ # encoding: utf-8
2
+
3
+ module TrangeFrange
4
+ class Member < Struct.new :base
5
+ def one
6
+ base[-1]
7
+ end
8
+
9
+ def ten
10
+ base.size >= 2 ? base[-2] : '0'
11
+ end
12
+
13
+ def hundred
14
+ base.size == 3 ? base[-3] : '0'
15
+ end
16
+ end
17
+ 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,15 @@
1
+ # encoding: utf-8
2
+
3
+ module TrangeFrange
4
+ module SuffixHelper
5
+ private
6
+
7
+ def suffix
8
+ @suffix ||= TrangeFrange::Suffix.new base
9
+ end
10
+
11
+ def order_condition
12
+ @order_condition ||= TrangeFrange::OrderCondition.new
13
+ end
14
+ end
15
+ 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
@@ -1,5 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # encoding: utf-8
2
2
 
3
3
  module TrangeFrange
4
- VERSION = '0.1.1'
5
- end
4
+ VERSION = '0.1.2'
5
+ end
@@ -1,5 +1,7 @@
1
+ # encoding: utf-8
2
+
1
3
  gem 'rspec', '~> 2.4'
2
4
  require 'rspec'
3
5
  require 'trange_frange'
4
6
 
5
- include TrangeFrange
7
+ include TrangeFrange
@@ -1,4 +1,4 @@
1
- # -*- coding: utf-8 -*-
1
+ # encoding: utf-8
2
2
 
3
3
  require 'spec_helper'
4
4
 
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.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-09-01 00:00:00.000000000 Z
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.8.25
107
+ rubygems_version: 2.1.9
102
108
  signing_key:
103
- specification_version: 3
109
+ specification_version: 4
104
110
  summary: Tool for spelling amounts
105
111
  test_files:
106
112
  - spec/spec_helper.rb