numbers_in_words 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d21920a1919da0cd7f56cf3baddc23e57e59272ce170178e7640f5a445bfee2c
4
- data.tar.gz: a21c3aa8278bb902b5e5d5f84a5fcd21250e28a636758f95e433ff04aade8755
3
+ metadata.gz: 5a69b94b2d308dbf461d439c03e57ab585f6bd14760fbe01fbfb72ab7c87bf49
4
+ data.tar.gz: e8eaf38c1c28fa6b6d6c055ad2e73a0a446f418f984314682c5cc22eda6a64a3
5
5
  SHA512:
6
- metadata.gz: b71f15283b1145484d84f45fa2e203909a23696ea2c05ba5772d24c8c98d8691588c5b5d5d8a17c574e6ff0432c69c836ae796f8b94e2b1841c7e31715873859
7
- data.tar.gz: cf911bebfacf6367757ad7fec02903dbd5f602ce148c20000fe9d64955d02b8bc253e3aad1cf228eb64a9d860783f4eba27f660406ab1c296f65b06e941585b8
6
+ metadata.gz: a62e3d4ee01401dc3fd9ed1a694722fc4033954ea4c3e4ffc0f321f2c11777b91b465407873a80477986ef4c91d6bbc1aaa64dd6b0d9ab35ff45435d687b09a4
7
+ data.tar.gz: f068adee24754761e40e8b969fd432f478ec6c0d921e686594a33c29d06c4384644b2cb9a18a82c385e225e090c0a3db2fb379154d5885ced72523efb9f1776c
@@ -1,7 +1,15 @@
1
+ env:
2
+ global:
3
+ - CC_TEST_REPORTER_ID=9a548b48c1c0804d8fb9083ae8e9693a5d5197eb86e8cf1b63a89d18f33e0464
1
4
  sudo: false
2
5
  language: ruby
3
6
  rvm:
4
- - "2.4.6"
5
- - "2.5.5"
6
- - "2.6.3"
7
+ - "2.6.6"
8
+ - "2.7.1"
9
+ before_script:
10
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
11
+ - chmod +x ./cc-test-reporter
12
+ - ./cc-test-reporter before-build
7
13
  script: ./bin/spec
14
+ after_script:
15
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/Gemfile CHANGED
@@ -3,5 +3,6 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  gem 'byebug'
6
+ gem 'simplecov', '< 0.18.0', require: false, group: :test
6
7
  # Specify your gem's dependencies in numbers_in_words.gemspec
7
8
  gemspec
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'numbers_in_words/version'
4
4
  require 'numbers_in_words/exceptional_numbers'
5
+ require 'numbers_in_words/parsing/number_parser'
5
6
  require 'numbers_in_words/to_word'
6
7
  require 'numbers_in_words/parsing/to_number'
7
8
 
@@ -56,10 +56,6 @@ module NumbersInWords
56
56
  to_h[number]
57
57
  end
58
58
 
59
- def fractions
60
- DEFINITIONS
61
- end
62
-
63
59
  def fraction(denominator: nil, numerator: nil, word: nil)
64
60
  raise unless denominator || word
65
61
 
@@ -18,12 +18,6 @@ module NumbersInWords
18
18
  @attributes = attributes || NumbersInWords::ExceptionalNumbers::DEFINITIONS[denominator] || {}
19
19
  end
20
20
 
21
- def to_r
22
- return 0.0 if denominator == Float::INFINITY
23
-
24
- (numerator / denominator.to_f).rationalize(EPSILON)
25
- end
26
-
27
21
  def lookup_keys
28
22
  key = in_words
29
23
  key2 = strip_punctuation(key.split(' ')).join(' ')
@@ -36,13 +30,6 @@ module NumbersInWords
36
30
  end
37
31
 
38
32
  def in_words
39
- if denominator == Float::INFINITY
40
- # We've reached the limits of ruby's number system
41
- # by the time we get to a googolplex (10 ** (10 ** 100))
42
- # I suppose we could also call this an 'infinitieth'
43
- return pluralize? ? 'googolplexths' : 'googolplexth'
44
- end
45
-
46
33
  NumbersInWords.in_words(numerator) + ' ' + fraction
47
34
  end
48
35
 
@@ -51,6 +38,12 @@ module NumbersInWords
51
38
  end
