money_parser 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +29 -0
- data/Rakefile +101 -0
- data/VERSION +1 -0
- data/lib/money_parser.rb +40 -0
- data/money_parser.gemspec +14 -0
- data/spec/money_parser_spec.rb +1693 -0
- data/spec/spec_helper.rb +51 -0
- data/specification.rb +52 -0
- data/test/money_parser_spec.js +1357 -0
- data/vendor/assets/javascripts/parse_money.js +44 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 17061821eaee57290483af05d265f37d828bc6d8
|
4
|
+
data.tar.gz: 75952160c7f5bb973714f05b3c369e700d215631
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4cc1f9b20736daed4180792a83c98cfc7907cf6fc4d4c175dd2c53628e1e54a6d971ab5fdf52be5cad8ac2574f5a8ebc033db1c9a546eb30babfbc4ca1521985
|
7
|
+
data.tar.gz: 4211f0e1172937021ee438575dd52bcf3ab6b77a0066919c2867aeaf90d89c418e3749e348849121f689c364917aaf7cb9fb83d4e0b0fa3e7be26cd5b57e4a9a
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2014 Yuri Leikind
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Author:: Yuri Leikind
|
2
|
+
|
3
|
+
A simple function in Ruby and a similar function in Javascript which try
|
4
|
+
to parse a string containing
|
5
|
+
a money amount in any format and return a float for javascript and a <tt>BigDecimal</tt> for Ruby.
|
6
|
+
|
7
|
+
The functions return <tt>nil</tt>/<tt>null</tt> if the input is not a a money amount.
|
8
|
+
|
9
|
+
<tt>specification.rb</tt> contains input/output pairs.
|
10
|
+
|
11
|
+
The tests are generated by <tt>rake generate_tests</tt> from <tt>specification.rb</tt>.
|
12
|
+
|
13
|
+
To install add
|
14
|
+
|
15
|
+
gem "money_parser"
|
16
|
+
|
17
|
+
or
|
18
|
+
|
19
|
+
gem "money_parser", :git => 'git://github.com/leikind/money_parser.git'
|
20
|
+
|
21
|
+
to your <tt>Gemfile</tt>, and
|
22
|
+
|
23
|
+
//= require parse_money
|
24
|
+
|
25
|
+
to your <tt>app/assets/javascripts/application.js</tt>, and run <tt>bundle install</tt>.
|
26
|
+
|
27
|
+
After that you can call JS function <tt>parseMoney()</tt> on the client side,
|
28
|
+
and Ruby function <tt>MoneyParser.parse</tt> on the server side.
|
29
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# © Yuri Leikind 2014
|
2
|
+
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require 'rdoc/task'
|
5
|
+
|
6
|
+
task :default => :rdoc
|
7
|
+
|
8
|
+
desc 'Generate documentation for the plugin.'
|
9
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'money_parser'
|
12
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
def random_amount_of_spaces
|
18
|
+
' ' * rand(2)
|
19
|
+
end
|
20
|
+
|
21
|
+
def randomly_replace_zeros_by_o(string)
|
22
|
+
indexes = string.
|
23
|
+
each_char.
|
24
|
+
each_with_index.
|
25
|
+
to_a.
|
26
|
+
select{|l, idx| l == '0'}.
|
27
|
+
map{|_, idx| idx }
|
28
|
+
|
29
|
+
return nil if indexes.empty?
|
30
|
+
idx = indexes[rand(indexes.size)]
|
31
|
+
idx2 = indexes[rand(indexes.size)]
|
32
|
+
|
33
|
+
string.clone.tap do |cloned|
|
34
|
+
cloned[idx] = 'O'
|
35
|
+
cloned[idx] = 'o'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def generate_tests specs
|
40
|
+
ruby_code = "require 'spec_helper'\ndescribe MoneyParser do\n"
|
41
|
+
|
42
|
+
js_code = "var assert = require(\"assert\")\n" +
|
43
|
+
"var parseMoney = require('../vendor/assets/javascripts/parseMoney');\n\n" +
|
44
|
+
"describe('moneyParse', function(){\n"
|
45
|
+
|
46
|
+
|
47
|
+
specs.inject([]) {|accu, pair|
|
48
|
+
|
49
|
+
money_string, result = pair
|
50
|
+
|
51
|
+
accu << [money_string, result]
|
52
|
+
|
53
|
+
unless result.nil?
|
54
|
+
accu << [random_amount_of_spaces + "-" + random_amount_of_spaces + money_string, result * -1, '(negative amount)']
|
55
|
+
end
|
56
|
+
|
57
|
+
tuple_with_o = [randomly_replace_zeros_by_o(money_string), result, '(with O instead of 0)']
|
58
|
+
|
59
|
+
accu << tuple_with_o unless tuple_with_o[0].nil?
|
60
|
+
|
61
|
+
accu << ['$' + money_string, result, '(with a dollar sign)']
|
62
|
+
accu << ['€' + money_string, result, '(with a euro sign)']
|
63
|
+
accu << ['£' + money_string, result, '(with a pound sign)']
|
64
|
+
accu << ['₤' + money_string, result, '(with a pound sign)']
|
65
|
+
|
66
|
+
accu
|
67
|
+
}.each {|money_string, result, comment|
|
68
|
+
|
69
|
+
expecting = if result
|
70
|
+
"BigDecimal.new(\"#{result.inspect}\")"
|
71
|
+
else
|
72
|
+
result.inspect
|
73
|
+
end
|
74
|
+
ruby_code << %!
|
75
|
+
|
76
|
+
it '\"#{money_string}\" should be parsed as #{result.inspect} #{comment}' do
|
77
|
+
MoneyParser.parse(\"#{money_string}\").should == #{expecting}
|
78
|
+
end\n!
|
79
|
+
|
80
|
+
js_code << %!
|
81
|
+
it('\"#{money_string}\" should be parsed as #{nil_to_null(result.inspect)} #{comment}', function(){
|
82
|
+
assert.equal(#{nil_to_null(result.inspect)}, parseMoney(\"#{money_string}\"));
|
83
|
+
});\n!
|
84
|
+
|
85
|
+
|
86
|
+
}
|
87
|
+
[ruby_code + "end\n", js_code + "})\n"]
|
88
|
+
end
|
89
|
+
|
90
|
+
def nil_to_null(null_or_other)
|
91
|
+
null_or_other == 'nil' ? 'null' : null_or_other
|
92
|
+
end
|
93
|
+
|
94
|
+
desc 'Generate tests'
|
95
|
+
task :generate_tests do |rdoc|
|
96
|
+
require './specification.rb'
|
97
|
+
ruby_code, js_code = generate_tests(SPECIFICATION)
|
98
|
+
File.open('./spec/money_parser_spec.rb', 'w'){|f| f.write ruby_code }
|
99
|
+
File.open('./test/money_parser_spec.js', 'w'){|f| f.write js_code }
|
100
|
+
end
|
101
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/lib/money_parser.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# © Yuri Leikind 2014
|
3
|
+
|
4
|
+
require 'bigdecimal'
|
5
|
+
|
6
|
+
module MoneyParser
|
7
|
+
|
8
|
+
if Kernel.const_defined?('Rails')
|
9
|
+
class Engine < ::Rails::Engine
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.parse(money_string)
|
14
|
+
|
15
|
+
cleaned_up = money_string.
|
16
|
+
gsub(/\s+/,'').
|
17
|
+
gsub(/(\d)o/i){$1 + '0'}.
|
18
|
+
gsub(/o(\d)/i){'0' + $1}.
|
19
|
+
gsub(/\s+/,'').
|
20
|
+
tr(',', '.').
|
21
|
+
gsub(/[^\d\.-]/, '')
|
22
|
+
|
23
|
+
return nil if cleaned_up.empty?
|
24
|
+
|
25
|
+
chunks = cleaned_up.split('.')
|
26
|
+
|
27
|
+
normalized = if chunks.size == 1
|
28
|
+
cleaned_up
|
29
|
+
else
|
30
|
+
if chunks[-1].size > 2
|
31
|
+
chunks.join
|
32
|
+
else
|
33
|
+
chunks[0..-2].join + '.' + chunks[-1]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
normalized ? BigDecimal.new(normalized) : normalized
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'money_parser'
|
3
|
+
s.version = '0.0.1'
|
4
|
+
s.homepage = 'https://github.com/leikind/money_parser'
|
5
|
+
s.date = '2014-01-05'
|
6
|
+
s.summary = 'Tries to parse various crazy money formats'
|
7
|
+
s.description = 'Tries to parse various crazy money formats'
|
8
|
+
s.authors = ['Yuri Leikind']
|
9
|
+
s.email = 'yuri.leikind@gmail.com'
|
10
|
+
s.files = `git ls-files`.split($/)
|
11
|
+
s.license = 'MIT'
|
12
|
+
|
13
|
+
s.add_development_dependency "rspec"
|
14
|
+
end
|