english_number 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad1e9753922557166b6fd050738d7dec6a4d0b70
4
- data.tar.gz: fa8ce30e3cc5af982efa6d566dac4f6b360a3b4d
3
+ metadata.gz: cdf0d7574ca5907f46a01d20ff33b5dcffc4052e
4
+ data.tar.gz: e1e587b04a8245be90a070af212ed889399259bc
5
5
  SHA512:
6
- metadata.gz: 96b2a71799d08d7702f97d7b1d31cb997f96a5a72a033d810928752f209a7c27dc811ac2458fff1f075697e3eeda2f8cd4ff6fe10185f58ea8ed17b6fb753d23
7
- data.tar.gz: f7c05cf0299f4abf37a01e14d77cbaa37906d903e74f66071c7fbe244c950fef85be8fbb017d191517a7d7604e707c05373900cb39218c68b173bdc40b0f2c88
6
+ metadata.gz: 8b3d9cf1988aa803f1063ea1e4eeeed11481a92ef67975b76e2fddcdf78eeca882a584c6aed94854993f94e6c73b3b5e0d0f84f844324f20ac8392cd440cc6b6
7
+ data.tar.gz: 1ad634b277764c301d46ee8a515ba3ed062c156847a62b5b1a5a8163205fb53b671bfa9e34b1bd2e45233fca36ac39c2de29ffe8d03ea0fe0f0e99fce7f5f5ac
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.0
4
+ script:
5
+ - bundle exec rspec -fd
@@ -1,13 +1,9 @@
1
1
  == english_number
2
2
 