52
39
 
53
40
  def fraction
41
+ if denominator == Float::INFINITY
42
+ # We've reached the limits of ruby's number system
43
+ # by the time we get to a googolplex (10 ** (10 ** 100))
44
+ return pluralize? ? 'infinitieths' : 'infinitieth'
45
+ end
46
+
54
47
  pluralize? ? pluralized_fraction : singular_fraction
55
48
  end
56
49
 
@@ -102,14 +95,6 @@ module NumbersInWords
102
95
  end
103
96
  end
104
97
 
105
- def plural
106
- exception && (fraction_plural || singular + 's') || ordinal_plural
107
- end
108
-
109
- def singular
110
- (exception && exception[:singular]) || ordinal
111
- end
112
-
113
98
  def with_remainder(mod, join_word)
114
99
  rest = denominator % mod
115
100
  main = denominator - rest
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NumbersInWords
4
+ module FractionParsing
5
+ def fraction(text)
6
+ return unless possible_fraction?(text)
7
+
8
+ NumbersInWords.exceptional_numbers.lookup_fraction(text)
9
+ end
10
+
11
+ def strip_punctuation(text)
12
+ text = text.downcase.gsub(/[^a-z 0-9]/, ' ')
13
+ to_remove = true
14
+
15
+ to_remove = text.gsub! ' ', ' ' while to_remove
16
+
17
+ text
18
+ end
19
+
20
+ def possible_fraction?(text)
21
+ words = text.split(' ')
22
+ result = words & NumbersInWords.exceptional_numbers.fraction_names
23
+ result.length.positive?
24
+ end
25
+
26
+ def text_including_punctuation
27
+ to_s.strip
28
+ end
29
+
30
+ def text
31
+ strip_punctuation text_including_punctuation
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './fraction_parsing'
4
+
5
+ module NumbersInWords
6
+ class Special
7
+ extend Forwardable
8
+ def_delegator :that, :to_s
9
+
10
+ include FractionParsing
11
+
12
+ attr_reader :that, :only_compress
13
+
14
+ def initialize(that, only_compress)
15
+ @that = that
16
+ @only_compress = only_compress
17
+ end
18
+
19
+ def call
20
+ float ||
21
+ negative ||
22
+ fraction(that) ||
23
+ mixed_words_and_digits ||
24
+ one
25
+ end
26
+
27
+ def float
28
+ text_including_punctuation.to_f if text =~ /^-?\d+(.\d+)?$/
29
+ end
30
+
31
+ def negative
32
+ stripped = strip_minus text
33
+ return unless stripped
34
+
35
+ stripped_n = NumbersInWords.in_numbers(stripped, only_compress: only_compress)
36
+ only_compress ? stripped_n.map { |k| k * -1 } : -1 * stripped_n
37
+ end
38
+
39
+ def mixed_words_and_digits
40
+ return unless numeric?(that)
41
+
42
+ in_words = that.split(' ').map { |word| numeric?(word) ? NumbersInWords.in_words(word) : word }.join(' ')
43
+ ToNumber.new(in_words, only_compress).call
44
+ end
45
+
46
+ def numeric?(word)
47
+ word.match(/\d+/)
48
+ end
49
+
50
+ def strip_minus(txt)
51
+ txt.gsub(/^minus/, '') if txt =~ /^minus/
52
+ end
53
+
54
+ def one
55
+ one = check_one text
56
+
57
+ return unless one
58
+
59
+ res = NumbersInWords.in_numbers(one[1])
60
+ only_compress ? [res] : res
61
+ end
62
+
63
+ def check_one(txt)
64
+ txt.match(/^one (#{POWERS_RX})$/)
65
+ end
66
+ end
67
+ end
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './special'
4
+ require_relative './fraction_parsing'
5
+
3
6
  module NumbersInWords
4
7
  class ToNumber
8
+ include FractionParsing
5
9
  extend Forwardable
6
10
  def_delegator :that, :to_s
7
11
 
@@ -19,65 +23,7 @@ module NumbersInWords
19
23
  private
20
24
 
21
25
  def special
22
- float ||
23
- negative ||
24
- fraction(that) ||
25
- mixed_words_and_digits ||
26
- one ||
27
- mixed
28
- end
29
-
30
- def float
31
- return text_including_punctuation.to_f if text =~ /^-?\d+(.\d+)?$/
32
- end
33
-
34
- def text_including_punctuation
35
- to_s.strip
36
- end
37
-
38
- def text
39
- strip_punctuation text_including_punctuation
40
- end
41
-
42
- def negative
43
- stripped = strip_minus text
44
- return unless stripped
45
-
46
- stripped_n = NumbersInWords.in_numbers(stripped, only_compress: only_compress)
47
- only_compress ? stripped_n.map { |k| k * -1 } : -1 * stripped_n
48
- end
49
-
50
- def mixed_words_and_digits
51
- return unless numeric?(that)
52
-
53
- in_words = that.split(' ').map { |word| numeric?(word) ? NumbersInWords.in_words(word) : word }.join(' ')
54
- self.class.new(in_words, only_compress).call
55
- end
56
-
57
- def numeric?(word)
58
- word.match(/\d+/)
59
- end
60
-
61
- def strip_punctuation(text)
62
- text = text.downcase.gsub(/[^a-z 0-9]/, ' ')
63
- to_remove = true
64
-
65
- to_remove = text.gsub! ' ', ' ' while to_remove
66
-
67
- text
68
- end
69
-
70
- def one
71
- one = check_one text
72
-
73
- return unless one
74
-
75
- res = NumbersInWords.in_numbers(one[1])
76
- only_compress ? [res] : res
77
- end
78
-
79
- def mixed
80
- check_mixed text
26
+ Special.new(that, only_compress).call
81
27
  end
82
28
 
83
29
  def decimal
@@ -107,18 +53,6 @@ module NumbersInWords
107
53
  NumbersInWords.exceptional_number(text) || fraction(text) || power(text)
108
54
  end
109
55
 
110
- def fraction(text)
111
- return unless possible_fraction?(text)
112
-
113
- NumbersInWords.exceptional_numbers.lookup_fraction(text)
114
- end
115
-
116
- def possible_fraction?(text)
117
- words = text.split(' ')
118
- result = words & NumbersInWords.exceptional_numbers.fraction_names
119
- result.length.positive?
120
- end
121
-
122
56
  def power(text)
123
57
  power = NumbersInWords.power_of_ten(text)
124
58
 
@@ -136,22 +70,6 @@ module NumbersInWords
136
70
  }
137
71
  end
138
72
 
139
- def check_mixed(txt)
140
- mixed = txt.match(/^(-?\d+(.\d+)?) (#{POWERS_RX}s?)$/)
141
- return unless mixed && mixed[1] && mixed[3]
142
-
143
- matches = [mixed[1], mixed[3]].map { |m| NumbersInWords.in_numbers m }
144
- matches.reduce(&:*)
145
- end
146
-
147
- def check_one(txt)
148
- txt.match(/^one (#{POWERS_RX})$/)
149
- end
150
-
151
- def strip_minus(txt)
152
- txt.gsub(/^minus/, '') if txt =~ /^minus/
153
- end
154
-
155
73
  def check_decimal(txt)
156
74
  txt.match(/\spoint\s/)
157
75
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NumbersInWords
4
- VERSION = '0.4.1'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -7,7 +7,8 @@ require 'numbers_in_words/version'
7
7
  Gem::Specification.new do |gem|
8
8
  gem.name = 'numbers_in_words'
9
9
  gem.description = 'convert written numbers into Integers and vice-versa'
10
- gem.summary = 'Example: NumbersInWords.in_words(123) # => "one hundred and twenty three", NumbersInWords.in_numbers("seventy-five point eight") # = > 75.8'
10
+ gem.summary = 'Example: NumbersInWords.in_words(123) # => ' \
11
+ '"one hundred and twenty three", NumbersInWords.in_numbers("seventy-five point eight") # = > 75.8'
11
12
 
12
13
  gem.version = NumbersInWords::VERSION
13
14
  gem.authors = ['Mark Burns', 'Dimid Duchovny']
@@ -1,131 +1,151 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NumbersInWords
4
- RSpec.describe Fraction do
5
- subject do
6
- described_class.new(numerator: numerator, denominator: denominator, numerator: numerator, attributes: attributes)
3
+ RSpec.describe NumbersInWords::Fraction do # rubocop: disable Metrics/BlockLength
4
+ subject do
5
+ described_class.new(numerator: numerator, denominator: denominator, attributes: attributes)
6
+ end
7
+
8
+ let(:numerator) { 1 }
9
+
10
+ context 'halves' do
11
+ let(:denominator) { 2 }
12
+ let(:attributes) do
13
+ { number: 'two',
14
+ ordinal: 'second',
15
+ fraction: { singular: 'half', plural: 'halves' } }
7
16
  end
8
17
 
9
- let(:numerator) { 1 }
18
+ it do
19
+ expect(subject.in_words).to eq 'one half'
20
+ end
10
21
 
11
- context 'halves' do
12
- let(:denominator) { 2 }
13
- let(:attributes) do
14
- { number: 'two',
15
- ordinal: 'second',
16
- fraction: { singular: 'half', plural: 'halves' } }
17
- end
22
+ context 'with plural' do
23
+ let(:numerator) { 2 }
18
24
 
19
25
  it do
20
- expect(subject.in_words).to eq 'one half'
26
+ expect(subject.in_words).to eq 'two halves'
21
27
  end
28
+ end
29
+ end
22
30
 
23
- context 'with plural' do
24
- let(:numerator) { 2 }
31
+ context 'quarters' do
32
+ let(:denominator) { 4 }
33
+ let(:attributes) do
34
+ {
35
+ number: 'four',
36
+ ordinal: 'fourth',
37
+ fraction: { singular: 'quarter' }
38
+ }
39
+ end
25
40
 
26
- it do
27
- expect(subject.in_words).to eq 'two halves'
28
- end
29
- end
41
+ it do
42
+ expect(subject.in_words).to eq 'one quarter'
30
43
  end
44
+ end
31
45
 
32
- context 'quarters' do
33
- let(:denominator) { 4 }
34
- let(:attributes) do
35
- {
36
- number: 'four',
37
- ordinal: 'fourth',
38
- fraction: { singular: 'quarter' }
39
- }
40
- end
46
+ context 'fifths' do
47
+ let(:denominator) { 5 }
48
+ let(:attributes) do
49
+ { number: 'five', ordinal: 'fifth' }
50
+ end
41
51
 
42
- it do
43
- expect(subject.in_words).to eq 'one quarter'
44
- end
52
+ it do
53
+ expect(subject.in_words).to eq 'one fifth'
45
54
  end
55
+ end
46
56
 
47
- context 'fifths' do
48
- let(:denominator) { 5 }
49
- let(:attributes) do
50
- { number: 'five', ordinal: 'fifth' }
51
- end
57
+ context 'sixths' do
58
+ let(:denominator) { 6 }
59
+ let(:attributes) { {} }
52
60
 
53
- it do
54
- expect(subject.in_words).to eq 'one fifth'
55
- end
61
+ it do
62
+ expect(subject.in_words).to eq 'one sixth'
56
63
  end
64
+ end
57
65
 
58
- context 'sixths' do
59
- let(:denominator) { 6 }
60
- let(:attributes) { {} }
66
+ context 'nineteenths' do
67
+ let(:denominator) { 19 }
68
+ let(:attributes) { {} }
61
69
 
62
- it do
63
- expect(subject.in_words).to eq 'one sixth'
64
- end
70
+ it do
71
+ expect(subject.in_words).to eq 'one nineteenth'
72
+ expect(subject.fraction).to eq 'nineteenth'
65
73
  end
66
74
 
67
- context 'nineteenths' do
68
- let(:denominator) { 19 }
69
- let(:attributes) { {} }
75
+ context 'plural' do
76
+ let(:numerator) { 763 }
70
77
 
71
78
  it do
72
- expect(subject.in_words).to eq 'one nineteenth'
73
- expect(subject.fraction).to eq 'nineteenth'
79
+ expect(subject.in_words).to eq 'seven hundred and sixty-three nineteenths'
74
80
  end
81
+ end
82
+ end
75
83
 
76
- context 'plural' do
77
- let(:numerator) { 763 }
84
+ context 'one hundred and seconds' do
85
+ let(:denominator) { 102 }
86
+ let(:attributes) { {} }
78
87
 
79
- it do
80
- expect(subject.in_words).to eq 'seven hundred and sixty-three nineteenths'
81
- end
82
- end
88
+ it do
89
+ expect(subject.in_words).to eq 'one one hundred and second'
83
90
  end
91
+ end
84
92
 
85
- context 'one hundred and seconds' do
86
- let(:denominator) { 102 }
87
- let(:attributes) { {} }
93
+ context 'one hundred and sixth' do
94
+ let(:denominator) { 106 }
95
+ let(:attributes) { {} }
88
96
 
89
- it do
90
- expect(subject.in_words).to eq 'one one hundred and second'
91
- end
97
+ it do
98
+ expect(subject.in_words).to eq 'one one hundred and sixth'
92
99
  end
100
+ end
93
101
 
94
- context 'one hundred and sixth' do
95
- let(:denominator) { 106 }
96
- let(:attributes) { {} }
102
+ context 'one hundred and nineteenth' do
103
+ let(:denominator) { 119 }
104
+ let(:attributes) { {} }
97
105
 
98
- it do
99
- expect(subject.in_words).to eq 'one one hundred and sixth'
100
- end
106
+ it do
107
+ expect(subject.ordinal).to eq 'one hundred and nineteenth'
108
+ expect(subject.in_words).to eq 'one one hundred and nineteenth'
101
109
  end
110
+ end
102
111
 
103
- context 'one hundred and nineteenth' do
104
- let(:denominator) { 119 }
105
- let(:attributes) { {} }
112
+ context 'one thousandth' do
113
+ let(:denominator) { 1000 }
114
+ let(:attributes) { {} }
106
115
 
107
- it do
108
- expect(subject.ordinal).to eq 'one hundred and nineteenth'
109
- expect(subject.in_words).to eq 'one one hundred and nineteenth'
110
- end
116
+ it do
117
+ expect(subject.ordinal).to eq 'one thousandth'
118
+ expect(subject.in_words).to eq 'one one thousandth'
111
119
  end
112
120
 
113
- context 'one thousandth' do
121
+ context 'plural' do
122
+ let(:numerator) { 2 }
114
123
  let(:denominator) { 1000 }
115
- let(:attributes) { {} }
116
124
 
117
125
  it do
118
- expect(subject.ordinal).to eq 'one thousandth'
119
- expect(subject.in_words).to eq 'one one thousandth'
126
+ expect(subject.in_words).to eq 'two thousandths'
120
127
  end
128
+ end
129
+ end
130
+
131
+ context 'googolplexths' do
132
+ let(:denominator) { Kernel.silence_warnings { 10**(10**100) } }
121
133
 
122
- context 'plural' do
123
- let(:numerator) { 2 }
124
- let(:denominator) { 1000 }
134
+ let(:attributes) do
135
+ { number: 'googolplex',
136
+ ordinal: 'googolplexth',
137
+ fraction: { singular: 'googolplexth', plural: 'googolplexths' } }
138
+ end
139
+
140
+ it do
141
+ expect(subject.in_words).to eq 'one infinitieth'
142
+ end
125
143
 
126
- it do
127
- expect(subject.in_words).to eq 'two thousandths'
128
- end
144
+ context 'with plural' do
145
+ let(:numerator) { 2 }
146
+
147
+ it do
148
+ expect(subject.in_words).to eq 'two infinitieths'
129
149
  end
130
150
  end
131
151
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  describe NumbersInWords do
4
- FRACTIONS = {
4
+ FRACTION_EXAMPLES = {
5
5
  'half' => 0.5,
6
6
  'a half' => 0.5,
7
7
  'one half' => 0.5,
@@ -17,7 +17,7 @@ describe NumbersInWords do
17
17
  'three ninety-sevenths' => 3 / 97.0
18
18
  }.freeze
19
19
 
20
- FRACTIONS.each do |string, float|
20
+ FRACTION_EXAMPLES.each do |string, float|
21
21
  it "#{string} == #{float}" do
22
22
  expect(string.in_numbers).to eql(float)
23
23
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe 'NumbersInWords' do
5
+ describe 'NumbersInWords' do # rubocop: disable Metrics/BlockLength
6
6
  describe '.in_words' do
7
7
  it do
8
8
  expect(NumbersInWords.in_words(100)).to eq 'one hundred'
@@ -14,7 +14,7 @@ describe 'NumbersInWords' do
14
14
  end
15
15
  end
16
16
 
17
- FRACTIONS = {
17
+ FRACTION_TO_WORDS = {
18
18
  [1, 2] => 'one half',
19
19
  [3, 2] => 'three halves',
20
20
  [1, 3] => 'one third',
@@ -30,9 +30,9 @@ describe 'NumbersInWords' do
30
30
  [13, 97] => 'thirteen ninety-sevenths'
31
31
  }.freeze
32
32
 
33
- FRACTIONS.each do |(numerator, denominator), string|
33
+ FRACTION_TO_WORDS.each do |(numerator, denominator), string|
34
34
  it "#{numerator}/#{denominator} == #{string}" do
35
- expect(NumbersInWords.in_words(numerator.to_f / denominator.to_f, fraction: true)).to eql(string)
35
+ expect(NumbersInWords.in_words(numerator.to_f / denominator, fraction: true)).to eql(string)
36
36
  end
37
37
  end
38
38
 
@@ -23,38 +23,6 @@ describe NumbersInWords::NumberParser do
23
23
  it { expect(subject).to eq 1600 }
24
24
  end
25
25
 
26
- pending 'with fractions' do
27
- context 'with only denominator' do
28
- let(:number) { [0.5] }
29
- it { expect(subject).to eq 0.5 }
30
- end
31
-
32
- context 'with numerator denominator' do
33
- let(:number) { [1, 0.5] }
34
- it { expect(subject).to eq 0.5 }
35
- end
36
-
37
- context 'with multiple denominator' do
38
- let(:number) { [3, 0.5] }
39
- it { expect(subject).to eq 1.5 }
40
- end
41
-
42
- context 'with tens denominator' do
43
- let(:number) { [2, 3, 0.5] }
44
- pending { expect(subject).to eq 21.5 }
45
- end
46
-
47
- context 'with invalid number' do
48
- let(:number) { [2, 1, 0.5, 1] }
49
- it { expect { subject }.to raise_error NumbersInWords::InvalidNumber }
50
- end
51
-
52
- context 'with numerator and denominator' do
53
- let(:number) { [2, 0.5] }
54
- it { expect(subject).to eq 1.0 }
55
- end
56
- end
57
-
58
26
  context 'with hundreds' do
59
27
  let(:number) { [2, 100, 45] }
60
28
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  require './spec/spec_helper'
4
4
 
5
- describe NumbersInWords do
5
+ describe NumbersInWords do # rubocop: disable Metrics/BlockLength
6
6
  describe '.in_words' do
7
7
  it do
8
8
  expect(NumbersInWords.in_words(100)).to eq 'one hundred'
@@ -66,7 +66,8 @@ describe NumbersInWords do
66
66
  it 'should handle a googol and larger' do
67
67
  googol = 10**100
68
68
  expect((googol + 1).in_words).to eq('one googol and one')
69
- expect((42 * googol + 16_777_216).in_words).to eq('forty-two googol sixteen million seven hundred and seventy-seven thousand two hundred and sixteen')
69
+ expect((42 * googol + 16_777_216).in_words)
70
+ .to eq('forty-two googol sixteen million seven hundred and seventy-seven thousand two hundred and sixteen')
70
71
  expect((42 * googol * googol).in_words).to eq('forty-two googol googol')
71
72
  end
72
73
 
@@ -77,7 +78,10 @@ describe NumbersInWords do
77
78
  expect(-15.in_words).to eq('minus fifteen')
78
79
  expect(-100.in_words).to eq('minus one hundred')
79
80
  expect((-1 * (10**100)).in_words).to eq('minus one googol')
80
- expect(-123_456_789.in_words).to eq('minus one hundred and twenty-three million four hundred and fifty-six thousand seven hundred and eighty-nine')
81
+
82
+ expect(-123_456_789.in_words)
83
+ .to eq('minus one hundred and twenty-three million four hundred and ' \
84
+ 'fifty-six thousand seven hundred and eighty-nine')
81
85
  end
82
86
 
83
87
  it 'should handle decimals' do
@@ -87,7 +91,9 @@ describe NumbersInWords do
87
91
  expect(1.1.in_words).to match(/one point one/)
88
92
  expect(1.2345678.in_words).to match(/one point two three four five six seven eight/)
89
93
  expect(1000.2345678.in_words).to match(/one thousand point two three four five six seven eight/)
90
- expect(12_345.2345678.in_words).to match(/twelve thousand three hundred and forty-five point two three four five six seven eight/)
94
+ expect(12_345.2345678.in_words)
95
+ .to match(/twelve thousand three hundred and forty-five point two three four five six seven eight/)
96
+
91
97
  expect((10**9 + 0.1).in_words).to match(/one billion point one/)
92
98
  end
93
99
  end
@@ -23,11 +23,11 @@ describe NumbersInWords do
23
23
  end
24
24
  end
25
25
 
26
- PENDING = {
26
+ PENDING_MIXED = {
27
27
  '19 zero five' => 1_905
28
28
  }.freeze
29
29
 
30
- PENDING.each do |k, v|
30
+ PENDING_MIXED.each do |k, v|
31
31
  pending do
32
32
  expect(k.in_numbers).to eql(v)
33
33
  end
@@ -1,5 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ if ENV['CC_TEST_REPORTER_ID']
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+ end
7
+
8
+ unless Kernel.method_defined?(:silence_warnings)
9
+ module Kernel
10
+ def silence_warnings
11
+ with_warnings(nil) { yield }
12
+ end
13
+
14
+ def with_warnings(flag)
15
+ old_verbose = $VERBOSE
16
+ $VERBOSE = flag
17
+ yield
18
+ ensure
19
+ $VERBOSE = old_verbose
20
+ end
21
+ end
22
+ end
23
+
3
24
  require 'numbers_in_words'
4
25
  require 'numbers_in_words/duck_punch'
5
26
  require 'byebug'
@@ -2,7 +2,7 @@
2
2
 
3
3
  require './spec/spec_helper'
4
4
 
5
- describe NumbersInWords::StringExtension do
5
+ describe NumbersInWords::StringExtension do # rubocop: disable Metrics/BlockLength
6
6
  it 'should do the digits 0-10' do
7
7
  expect('zero'.in_numbers).to eq(0)
8
8
  expect('one'.in_numbers).to eq(1)
@@ -101,7 +101,7 @@ describe NumbersInWords::StringExtension do
101
101
  expect("FIVE,,./';';';[] Million, three hundred and fifty-seVen Thousand".in_numbers).to eq(5_357_000)
102
102
  end
103
103
 
104
- it 'should handle decimal points' do
104
+ it 'should handle decimal points' do # rubocop: disable Metrics/BlockLength
105
105
  expect('one point one'.in_numbers).to eq(1.1)
106
106
 
107
107
  expect('zero point seven six five three four'.in_numbers).to eq(0.76534)
@@ -130,9 +130,11 @@ describe NumbersInWords::StringExtension do
130
130
  eight nine five six four three two one eight nine five six seven eight
131
131
  NUMBER
132
132
 
133
+ # rubocop: disable Metrics/LineLength
133
134
  expect(long_number.in_numbers).to eq(
134
135
  9_777_059_160_806_736_471_970_632_827_836_952_710_801_948_705_683_106_707_757_426_795_746_813_127_465_237_139_153_046_752_803_093_791.89564321895678
135
136
  )
137
+ # rubocop: enable Metrics/LineLength
136
138
 
137
139
  expect('seventy five point eight four three two seven six nine four five one eight'
138
140
  .in_numbers).to eq(75.84327694518)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: numbers_in_words
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Burns
@@ -64,11 +64,13 @@ files:
64
64
  - lib/numbers_in_words/exceptional_numbers.rb
65
65
  - lib/numbers_in_words/fraction.rb
66
66
  - lib/numbers_in_words/number_group.rb
67
+ - lib/numbers_in_words/parsing/fraction_parsing.rb
67
68
  - lib/numbers_in_words/parsing/number_parser.rb
68
69
  - lib/numbers_in_words/parsing/pair_parsing.rb
69
70
  - lib/numbers_in_words/parsing/parse_fractions.rb
70
71
  - lib/numbers_in_words/parsing/parse_individual_number.rb
71
72
  - lib/numbers_in_words/parsing/parse_status.rb
73
+ - lib/numbers_in_words/parsing/special.rb
72
74
  - lib/numbers_in_words/parsing/to_number.rb
73
75
  - lib/numbers_in_words/powers_of_ten.rb
74
76
  - lib/numbers_in_words/to_word.rb