reckon 0.4.4 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +10 -2
  5. data/CHANGELOG.md +235 -0
  6. data/Gemfile +0 -1
  7. data/Gemfile.lock +73 -15
  8. data/README.md +12 -5
  9. data/lib/reckon.rb +13 -12
  10. data/lib/reckon/app.rb +94 -116
  11. data/lib/reckon/cosine_similarity.rb +122 -0
  12. data/lib/reckon/csv_parser.rb +116 -129
  13. data/lib/reckon/date_column.rb +60 -0
  14. data/lib/reckon/ledger_parser.rb +204 -30
  15. data/lib/reckon/logger.rb +4 -0
  16. data/lib/reckon/money.rb +6 -62
  17. data/lib/reckon/version.rb +3 -0
  18. data/reckon.gemspec +8 -5
  19. data/spec/data_fixtures/51-sample.csv +8 -0
  20. data/spec/data_fixtures/51-tokens.yml +9 -0
  21. data/spec/data_fixtures/73-sample.csv +2 -0
  22. data/spec/data_fixtures/73-tokens.yml +8 -0
  23. data/spec/data_fixtures/73-transactions.ledger +7 -0
  24. data/spec/data_fixtures/85-date-example.csv +2 -0
  25. data/spec/data_fixtures/austrian_example.csv +13 -0
  26. data/spec/data_fixtures/bom_utf8_file.csv +1 -0
  27. data/spec/data_fixtures/broker_canada_example.csv +12 -0
  28. data/spec/data_fixtures/chase.csv +9 -0
  29. data/spec/data_fixtures/danish_kroner_nordea_example.csv +6 -0
  30. data/spec/data_fixtures/english_date_example.csv +3 -0
  31. data/spec/data_fixtures/french_example.csv +9 -0
  32. data/spec/data_fixtures/german_date_example.csv +3 -0
  33. data/spec/data_fixtures/harder_date_example.csv +5 -0
  34. data/spec/data_fixtures/ing.csv +3 -0
  35. data/spec/data_fixtures/intuit_mint_example.csv +7 -0
  36. data/spec/data_fixtures/invalid_header_example.csv +6 -0
  37. data/spec/data_fixtures/inversed_credit_card.csv +16 -0
  38. data/spec/data_fixtures/nationwide.csv +4 -0
  39. data/spec/data_fixtures/simple.csv +2 -0
  40. data/spec/data_fixtures/some_other.csv +9 -0
  41. data/spec/data_fixtures/spanish_date_example.csv +3 -0
  42. data/spec/data_fixtures/suntrust.csv +7 -0
  43. data/spec/data_fixtures/test_money_column.csv +3 -0
  44. data/spec/data_fixtures/two_money_columns.csv +5 -0
  45. data/spec/data_fixtures/yyyymmdd_date_example.csv +1 -0
  46. data/spec/reckon/app_spec.rb +96 -34
  47. data/spec/reckon/csv_parser_spec.rb +185 -307
  48. data/spec/reckon/date_column_spec.rb +12 -13
  49. data/spec/reckon/ledger_parser_spec.rb +99 -9
  50. data/spec/reckon/money_spec.rb +42 -29
  51. data/spec/spec_helper.rb +22 -0
  52. metadata +85 -21
  53. data/CHANGES.md +0 -9
@@ -20,23 +20,22 @@ describe Reckon::DateColumn do
20
20
  end
21
21
  describe "for" do
22
22
  it "should detect the date" do
