reckon 0.6.0 → 0.7.2

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.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +50 -0
  3. data/.gitignore +3 -0
  4. data/.ruby-version +1 -1
  5. data/CHANGELOG.md +75 -7
  6. data/Gemfile.lock +1 -1
  7. data/README.md +85 -24
  8. data/Rakefile +17 -1
  9. data/bin/build-new-version.sh +26 -0
  10. data/bin/reckon +9 -1
  11. data/lib/reckon.rb +1 -0
  12. data/lib/reckon/app.rb +18 -141
  13. data/lib/reckon/cosine_similarity.rb +67 -62
  14. data/lib/reckon/csv_parser.rb +2 -7
  15. data/lib/reckon/date_column.rb +10 -0
  16. data/lib/reckon/money.rb +59 -52
  17. data/lib/reckon/options.rb +153 -0
  18. data/lib/reckon/version.rb +1 -1
  19. data/spec/cosine_training_and_test.rb +52 -0
  20. data/spec/integration/another_bank_example/input.csv +9 -0
  21. data/spec/integration/another_bank_example/output.ledger +36 -0
  22. data/spec/integration/another_bank_example/test_args +1 -0
  23. data/spec/integration/ask_for_account/cli_input.exp +33 -0
  24. data/spec/integration/ask_for_account/expected_output +11 -0
  25. data/spec/integration/ask_for_account/input.csv +9 -0
  26. data/spec/integration/ask_for_account/test_args +1 -0
  27. data/spec/integration/austrian_example/input.csv +13 -0
  28. data/spec/integration/austrian_example/output.ledger +52 -0
  29. data/spec/integration/austrian_example/test_args +2 -0
  30. data/spec/integration/bom_utf8_file/input.csv +3 -0
  31. data/spec/integration/bom_utf8_file/output.ledger +4 -0
  32. data/spec/integration/bom_utf8_file/test_args +3 -0
  33. data/spec/integration/broker_canada_example/input.csv +12 -0
  34. data/spec/integration/broker_canada_example/output.ledger +48 -0
  35. data/spec/integration/broker_canada_example/test_args +1 -0
  36. data/spec/integration/chase/account_tokens_and_regex/output.ledger +36 -0
  37. data/spec/integration/chase/account_tokens_and_regex/test_args +2 -0
  38. data/spec/integration/chase/account_tokens_and_regex/tokens.yml +16 -0
  39. data/spec/integration/chase/default_account_names/output.ledger +36 -0
  40. data/spec/integration/chase/default_account_names/test_args +3 -0
  41. data/spec/integration/chase/input.csv +9 -0
  42. data/spec/integration/chase/learn_from_existing/learn.ledger +7 -0
  43. data/spec/integration/chase/learn_from_existing/output.ledger +36 -0
  44. data/spec/integration/chase/learn_from_existing/test_args +1 -0
  45. data/spec/integration/chase/simple/output.ledger +36 -0
  46. data/spec/integration/chase/simple/test_args +1 -0
  47. data/spec/integration/danish_kroner_nordea_example/input.csv +6 -0
  48. data/spec/integration/danish_kroner_nordea_example/output.ledger +24 -0
  49. data/spec/integration/danish_kroner_nordea_example/test_args +1 -0
  50. data/spec/integration/english_date_example/input.csv +3 -0
  51. data/spec/integration/english_date_example/output.ledger +12 -0
  52. data/spec/integration/english_date_example/test_args +1 -0
  53. data/spec/integration/extratofake/input.csv +24 -0
  54. data/spec/integration/extratofake/output.ledger +92 -0
  55. data/spec/integration/extratofake/test_args +1 -0
  56. data/spec/integration/french_example/input.csv +9 -0
  57. data/spec/integration/french_example/output.ledger +36 -0
  58. data/spec/integration/french_example/test_args +2 -0
  59. data/spec/integration/german_date_example/input.csv +3 -0
  60. data/spec/integration/german_date_example/output.ledger +12 -0
  61. data/spec/integration/german_date_example/test_args +1 -0
  62. data/spec/integration/harder_date_example/input.csv +5 -0
  63. data/spec/integration/harder_date_example/output.ledger +20 -0
  64. data/spec/integration/harder_date_example/test_args +1 -0
  65. data/spec/integration/ing/input.csv +3 -0
  66. data/spec/integration/ing/output.ledger +12 -0
  67. data/spec/integration/ing/test_args +1 -0
  68. data/spec/integration/intuit_mint_example/input.csv +7 -0
  69. data/spec/integration/intuit_mint_example/output.ledger +28 -0
  70. data/spec/integration/intuit_mint_example/test_args +1 -0
  71. data/spec/integration/invalid_header_example/input.csv +6 -0
  72. data/spec/integration/invalid_header_example/output.ledger +8 -0
  73. data/spec/integration/invalid_header_example/test_args +1 -0
  74. data/spec/integration/inversed_credit_card/input.csv +16 -0
  75. data/spec/integration/inversed_credit_card/output.ledger +64 -0
  76. data/spec/integration/inversed_credit_card/test_args +1 -0
  77. data/spec/integration/nationwide/input.csv +4 -0
  78. data/spec/integration/nationwide/output.ledger +16 -0
  79. data/spec/integration/nationwide/test_args +1 -0
  80. data/spec/integration/regression/issue_51_account_tokens/input.csv +8 -0
  81. data/spec/integration/regression/issue_51_account_tokens/output.ledger +32 -0
  82. data/spec/integration/regression/issue_51_account_tokens/test_args +4 -0
  83. data/spec/integration/regression/issue_51_account_tokens/tokens.yml +9 -0
  84. data/spec/integration/regression/issue_64_date_column/input.csv +3 -0
  85. data/spec/integration/regression/issue_64_date_column/output.ledger +8 -0
  86. data/spec/integration/regression/issue_64_date_column/test_args +1 -0
  87. data/spec/integration/regression/issue_73_account_token_matching/input.csv +2 -0
  88. data/spec/integration/regression/issue_73_account_token_matching/output.ledger +4 -0
  89. data/spec/integration/regression/issue_73_account_token_matching/test_args +6 -0
  90. data/spec/integration/regression/issue_73_account_token_matching/tokens.yml +8 -0
  91. data/spec/integration/regression/issue_85_date_example/input.csv +2 -0
  92. data/spec/integration/regression/issue_85_date_example/output.ledger +8 -0
  93. data/spec/integration/regression/issue_85_date_example/test_args +1 -0
  94. data/spec/integration/spanish_date_example/input.csv +3 -0
  95. data/spec/integration/spanish_date_example/output.ledger +12 -0
  96. data/spec/integration/spanish_date_example/test_args +1 -0
  97. data/spec/integration/suntrust/input.csv +7 -0
  98. data/spec/integration/suntrust/output.ledger +28 -0
  99. data/spec/integration/suntrust/test_args +1 -0
  100. data/spec/integration/test.sh +123 -0
  101. data/spec/integration/test_money_column/input.csv +3 -0
  102. data/spec/integration/test_money_column/output.ledger +8 -0
  103. data/spec/integration/test_money_column/test_args +1 -0
  104. data/spec/integration/two_money_columns/input.csv +5 -0
  105. data/spec/integration/two_money_columns/output.ledger +20 -0
  106. data/spec/integration/two_money_columns/test_args +1 -0
  107. data/spec/integration/yyyymmdd_date_example/input.csv +1 -0
  108. data/spec/integration/yyyymmdd_date_example/output.ledger +4 -0
  109. data/spec/integration/yyyymmdd_date_example/test_args +1 -0
  110. data/spec/reckon/app_spec.rb +24 -6
  111. data/spec/reckon/csv_parser_spec.rb +3 -3
  112. data/spec/reckon/money_column_spec.rb +24 -24
  113. data/spec/reckon/money_spec.rb +15 -34
  114. data/spec/reckon/options_spec.rb +17 -0
  115. data/spec/spec_helper.rb +6 -1
  116. metadata +102 -7
  117. data/.travis.yml +0 -13