3
- <!--TODO:-->
4
- <!--{<img src="https://badge.fury.io/rb/numbers_and_words.svg?branch=master" alt="Gem Version" />}[http://badge.fury.io/rb/numbers_and_words]-->
5
- <!--{<img src="https://gemnasium.com/kslazarev/numbers_and_words.svg?branch=master" alt="Dependency Status" />}[https://gemnasium.com/kslazarev/numbers_and_words]-->
6
- <!--{<img src="https://codeclimate.com/github/kslazarev/numbers_and_words.svg?branch=master" />}[https://codeclimate.com/github/kslazarev/numbers_and_words]-->
7
- <!--{<img src="https://secure.travis-ci.org/kslazarev/numbers_and_words.svg?branch=master" />}[http://travis-ci.org/kslazarev/numbers_and_words]-->
8
- <!--{<img src="https://coveralls.io/repos/kslazarev/numbers_and_words/badge.svg?branch=master" alt="Coverage Status" />}[https://coveralls.io/r/kslazarev/numbers_and_words]-->
9
-
10
- Convert numbers to words in English. Limit of digits handled can be set. For now works for up to 3 digits. Additionally EnglishNumber objects can be added, subtracted, multiplied and divided.
3
+ {<img src="https://travis-ci.org/bryszard/english_number.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/bryszard/english_number]
4
+ {<img src="https://codeclimate.com/github/bryszard/english_number/badges/gpa.svg" />}[https://codeclimate.com/github/bryszard/english_number]
5
+
6
+ Convert numbers to words in English. Limit of digits handled can be set. For now works for up to 5 digits. Additionally EnglishNumber objects can be added, subtracted, multiplied and divided.
11
7
 
12
8
 
13
9
  == Supported Languages
@@ -1,16 +1,17 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'english_number'
3
- s.version = '0.0.3'
3
+ s.version = '0.0.4'
4
4
  s.date = '2016-05-15'
5
5
  s.summary = "Converting English numbers to strings"
6
6
  s.description = "Example: EnglishNumber.new(63).in_english # => 'sixty-three'.\n
7
7
  EnglishNumber objects can be added, subtracted, multiplied, divided.\n
8
- For now gem is deliberately limited to numbers maximum three digits long.\n"
8
+ For now gem is deliberately limited to numbers maximum five digits long.\n
9
+ Lower limit might be set manually (see the source code)"
9
10
 
10
11
  s.authors = ["Piotr Brych"]
11
12
  s.email = 'pbrych@gmail.com'
12
13
  s.files = `git ls-files`.split($/)
13
- s.homepage = 'http://rubygems.org/gems/english-number.rb'
14
+ s.homepage = 'https://github.com/bryszard/english_number'
14
15
 
15
16
  s.add_dependency 'activesupport', '~> 4.2.6'
16
17
  s.add_development_dependency 'rspec', '~> 3.4.0'
@@ -0,0 +1,14 @@
1
+ require 'modules/compute'
2
+ require 'modules/translate'
3
+
4
+ class Digits
5
+ include Compute
6
+ include Translate
7
+
8
+ attr_reader :num
9
+
10
+ def initialize(num)
11
+ @num = num
12
+ end
13
+
14
+ end
@@ -0,0 +1,38 @@
1
+ class FiveDigits < Digits
2
+
3
+ def self.run(num)
4
+ new(num).in_words
5
+ end
6
+
7
+ def in_words
8
+ num_mod(10000).zero? ? simple_ten_thous : complex_ten_thous
9
+ end
10
+
11
+ private
12
+
13
+ attr_reader :num
14
+
15
+ def initialize(num)
16
+ @num = num
17
+ end
18
+
19
+ def first_two_digits
20
+ TwoDigits.new(in_array[0,2].join.to_i).in_english
21
+ end
22
+
23
+ def rest_digits
24
+ in_array[-3..-1].join.to_i
25
+ end
26
+
27
+ def rest
28
+ rest_digits < 10 ? single_digits(rest_digits) : Digits.new(rest_digits).in_english
29
+ end
30
+
31
+ def simple_ten_thous
32
+ [first_two_digits, prefix(power_of_ten)].join('-')
33
+ end
34
+
35
+ def complex_ten_thous
36
+ [simple_ten_thous, rest].join('-')
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ class FourDigits < Digits
2
+
3
+ def self.run(num)
4
+ new(num).in_words
5
+ end
6
+
7
+ def in_words
8
+ num_mod(1000).zero? ? simple_thousends : complex_thousends
9
+ end
10
+
11
+ private
12
+
13
+ attr_reader :num
14
+
15
+ def initialize(num)
16
+ @num = num
17
+ end
18
+
19
+ def first_digit
20
+ single_digits(in_array[0].to_i)
21
+ end
22
+
23
+ def rest_digits
24
+ in_array[1..-1].join.to_i
25
+ end
26
+
27
+ def rest
28
+ rest_digits < 10 ? single_digits(rest_digits) : Digits.new(rest_digits).in_english
29
+ end
30
+
31
+ def simple_thousends
32
+ [first_digit, prefix(power_of_ten)].join('-')
33
+ end
34
+
35
+ def complex_thousends
36
+ [first_digit, prefix(power_of_ten), rest].join('-')
37
+ end
38
+
39
+ end
@@ -1,9 +1,4 @@
1
- require 'modules/compute'
2
- require 'modules/translate'
3
-
4
- class ThreeDigits
5
- include Compute
6
- include Translate
1
+ class ThreeDigits < Digits
7
2
 
8
3
  def self.run(num)
9
4
  new(num).in_words
@@ -30,7 +25,7 @@ class ThreeDigits
30
25
  end
31
26
 
32
27
  def rest
33
- rest_digits < 10 ? single_digits(rest_digits) : TwoDigits.run(rest_digits)
28
+ rest_digits < 10 ? single_digits(rest_digits) : Digits.new(rest_digits).in_english
34
29
  end
35
30
 
36
31
  def simple_hundreds
@@ -1,9 +1,4 @@
1
- require 'modules/compute'
2
- require 'modules/translate'
3
-
4
- class TwoDigits
5
- include Compute
6
- include Translate
1
+ class TwoDigits < Digits
7
2
 
8
3
  def self.run(num)
9
4
  new(num).in_words
@@ -1,10 +1,9 @@
1
1
  require 'yaml'
2
2
  require 'active_support/inflector'
3
3
 
4
- require 'digits/two_digits'
5
- require 'digits/three_digits'
6
4
  require 'modules/compute'
7
5
  require 'modules/translate'
6
+ Dir["./lib/digits/*.rb"].each {|file| require file }
8
7
 
9
8
  class EnglishNumber
10
9
  include Compute
@@ -3,9 +3,11 @@
3
3
  module Compute
4
4
  OPERATIONS = [:+, :-, :*, :/]
5
5
 
6
- def method_missing(method, arg)
6
+ def method_missing(method, arg=nil)
7
7
  if OPERATIONS.include?(method)
8
8
  self.class.new(num.send(method, arg.num))
9
+ else
10
+ super
9
11
  end
10
12
  end
11
13
 
@@ -1,4 +1,4 @@
1
1
  ones: [zero, one, two, three, four, five, six, seven, eight, nine]
2
2
  tenss: [ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen]
3
3
  tens: [zero, ten, twenty, thirty, forty, fifty, sixty, seventy, eighty, ninety]
4
- powers: [one, ten, hundred, thousand, ten-thousand, hundred-thousand, million, ten-million, hundred-million, billion]
4
+ powers: [one, ten, hundred, thousand, thousand, thousand, million, million, million, billion]
@@ -1,6 +1,6 @@
1
1
  module Translate
2
2
  # Set the limit of translated number of digits
3
- DIGITS_LIMIT = 2
3
+ DIGITS_LIMIT = 5
4
4
 
5
5
  def in_english
6
6
  return nil if over_limit?
@@ -0,0 +1,68 @@
1
+ RSpec.describe FiveDigits do
2
+ subject(:five_dig) { described_class }
3
+
4
+ context 'modules' do
5
+
6
+ it 'includes Compute module' do
7
+ expect(five_dig.included_modules).to include(Compute)
8
+ end
9
+
10
+ it 'includes Translate module' do
11
+ expect(five_dig.included_modules).to include(Translate)
12
+ end
13
+
14
+ end
15
+
16
+ context '#run' do
17
+ let(:limit) { 10**Translate::DIGITS_LIMIT }
18
+ let(:num) { rand(limit/10..limit) }
19
+ let(:inst) { instance_double('FiveDigits') }
20
+
21
+ it 'responds to class method #run(num)' do
22
+ expect(five_dig).to respond_to(:run).with(1).argument
23
+ five_dig.run(num)
24
+ end
25
+
26
+ it 'when #run used it it invokes #in_words on new instance' do
27
+ allow(five_dig).to receive(:new).with(num) { inst }
28
+ expect(inst).to receive(:in_words)
29
+ five_dig.run(num)
30
+ end
31
+
32
+ end
33
+
34
+ context '#in_words', if: Translate::DIGITS_LIMIT > 4 do
35
+
36
+ context 'works for five-digit numbers:' do
37
+ it '10000' do
38
+ expect(five_dig.new(10000).in_words).to eq('ten-thousand')
39
+ end
40
+ it '10010' do
41
+ expect(five_dig.new(10010).in_words).to eq('ten-thousand-ten')
42
+ end
43
+ it '15210' do
44
+ expect(five_dig.new(15210).in_words).to eq('fifteen-thousand-two-hundred-ten')
45
+ end
46
+ it '27378' do
47
+ expect(five_dig.new(27378).in_words).to eq('twenty-seven-thousand-three-hundred-seventy-eight')
48
+ end
49
+ it '30000' do
50
+ expect(five_dig.new(30000).in_words).to eq('thirty-thousand')
51
+ end
52
+ it '31500' do
53
+ expect(five_dig.new(31500).in_words).to eq('thirty-one-thousand-five-hundred')
54
+ end
55
+ it '60000' do
56
+ expect(five_dig.new(60000).in_words).to eq('sixty-thousand')
57
+ end
58
+ it '87324' do
59
+ expect(five_dig.new(87324).in_words).to eq('eighty-seven-thousand-three-hundred-twenty-four')
60
+ end
61
+ it '99999' do
62
+ expect(five_dig.new(99999).in_words).to eq('ninety-nine-thousand-nine-hundred-ninety-nine')
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+ end
@@ -0,0 +1,68 @@
1
+ RSpec.describe FourDigits do
2
+ subject(:four_dig) { described_class }
3
+
4
+ context 'modules' do
5
+
6
+ it 'includes Compute module' do
7
+ expect(four_dig.included_modules).to include(Compute)
8
+ end
9
+
10
+ it 'includes Translate module' do
11
+ expect(four_dig.included_modules).to include(Translate)
12
+ end
13
+
14
+ end
15
+
16
+ context '#run' do
17
+ let(:limit) { 10**Translate::DIGITS_LIMIT }
18
+ let(:num) { rand(limit/10..limit) }
19
+ let(:inst) { instance_double('FourDigits') }
20
+
21
+ it 'responds to class method #run(num)' do
22
+ expect(four_dig).to respond_to(:run).with(1).argument
23
+ four_dig.run(num)
24
+ end
25
+
26
+ it 'when #run used it it invokes #in_words on new instance' do
27
+ allow(four_dig).to receive(:new).with(num) { inst }
28
+ expect(inst).to receive(:in_words)
29
+ four_dig.run(num)
30
+ end
31
+
32
+ end
33
+
34
+ context '#in_words', if: Translate::DIGITS_LIMIT > 3 do
35
+
36
+ context 'works for four-digit numbers:' do
37
+ it '1000' do
38
+ expect(four_dig.new(1000).in_words).to eq('one-thousand')
39
+ end
40
+ it '1010' do
41
+ expect(four_dig.new(1010).in_words).to eq('one-thousand-ten')
42
+ end
43
+ it '1210' do
44
+ expect(four_dig.new(1210).in_words).to eq('one-thousand-two-hundred-ten')
45
+ end
46
+ it '2378' do
47
+ expect(four_dig.new(2378).in_words).to eq('two-thousand-three-hundred-seventy-eight')
48
+ end
49
+ it '3000' do
50
+ expect(four_dig.new(3000).in_words).to eq('three-thousand')
51
+ end
52
+ it '3500' do
53
+ expect(four_dig.new(3500).in_words).to eq('three-thousand-five-hundred')
54
+ end
55
+ it '6000' do
56
+ expect(four_dig.new(6001).in_words).to eq('six-thousand-one')
57
+ end
58
+ it '8732' do
59
+ expect(four_dig.new(8732).in_words).to eq('eight-thousand-seven-hundred-thirty-two')
60
+ end
61
+ it '9999' do
62
+ expect(four_dig.new(9999).in_words).to eq('nine-thousand-nine-hundred-ninety-nine')
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+ end
@@ -14,7 +14,8 @@ RSpec.describe ThreeDigits do
14
14
  end
15
15
 
16
16
  context '#run' do
17
- let(:num) { rand }
17
+ let(:limit) { 10**Translate::DIGITS_LIMIT }
18
+ let(:num) { rand(limit/10..limit) }
18
19
  let(:inst) { instance_double('ThreeDigits') }
19
20
 
20
21
  it 'responds to class method #run(num)' do
@@ -14,7 +14,8 @@ RSpec.describe TwoDigits do
14
14
  end
15
15
 
16
16
  context '#run' do
17
- let(:num) { rand }
17
+ let(:limit) { 10**Translate::DIGITS_LIMIT }
18
+ let(:num) { rand(limit/10..limit) }
18
19
  let(:inst) { instance_double('TwoDigits') }
19
20
 
20
21
  it 'responds to class method #run(num)' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: english_number
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Brych
@@ -54,7 +54,8 @@ dependencies:
54
54
  version: 0.11.2
55
55
  description: "Example: EnglishNumber.new(63).in_english # => 'sixty-three'.\n \n EnglishNumber
56
56
  objects can be added, subtracted, multiplied, divided.\n\n For
57
- now gem is deliberately limited to numbers maximum three digits long.\n"
57
+ now gem is deliberately limited to numbers maximum five digits long.\n\n Lower
58
+ limit might be set manually (see the source code)"
58
59
  email: pbrych@gmail.com
59
60
  executables: []
60
61
  extensions: []
@@ -62,10 +63,14 @@ extra_rdoc_files: []
62
63
  files:
63
64
  - ".gitignore"
64
65
  - ".rspec"
66
+ - ".travis.yml"
65
67
  - CHANGELOG.md
66
68
  - Gemfile
67
- - README.md
69
+ - README.rdoc
68
70
  - english_number.gemspec
71
+ - lib/digits/digits.rb
72
+ - lib/digits/five_digits.rb
73
+ - lib/digits/four_digits.rb
69
74
  - lib/digits/three_digits.rb
70
75
  - lib/digits/two_digits.rb
71
76
  - lib/english_number.rb
@@ -76,10 +81,12 @@ files:
76
81
  - spec/spec_helper.rb
77
82
  - spec/unit_tests/compute_spec.rb
78
83
  - spec/unit_tests/english_number_unit_spec.rb
84
+ - spec/unit_tests/five_digits_spec.rb
85
+ - spec/unit_tests/four_digits_spec.rb
79
86
  - spec/unit_tests/three_digits_spec.rb
80
87
  - spec/unit_tests/translate_spec.rb
81
88
  - spec/unit_tests/two_digits_spec.rb
82
- homepage: http://rubygems.org/gems/english-number.rb
89
+ homepage: https://github.com/bryszard/english_number
83
90
  licenses:
84
91
  - MIT
85
92
  metadata: {}