23
- Reckon::DateColumn.new( ["13/12/2013"] ).for( 0 ).should ==
24
- Time.new( 2013, 12, 13, 12 )
25
- Reckon::DateColumn.new( ["01/14/2013"] ).for( 0 ).should ==
26
- Time.new( 2013, 01, 14, 12 )
27
- Reckon::DateColumn.new( ["13/12/2013", "21/11/2013"] ).for( 1 ).should ==
28
- Time.new( 2013, 11, 21, 12 )
29
- Reckon::DateColumn.new( ["2013-11-21"] ).for( 0 ).should ==
30
- Time.new( 2013, 11, 21, 12 )
23
+ expect(Reckon::DateColumn.new(%w[13/12/2013]).for(0))
24
+ .to eq(Date.new(2013, 12, 13))
25
+ expect(Reckon::DateColumn.new(%w[01/14/2013]).for(0))
26
+ .to eq(Date.new(2013, 1, 14))
27
+ expect(Reckon::DateColumn.new(%w[13/12/2013 21/11/2013]).for(1))
28
+ .to eq(Date.new(2013, 11, 21))
29
+ expect(Reckon::DateColumn.new( ["2013-11-21"] ).for( 0 ))
30
+ .to eq(Date.new(2013, 11, 21))
31
31
 
32
32
  end
33
33
 
34
34
  it "should correctly use endian_precedence" do
35
- Reckon::DateColumn.new( ["01/02/2013", "01/14/2013"] ).for(0).should ==
36
- Time.new( 2013, 01, 02, 12 )
37
- Reckon::DateColumn.new( ["01/02/2013", "14/01/2013"] ).for(0).should ==
38
- Time.new( 2013, 02, 01, 12 )
35
+ expect(Reckon::DateColumn.new(%w[01/02/2013 01/14/2013]).for(0))
36
+ .to eq(Date.new(2013, 1, 2))
37
+ expect(Reckon::DateColumn.new(%w[01/02/2013 14/01/2013]).for(0))
38
+ .to eq(Date.new(2013, 2, 1))
39
39
  end
40
40
  end
41
41
  end
42
-
@@ -1,31 +1,121 @@
1
1
  #!/usr/bin/env ruby
2
2
  #encoding: utf-8
3
3
 
4
- require "spec_helper"
4
+ require_relative "../spec_helper"
5
5
  require 'rubygems'
6
6
  require 'reckon'
7
7
  require 'pp'
8
+ require 'rantly'
9
+ require 'rantly/rspec_extensions'
10
+ require 'shellwords'
8
11
 
9
12
  describe Reckon::LedgerParser do
10
13
  before do
11
- @ledger = Reckon::LedgerParser.new(EXAMPLE_LEDGER)
14
+ @ledger = Reckon::LedgerParser.new(EXAMPLE_LEDGER, date_format: '%Y/%m/%d')
12
15
  end
13
16
 
14
17
  describe "parse" do
