money-heuristics 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 79f7a3d1ed519a875dca357a27c43edfa213f681
4
+ data.tar.gz: 18fbf4a233e688163c980f81c01fc95a38d43d99
5
+ SHA512:
6
+ metadata.gz: 29d56724b61912d83dbb54af05c4c7c0f45ffd74f97804da050b10996cc7ca84cfdbb94100b3668b11d84acefb3e07c9e3738f46ef119218c4ab94e225da9d28
7
+ data.tar.gz: b8f1d08cadadc95218bd28c759216861a994205f87839eefa95329ff3e7aca137317795c00b8a19debd1cc1d3b0a44a819a5181d36d6598aaa5c50a64704881c
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ repo_token: m7vyhHNz7HTqdYSL90YbygyYNMQ2JO9E2
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ # Bundler
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ bin/
6
+
7
+ # Rubinius
8
+ *.rbc
9
+
10
+ # YARD
11
+ .yardoc
12
+ yardoc/
13
+ doc/
14
+
15
+ # Project
16
+ .rbenv-version
17
+ .rbx
18
+ .rvmrc
19
+ .ruby-version
20
+ .ruby-gemset
21
+
22
+ # Spec artifacts
23
+ /coverage
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,25 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - 2.0.0
5
+ - 2.1.10
6
+ - 2.2.5
7
+ - 2.3.1
8
+ - 2.4.0
9
+ - rbx-2
10
+ - jruby-9.0.5.0
11
+ - jruby-9.1.2.0
12
+ - ruby-head
13
+ - jruby-head
14
+ matrix:
15
+ allow_failures:
16
+ - rvm: ruby-head
17
+ - rvm: jruby-head
18
+ - rvm: rbx-2
19
+ fast_finish: true
20
+ script: bundle exec rspec spec
21
+ notifications:
22
+ email:
23
+ - semmons99@gmail.com
24
+ - andreas@aloop.org
25
+ - weppos@weppos.net
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ - Refactored code
6
+ - Released as a gem
7
+
8
+ ## 0.0.1
9
+
10
+ - Extracted from money gem
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,17 @@
1
+ # Contribution Guidelines
2
+
3
+ ## Steps
4
+
5
+ 1. Fork [the repo](https://github.com/RubyMoney/money-heuristics)
6
+ 2. Grab dependencies: `bundle install`
7
+ 3. Make sure everything is working: `bundle exec rake spec`
8
+ 4. Make your changes
9
+ 5. Test your changes
10
+ 5. Create a Pull Request
11
+ 6. Celebrate!!!!!
12
+
13
+ ## Notes
14
+
15
+ When contributing, please make sure to update the CHANGELOG and AUTHORS files
16
+ when you submit your pull request. Upon merging of your first pull request,
17
+ you will be given commit access to the repository.
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'coveralls', '>= 0.8.20', :require => false
4
+ gem 'pry', :require => false
5
+
6
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2005 Tobias Lutke
4
+ Copyright (c) 2008 Phusion
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ "Software"), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # RubyMoney - Money Heuristics
2
+
3
+ This is a module for heuristic analysis of the string input for the
4
+ [money gem](https://github.com/RubyMoney/money). It was formerly part of the gem.
5
+
6
+ [![Gem Version](https://badge.fury.io/rb/money-heuristics.svg)](https://rubygems.org/gems/money-heuristics)
7
+ [![Build Status](https://travis-ci.org/RubyMoney/money-heuristics.svg?branch=master)](https://travis-ci.org/RubyMoney/money-heuristics)
8
+ [![Coverage Status](https://coveralls.io/repos/RubyMoney/money-heuristics/badge.svg?branch=master)](https://coveralls.io/github/RubyMoney/money-heuristics?branch=master)
9
+ [![License](https://img.shields.io/github/license/RubyMoney/money-heuristics.svg)](https://opensource.org/licenses/MIT)
10
+
11
+ ## Contributing
12
+
13
+ See the [Contribution Guidelines](https://github.com/RubyMoney/money-heuristics/blob/master/CONTRIBUTING.md)
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/clean"
3
+ require "rspec/core/rake_task"
4
+
5
+ CLOBBER.include('doc', '.yardoc')
6
+
7
+ require "yard"
8
+
9
+ YARD::Rake::YardocTask.new do |t|
10
+ t.options << "--files" << "CHANGELOG.md,LICENSE"
11
+ end
12
+
13
+ RSpec::Core::RakeTask.new(:spec) do |t|
14
+ t.fail_on_error = false
15
+ end
16
+
17
+ task default: :spec
@@ -0,0 +1,6 @@
1
+ require 'money/currency'
2
+
3
+ require 'money-heuristics/string'
4
+ require 'money-heuristics/heuristics'
5
+
6
+ Money::Currency.extend MoneyHeuristics::Heuristics
@@ -0,0 +1,84 @@
1
+ module MoneyHeuristics
2
+ class Analyzer
3
+ attr_reader :search_tree, :words
4
+ attr_accessor :str, :currencies
5
+
6
+ def initialize(str, search_tree)
7
+ @str = (str || '').dup
8
+ @search_tree = search_tree
9
+ @currencies = []
10
+ end
11
+
12
+ def process
13
+ format
14
+ return [] if str.empty?
15
+
16
+ search_by_symbol
17
+ search_by_iso_code
18
+ search_by_name
19
+
20
+ prepare_reply
21
+ end
22
+
23
+ private
24
+
25
+ def format
26
+ str.gsub!(/[\r\n\t]/,'')
27
+ str.gsub!(/[0-9][\.,:0-9]*[0-9]/,'')
28
+ str.gsub!(/[0-9]/, '')
29
+ str.downcase!
30
+ @words = str.unaccent.split
31
+ @words.each {|word| word.chomp!('.'); word.chomp!(',') }
32
+ end
33
+
34
+ def search_by_symbol
35
+ words.each do |word|
36
+ if found = search_tree[:by_symbol][word]
37
+ currencies.concat(found)
38
+ end
39
+ end
40
+ end
41
+
42
+ def search_by_iso_code
43
+ words.each do |word|
44
+ if found = search_tree[:by_iso_code][word]
45
+ currencies.concat(found)
46
+ end
47
+ end
48
+ end
49
+
50
+ def search_by_name
51
+ # remember, the search tree by name is a construct of branches and leaf!
52
+ # We need to try every combination of words within the sentence, so we
53
+ # end up with a x^2 equation, which should be fine as most names are either
54
+ # one or two words, and this is multiplied with the words of given sentence
55
+
56
+ search_words = words.dup
57
+
58
+ while search_words.length > 0
59
+ root = search_tree[:by_name]
60
+
61
+ search_words.each do |word|
62
+ if root = root[word]
63
+ if root[:value]
64
+ currencies.concat(root[:value])
65
+ end
66
+ else
67
+ break
68
+ end
69
+ end
70
+
71
+ search_words.delete_at(0)
72
+ end
73
+ end
74
+
75
+ def prepare_reply
76
+ codes = currencies.map do |currency|
77
+ currency[:iso_code]
78
+ end
79
+ codes.uniq!
80
+ codes.sort!
81
+ codes
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,19 @@
1
+ require 'money-heuristics/analyzer'
2
+ require 'money-heuristics/search_tree'
3
+
4
+ module MoneyHeuristics
5
+ module Heuristics
6
+ # An robust and efficient algorithm for finding currencies in
7
+ # text. Using several algorithms it can find symbols, iso codes and
8
+ # even names of currencies.
9
+ # Although not recommendable, it can also attempt to find the given
10
+ # currency in an entire sentence
11
+ #
12
+ # Returns: Array (matched results)
13
+ def analyze(str)
14
+ @_heuristics_search_tree ||= MoneyHeuristics::SearchTree.new(table).build
15
+
16
+ return MoneyHeuristics::Analyzer.new(str, @_heuristics_search_tree).process
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,62 @@
1
+ module MoneyHeuristics
2
+ class SearchTree
3
+ def initialize(currency_data)
4
+ @currency_data = currency_data
5
+ end
6
+
7
+ # Build a search tree from the currency database
8
+ def build
9
+ {
10
+ by_symbol: currencies_by_symbol,
11
+ by_iso_code: currencies_by_iso_code,
12
+ by_name: currencies_by_name
13
+ }
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :currency_data
19
+
20
+ def currencies_by_symbol
21
+ {}.tap do |result|
22
+ currency_data.each do |_, currency|
23
+ symbol = (currency[:symbol]||"").downcase
24
+ symbol.chomp!('.')
25
+ (result[symbol] ||= []) << currency
26
+
27
+ (currency[:alternate_symbols] || []).each do |ac|
28
+ ac = ac.downcase
29
+ ac.chomp!('.')
30
+ (result[ac] ||= []) << currency
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ def currencies_by_iso_code
37
+ {}.tap do |result|
38
+ currency_data.each do |_, currency|
39
+ (result[currency[:iso_code].downcase] ||= []) << currency
40
+ end
41
+ end
42
+ end
43
+
44
+ def currencies_by_name
45
+ {}.tap do |result|
46
+ currency_data.each do |_, currency|
47
+ name_parts = currency[:name].unaccent.downcase.split
48
+ name_parts.each {|part| part.chomp!('.')}
49
+
50
+ # construct one branch per word
51
+ root = result
52
+ while name_part = name_parts.shift
53
+ root = (root[name_part] ||= {})
54
+ end
55
+
56
+ # the leaf is a currency
57
+ (root[:value] ||= []) << currency
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,13 @@
1
+ require 'sixarm_ruby_unaccent'
2
+
3
+ # Overwrites unaccent method of sixarm_ruby_unaccent.
4
+ class String
5
+ def unaccent
6
+ accentmap = ACCENTMAP
7
+ accentmap.delete("\u{0142}") # Delete ł symbol from ACCENTMAP used in PLN currency
8
+ accentmap.delete("\u{010D}") # Delete č symbol from ACCENTMAP used in CZK currency
9
+ accentmap.delete("\u{FDFC}") # Delete ﷼ symbol from ACCENTMAP used in IRR, SAR and YER currencies
10
+ accentmap.delete("\u{20A8}") # Delete ₨ symbol from ACCENTMAP used in INR, LKR, MUR, NPR, PKR and SCR currencies
11
+ split(//u).map {|c| accentmap[c] || c }.join("")
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module MoneyHeuristics
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require "money-heuristics/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "money-heuristics"
8
+ s.version = MoneyHeuristics::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ['Shane Emmons']
11
+ s.email = ['shane@emmons.io']
12
+ s.homepage = 'https://rubymoney.github.io/money-heuristics'
13
+ s.summary = 'Heuristic module for for the money gem'
14
+ s.description = 'This is a module for heuristic analysis of the string input for the money gem. It was formerly part of the gem.'
15
+ s.license = 'MIT'
16
+
17
+ s.add_dependency 'money', '>= 6.8.2'
18
+ s.add_dependency 'sixarm_ruby_unaccent', ['>= 1.1.1', '< 2']
19
+
20
+ s.add_development_dependency "bundler", "~> 1.3"
21
+ s.add_development_dependency "rake"
22
+ s.add_development_dependency "rspec", "~> 3.4.0"
23
+ s.add_development_dependency "yard", "~> 0.8"
24
+
25
+ s.files = `git ls-files`.split($/)
26
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
27
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
28
+ s.require_paths = ["lib"]
29
+ end
@@ -0,0 +1,162 @@
1
+ # encoding: utf-8
2
+
3
+ describe MoneyHeuristics do
4
+ describe "#analyze_string" do
5
+ let(:it) { Money::Currency }
6
+
7
+ it "is not affected by blank characters and numbers" do
8
+ expect(it.analyze('123')).to eq []
9
+ expect(it.analyze('\n123 \t')).to eq []
10
+ end
11
+
12
+ it "returns nothing when given nothing" do
13
+ expect(it.analyze('')).to eq []
14
+ expect(it.analyze(nil)).to eq []
15
+ end
16
+
17
+ it "finds a currency by use of its symbol" do
18
+ expect(it.analyze('zł')).to eq ['PLN']
19
+ end
20
+
21
+ it "is not affected by trailing dot" do
22
+ expect(it.analyze('zł.')).to eq ['PLN']
23
+ end
24
+
25
+ it "finds match even if has numbers after" do
26
+ expect(it.analyze('zł 123')).to eq ['PLN']
27
+ end
28
+
29
+ it "finds match even if has numbers before" do
30
+ expect(it.analyze('123 zł')).to eq ['PLN']
31
+ end
32
+
33
+ it "find match even if symbol is next to number" do
34
+ expect(it.analyze('300zł')).to eq ['PLN']
35
+ end
36
+
37
+ it "finds match even if has numbers with delimiters" do
38
+ expect(it.analyze('zł 123,000.50')).to eq ['PLN']
39
+ expect(it.analyze('zł123,000.50')).to eq ['PLN']
40
+ end
41
+
42
+ it "finds currencies with dots in symbols" do
43
+ expect(it.analyze('L.E.')).to eq ['EGP']
44
+ end
45
+
46
+ it "finds by name" do
47
+ expect(it.analyze('1900 bulgarian lev')).to eq ['BGN']
48
+ expect(it.analyze('Swedish Krona')).to eq ['SEK']
49
+ end
50
+
51
+ it "Finds several currencies when several match" do
52
+ r = it.analyze('$400')
53
+ expect(r).to include("ARS")
54
+ expect(r).to include("USD")
55
+ expect(r).to include("NZD")
56
+
57
+ r = it.analyze('9000 £')
58
+ expect(r).to include("GBP")
59
+ expect(r).to include("SHP")
60
+ expect(r).to include("SYP")
61
+ end
62
+
63
+ it "should use alternate symbols" do
64
+ expect(it.analyze('US$')).to eq ['USD']
65
+ end
66
+
67
+ it "finds a currency by use of its iso code" do
68
+ expect(it.analyze('USD 200')).to eq ['USD']
69
+ end
70
+
71
+ it "finds currencies in the middle of a sentence!" do
72
+ expect(it.analyze('It would be nice to have 10000 Albanian lek by tomorrow!')).to eq ['ALL']
73
+ end
74
+
75
+ it "finds several currencies in the same text!" do
76
+ expect(it.analyze("10EUR is less than 100:- but really, I want US$1")).to eq ['EUR', 'SEK', 'USD']
77
+ end
78
+
79
+ it "find currencies with normal characters in name using unaccent" do
80
+ expect(it.analyze("10 Nicaraguan Cordoba")).to eq ["NIO"]
81
+ end
82
+
83
+ it "find currencies with special characters in name using unaccent" do
84
+ expect(it.analyze("10 Nicaraguan Córdoba")).to eq ["NIO"]
85
+ end
86
+
87
+ it "find currencies with special symbols using unaccent" do
88
+ expect(it.analyze("ل.س")).not_to eq []
89
+ expect(it.analyze("R₣")).not_to eq []
90
+ expect(it.analyze("ரூ")).not_to eq []
91
+ expect(it.analyze("රු")).not_to eq []
92
+ expect(it.analyze("сом")).not_to eq []
93
+ expect(it.analyze("圓")).not_to eq []
94
+ expect(it.analyze("円")).not_to eq []
95
+ expect(it.analyze("৳")).not_to eq []
96
+ expect(it.analyze("૱")).not_to eq []
97
+ expect(it.analyze("௹")).not_to eq []
98
+ expect(it.analyze("रु")).not_to eq []
99
+ expect(it.analyze("ש״ח")).not_to eq []
100
+ expect(it.analyze("元")).not_to eq []
101
+ expect(it.analyze("¢")).not_to eq []
102
+ expect(it.analyze("£")).not_to eq []
103
+ expect(it.analyze("€")).not_to eq []
104
+ expect(it.analyze("¥")).not_to eq []
105
+ expect(it.analyze("د.إ")).not_to eq []
106
+ expect(it.analyze("؋")).not_to eq []
107
+ expect(it.analyze("դր.")).not_to eq []
108
+ expect(it.analyze("ƒ")).not_to eq []
109
+ expect(it.analyze("₼")).not_to eq []
110
+ expect(it.analyze("৳")).not_to eq []
111
+ expect(it.analyze("лв")).not_to eq []
112
+ expect(it.analyze("лев")).not_to eq []
113
+ expect(it.analyze("дин")).not_to eq []
114
+ expect(it.analyze("ب.د")).not_to eq []
115
+ expect(it.analyze("₡")).not_to eq []
116
+ expect(it.analyze("Kč")).not_to eq []
117
+ expect(it.analyze("د.ج")).not_to eq []
118
+ expect(it.analyze("ج.م")).not_to eq []
119
+ expect(it.analyze("ლ")).not_to eq []
120
+ expect(it.analyze("₵")).not_to eq []
121
+ expect(it.analyze("₪")).not_to eq []
122
+ expect(it.analyze("₹")).not_to eq []
123
+ expect(it.analyze("ع.د")).not_to eq []
124
+ expect(it.analyze("﷼")).not_to eq []
125
+ expect(it.analyze("د.ا")).not_to eq []
126
+ expect(it.analyze("៛")).not_to eq []
127
+ expect(it.analyze("₩")).not_to eq []
128
+ expect(it.analyze("د.ك")).not_to eq []
129
+ expect(it.analyze("〒")).not_to eq []
130
+ expect(it.analyze("₭")).not_to eq []
131
+ expect(it.analyze("ل.ل")).not_to eq []
132
+ expect(it.analyze("₨")).not_to eq []
133
+ expect(it.analyze("ل.د")).not_to eq []
134
+ expect(it.analyze("د.م.")).not_to eq []
135
+ expect(it.analyze("ден")).not_to eq []
136
+ expect(it.analyze("₮")).not_to eq []
137
+ expect(it.analyze("₦")).not_to eq []
138
+ expect(it.analyze("C$")).not_to eq []
139
+ expect(it.analyze("ر.ع.")).not_to eq []
140
+ expect(it.analyze("₱")).not_to eq []
141
+ expect(it.analyze("zł")).not_to eq []
142
+ expect(it.analyze("₲")).not_to eq []
143
+ expect(it.analyze("ر.ق")).not_to eq []
144
+ expect(it.analyze("РСД")).not_to eq []
145
+ expect(it.analyze("₽")).not_to eq []
146
+ expect(it.analyze("ر.س")).not_to eq []
147
+ expect(it.analyze("฿")).not_to eq []
148
+ expect(it.analyze("د.ت")).not_to eq []
149
+ expect(it.analyze("T$")).not_to eq []
150
+ expect(it.analyze("₺")).not_to eq []
151
+ expect(it.analyze("₴")).not_to eq []
152
+ expect(it.analyze("₫")).not_to eq []
153
+ expect(it.analyze("B⃦")).not_to eq []
154
+ expect(it.analyze("₤")).not_to eq []
155
+ expect(it.analyze("ރ")).not_to eq []
156
+ end
157
+
158
+ it "should function with unicode characters" do
159
+ expect(it.analyze("10 դր.")).to eq ["AMD"]
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,28 @@
1
+ require "coveralls"
2
+ Coveralls.wear!
3
+
4
+ $LOAD_PATH.unshift File.dirname(__FILE__)
5
+ require "rspec"
6
+ require "money"
7
+
8
+ I18n.enforce_available_locales = false
9
+
10
+ RSpec.configure do |c|
11
+ c.order = :random
12
+ c.filter_run :focus
13
+ c.run_all_when_everything_filtered = true
14
+ end
15
+
16
+ def reset_i18n
17
+ I18n.backend = I18n::Backend::Simple.new
18
+ end
19
+
20
+ RSpec.shared_context "with infinite precision", :infinite_precision do
21
+ before do
22
+ Money.infinite_precision = true
23
+ end
24
+
25
+ after do
26
+ Money.infinite_precision = false
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: money-heuristics
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Shane Emmons
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-04-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: money
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 6.8.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 6.8.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: sixarm_ruby_unaccent
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.1
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '2'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.1.1
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.3'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.3'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 3.4.0
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 3.4.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: yard
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.8'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.8'
103
+ description: This is a module for heuristic analysis of the string input for the money
104
+ gem. It was formerly part of the gem.
105
+ email:
106
+ - shane@emmons.io
107
+ executables: []
108
+ extensions: []
109
+ extra_rdoc_files: []
110
+ files:
111
+ - ".coveralls.yml"
112
+ - ".gitignore"
113
+ - ".rspec"
114
+ - ".travis.yml"
115
+ - CHANGELOG.md
116
+ - CONTRIBUTING.md
117
+ - Gemfile
118
+ - LICENSE
119
+ - README.md
120
+ - Rakefile
121
+ - lib/money-heuristics.rb
122
+ - lib/money-heuristics/analyzer.rb
123
+ - lib/money-heuristics/heuristics.rb
124
+ - lib/money-heuristics/search_tree.rb
125
+ - lib/money-heuristics/string.rb
126
+ - lib/money-heuristics/version.rb
127
+ - money-heuristics.gemspec
128
+ - spec/heuristics_spec.rb
129
+ - spec/spec_helper.rb
130
+ homepage: https://rubymoney.github.io/money-heuristics
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.6.8
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: Heuristic module for for the money gem
154
+ test_files:
155
+ - spec/heuristics_spec.rb
156
+ - spec/spec_helper.rb