@@ -0,0 +1,3 @@
1
+ "Date","Note","Amount"
2
+ "2012/3/22","DEPOSIT","50.00"
3
+ "2012/3/23","TRANSFER TO SAVINGS","-10.00"
@@ -0,0 +1,8 @@
1
+ 2012-03-22 DEPOSIT
2
+ Assets:Bank:Checking $50.00
3
+ Income:Unknown
4
+
5
+ 2012-03-23 TRANSFER TO SAVINGS
6
+ Expenses:Unknown
7
+ Assets:Bank:Checking -$10.00
8
+
@@ -0,0 +1 @@
1
+ -f input.csv --unattended --account Assets:Bank:Checking
@@ -0,0 +1,5 @@
1
+ 4/1/2008,Check - 0000000122,122,-$76.00,"","$1,750.06"
2
+ 3/28/2008,BLARG R SH 456930,"","",+$327.49,"$1,826.06"
3
+ 3/27/2008,Check - 0000000112,112,-$800.00,"","$1,498.57"
4
+ 3/26/2008,Check - 0000000251,251,-$88.55,"","$1,298.57"
5
+ 3/26/2008,Check - 0000000251,251,"","+$88.55","$1,298.57"
@@ -0,0 +1,20 @@
1
+ 2008-03-26 Check - 0000000251; 251; $1,298.57
2
+ Assets:Bank:Checking $88.55
3
+ Income:Unknown
4
+
5
+ 2008-03-26 Check - 0000000251; 251; $1,298.57
6
+ Income:Unknown
7
+ Assets:Bank:Checking -$88.55
8
+
9
+ 2008-03-27 Check - 0000000112; 112; $1,498.57
10
+ Income:Unknown
11
+ Assets:Bank:Checking -$800.00
12
+
13
+ 2008-03-28 BLARG R SH 456930; $1,826.06
14
+ Assets:Bank:Checking $327.49
15
+ Income:Unknown
16
+
17
+ 2008-04-01 Check - 0000000122; 122; $1,750.06
18
+ Income:Unknown
19
+ Assets:Bank:Checking -$76.00
20
+
@@ -0,0 +1 @@
1
+ -f input.csv --unattended --account Assets:Bank:Checking
@@ -0,0 +1 @@
1
+ DEBIT,20121231,"ODESK***BAL-27DEC12 650-12345 CA 12/28",-123.45
@@ -0,0 +1,4 @@
1
+ 2012-12-31 DEBIT; ODESK***BAL-27DEC12 650-12345 CA 12/28
2
+ Expenses:Unknown
3
+ Assets:Bank:Checking -$123.45
4
+
@@ -0,0 +1 @@
1
+ -f input.csv --unattended --account Assets:Bank:Checking
@@ -16,10 +16,10 @@ describe Reckon::App do
16
16
  describe "each_row_backwards" do