18
+ it "should match ledger csv output" do
19
+ # ledger only parses dates with - or / as separator, and separator is required
20
+ formats = ["%Y/%m/%d", "%Y-%m-%d"]
21
+ types = [' ! ', ' * ', ' ']
22
+ delimiters = [" ", "\t", "\t\t"]
23
+ comment_chars = ';#%*|'
24
+ currency_delimiters = delimiters + ['']
25
+ currencies = ['', '$', '£']
26
+ property_of do
27
+ Rantly do
28
+ description = Proc.new do
29
+ sized(15){string}.tr(%q{'`:*\\},'').gsub(/\s+/, ' ').gsub(/^[!;<\[( #{comment_chars}]+/, '')
30
+ end
31
+ currency = choose(*currencies) # to be consistent within the transaction
32
+ single_line_comments = ";#|%*".split('').map { |n| "#{n} #{call(description)}" }
33
+ comments = ['', '; ', "\t;#{call(description)}", " ; #{call(description)}"]
34
+ date = Time.at(range(0, 1_581_389_644)).strftime(choose(*formats))
35
+ codes = [' ', " (#{string(:alnum).tr('()', '')}) "]
36
+ account = Proc.new { choose(*delimiters) + call(description) }
37
+ account_money = Proc.new do
38
+ sprintf("%.02f", (float * range(5,10) + 1) * choose(1, -1))
39
+ end
40
+ account_line = Proc.new do
41
+ call(account) + \
42
+ choose(*delimiters) + \
43
+ currency + \
44
+ choose(*currency_delimiters) + \
45
+ call(account_money) + \
46
+ choose(*comments)
47
+ end
48
+ ledger = "#{date}#{choose(*types)}#{choose(*codes)}#{call(description)}\n"
49
+ range(1,5).times do
50
+ ledger += "#{call(account_line)}\n"
51
+ end
52
+ ledger += "#{call(account)}\n"
53
+ ledger += choose(*single_line_comments) + "\n"
54
+ ledger
55
+ end
56
+ end.check(1000) do |s|
57
+ filter_format = lambda { |n| [n['date'], n['desc'], n['name'], sprintf("%.02f", n['amount'])] }
58
+ headers = %w[date code desc name currency amount type commend]
59
+ safe_s = Shellwords.escape(s)
60
+
61
+ lp_csv = Reckon::LedgerParser.new(s, date_format: '%Y-%m-%d').to_csv.join("\n")
62
+ actual = CSV.parse(lp_csv, headers: headers).map(&filter_format)
63
+
64
+ ledger_csv = `echo #{safe_s} | ledger csv --date-format '%Y-%m-%d' -f - `
65
+ expected = CSV.parse(ledger_csv.gsub('\"', '""'), headers: headers).map(&filter_format)
66
+ expected.length.times do |i|
67
+ expect(actual[i]).to eq(expected[i])
68
+ end
69
+ end
70
+ end
71
+
72
+ it 'should filter block comments' do
73
+ ledger = <<HERE
74
+ 1970/11/01 Dinner should show up
75
+ Assets:Checking -123.00
76
+ Expenses:Restaurants
77
+
78
+ comment
79
+
80
+ 1970/11/01 Lunch should NOT show up
81
+ Assets:Checking -12.00
82
+ Expenses:Restaurants
83
+
84
+ end comment
85
+ HERE
86
+ l = Reckon::LedgerParser.new(ledger)
87
+ expect(l.entries.length).to eq(1)
88
+ expect(l.entries.first[:desc]).to eq('Dinner should show up')
89
+
90
+ end
91
+
92
+ it 'should transaction comments' do
93
+ ledger = <<HERE
94
+ 2020-03-27 AMZN Mktp USX999H3203; Shopping; Sale
95
+ Expenses:Household $82.77
96
+ Liabilities:ChaseSapphire -$81.77
97
+ # END FINANCE SCRIPT OUTPUT Thu 02 Apr 2020 12:05:54 PM EDT
98
+ HERE
99
+ l = Reckon::LedgerParser.new(ledger)
100
+ expect(l.entries.first[:accounts].map { |n| n[:name] }).to eq(['Expenses:Household', 'Liabilities:ChaseSapphire'])
101
+ expect(l.entries.first[:accounts].size).to eq(2)
102
+ expect(l.entries.length).to eq(1)
103
+ end
104
+
15
105
  it "should ignore non-standard entries" do
16
106
  @ledger.entries.length.should == 7
17
107
  end
18
108
 
19
109
  it "should parse entries correctly" do
20
- @ledger.entries.first[:desc].should == "* Checking balance"
21
- @ledger.entries.first[:date].should == "2004-05-01"
110
+ @ledger.entries.first[:desc].should == "Checking balance"
111
+ @ledger.entries.first[:date].should == Date.parse("2004-05-01")
22
112
  @ledger.entries.first[:accounts].first[:name].should == "Assets:Bank:Checking"
23
113
  @ledger.entries.first[:accounts].first[:amount].should == 1000
24
114
  @ledger.entries.first[:accounts].last[:name].should == "Equity:Opening Balances"
25
115
  @ledger.entries.first[:accounts].last[:amount].should == -1000
26
116
 
27
- @ledger.entries.last[:desc].should == "(100) Credit card company"
28
- @ledger.entries.last[:date].should == "2004/05/27"
117
+ @ledger.entries.last[:desc].should == "Credit card company"
118
+ @ledger.entries.last[:date].should == Date.parse("2004/05/27")
29
119
  @ledger.entries.last[:accounts].first[:name].should == "Liabilities:MasterCard"
30
120
  @ledger.entries.last[:accounts].first[:amount].should == 20.24
31
121
  @ledger.entries.last[:accounts].last[:name].should == "Assets:Bank:Checking"
@@ -35,14 +125,14 @@ describe Reckon::LedgerParser do
35
125
 
36
126
  describe "balance" do
37
127
  it "it should balance out missing account values" do
38
- @ledger.balance([
128
+ @ledger.send(:balance, [
39
129
  { :name => "Account1", :amount => 1000 },
40
130
  { :name => "Account2", :amount => nil }
41
131
  ]).should == [ { :name => "Account1", :amount => 1000 }, { :name => "Account2", :amount => -1000 } ]
42
132
  end
43
133
 
44
134
  it "it should balance out missing account values" do
45
- @ledger.balance([
135
+ @ledger.send(:balance, [
46
136
  { :name => "Account1", :amount => 1000 },
47
137
  { :name => "Account2", :amount => 100 },
48
138
  { :name => "Account3", :amount => -200 },
@@ -56,7 +146,7 @@ describe Reckon::LedgerParser do
56
146
  end
57
147
 
58
148
  it "it should work on normal values too" do
59
- @ledger.balance([
149
+ @ledger.send(:balance, [
60
150
  { :name => "Account1", :amount => 1000 },
61
151
  { :name => "Account2", :amount => -1000 }
62
152
  ]).should == [ { :name => "Account1", :amount => 1000 }, { :name => "Account2", :amount => -1000 } ]
@@ -8,79 +8,92 @@ require 'reckon'
8
8
  describe Reckon::Money do
9
9
  describe "from_s" do
10
10
  it "should handle currency indicators" do
11
- Reckon::Money::from_s( "$2.00" ).should == 2.00
12
- Reckon::Money::from_s( "-$1025.67" ).should == -1025.67
13
- Reckon::Money::from_s( "$-1025.67" ).should == -1025.67
11
+ expect(Reckon::Money::from_s( "$2.00" )).to eq(2.00)
12
+ expect(Reckon::Money::from_s("-$1025.67")).to eq(-1025.67)
13
+ expect(Reckon::Money::from_s("$-1025.67")).to eq(-1025.67)
14
14
  end
15
15
 
16
16
  it "should handle the comma_separates_cents option correctly" do
17
- Reckon::Money::from_s( "$2,00", :comma_separates_cents => true ).should == 2.00
18
- Reckon::Money::from_s( "-$1025,67", :comma_separates_cents => true ).should == -1025.67
19
- Reckon::Money::from_s( "$-1025,67", :comma_separates_cents => true ).should == -1025.67
17
+ expect(Reckon::Money::from_s("$2,00", :comma_separates_cents => true)).to eq(2.00)
18
+ expect(Reckon::Money::from_s("-$1025,67", :comma_separates_cents => true )).to eq(-1025.67)
19
+ expect(Reckon::Money::from_s("$-1025,67", :comma_separates_cents => true )).to eq(-1025.67)
20
20
  end
21
21
 
22
22
  it "should return 0 for an empty string" do
23
- Reckon::Money::from_s( "" ).should == 0
23
+ expect(Reckon::Money::from_s("")).to eq(0)
24
24
  end
25
25
 
26
26
  it "should handle 1000 indicators correctly" do
27
- Reckon::Money::from_s( "$2.000,00", :comma_separates_cents => true ).should == 2000.00
28
- Reckon::Money::from_s( "-$1,025.67" ).should == -1025.67
27
+ expect(Reckon::Money::from_s("$2.000,00", :comma_separates_cents => true)).to eq(2000.00)
28
+ expect(Reckon::Money::from_s("-$1,025.67")).to eq(-1025.67)
29
29
  end
30
30
 
31
31
  it "should keep numbers together" do
32
- Reckon::Money::from_s( "1A1" ).should == 1
32
+ expect(Reckon::Money::from_s("1A1")).to eq(1)
33
33
  end
34
34
 
35
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
36
+ expect(Reckon::Money::from_s("1A2.00")).to eq(2)
37
+ expect(Reckon::Money::from_s("2.00A1")).to eq(2)
38
38
  end
39
39
 
40
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
41
+ expect(Reckon::Money::from_s("AB1.00C")).to eq(1)
42
+ expect(Reckon::Money::from_s("AB0C")).to eq(0)
43
+ expect(Reckon::Money::from_s("AB-2.00C")).to eq(-2)
44
44
  end
45
45
 
46
46
  it "should return nil if no numbers are found" do
47
- Reckon::Money::from_s( "BAC" ).should == nil
47
+ expect(Reckon::Money::from_s("BAC")).to be_nil()
48
48
  end
49
49
  end
50
50
 
51
51
  describe "pretty" do
52
52
  it "work with negative and positive numbers" do
53
- Reckon::Money.new( -20.00 ).pretty.should == "-$20.00"
54
- Reckon::Money.new( 1558.52 ).pretty.should == " $1558.52"
53
+ expect(Reckon::Money.new(-20.00).pretty).to eq("-$20.00")
54
+ expect(Reckon::Money.new(1558.52).pretty).to eq(" $1558.52")
55
55
  end
56
56
 
57
57
  it "work with other currencies such as €" do
58
- Reckon::Money.new( -20.00, :currency => "€", :suffixed => false ).pretty.should == "-€20.00"
59
- Reckon::Money.new( 1558.52, :currency => "€", :suffixed => false ).pretty.should == " €1558.52"
58
+ expect(Reckon::Money.new(-20.00, currency: "€", suffixed: false).pretty).to eq("-€20.00")
59
+ expect(Reckon::Money.new(1558.52, currency: "€", suffixed: false).pretty).to eq(" €1558.52")
60
60
  end
61
61
 
62
62
  it "work with suffixed currencies such as SEK" do
63
- Reckon::Money.new( -20.00, :currency => "SEK", :suffixed => true ).pretty.should == "-20.00 SEK"
64
- Reckon::Money.new( 1558.52, :currency => "SEK", :suffixed => true ).pretty.should == " 1558.52 SEK"
63
+ expect(Reckon::Money.new( -20.00, :currency => "SEK", :suffixed => true ).pretty).to eq("-20.00 SEK")
64
+ expect(Reckon::Money.new( 1558.52, :currency => "SEK", :suffixed => true ).pretty).to eq(" 1558.52 SEK")
65
65
  end
66
66
  end
67
67
 
68
68
  describe "likelihood" do
69
69
  it "should return the likelihood that a string represents money" do
70
- Reckon::Money::likelihood( "$20.00" ).should == 45
70
+ expect(Reckon::Money::likelihood( "$20.00" )).to eq(65)
71
+ end
72
+
73
+ it "should return neutral for empty string" do
74
+ expect(Reckon::Money::likelihood("")).to eq(0)
75
+ end
76
+
77
+ it "should recognize non-us currencies" do
78
+ expect(Reckon::Money::likelihood("£480.00")).to eq(30)
79
+ expect(Reckon::Money::likelihood("£1.480,00")).to eq(30)
80
+ end
81
+
82
+ it 'should not identify date columns as money' do
83
+ expect(Reckon::Money::likelihood("22.01.2014")).to eq(0)
71
84
  end
72
85
  end
73
86
 
74
87
  describe "equality" do
75
88
  it "should be comparable to other money" do
76
- Reckon::Money.new( 2.0 ).should == Reckon::Money.new( 2.0 )
77
- Reckon::Money.new( 1.0 ).should <= Reckon::Money.new( 2.0 )
78
- Reckon::Money.new( 3.0 ).should > Reckon::Money.new( 2.0 )
89
+ expect(Reckon::Money.new(2.0)).to eq(Reckon::Money.new(2.0))
90
+ expect(Reckon::Money.new(1.0)).to be <= Reckon::Money.new(2.0)
91
+ expect(Reckon::Money.new(3.0)).to be > Reckon::Money.new(2.0)
79
92
  end
80
93
  it "should be comparable to other float" do
81
- Reckon::Money.new( 2.0 ).should == 2.0
82
- Reckon::Money.new( 1.0 ).should <= 2.0
83
- Reckon::Money.new( 3.0 ).should > 2.0
94
+ expect(Reckon::Money.new(2.0)).to eq(2.0)
95
+ expect(Reckon::Money.new(1.0)).to be <= 2.0
96
+ expect(Reckon::Money.new(3.0)).to be > 2.0
84
97
  end
85
98
  end
86
99
  end
@@ -3,4 +3,26 @@ require 'rspec'
3
3
  require 'reckon'
4
4
 
5
5
  RSpec.configure do |config|
6
+ config.before(:all, &:silence_output)
7
+ config.after(:all, &:enable_output)
8
+ def fixture_path(file)
9
+ File.expand_path(File.join(File.dirname(__FILE__), "data_fixtures", file))
10
+ end
11
+ end
12
+
13
+ public
14
+
15
+ # Redirects stderr and stout to /dev/null.txt
16
+ def silence_output
17
+ # Store the original stderr and stdout in order to restore them later
18
+ @original_stdout = $stdout
19
+
20
+ # Redirect stderr and stdout
21
+ $stdout = File.new(File.join(File.dirname(__FILE__), 'test_log.txt'), 'w')
22
+ end
23
+
24
+ # Replace stderr and stdout so anything else is output correctly
25
+ def enable_output
26
+ $stdout = @original_stdout
27
+ @original_stdout = nil
6
28
  end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reckon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Cantino
8
8
  - BlackEdder
9
+ - Ben Prew
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2015-12-02 00:00:00.000000000 Z
13
+ date: 2020-06-05 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rspec
@@ -26,19 +27,47 @@ dependencies:
26
27
  - !ruby/object:Gem::Version
27
28
  version: 1.2.9
28
29
  - !ruby/object:Gem::Dependency
29
- name: fastercsv
30
+ name: pry
30
31
  requirement: !ruby/object:Gem::Requirement
31
32
  requirements:
32
33
  - - ">="
33
34
  - !ruby/object:Gem::Version
34
- version: 1.5.1
35
- type: :runtime
35
+ version: 0.12.2
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.12.2
43
+ - !ruby/object:Gem::Dependency
44
+ name: rantly
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '='
48
+ - !ruby/object:Gem::Version
49
+ version: 1.2.0
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - '='
55
+ - !ruby/object:Gem::Version
56
+ version: 1.2.0
57
+ - !ruby/object:Gem::Dependency
58
+ name: github_changelog_generator
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
36
65
  prerelease: false
37
66
  version_requirements: !ruby/object:Gem::Requirement
38
67
  requirements:
39
68
  - - ">="
40
69
  - !ruby/object:Gem::Version
41
- version: 1.5.1
70
+ version: '0'
42
71
  - !ruby/object:Gem::Dependency
43
72
  name: chronic
44
73
  requirement: !ruby/object:Gem::Requirement
@@ -81,6 +110,20 @@ dependencies:
81
110
  - - ">="
82
111
  - !ruby/object:Gem::Version
83
112
  version: 1.4.2
113
+ - !ruby/object:Gem::Dependency
114
+ name: rchardet
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: 1.8.0
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 1.8.0
84
127
  description: Reckon automagically converts CSV files for use with the command-line
85
128
  accounting tool Ledger. It also helps you to select the correct accounts associated
86
129
  with the CSV data using Bayesian machine learning.
@@ -95,7 +138,7 @@ files:
95
138
  - ".ruby-gemset"
96
139
  - ".ruby-version"
97
140
  - ".travis.yml"
98
- - CHANGES.md
141
+ - CHANGELOG.md
99
142
  - Gemfile
100
143
  - Gemfile.lock
101
144
  - LICENSE
@@ -104,12 +147,43 @@ files:
104
147
  - bin/reckon
105
148
  - lib/reckon.rb
106
149
  - lib/reckon/app.rb
150
+ - lib/reckon/cosine_similarity.rb
107
151
  - lib/reckon/csv_parser.rb
152
+ - lib/reckon/date_column.rb
108
153
  - lib/reckon/ledger_parser.rb
154
+ - lib/reckon/logger.rb
109
155
  - lib/reckon/money.rb
156
+ - lib/reckon/version.rb
110
157
  - reckon.gemspec
158
+ - spec/data_fixtures/51-sample.csv
159
+ - spec/data_fixtures/51-tokens.yml
160
+ - spec/data_fixtures/73-sample.csv
161
+ - spec/data_fixtures/73-tokens.yml
162
+ - spec/data_fixtures/73-transactions.ledger
163
+ - spec/data_fixtures/85-date-example.csv
164
+ - spec/data_fixtures/austrian_example.csv
165
+ - spec/data_fixtures/bom_utf8_file.csv
166
+ - spec/data_fixtures/broker_canada_example.csv
167
+ - spec/data_fixtures/chase.csv
168
+ - spec/data_fixtures/danish_kroner_nordea_example.csv
169
+ - spec/data_fixtures/english_date_example.csv
111
170
  - spec/data_fixtures/extratofake.csv
171
+ - spec/data_fixtures/french_example.csv
172
+ - spec/data_fixtures/german_date_example.csv
173
+ - spec/data_fixtures/harder_date_example.csv
174
+ - spec/data_fixtures/ing.csv
175
+ - spec/data_fixtures/intuit_mint_example.csv
176
+ - spec/data_fixtures/invalid_header_example.csv
177
+ - spec/data_fixtures/inversed_credit_card.csv
178
+ - spec/data_fixtures/nationwide.csv
179
+ - spec/data_fixtures/simple.csv
180
+ - spec/data_fixtures/some_other.csv
181
+ - spec/data_fixtures/spanish_date_example.csv
182
+ - spec/data_fixtures/suntrust.csv
183
+ - spec/data_fixtures/test_money_column.csv
112
184
  - spec/data_fixtures/tokens.yaml
185
+ - spec/data_fixtures/two_money_columns.csv
186
+ - spec/data_fixtures/yyyymmdd_date_example.csv
113
187
  - spec/reckon/app_spec.rb
114
188
  - spec/reckon/csv_parser_spec.rb
115
189
  - spec/reckon/date_column_spec.rb
@@ -119,7 +193,8 @@ files:
119
193
  - spec/spec.opts
120
194
  - spec/spec_helper.rb
121
195
  homepage: https://github.com/cantino/reckon
122
- licenses: []
196
+ licenses:
197
+ - MIT
123
198
  metadata: {}
124
199
  post_install_message:
125
200
  rdoc_options: []
@@ -136,20 +211,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
211
  - !ruby/object:Gem::Version
137
212
  version: '0'
138
213
  requirements: []
139
- rubyforge_project:
140
- rubygems_version: 2.4.6
214
+ rubygems_version: 3.1.2
141
215
  signing_key:
142
216
  specification_version: 4
143
217
  summary: Utility for interactively converting and labeling CSV files for the Ledger
144
218
  accounting tool.
145
- test_files:
146
- - spec/data_fixtures/extratofake.csv
147
- - spec/data_fixtures/tokens.yaml
148
- - spec/reckon/app_spec.rb
149
- - spec/reckon/csv_parser_spec.rb
150
- - spec/reckon/date_column_spec.rb
151
- - spec/reckon/ledger_parser_spec.rb
152
- - spec/reckon/money_column_spec.rb
153
- - spec/reckon/money_spec.rb
154
- - spec/spec.opts
155
- - spec/spec_helper.rb
219
+ test_files: []