german_numbers 0.1 → 0.5

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
  SHA1:
3
- metadata.gz: 92f164db2d96ce8b35a633516c6410e2fe115d86
4
- data.tar.gz: e28f2f23636b84afc3788ff191375400952970a7
3
+ metadata.gz: 013dae0466819b3a48241f72efbecfc135d997a0
4
+ data.tar.gz: 651d87269eb855b5dab6e6a43f68ae3e7ddf098d
5
5
  SHA512:
6
- metadata.gz: bc470cd757b52a2c27283c23a1c07fe854642e9b630aadbbc9c137cd199f46d91e96546c71dc05fc26b6232a7a2e964486addc158742552595edfec4623e848a
7
- data.tar.gz: 84697dc0c43365af6a0ef8021a98db50b537fc643c6cb57a5412dbe1208611d6987bfa72bb2463d86f290e6f508d7a20dfef101c4311436b389ff57d5533c9d8
6
+ metadata.gz: 292e5224dceb2cfbb925d57893ae34e96ea79d207f73817468e7fa07c2209a8ed85762ff48708cfa93874d6b6338a190adc1bc66eb767e551730a250be7e3da1
7
+ data.tar.gz: '09ceb4a387b0334f1e1655b4632876bcbce5eb18245a7852afe413c27cd288ec8b7fc70648fcf0806b22ce93a880eb39eb083ae6e291e7f9bf3b82d76b084c7b'
@@ -0,0 +1,30 @@
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ docker:
5
+ - image: circleci/ruby:2.4.1
6
+ working_directory: ~/german_numbers
7
+
8
+ steps:
9
+ - checkout
10
+
11
+ - restore_cache:
12
+ keys:
13
+ - v1-dependencies-{{ checksum "Gemfile.lock" }}
14
+ - v1-dependencies-
15
+
16
+ - run:
17
+ name: install dependencies
18
+ command: bundle install --jobs=4 --retry=3 --path vendor/bundle
19
+
20
+ - save_cache:
21
+ paths:
22
+ - ./vendor/bundle
23
+ key: v1-dependencies-{{ checksum "Gemfile.lock" }}
24
+
25
+ - run:
26
+ name: run rubocop
27
+ command: bundle exec rubocop
28
+ - run:
29
+ name: run tests
30
+ command: bundle exec rspec
data/.gitignore CHANGED
@@ -7,4 +7,5 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  /.idea/
10
- /coverage/
10
+ /coverage/
11
+ *.gem
data/Gemfile.lock CHANGED
@@ -1,14 +1,25 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- german_numbers (0.1)
4
+ german_numbers (0.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ ast (2.4.0)
10
+ coderay (1.1.2)
9
11
  diff-lcs (1.3)
10
12
  docile (1.1.5)
11
13
  json (2.1.0)
14
+ method_source (0.9.0)
15
+ parallel (1.12.1)
16
+ parser (2.5.0.2)
17
+ ast (~> 2.4.0)
18
+ powerpack (0.1.1)
19
+ pry (0.11.3)
20
+ coderay (~> 1.1.0)
21
+ method_source (~> 0.9.0)
22
+ rainbow (3.0.0)
12
23
  rake (10.5.0)
13
24
  rspec (3.7.0)
14
25
  rspec-core (~> 3.7.0)
@@ -23,11 +34,21 @@ GEM
23
34
  diff-lcs (>= 1.2.0, < 2.0)
24
35
  rspec-support (~> 3.7.0)
25
36
  rspec-support (3.7.0)
37
+ rubocop (0.52.1)
38
+ parallel (~> 1.10)
39
+ parser (>= 2.4.0.2, < 3.0)
40
+ powerpack (~> 0.1)
41
+ rainbow (>= 2.2.2, < 4.0)
42
+ ruby-progressbar (~> 1.7)
43
+ unicode-display_width (~> 1.0, >= 1.0.1)
44
+ ruby-prof (0.17.0)
45
+ ruby-progressbar (1.9.0)
26
46
  simplecov (0.15.1)
27
47
  docile (~> 1.1.0)
28
48
  json (>= 1.8, < 3)
29
49
  simplecov-html (~> 0.10.0)
30
50
  simplecov-html (0.10.2)
51
+ unicode-display_width (1.3.0)
31
52
 
32
53
  PLATFORMS
33
54
  ruby
@@ -35,8 +56,11 @@ PLATFORMS
35
56
  DEPENDENCIES
36
57
  bundler (~> 1.16)
37
58
  german_numbers!
59
+ pry (~> 0.11)
38
60
  rake (~> 10.0)
39
61
  rspec (~> 3.7)
62
+ rubocop (~> 0.52)
63
+ ruby-prof (~> 0.17)
40
64
  simplecov (~> 0.15)
41
65
 
42
66
  BUNDLED WITH
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 Gleb Sinyavsky
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,35 +1,32 @@
1
1
  # GermanNumbers
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/german_numbers`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ German numbers is a ruby gem for converting numbers into German strings and vise-versa.
4
+ It supports numbers up to 999 999 999 999. Also it can handle malformed and invalid strings. See
5
+ examples below.
6
6
 
7
7
  ## Installation
8
8
 
9
- Add this line to your application's Gemfile:
10
-
11
- ```ruby
12
- gem 'german_numbers'
13
- ```
14
-
15
- And then execute:
9
+ `gem install german_numbers`
16
10
 
17
- $ bundle
11
+ or
18
12
 
19
- Or install it yourself as:
20
-
21
- $ gem install german_numbers
13
+ `gem 'german_numbers'` in your Gemfile.
22
14
 
23
15
  ## Usage
24
16
 
25
- TODO: Write usage instructions here
17
+ ```ruby
18
+ require 'german_numbers'
19
+
20
+ GermanNumbers.stringify(213_431_983_111) # => "zweihundertdreizehn Milliarden vierhunderteinunddreißig Millionen neunhundertdreiundachtzigtausendeinhundertelf"
26
21
 
27
- ## Development
22
+ GermanNumbers.parse("zweihundertdreizehn Milliarden vierhunderteinunddreißig Millionen neunhundertdreiundachtzigtausendeinhundertelf") # => 213_431_983_111
23
+ GermanNumbers.parse("invalid") # => GermanNumbers::Parser::ParsingError: invalid is not a valid German number
28
24
 
29
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
25
+ GermanNumbers.valid?("zweihundertdreizehn Milliarden vierhunderteinunddreißig Millionen neunhundertdreiundachtzigtausendeinhundertelf") # => true
26
+ GermanNumbers.valid?("invalid") # => false
30
27
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
28
+ ```
32
29
 
33
30
  ## Contributing
34
31
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/german_numbers.
32
+ You know=)
@@ -3,7 +3,7 @@
3
3
 
4
4
  lib = File.expand_path('../lib', __FILE__)
5
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require 'german_numbers'
6
+ require 'german_numbers/version'
7
7
 
8
8
  Gem::Specification.new do |spec|
9
9
  spec.name = 'german_numbers'
@@ -24,7 +24,10 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ['lib']
25
25
 
26
26
  spec.add_development_dependency 'bundler', '~> 1.16'
27
+ spec.add_development_dependency 'pry', '~> 0.11'
27
28
  spec.add_development_dependency 'rake', '~> 10.0'
28
29
  spec.add_development_dependency 'rspec', '~> 3.7'
30
+ spec.add_development_dependency 'rubocop', '~> 0.52'
31
+ spec.add_development_dependency 'ruby-prof', '~> 0.17'
29
32
  spec.add_development_dependency 'simplecov', '~> 0.15'
30
33
  end
@@ -1,14 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'yaml'
4
+
3
5
  require 'german_numbers/version'
4
- require 'german_numbers/to_words'
6
+ require 'german_numbers/state_machine'
5
7
 
6
8
  module GermanNumbers
7
9
  DIGITS = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'data', 'de.yml'))['de']
8
10
 
9
11
  class << self
10
- def words(ws)
11
- ToWords.new.words(ws)
12
+ def stringify(number)
13
+ GermanNumbers::Stringifier.new.words(number)
14
+ end
15
+
16
+ def parse(string)
17
+ GermanNumbers::Parser::Parser.new.parse(string)
18
+ end
19
+
20
+ def valid?(string)
21
+ GermanNumbers::Parser::Parser.new.parse(string)
22
+ true
23
+ rescue GermanNumbers::Parser::ParsingError
24
+ false
12
25
  end
13
26
  end
14
27
  end
28
+
29
+ require 'german_numbers/stringifier'
30
+ require 'german_numbers/parser/small_number_parser'
31
+ require 'german_numbers/parser/stack_machine'
32
+ require 'german_numbers/parser/parser'
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GermanNumbers
4
+ module Parser
5
+ class ParsingError < StandardError
6
+ end
7
+
8
+ class Parser
9
+ extend GermanNumbers::StateMachine
10
+ state_machine_for :order do
11
+ state :initial, can_be_initial: true, final: false
12
+ state :thousands
13
+ state :million_keyword, final: false
14
+ state :millionen_keyword, final: false
15
+ state :million, final: true
16
+ state :millions, final: true
17
+ state :milliarde_keyword, final: false
18
+ state :milliarden_keyword, final: false
19
+ state :billion, final: true
20
+ state :billions, final: true
21
+
22
+ transition from: :initial, to: %i[thousands million_keyword millionen_keyword
23
+ milliarde_keyword milliarden_keyword]
24
+ transition from: :thousands, to: %i[million_keyword millionen_keyword milliarde_keyword milliarden_keyword]
25
+ transition from: :million_keyword, to: :million
26
+ transition from: :millionen_keyword, to: :millions
27
+ transition from: :milliarde_keyword, to: :billion
28
+ transition from: :milliarden_keyword, to: :billions
29
+ transition from: :million, to: %i[milliarde_keyword milliarden_keyword]
30
+ transition from: :millions, to: %i[milliarde_keyword milliarden_keyword]
31
+ end
32
+
33
+ DIGITS = GermanNumbers::DIGITS.invert
34
+ ERRORS = ['ein', 'sech', 'sieb', nil, ''].freeze
35
+ KEYWORDS = {
36
+ 'Million' => :million_keyword,
37
+ 'Millionen' => :millionen_keyword,
38
+ 'Milliarde' => :milliarde_keyword,
39
+ 'Milliarden' => :milliarden_keyword
40
+ }.freeze
41
+
42
+ def initialize
43
+ initialize_order(:initial)
44
+ end
45
+
46
+ def parse(string)
47
+ raise ParsingError if ERRORS.include?(string)
48
+ string.split(' ').reverse.inject(0, &method(:parse_part)).tap do
49
+ raise ParsingError unless final_order_state?
50
+ end
51
+ rescue ParsingError, StateMachine::StateError
52
+ raise ParsingError, "#{string} is not a valid German number"
53
+ end
54
+
55
+ # rubocop:disable Metrics/AbcSize
56
+ # rubocop:disable Metrics/MethodLength
57
+ # rubocop:disable Metrics/CyclomaticComplexity
58
+ # rubocop:disable Metrics/PerceivedComplexity
59
+ def parse_part(sum, part)
60
+ if order_state == :initial && KEYWORDS[part].nil?
61
+ self.order_state = :thousands
62
+ return parse_part(sum, part)
63
+ end
64
+
65
+ unless (st = KEYWORDS[part]).nil?
66
+ self.order_state = st
67
+ return sum
68
+ end
69
+
70
+ return SmallNumberParser.new.parse(part) if order_state == :thousands
71
+
72
+ self.order_state = :million if order_state == :million_keyword
73
+ self.order_state = :millions if order_state == :millionen_keyword
74
+ self.order_state = :billion if order_state == :milliarde_keyword
75
+ self.order_state = :billions if order_state == :milliarden_keyword
76
+
77
+ if order_state == :million
78
+ raise ParsingError unless part == 'eine'
79
+ return sum + 1_000_000
80
+ end
81
+ if order_state == :billion
82
+ raise ParsingError unless part == 'eine'
83
+ return sum + 1_000_000_000
84
+ end
85
+
86
+ return sum + SmallNumberParser.new(2..999).parse(part) * 1_000_000 if order_state == :millions
87
+ return sum + SmallNumberParser.new(2..999).parse(part) * 1_000_000_000 if order_state == :billions
88
+ end
89
+ # rubocop:enable Metrics/AbcSize
90
+ # rubocop:enable Metrics/MethodLength
91
+ # rubocop:enable Metrics/CyclomaticComplexity
92
+ # rubocop:enable Metrics/PerceivedComplexity
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GermanNumbers
4
+ module Parser
5
+ class SmallNumberParser
6
+ extend GermanNumbers::StateMachine
7
+
8
+ state_machine_for :order do
9
+ state :initial, can_be_initial: true, final: false
10
+ state :units
11
+ state :tausend_keyword, unique: true, final: false
12
+ state :thousands
13
+
14
+ transition from: :initial, to: %i[units tausend_keyword]
15
+ transition from: :tausend_keyword, to: :thousands
16
+ end
17
+
18
+ def initialize(range = 0..999_999)
19
+ initialize_order(:initial)
20
+ @range = range
21
+ @k = 1
22
+ end
23
+
24
+ def parse(string)
25
+ string.split(/(tausend)/).reverse.inject(0, &method(:parse_part))
26
+ end
27
+
28
+ private
29
+
30
+ def parse_part(sum, part)
31
+ if order_state == :tausend_keyword
32
+ self.order_state = :thousands
33
+ @k *= 1000
34
+ end
35
+ if part == 'tausend'
36
+ self.order_state = :tausend_keyword
37
+ return sum
38
+ end
39
+ raise ParsingError if (part == 'eins' || part == 'null') && order_state == :thousands
40
+ parse_number(sum, part)
41
+ end
42
+
43
+ def parse_number(sum, part)
44
+ m = StackMachine.new
45
+ (sum + part.split('').reverse.inject(0, &m.method(:step)) * @k).tap do |res|
46
+ raise ParsingError if !m.empty? || !m.final_stack_state? || !@range.cover?(res)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GermanNumbers
4
+ module Parser
5
+ class StackMachine
6
+ extend GermanNumbers::StateMachine
7
+
8
+ state_machine_for :stack do
9
+ state :initial, can_be_initial: true, final: false
10
+ state :null, unique: true
11
+ state :eins, unique: true
12
+ state :zehn, unique: true
13
+ state :short_units, unique: true
14
+ state :under_twenty, unique: true
15
+ state :dozens, unique: true
16
+ state :und_keyword, final: false, unique: true
17
+ state :units
18
+ state :hundert_keyword, final: false, unique: true
19
+ state :hundreds
20
+
21
+ transition from: :initial, to: %i[units hundert_keyword dozens null eins zehn under_twenty]
22
+ transition from: :dozens, to: %i[und_keyword hundert_keyword]
23
+ transition from: :zehn, to: %i[hundert_keyword short_units]
24
+
25
+ transition from: :und_keyword, to: :units
26
+ transition from: :units, to: :hundert_keyword
27
+ transition from: :hundert_keyword, to: :hundreds
28
+ transition from: :hundreds, to: :units
29
+ transition from: :eins, to: :hundert_keyword
30
+ transition from: :short_units, to: :hundert_keyword
31
+ transition from: :under_twenty, to: :hundert_keyword
32
+ end
33
+
34
+ SHORT = {
35
+ 'eins' => 1,
36
+ 'sech' => 6,
37
+ 'sieb' => 7
38
+ }.freeze
39
+
40
+ KEYWORDS = {
41
+ 'und' => :und_keyword,
42
+ 'hundert' => :hundert_keyword
43
+ }.freeze
44
+
45
+ SHORT_UNITS = Set.new(%w(drei vier fünf sech sieb acht neun)).freeze
46
+
47
+ def initialize
48
+ initialize_stack(:initial)
49
+ @collector = ''
50
+ @k = 1
51
+ end
52
+
53
+ # rubocop:disable Metrics/MethodLength
54
+ def step(result, letter)
55
+ @collector = letter + @collector
56
+ num = SHORT[@collector] || Parser::DIGITS[@collector]
57
+ unless (s = select_state(num, @collector)).nil?
58
+ self.stack_state = s
59
+ end
60
+ if stack_state == :hundert_keyword
61
+ self.stack_state = :hundreds
62
+ @k = 100
63
+ end
64
+ unless (st = KEYWORDS[@collector]).nil?
65
+ self.stack_state = st
66
+ @collector = ''
67
+ return result
68
+ end
69
+ return result if num.nil?
70
+ @collector = ''
71
+ result + num * @k
72
+ end
73
+ # rubocop:enable Metrics/MethodLength
74
+
75
+ def empty?
76
+ @collector.empty?
77
+ end
78
+
79
+ private
80
+
81
+ def select_state(num, collector)
82
+ if stack_state == :zehn && SHORT_UNITS.include?(collector)
83
+ :short_units
84
+ elsif collector == 'eins'
85
+ :eins
86
+ elsif collector == 'null'
87
+ :null
88
+ else
89
+ num_state(num)
90
+ end
91
+ end
92
+
93
+ # rubocop:disable Metrics/CyclomaticComplexity
94
+ # rubocop:disable Metrics/PerceivedComplexity
95
+ def num_state(num)
96
+ return if num.nil?
97
+ return :zehn if num == 10
98
+ return :units if num >= 1 && num <= 9
99
+ return :under_twenty if num >= 11 && num <= 19
100
+ return :dozens if num >= 20 && num <= 99
101
+ end
102
+ # rubocop:enable Metrics/CyclomaticComplexity
103
+ # rubocop:enable Metrics/PerceivedComplexity
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GermanNumbers
4
+ module StateMachine
5
+ class StateError < StandardError
6
+ end
7
+
8
+ class State
9
+ attr_reader :name
10
+
11
+ def initialize(name, initial, final, unique)
12
+ @name = name
13
+ @initial = initial
14
+ @final = final
15
+ @unique = unique
16
+ end
17
+
18
+ def can_be_initial?
19
+ @initial
20
+ end
21
+
22
+ def final?
23
+ @final
24
+ end
25
+
26
+ def unique?
27
+ @unique
28
+ end
29
+ end
30
+
31
+ class Machine
32
+ attr_reader :states, :transitions
33
+
34
+ def initialize
35
+ @states = {}
36
+ @transitions = Hash.new { [] }
37
+ end
38
+
39
+ def state(state, can_be_initial: false, final: true, unique: false)
40
+ @states[state] = State.new(state, can_be_initial, final, unique)
41
+ end
42
+
43
+ def transition(from:, to:)
44
+ to = [to].flatten
45
+ validate_state!(from, *to)
46
+ to.each do |s|
47
+ @transitions[from] = @transitions[from] << s
48
+ end
49
+ end
50
+
51
+ def validate_state!(*states)
52
+ states.each do |state|
53
+ raise StateError, "#{state} is unknown state" unless @states.include?(state)
54
+ end
55
+ end
56
+ end
57
+
58
+ # rubocop:disable Metrics/AbcSize
59
+ # rubocop:disable Metrics/MethodLength
60
+ def state_machine_for(field, &block)
61
+ m = Machine.new
62
+ m.instance_eval(&block)
63
+ var_name = "@#{field}_state"
64
+ set_name = "#{field}_state="
65
+ history_name = "@#{field}_state_history"
66
+
67
+ define_method("#{field}_state") do
68
+ instance_variable_get(var_name)
69
+ end
70
+
71
+ define_method(set_name) do |ns|
72
+ state = instance_variable_get(var_name)
73
+ raise StateError, "#{ns} is not possible state after #{state}" unless m.transitions[state].include?(ns)
74
+ if instance_variable_get(history_name).include?(ns) && m.states[ns].unique?
75
+ raise StateError, "#{ns} is a unique state and has already been taken"
76
+ end
77
+ instance_variable_get(history_name) << ns
78
+ instance_variable_set(var_name, ns)
79
+ end
80
+
81
+ define_method("initialize_#{field}") do |initial|
82
+ m.validate_state!(initial)
83
+ raise StateError, "#{initial} is not possible initial state" unless m.states[initial].can_be_initial?
84
+ instance_variable_set(history_name, Set.new)
85
+ instance_variable_set(var_name, initial)
86
+ end
87
+
88
+ define_method("final_#{field}_state?") do
89
+ m.states[instance_variable_get(var_name)].final?
90
+ end
91
+ end
92
+ # rubocop:enable Metrics/AbcSize
93
+ # rubocop:enable Metrics/MethodLength
94
+ end
95
+ end
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'yaml'
4
-
5
3
  module GermanNumbers
6
- class ToWords
4
+ class Stringifier
5
+ SMALL_KEYWORDS = %w(hundert tausend).freeze
6
+ BIG_KEYWORDS = %w(Million Milliarde).freeze
7
+
7
8
  def words(number)
8
9
  raise ArgumentError if number > 999_999_999_999 || number.negative?
9
10
  return postprocess(DIGITS[number]) unless DIGITS[number].nil?
@@ -35,8 +36,8 @@ module GermanNumbers
35
36
 
36
37
  def postprocess(result)
37
38
  result += 's' if result.end_with?('ein')
38
- result = 'ein' + result if %w(hundert tausend).include?(result)
39
- result = 'eine ' + result if %w(Million Milliarde).include?(result)
39
+ result = 'ein' + result if SMALL_KEYWORDS.include?(result)
40
+ result = 'eine ' + result if BIG_KEYWORDS.include?(result)
40
41
  result.strip
41
42
  end
42
43
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GermanNumbers
4
- VERSION = '0.1'
4
+ VERSION = '0.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: german_numbers
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Sinyavsky
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-05 00:00:00.000000000 Z
11
+ date: 2018-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.11'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,34 @@ dependencies:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '3.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.52'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.52'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ruby-prof
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.17'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.17'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: simplecov
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -73,6 +115,7 @@ executables: []
73
115
  extensions: []
74
116
  extra_rdoc_files: []
75
117
  files:
118
+ - ".circleci/config.yml"
76
119
  - ".gitignore"
77
120
  - ".overcommit.yml"
78
121
  - ".rspec"
@@ -81,6 +124,7 @@ files:
81
124
  - ".ruby-version"
82
125
  - Gemfile
83
126
  - Gemfile.lock
127
+ - LICENSE
84
128
  - README.md
85
129
  - Rakefile
86
130
  - bin/console
@@ -88,7 +132,11 @@ files:
88
132
  - data/de.yml
89
133
  - german_numbers.gemspec
90
134
  - lib/german_numbers.rb
91
- - lib/german_numbers/to_words.rb
135
+ - lib/german_numbers/parser/parser.rb
136
+ - lib/german_numbers/parser/small_number_parser.rb
137
+ - lib/german_numbers/parser/stack_machine.rb
138
+ - lib/german_numbers/state_machine.rb
139
+ - lib/german_numbers/stringifier.rb
92
140
  - lib/german_numbers/version.rb
93
141
  homepage: https://github.com/zhulik/german_words
94
142
  licenses: