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