reckon 0.4.0 → 0.4.1
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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/reckon/csv_parser.rb +3 -4
- data/lib/reckon/money.rb +26 -6
- data/reckon.gemspec +1 -1
- data/spec/reckon/csv_parser_spec.rb +12 -10
- data/spec/reckon/money_column_spec.rb +13 -1
- data/spec/reckon/money_spec.rb +21 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3b4088d077cc7f00227616a72cb8b3ceee7ec6b
|
4
|
+
data.tar.gz: f0af12774c1ac656196e2ab6c4fd344a2cc09c1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f8fe4aa72b96c8deeff382b18c6dc3fdd8df5360b859e49891beed8522b79a135d0f8f4994bc5d90137457407fd68d567faa6f1b4837d96a6f006775a4387e8
|
7
|
+
data.tar.gz: 9d8cfe9ffab12fcc0e77af8e5f613ab12d9b403a5122ed42cf983cedc24696ec5b4df90ae046ab5575301e6f51f23522f516ace2782c8934c381d7e79a640b21
|
data/Gemfile.lock
CHANGED
data/lib/reckon/csv_parser.rb
CHANGED
@@ -95,10 +95,9 @@ module Reckon
|
|
95
95
|
output_columns = []
|
96
96
|
columns.each_with_index do |column, index|
|
97
97
|
if index == a
|
98
|
-
new_column =
|
99
|
-
|
100
|
-
|
101
|
-
end
|
98
|
+
new_column = MoneyColumn.new( column )
|
99
|
+
.merge!( MoneyColumn.new( columns[b] ) )
|
100
|
+
.map { |m| m.amount.to_s }
|
102
101
|
output_columns << new_column
|
103
102
|
elsif index == b
|
104
103
|
# skip
|
data/lib/reckon/money.rb
CHANGED
@@ -43,11 +43,30 @@ module Reckon
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def Money::from_s( value, options = {} )
|
46
|
-
|
46
|
+
# Empty string is treated as money with value 0
|
47
|
+
return Money.new( 0.00, options ) if value.empty?
|
48
|
+
|
49
|
+
# Remove 1000 separaters and replace , with . if comma_separates_cents
|
50
|
+
# 1.000,00 -> 1000.00
|
47
51
|
value = value.gsub(/\./, '').gsub(/,/, '.') if options[:comma_separates_cents]
|
48
|
-
|
49
|
-
|
50
|
-
|
52
|
+
value = value.gsub(/,/, '')
|
53
|
+
|
54
|
+
money_format_regex = /^(.*?)(\d+\.\d\d)/ # Money has two decimal precision
|
55
|
+
any_number_regex = /^(.*?)([\d\.]+)/
|
56
|
+
|
57
|
+
# Prefer matching the money_format, match any number otherwise
|
58
|
+
m = value.match( money_format_regex ) ||
|
59
|
+
value.match( any_number_regex )
|
60
|
+
if m
|
61
|
+
amount = m[2].to_f
|
62
|
+
# Check whether the money had a - or (, which indicates negative amounts
|
63
|
+
if (m[1].match( /^[\(-]/ ) || m[1].match( /-$/ ))
|
64
|
+
amount *= -1
|
65
|
+
end
|
66
|
+
return Money.new( amount, options )
|
67
|
+
else
|
68
|
+
return nil
|
69
|
+
end
|
51
70
|
end
|
52
71
|
|
53
72
|
def Money::likelihood( entry )
|
@@ -79,11 +98,12 @@ module Reckon
|
|
79
98
|
invert = true if self.positive? && other_column.positive?
|
80
99
|
self.each_with_index do |mon, i|
|
81
100
|
other = other_column[i]
|
82
|
-
if mon
|
101
|
+
return nil if (!mon || !other)
|
102
|
+
if mon != 0.00 && other == 0.0
|
83
103
|
if invert
|
84
104
|
self[i]= -mon
|
85
105
|
end
|
86
|
-
elsif
|
106
|
+
elsif mon == 0.00 && other != 0.00
|
87
107
|
self[i] = other
|
88
108
|
else
|
89
109
|
return nil
|
data/reckon.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = %q{reckon}
|
6
|
-
s.version = "0.4.
|
6
|
+
s.version = "0.4.1"
|
7
7
|
s.authors = ["Andrew Cantino", "BlackEdder"]
|
8
8
|
s.email = %q{andrew@iterationlabs.com}
|
9
9
|
s.homepage = %q{https://github.com/cantino/reckon}
|
@@ -12,6 +12,7 @@ describe Reckon::CSVParser do
|
|
12
12
|
@chase = Reckon::CSVParser.new(:string => CHASE_CSV)
|
13
13
|
@some_other_bank = Reckon::CSVParser.new(:string => SOME_OTHER_CSV)
|
14
14
|
@two_money_columns = Reckon::CSVParser.new(:string => TWO_MONEY_COLUMNS_BANK)
|
15
|
+
@suntrust_csv = Reckon::CSVParser.new(:string => SUNTRUST_CSV)
|
15
16
|
@simple_csv = Reckon::CSVParser.new(:string => SIMPLE_CSV)
|
16
17
|
@nationwide = Reckon::CSVParser.new( :string => NATIONWIDE_CSV, :csv_separator => ',', :suffixed => true, :currency => "POUND" )
|
17
18
|
@german_date = Reckon::CSVParser.new(:string => GERMAN_DATE_EXAMPLE)
|
@@ -65,6 +66,7 @@ describe Reckon::CSVParser do
|
|
65
66
|
@chase.money_column_indices.should == [3]
|
66
67
|
@some_other_bank.money_column_indices.should == [3]
|
67
68
|
@two_money_columns.money_column_indices.should == [3, 4]
|
69
|
+
@suntrust_csv.money_column_indices.should == [3, 4]
|
68
70
|
@nationwide.money_column_indices.should == [3, 4]
|
69
71
|
@harder_date_example_csv.money_column_indices.should == [1]
|
70
72
|
@danish_kroner_nordea.money_column_indices.should == [3]
|
@@ -221,16 +223,6 @@ describe Reckon::CSVParser do
|
|
221
223
|
end
|
222
224
|
end
|
223
225
|
|
224
|
-
describe "merge_columns" do
|
225
|
-
it "should work on adjacent columns" do
|
226
|
-
@simple_csv.merge_columns(0,1).should == [["entry1 entry2", "entry4 entry5"], ["entry3", "entry6"]]
|
227
|
-
end
|
228
|
-
|
229
|
-
it "should work on non-adjacent columns" do
|
230
|
-
@simple_csv.merge_columns(0,2).should == [["entry1 entry3", "entry4 entry6"], ["entry2", "entry5"]]
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
226
|
# Data
|
235
227
|
|
236
228
|
SIMPLE_CSV = "entry1,entry2,entry3\nentry4,entry5,entry6"
|
@@ -286,6 +278,16 @@ describe Reckon::CSVParser do
|
|
286
278
|
3/26/2008,Check - 0000000251,251,"","+$88.55","$1,298.57"
|
287
279
|
CSV
|
288
280
|
|
281
|
+
SUNTRUST_CSV = (<<-CSV).strip
|
282
|
+
11/01/2014,0, Deposit,0,500.00,500.00
|
283
|
+
11/02/2014,101,Check,100.00,0,400.00
|
284
|
+
11/03/2014,102,Check,100.00,0,300.00
|
285
|
+
11/04/2014,103,Check,100.00,0,200.00
|
286
|
+
11/05/2014,104,Check,100.00,0,100.00
|
287
|
+
11/06/2014,105,Check,100.00,0,0.00
|
288
|
+
11/17/2014,0, Deposit,0,700.00,700.00
|
289
|
+
CSV
|
290
|
+
|
289
291
|
NATIONWIDE_CSV = (<<-CSV).strip
|
290
292
|
07 Nov 2013,Bank credit,Bank credit,,£500.00,£500.00
|
291
293
|
09 Oct 2013,ATM Withdrawal,Withdrawal,£20.00,,£480.00
|
@@ -35,11 +35,23 @@ describe Reckon::MoneyColumn do
|
|
35
35
|
Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
|
36
36
|
Reckon::MoneyColumn.new( ["", "-2.00"] ) ).should == [
|
37
37
|
Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
|
38
|
-
|
38
|
+
Reckon::MoneyColumn.new( ["1.00", "0"] ).merge!(
|
39
|
+
Reckon::MoneyColumn.new( ["0", "-2.00"] ) ).should == [
|
40
|
+
Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
|
41
|
+
Reckon::MoneyColumn.new( ["AB1.00C", ""] ).merge!(
|
42
|
+
Reckon::MoneyColumn.new( ["", "AB-2.00C"] ) ).should == [
|
43
|
+
Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
|
44
|
+
Reckon::MoneyColumn.new( ["AB1.00C", "AB0C"] ).merge!(
|
45
|
+
Reckon::MoneyColumn.new( ["AB0C", "AB-2.00C"] ) ).should == [
|
46
|
+
Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
|
47
|
+
end
|
39
48
|
|
40
49
|
it "should return nil if columns cannot be merged" do
|
41
50
|
Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
|
42
51
|
Reckon::MoneyColumn.new( ["1.00", "-2.00"] ) ).should == nil
|
52
|
+
|
53
|
+
Reckon::MoneyColumn.new( ["From1", "Names"] ).merge!(
|
54
|
+
Reckon::MoneyColumn.new( ["Acc", "NL28 INGB 1200 3244 16,21817"] ) ).should == nil
|
43
55
|
end
|
44
56
|
|
45
57
|
it "should invert first column if both positive" do
|
data/spec/reckon/money_spec.rb
CHANGED
@@ -19,15 +19,33 @@ describe Reckon::Money do
|
|
19
19
|
Reckon::Money::from_s( "$-1025,67", :comma_separates_cents => true ).should == -1025.67
|
20
20
|
end
|
21
21
|
|
22
|
-
it "should return
|
23
|
-
Reckon::Money::from_s( "" ).should ==
|
24
|
-
Reckon::Money::from_s( "" ).should_not == 0
|
22
|
+
it "should return 0 for an empty string" do
|
23
|
+
Reckon::Money::from_s( "" ).should == 0
|
25
24
|
end
|
26
25
|
|
27
26
|
it "should handle 1000 indicators correctly" do
|
28
27
|
Reckon::Money::from_s( "$2.000,00", :comma_separates_cents => true ).should == 2000.00
|
29
28
|
Reckon::Money::from_s( "-$1,025.67" ).should == -1025.67
|
30
29
|
end
|
30
|
+
|
31
|
+
it "should keep numbers together" do
|
32
|
+
Reckon::Money::from_s( "1A1" ).should == 1
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should prefer numbers with precision of two" do
|
36
|
+
Reckon::Money::from_s( "1A2.00" ).should == 2
|
37
|
+
Reckon::Money::from_s( "2.00A1" ).should == 2
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should handle arbitrary prefixes and postfixes" do
|
41
|
+
Reckon::Money::from_s( "AB1.00C" ).should == 1
|
42
|
+
Reckon::Money::from_s( "AB0C" ).should == 0
|
43
|
+
Reckon::Money::from_s( "AB-2.00C" ).should == -2
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return nil if no numbers are found" do
|
47
|
+
Reckon::Money::from_s( "BAC" ).should == nil
|
48
|
+
end
|
31
49
|
end
|
32
50
|
|
33
51
|
describe "pretty" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reckon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Cantino
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-07-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|