17
17
  it "should return rows with hashes" do
18
18
  @rows[0][:pretty_date].should == "2009-12-10"
19
- @rows[0][:pretty_money].should == " $2105.00"
19
+ @rows[0][:pretty_money].should == " $2,105.00"
20
20
  @rows[0][:description].should == "CREDIT; Some Company vendorpymt PPD ID: 5KL3832735"
21
21
  @rows[1][:pretty_date].should == "2009-12-11"
22
- @rows[1][:pretty_money].should == "-$116.22"
22
+ @rows[1][:pretty_money].should == " $116.22"
23
23
  @rows[1][:description].should == "CREDIT; PAYPAL TRANSFER PPD ID: PAYPALSDSL"
24
24
  end
25
25
  end
@@ -37,14 +37,16 @@ describe Reckon::App do
37
37
 
38
38
  context 'unattended mode with chase csv input' do
39
39
  let(:output_file) { StringIO.new }
40
- let(:chase) {
40
+ let(:chase) do
41
41
  Reckon::App.new(
42
42
  string: BANK_CSV,
43
43
  unattended: true,
44
44
  output_file: output_file,
45
- bank_account: 'Assets:Bank:Checking'
45
+ bank_account: 'Assets:Bank:Checking',
46
+ default_into_account: 'Expenses:Unknown',
47
+ default_outof_account: 'Income:Unknown',
46
48
  )
47
- }
49
+ end
48
50
 
49
51
  describe 'walk backwards' do
50
52
  it 'should assign Income:Unknown and Expenses:Unknown by default' do
@@ -86,6 +88,22 @@ describe Reckon::App do
86
88
  expect(output_file.string.scan('Expenses:Websites').count).to eq(2)
87
89
  end
88
90
  end
91
+
92
+ it 'should fail-on-unknown-account' do
93
+ chase = Reckon::App.new(
94
+ string: BANK_CSV,
95
+ unattended: true,
96
+ output_file: output_file,
97
+ bank_account: 'Assets:Bank:Checking',
98
+ default_into_account: 'Expenses:Unknown',
99
+ default_outof_account: 'Income:Unknown',
100
+ fail_on_unknown_account: true
101
+ )
102
+
103
+ expect { chase.walk_backwards }.to(
104
+ raise_error(RuntimeError, /Couldn't find any matches/)
105
+ )
106
+ end
89
107
  end
90
108
 
91
109
  context "Issue #73 - regression test" do
@@ -146,7 +164,7 @@ describe Reckon::App do
146
164
  CREDIT,20091223120000[0:GMT],"Blarg BLARG REVENUE PPD ID: 00jah78563",1558.52
147
165
  DEBIT,20091221120000[0:GMT],"WEBSITE-BALANCE-17DEC09 12 12/17WEBSITE-BAL",-12.23
148
166
  DEBIT,20091214120000[0:GMT],"WEBSITE-BALANCE-10DEC09 12 12/10WEBSITE-BAL",-20.96
149
- CREDIT,20091211120000[0:GMT],"PAYPAL TRANSFER PPD ID: PAYPALSDSL",-116.22
167
+ CREDIT,20091211120000[0:GMT],"PAYPAL TRANSFER PPD ID: PAYPALSDSL",116.22
150
168
  CREDIT,20091210120000[0:GMT],"Some Company vendorpymt PPD ID: 5KL3832735",2105.00
151
169
  CSV
152
170
 
@@ -242,7 +242,7 @@ describe Reckon::CSVParser do
242
242
  describe "pretty_money_for" do
243
243
  it "work with negative and positive numbers" do
244
244
  some_other_bank.pretty_money_for(1).should == "-$20.00"
245
- some_other_bank.pretty_money_for(4).should == " $1558.52"
245
+ some_other_bank.pretty_money_for(4).should == " $1,558.52"
246
246
  some_other_bank.pretty_money_for(7).should == "-$116.22"
247
247
  some_other_bank.pretty_money_for(5).should == " $0.23"
248
248
  some_other_bank.pretty_money_for(6).should == "-$0.96"
@@ -251,7 +251,7 @@ describe Reckon::CSVParser do
251
251
  it "work with other currencies such as €" do
252
252
  euro_bank = Reckon::CSVParser.new(file: fixture_path('some_other.csv'), currency: "€", suffixed: false )
253
253
  euro_bank.pretty_money_for(1).should == "-€20.00"
254
- euro_bank.pretty_money_for(4).should == " €1558.52"
254
+ euro_bank.pretty_money_for(4).should == " €1,558.52"
255
255
  euro_bank.pretty_money_for(7).should == "-€116.22"
256
256
  euro_bank.pretty_money_for(5).should == " €0.23"
257
257
  euro_bank.pretty_money_for(6).should == "-€0.96"
@@ -260,7 +260,7 @@ describe Reckon::CSVParser do
260
260
  it "work with suffixed currencies such as SEK" do
261
261
  swedish_bank = Reckon::CSVParser.new(file: fixture_path('some_other.csv'), currency: 'SEK', suffixed: true )
262
262
  swedish_bank.pretty_money_for(1).should == "-20.00 SEK"
263
- swedish_bank.pretty_money_for(4).should == " 1558.52 SEK"
263
+ swedish_bank.pretty_money_for(4).should == " 1,558.52 SEK"
264
264
  swedish_bank.pretty_money_for(7).should == "-116.22 SEK"
265
265
  swedish_bank.pretty_money_for(5).should == " 0.23 SEK"
266
266
  swedish_bank.pretty_money_for(6).should == "-0.96 SEK"
@@ -8,13 +8,13 @@ require 'reckon'
8
8
  describe Reckon::MoneyColumn do
9
9
  describe "initialize" do
10
10
  it "should convert strings into Money" do
11
- Reckon::MoneyColumn.new( ["1.00", "-2.00"] ).should == [
11
+ Reckon::MoneyColumn.new( ["1.00", "-2.00"] ).should == [
12
12
  Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
13
13
  end
14
14
  it "should convert empty string into nil" do
15
- Reckon::MoneyColumn.new( ["1.00", ""] ).should == [
15
+ Reckon::MoneyColumn.new( ["1.00", ""] ).should == [
16
16
  Reckon::Money.new( 1.00 ), nil ]
17
- Reckon::MoneyColumn.new( ["", "-2.00"] ).should == [
17
+ Reckon::MoneyColumn.new( ["", "-2.00"] ).should == [
18
18
  nil, Reckon::Money.new( -2.00 ) ]
19
19
  end
20
20
  end
@@ -32,33 +32,33 @@ describe Reckon::MoneyColumn do
32
32
 
33
33
  describe "merge" do
34
34
  it "should merge two columns" do
35
- Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
36
- Reckon::MoneyColumn.new( ["", "-2.00"] ) ).should == [
37
- Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
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
35
+ m1 = Reckon::MoneyColumn.new(["1.00", ""])
36
+ m2 = Reckon::MoneyColumn.new(["", "-2.00"])
37
+ expect(m1.merge!(m2)).to(
38
+ eq([Reckon::Money.new(1.00), Reckon::Money.new(-2.00)])
39
+ )
40
+
41
+ m1 = Reckon::MoneyColumn.new(["1.00", "0"])
42
+ m2 = Reckon::MoneyColumn.new(["0", "-2.00"])
43
+ expect(m1.merge!(m2)).to(
44
+ eq([Reckon::Money.new(1.00), Reckon::Money.new(-2.00)])
45
+ )
46
+ end
48
47
 
49
48
  it "should return nil if columns cannot be merged" do
50
- Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
51
- Reckon::MoneyColumn.new( ["1.00", "-2.00"] ) ).should == nil
49
+ m1 = Reckon::MoneyColumn.new(["1.00", ""])
50
+ m2 = Reckon::MoneyColumn.new(["1.00", "-2.00"])
51
+ expect(m1.merge!(m2)).to eq([Reckon::Money.new(0), Reckon::Money.new(-2)])
52
52
 
53
- Reckon::MoneyColumn.new( ["From1", "Names"] ).merge!(
54
- Reckon::MoneyColumn.new( ["Acc", "NL28 INGB 1200 3244 16,21817"] ) ).should == nil
53
+ m1 = Reckon::MoneyColumn.new(["From1", "Names"])
54
+ m2 = Reckon::MoneyColumn.new(["Acc", "NL28 INGB 1200 3244 16,21817"])
55
+ expect(m1.merge!(m2)).to eq([Reckon::Money.new(-1), Reckon::Money.new("NL28 INGB 1200 3244 16,21817")])
55
56
  end
56
57
 
57
58
  it "should invert first column if both positive" do
58
- Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
59
- Reckon::MoneyColumn.new( ["", "2.00"] ) ).should == [
60
- Reckon::Money.new( -1.00 ), Reckon::Money.new( 2.00 ) ]
59
+ expect(
60
+ Reckon::MoneyColumn.new(["1.00", ""]).merge!(Reckon::MoneyColumn.new( ["", "2.00"]))
61
+ ).to eq([Reckon::Money.new(-1.00), Reckon::Money.new(2.00)])
61
62
  end
62
63
  end
63
64
  end
64
-
@@ -6,68 +6,49 @@ require 'rubygems'
6
6
  require 'reckon'
7
7
 
8
8
  describe Reckon::Money do
9
- describe "from_s" do
9
+ describe "parse" do
10
10
  it "should handle currency indicators" do
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)
11
+ expect(Reckon::Money.new( "$2.00" )).to eq(2.00)
12
+ expect(Reckon::Money.new("-$1025.67")).to eq(-1025.67)
13
+ expect(Reckon::Money.new("$-1025.67")).to eq(-1025.67)
14
14
  end
15
15
 
16
16
  it "should handle the comma_separates_cents option correctly" do
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)
17
+ expect(Reckon::Money.new("$2,00", comma_separates_cents: true)).to eq(2.00)
18
+ expect(Reckon::Money.new("-$1025,67", comma_separates_cents: true)).to eq(-1025.67)
19
+ expect(Reckon::Money.new("$-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
- expect(Reckon::Money::from_s("")).to eq(0)
23
+ expect(Reckon::Money.new("")).to eq(0)
24
24
  end
25
25
 
26
26
  it "should handle 1000 indicators correctly" do
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
- end
30
-
31
- it "should keep numbers together" do
32
- expect(Reckon::Money::from_s("1A1")).to eq(1)
33
- end
34
-
35
- it "should prefer numbers with precision of two" do
36
- expect(Reckon::Money::from_s("1A2.00")).to eq(2)
37
- expect(Reckon::Money::from_s("2.00A1")).to eq(2)
38
- end
39
-
40
- it "should handle arbitrary prefixes and postfixes" do
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
- end
45
-
46
- it "should return nil if no numbers are found" do
47
- expect(Reckon::Money::from_s("BAC")).to be_nil()
27
+ expect(Reckon::Money.new("$2.000,00", comma_separates_cents: true)).to eq(2000.00)
28
+ expect(Reckon::Money.new("-$1,025.67")).to eq(-1025.67)
48
29
  end
49
30
  end
50
31
 
51
32
  describe "pretty" do
52
33
  it "work with negative and positive numbers" do
53
34
  expect(Reckon::Money.new(-20.00).pretty).to eq("-$20.00")
54
- expect(Reckon::Money.new(1558.52).pretty).to eq(" $1558.52")
35
+ expect(Reckon::Money.new(1558.52).pretty).to eq(" $1,558.52")
55
36
  end
56
37
 
57
38
  it "work with other currencies such as €" do
58
39
  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")
40
+ expect(Reckon::Money.new(1558.52, currency: "€", suffixed: false).pretty).to eq(" €1,558.52")
60
41
  end
61
42
 
62
43
  it "work with suffixed currencies such as SEK" do
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")
44
+ expect(Reckon::Money.new(-20.00, currency: "SEK", suffixed: true).pretty).to eq("-20.00 SEK")
45
+ expect(Reckon::Money.new(1558.52, currency: "SEK", suffixed: true).pretty).to eq(" 1,558.52 SEK")
65
46
  end
66
47
  end
67
48
 
68
49
  describe "likelihood" do
69
50
  it "should return the likelihood that a string represents money" do
70
- expect(Reckon::Money::likelihood( "$20.00" )).to eq(65)
51
+ expect(Reckon::Money::likelihood("$20.00")).to eq(65)
71
52
  end
72
53
 
73
54
  it "should return neutral for empty string" do
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe '#parse_opts' do
4
+ it 'should assign to :string option' do
5
+ options = Reckon::Options.parse(
6
+ %w[-f - --unattended --account bank],
7
+ StringIO.new('foo,bar,baz')
8
+ )
9
+ expect(options[:string]).to eq('foo,bar,baz')
10
+ end
11
+
12
+ it 'should require --unattended flag' do
13
+ expect { Reckon::Options.parse(%w[-f - --account bank]) }.to(
14
+ raise_error(RuntimeError, "--unattended is required to use STDIN as CSV source.")
15
+ )
16
+ end
17
+ end
data/spec/spec_helper.rb CHANGED
@@ -16,13 +16,18 @@ public
16
16
  def silence_output
17
17
  # Store the original stderr and stdout in order to restore them later
18
18
  @original_stdout = $stdout
19
+ @original_stderr = $stderr
19
20
 
20
21
  # Redirect stderr and stdout
21
- $stdout = File.new(File.join(File.dirname(__FILE__), 'test_log.txt'), 'w')
22
+ $stderr = File.new(File.join(File.dirname(__FILE__), 'test_log.txt'), 'w')
23
+ $stdout = $stderr
24
+ Reckon::LOGGER.reopen $stderr
22
25
  end
23
26
 
24
27
  # Replace stderr and stdout so anything else is output correctly
25
28
  def enable_output
26
29
  $stdout = @original_stdout
27
30
  @original_stdout = nil
31
+ $stderr = @original_stderr
32
+ @original_stderr = nil
28
33
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reckon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Cantino
8
8
  - BlackEdder
9
9
  - Ben Prew
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-09-04 00:00:00.000000000 Z
13
+ date: 2021-04-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -101,21 +101,23 @@ description: Reckon automagically converts CSV files for use with the command-li
101
101
  with the CSV data using Bayesian machine learning.
102
102
  email: andrew@iterationlabs.com
103
103
  executables:
104
+ - build-new-version.sh
104
105
  - reckon
105
106
  extensions: []
106
107
  extra_rdoc_files: []
107
108
  files:
108
109
  - ".document"
110
+ - ".github/workflows/ruby.yml"
109
111
  - ".gitignore"
110
112
  - ".ruby-gemset"
111
113
  - ".ruby-version"
112
- - ".travis.yml"
113
114
  - CHANGELOG.md
114
115
  - Gemfile
115
116
  - Gemfile.lock
116
117
  - LICENSE
117
118
  - README.md
118
119
  - Rakefile
120
+ - bin/build-new-version.sh
119
121
  - bin/reckon
120
122
  - lib/reckon.rb
121
123
  - lib/reckon/app.rb
@@ -125,8 +127,10 @@ files:
125
127
  - lib/reckon/ledger_parser.rb
126
128
  - lib/reckon/logger.rb
127
129
  - lib/reckon/money.rb
130
+ - lib/reckon/options.rb
128
131
  - lib/reckon/version.rb
129
132
  - reckon.gemspec
133
+ - spec/cosine_training_and_test.rb
130
134
  - spec/data_fixtures/51-sample.csv
131
135
  - spec/data_fixtures/51-tokens.yml
132
136
  - spec/data_fixtures/73-sample.csv
@@ -156,19 +160,110 @@ files:
156
160
  - spec/data_fixtures/tokens.yaml
157
161
  - spec/data_fixtures/two_money_columns.csv
158
162
  - spec/data_fixtures/yyyymmdd_date_example.csv
163
+ - spec/integration/another_bank_example/input.csv
164
+ - spec/integration/another_bank_example/output.ledger
165
+ - spec/integration/another_bank_example/test_args
166
+ - spec/integration/ask_for_account/cli_input.exp
167
+ - spec/integration/ask_for_account/expected_output
168
+ - spec/integration/ask_for_account/input.csv
169
+ - spec/integration/ask_for_account/test_args
170
+ - spec/integration/austrian_example/input.csv
171
+ - spec/integration/austrian_example/output.ledger
172
+ - spec/integration/austrian_example/test_args
173
+ - spec/integration/bom_utf8_file/input.csv
174
+ - spec/integration/bom_utf8_file/output.ledger
175
+ - spec/integration/bom_utf8_file/test_args
176
+ - spec/integration/broker_canada_example/input.csv
177
+ - spec/integration/broker_canada_example/output.ledger
178
+ - spec/integration/broker_canada_example/test_args
179
+ - spec/integration/chase/account_tokens_and_regex/output.ledger
180
+ - spec/integration/chase/account_tokens_and_regex/test_args
181
+ - spec/integration/chase/account_tokens_and_regex/tokens.yml
182
+ - spec/integration/chase/default_account_names/output.ledger
183
+ - spec/integration/chase/default_account_names/test_args
184
+ - spec/integration/chase/input.csv
185
+ - spec/integration/chase/learn_from_existing/learn.ledger
186
+ - spec/integration/chase/learn_from_existing/output.ledger
187
+ - spec/integration/chase/learn_from_existing/test_args
188
+ - spec/integration/chase/simple/output.ledger
189
+ - spec/integration/chase/simple/test_args
190
+ - spec/integration/danish_kroner_nordea_example/input.csv
191
+ - spec/integration/danish_kroner_nordea_example/output.ledger
192
+ - spec/integration/danish_kroner_nordea_example/test_args
193
+ - spec/integration/english_date_example/input.csv
194
+ - spec/integration/english_date_example/output.ledger
195
+ - spec/integration/english_date_example/test_args
196
+ - spec/integration/extratofake/input.csv
197
+ - spec/integration/extratofake/output.ledger
198
+ - spec/integration/extratofake/test_args
199
+ - spec/integration/french_example/input.csv
200
+ - spec/integration/french_example/output.ledger
201
+ - spec/integration/french_example/test_args
202
+ - spec/integration/german_date_example/input.csv
203
+ - spec/integration/german_date_example/output.ledger
204
+ - spec/integration/german_date_example/test_args
205
+ - spec/integration/harder_date_example/input.csv
206
+ - spec/integration/harder_date_example/output.ledger
207
+ - spec/integration/harder_date_example/test_args
208
+ - spec/integration/ing/input.csv
209
+ - spec/integration/ing/output.ledger
210
+ - spec/integration/ing/test_args
211
+ - spec/integration/intuit_mint_example/input.csv
212
+ - spec/integration/intuit_mint_example/output.ledger
213
+ - spec/integration/intuit_mint_example/test_args
214
+ - spec/integration/invalid_header_example/input.csv
215
+ - spec/integration/invalid_header_example/output.ledger
216
+ - spec/integration/invalid_header_example/test_args
217
+ - spec/integration/inversed_credit_card/input.csv
218
+ - spec/integration/inversed_credit_card/output.ledger
219
+ - spec/integration/inversed_credit_card/test_args
220
+ - spec/integration/nationwide/input.csv
221
+ - spec/integration/nationwide/output.ledger
222
+ - spec/integration/nationwide/test_args
223
+ - spec/integration/regression/issue_51_account_tokens/input.csv
224
+ - spec/integration/regression/issue_51_account_tokens/output.ledger
225
+ - spec/integration/regression/issue_51_account_tokens/test_args
226
+ - spec/integration/regression/issue_51_account_tokens/tokens.yml
227
+ - spec/integration/regression/issue_64_date_column/input.csv
228
+ - spec/integration/regression/issue_64_date_column/output.ledger
229
+ - spec/integration/regression/issue_64_date_column/test_args
230
+ - spec/integration/regression/issue_73_account_token_matching/input.csv
231
+ - spec/integration/regression/issue_73_account_token_matching/output.ledger
232
+ - spec/integration/regression/issue_73_account_token_matching/test_args
233
+ - spec/integration/regression/issue_73_account_token_matching/tokens.yml
234
+ - spec/integration/regression/issue_85_date_example/input.csv
235
+ - spec/integration/regression/issue_85_date_example/output.ledger
236
+ - spec/integration/regression/issue_85_date_example/test_args
237
+ - spec/integration/spanish_date_example/input.csv
238
+ - spec/integration/spanish_date_example/output.ledger
239
+ - spec/integration/spanish_date_example/test_args
240
+ - spec/integration/suntrust/input.csv
241
+ - spec/integration/suntrust/output.ledger
242
+ - spec/integration/suntrust/test_args
243
+ - spec/integration/test.sh
244
+ - spec/integration/test_money_column/input.csv
245
+ - spec/integration/test_money_column/output.ledger
246
+ - spec/integration/test_money_column/test_args
247
+ - spec/integration/two_money_columns/input.csv
248
+ - spec/integration/two_money_columns/output.ledger
249
+ - spec/integration/two_money_columns/test_args
250
+ - spec/integration/yyyymmdd_date_example/input.csv
251
+ - spec/integration/yyyymmdd_date_example/output.ledger
252
+ - spec/integration/yyyymmdd_date_example/test_args
159
253
  - spec/reckon/app_spec.rb
160
254
  - spec/reckon/csv_parser_spec.rb
161
255
  - spec/reckon/date_column_spec.rb
162
256
  - spec/reckon/ledger_parser_spec.rb
163
257
  - spec/reckon/money_column_spec.rb
164
258
  - spec/reckon/money_spec.rb
259
+ - spec/reckon/options_spec.rb
165
260
  - spec/spec.opts
166
261
  - spec/spec_helper.rb
167
262
  homepage: https://github.com/cantino/reckon
168
263
  licenses:
169
264
  - MIT
170
265
  metadata: {}
171
- post_install_message:
266
+ post_install_message:
172
267
  rdoc_options: []
173
268
  require_paths:
174
269
  - lib
@@ -183,8 +278,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
278
  - !ruby/object:Gem::Version
184
279
  version: '0'
185
280
  requirements: []
186
- rubygems_version: 3.1.2
187
- signing_key:
281
+ rubygems_version: 3.2.3
282
+ signing_key:
188
283
  specification_version: 4
189
284
  summary: Utility for interactively converting and labeling CSV files for the Ledger
190
285
  accounting tool.