outbanker 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGE0OTE3YTI0NWE1YzFiMDRkYWY4MDllOGFjNDIwZTEyYTMzODk4Ng==
5
+ data.tar.gz: !binary |-
6
+ NDczY2VkNTcwY2Q5YjE5MDVjMDA2ZDVkZmUwYjU0ODBhNGZjMTExNA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZjM0MWQxZWZkMzVmZDFlZDk1NjA5YTJiYzk4NjU5YTk1YmM2YmQyNDM2NzVj
10
+ ODY1MjcyZDgzYWQwODU2NWVlMWYxYzgzMzUzODRkMjU3ZDRjYzVlYjFiNGI3
11
+ MjczYjE5ZjcyNWFiMWUzZjYxNTA4NGU5YWQzMDY0OTI0NmNiZTQ=
12
+ data.tar.gz: !binary |-
13
+ NTUwMGUwOGZmNjBlZWE1MmZmODk1Mjk5NjRjOWVlZTRiMzM4YWVhZGNiMTQ4
14
+ YThlMTczYmIxMWEzMGY5NDE3YWQ3ZTI3Mzg0ZTI2YmI3NzNjYzU3ZjJiYmJm
15
+ OGJhZDYxZmY4OGIxZDhhMmU3ZDBhZjNmZjdlNjdkMTgyMzQyNTI=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ env:
5
+ - RUBYOPT=-Ku
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in outbanker.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Phillip Oertel
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ [![Build Status](https://api.travis-ci.org/phillipoertel/outbanker.png?branch=master)](https://travis-ci.org/phillipoertel/outbanker)
2
+
3
+ # Outbanker
4
+
5
+ Outbanker reads a CSV file exported from [Outbank](http://www.outbank.de) and converts the types to Ruby, as well as doing some cleanups.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'outbanker'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install outbanker
20
+
21
+ ## Usage
22
+
23
+ lines = Outbanker::StatementLines.read('outbank.csv')
24
+ lines.each do |line|
25
+ puts line.amount
26
+ end
27
+
28
+ See the class +StatementLine+ for all available fields.
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ task :default => :test
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << "test"
8
+ t.test_files = FileList['test/outbanker/**/*_test.rb']
9
+ t.verbose = true
10
+ end
11
+
12
+ desc 'parse a file given as FILE for testing purposes, show the FIELDS given on the cli'
13
+ task :parse_file do
14
+ require 'outbanker'
15
+ require 'yaml'
16
+ file = ENV['FILE']
17
+ fields = ENV['FIELDS'].split(',')
18
+ Outbanker::StatementLines.read(file).each do |line|
19
+ puts fields.map { |f| "#{f}: #{line.send(f)}" }.join("\n")
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ module Outbanker
2
+ module MoneyStringParser
3
+ def to_cents(string)
4
+ matches = string.match(/(?<separator>\.|\,)(?<cents>[0-9]{1,2})\Z/)
5
+ if !matches
6
+ string.to_i * 100
7
+ elsif matches[:cents].length == 1
8
+ string.gsub(matches[:separator], '').to_i * 10
9
+ elsif matches[:cents].length == 2
10
+ string.gsub(matches[:separator], '').to_i
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,78 @@
1
+ require 'digest/md5'
2
+
3
+ module Outbanker
4
+
5
+ #
6
+ # this is a representation of one line in an outbank csv statement
7
+ # with translated, parsed attributes (cents, date, etc.).
8
+ #
9
+ class StatementLine
10
+
11
+ include MoneyStringParser
12
+
13
+ ATTRIBUTE_MAPPING = {
14
+ :currency => "Währung",
15
+ :amount => "Betrag",
16
+ :booked_on => "Buchungstag",
17
+ :valuta_on => "Valuta-Datum",
18
+ :recipient => "Empfänger/Auftraggeber",
19
+ :bank_code => "Bankleitzahl",
20
+ :account_number => "Kontonummer",
21
+ :description => "Verwendungszweck",
22
+ :category => "Kategorie"
23
+ }
24
+
25
+ def initialize(csv_row)
26
+ @row = csv_row
27
+ end
28
+
29
+ def amount
30
+ to_cents(@row['Betrag'])
31
+ end
32
+
33
+ def booked_on
34
+ Date.parse(@row['Buchungstag'])
35
+ end
36
+
37
+ def charged?
38
+ # in different cases I get either "Abgerechnet" or "" when a line was charged.
39
+ @row['Buchungstext'] != "Nicht abgerechnet"
40
+ end
41
+
42
+ def valuta_on
43
+ Date.parse(@row['Valuta-Datum'])
44
+ end
45
+
46
+ def description
47
+ @row['Verwendungszweck'].to_s.gsub(/\s+/, ' ')
48
+ end
49
+
50
+ def payee
51
+ desc_lines = @row['Verwendungszweck'].split(" ").reject { |row| row =~ /\A\s*\Z/ }.map { |row| row.strip }
52
+ desc_lines[1] || desc_lines[0] || nil
53
+ end
54
+
55
+ def category
56
+ [nil, ''].include?(@row['Kategorie']) ? nil : @row['Kategorie']
57
+ end
58
+
59
+ def prebooking?
60
+ @row['Vormerkung'] == 'Ja'
61
+ end
62
+
63
+ def method_missing(arg)
64
+ super unless ATTRIBUTE_MAPPING.keys.include?(arg)
65
+ @row.send(:[], ATTRIBUTE_MAPPING[arg])
66
+ end
67
+
68
+ def unique_id
69
+ unique_string = [amount, booked_on, description].join('-')
70
+ Digest::MD5.hexdigest(unique_string)
71
+ end
72
+
73
+ def to_s
74
+ "Buchung vom: #{booked_on}, Betrag: #{amount}, Beschreibung: #{description}"
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,50 @@
1
+ require 'csv'
2
+
3
+ module Outbanker
4
+ class StatementLines
5
+
6
+ attr_reader :earliest_booking, :latest_booking, :num_statements
7
+
8
+ # required for testing only
9
+ attr_reader :csv
10
+
11
+ def self.read(file = 'data/outbank.csv')
12
+ instance = new
13
+ instance.read(file)
14
+ instance
15
+ end
16
+
17
+ def read(file)
18
+ @csv = read_csv(file)
19
+ get_csv_metadata
20
+ @lines = @csv.map { |row| Outbanker::StatementLine.new(row) }
21
+ end
22
+
23
+ # delegate stuff to the @lines array
24
+ def method_missing(method, *args, &block)
25
+ delegated_methods = [:size, :each, :map, :[]]
26
+ return super unless delegated_methods.include?(method)
27
+ @lines.send(method, *args, &block)
28
+ end
29
+
30
+ private
31
+
32
+ def read_csv(file)
33
+ options = {
34
+ :col_sep => ';',
35
+ :headers => true,
36
+ :converters => [:all]
37
+ }
38
+ CSV.new(File.read(file), options)
39
+ end
40
+
41
+ def get_csv_metadata
42
+ rows = @csv.read
43
+ @earliest_booking = Date.parse(rows[rows.size - 1]['Buchungstag'])
44
+ @latest_booking = Date.parse(rows[0]['Buchungstag'])
45
+ @num_statements = rows.size
46
+ @csv.rewind
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,3 @@
1
+ module Outbanker
2
+ VERSION = "0.1.1"
3
+ end
data/lib/outbanker.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'minitest/unit'
2
+
3
+ require "outbanker/version"
4
+ require "outbanker/money_string_parser"
5
+ require "outbanker/statement_line"
6
+ require "outbanker/statement_lines"
7
+
data/outbanker.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'outbanker/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "outbanker"
8
+ gem.version = Outbanker::VERSION
9
+ gem.authors = ["Phillip Oertel"]
10
+ gem.email = ["me@phillipoertel.com"]
11
+ gem.description = %q{outbanker is Ruby wrapper for Outbank CSV files.}
12
+ gem.summary = %q{outbanker reads a CSV file exported from Outbanker/MAC and converts the types to Ruby, as well as doing some cleanups.}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ gem.add_dependency('rake')
20
+ gem.add_dependency('turn')
21
+ end
@@ -0,0 +1,3 @@
1
+ "Buchungstext";"Währung";"Betrag";"Buchungstag";"Valuta-Datum";"Empfänger/Auftraggeber";"Bankleitzahl";"Kontonummer";"Verwendungszweck";"Vormerkung";"Buchungsschlüssel";"Kommentar";"Kategorie";"PayPal Empfänger/Auftraggeber";"PayPal An E-Mail";"PayPal Von E-Mail";"PayPal Gebühr";"PayPal Transaktionscode";"PayPal Status"
2
+ "Nicht abgerechnet";"EUR";"-105,90";"22.01.2013";"23.01.2013";;;;"Paypal Foo Bar";"Nein";;;"Some category";;;;;;
3
+ "Abgerechnet";"EUR";"-6,84";"19.01.2013";"21.01.2013";;;;"Some service 541-2264551";"Nein";;;"Weiterbildung";;;;;;
@@ -0,0 +1,5 @@
1
+ "Buchungstext";"Währung";"Betrag";"Buchungstag";"Valuta-Datum";"Empfänger/Auftraggeber";"Bankleitzahl";"Kontonummer";"Verwendungszweck";"Vormerkung";"Buchungsschlüssel";"Kommentar";"Kategorie";"PayPal Empfänger/Auftraggeber";"PayPal An E-Mail";"PayPal Von E-Mail";"PayPal Gebühr";"PayPal Transaktionscode";"PayPal Status"
2
+ ;"EUR";"-15,42";"31.12.2012";"02.01.2013";;;;"Saldo der Abschlussposten QM - Support 04082 Leipzig";"Nein";"835";;"Bankgebühren";;;;;;
3
+ ;"EUR";"-17,97";"31.12.2012";"31.12.2012";;;;"Saldo der Abschlussposten QM - Support 04082 Leipzig Kontoabschluss 4. Quartal 12 Foo 14,97 8 kostenfreie Poste";"Nein";"835";;"";;;;;;
4
+ ;"EUR";"-15,00";"28.12.2012";"28.12.2012";;;;"12.2012 VNR. 42-4444 PO XY LV PO ";"Ja";"835";;"Altersvorsorge";;;;;;
5
+ ;"EUR";"20,15";"28.12.2012";"28.12.2012";;;;"GELDKARTEBLABLAERSTATTUNG UNTER VORBEHALT SNR.0 KNR.424242 BLZ.42424242 672219500001343382 ";"Nein";"835";;"Bus & Bahn";;;;;;
@@ -0,0 +1,75 @@
1
+ require 'test_helper'
2
+
3
+ class Outbanker::MoneyStringParserTest < MiniTest::Unit::TestCase
4
+
5
+ class Tester
6
+ include ::Outbanker::MoneyStringParser
7
+ end
8
+
9
+ def setup
10
+ @tester = Tester.new
11
+ end
12
+
13
+ def test_full_value
14
+ assert_equal 1200, @tester.to_cents("12")
15
+ end
16
+
17
+ def test_full_value_negative
18
+ assert_equal -1200, @tester.to_cents("-12")
19
+ end
20
+
21
+ #
22
+ # COMMAS
23
+ #
24
+ def test_comma_full_euros
25
+ assert_equal 1200, @tester.to_cents("12,00")
26
+ end
27
+
28
+ def test_comma_euros_and_cents
29
+ assert_equal 1212, @tester.to_cents("12,12")
30
+ end
31
+
32
+ def test_comma_euros_and_cents_one_digit
33
+ assert_equal 1210, @tester.to_cents("12,1")
34
+ end
35
+
36
+ def test_comma_zero
37
+ assert_equal 0, @tester.to_cents("0,00")
38
+ end
39
+
40
+ def test_comma_negative_full_euros
41
+ assert_equal -1200, @tester.to_cents("-12,00")
42
+ end
43
+
44
+ def test_comma_negative_euros_and_cents
45
+ assert_equal -1212, @tester.to_cents("-12,12")
46
+ end
47
+
48
+ #
49
+ # DOT
50
+ #
51
+ def test_dot_full_euros
52
+ assert_equal 1200, @tester.to_cents("12.00")
53
+ end
54
+
55
+ def test_dot_euros_and_cents
56
+ assert_equal 1212, @tester.to_cents("12.12")
57
+ end
58
+
59
+ def test_dot_euros_and_cents_one_digit
60
+ assert_equal 1210, @tester.to_cents("12.1")
61
+ end
62
+
63
+ def test_dot_zero
64
+ assert_equal 0, @tester.to_cents("0.00")
65
+ end
66
+
67
+ def test_dot_negative_full_euros
68
+ assert_equal -1200, @tester.to_cents("-12.00")
69
+ end
70
+
71
+ def test_dot_negative_euros_and_cents
72
+ assert_equal -1212, @tester.to_cents("-12.12")
73
+ end
74
+
75
+ end
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+
3
+ class Outbanker::StatementLineTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ fixture = File.join(File.dirname(__FILE__), '../fixtures/outbank-fixture.csv')
7
+ @lines = Outbanker::StatementLines.read(fixture)
8
+ end
9
+
10
+ def setup_cc_fixture
11
+ fixture = File.join(File.dirname(__FILE__), '../fixtures/outbank-cc.csv')
12
+ @lines = Outbanker::StatementLines.read(fixture)
13
+ end
14
+
15
+ def test_attribute_mapping_works
16
+ line = @lines[0]
17
+ assert_equal "EUR", line.currency
18
+ assert_equal -1542, line.amount
19
+ assert_equal Date.parse("31.12.2012"), line.booked_on
20
+ assert_equal Date.parse("02.01.2013"), line.valuta_on
21
+ assert_equal nil, line.recipient
22
+ assert_equal nil, line.bank_code
23
+ assert_equal nil, line.account_number
24
+ assert_equal "Saldo der Abschlussposten QM - Support 04082 Leipzig", line.description
25
+ assert_equal "Bankgebühren", line.category
26
+ end
27
+
28
+ def test_empty_category_is_returned_as_nil
29
+ line = @lines[1]
30
+ assert_equal nil, line.category
31
+ end
32
+
33
+ #
34
+ # Unique Ids
35
+ #
36
+ def test_unique_id_exists
37
+ line = @lines[0]
38
+ assert_equal "218d1ee8478cbb5b697fe77962424817", line.unique_id
39
+ end
40
+
41
+ def test_unique_id_depends_on_amount
42
+ line = @lines[0]
43
+ row = @lines.csv.read # get the raw first csv line
44
+ row['Betrag'] = "1#{row['Betrag']}"
45
+ refute_equal Outbanker::StatementLine.new(row), line.unique_id
46
+ end
47
+
48
+ def test_unique_id_depends_on_booked_on
49
+ line = @lines[0]
50
+ row = @lines.csv.read # get the raw first csv line
51
+ row['Buchungstag'] = "01.01.1971"
52
+ refute_equal Outbanker::StatementLine.new(row), line.unique_id
53
+ end
54
+
55
+ def test_unique_id_depends_on_description
56
+ line = @lines[0]
57
+ row = @lines.csv.read # get the raw first csv line
58
+ row['Verwendungszweck'] = "#{row['Verwendungszweck']} Bla bla"
59
+ refute_equal Outbanker::StatementLine.new(row), line.unique_id
60
+ end
61
+
62
+ def test_was_charged_when_empty
63
+ line = @lines[0]
64
+ assert_equal true, line.charged?
65
+ end
66
+
67
+ def test_was_charged_when_filled
68
+ setup_cc_fixture
69
+ line = @lines[1]
70
+ assert_equal true, line.charged?
71
+ end
72
+
73
+ def test_was_not_charged
74
+ setup_cc_fixture
75
+ line = @lines[0]
76
+ assert_equal false, line.charged?
77
+ end
78
+
79
+ def test_prebooking_false
80
+ line = @lines[0]
81
+ assert_equal false, line.prebooking?
82
+ end
83
+
84
+ def test_prebooking_true
85
+ line = @lines[2]
86
+ assert_equal true, line.prebooking?
87
+ end
88
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ class Outbanker::StatementLinesTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ fixture = File.join(File.dirname(__FILE__), '../fixtures/outbank-fixture.csv')
7
+ @lines = Outbanker::StatementLines.read(fixture)
8
+ end
9
+
10
+ #
11
+ # test array behaviour
12
+ #
13
+ def test_size
14
+ assert_equal 4, @lines.size
15
+ end
16
+
17
+ def test_each
18
+ count = 0
19
+ @lines.each { |l| count += 1 }
20
+ assert_equal 4, count
21
+ end
22
+
23
+ def test_map
24
+ out = @lines.map { |l| l }
25
+ assert_equal 4, out.size
26
+ end
27
+
28
+ def test_array_access
29
+ assert_equal Outbanker::StatementLine, @lines[0].class
30
+ end
31
+
32
+ #
33
+ # test metadata
34
+ #
35
+ def test_num_statements
36
+ assert_equal 4, @lines.num_statements
37
+ end
38
+
39
+ def test_latest_booking
40
+ assert_equal Date.parse("31.12.2012"), @lines.latest_booking
41
+ end
42
+
43
+ def test_earliest_booking
44
+ assert_equal Date.parse("28.12.2012"), @lines.earliest_booking
45
+ end
46
+
47
+ end
@@ -0,0 +1,6 @@
1
+ require 'outbanker'
2
+
3
+ # TESTING UTILITIES
4
+ begin; require 'turn/autorun'; rescue LoadError; end
5
+ require 'minitest/autorun'
6
+ require 'ostruct'
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: outbanker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Phillip Oertel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ version_requirements: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ! '>='
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ prerelease: false
20
+ name: rake
21
+ requirement: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ type: :runtime
27
+ - !ruby/object:Gem::Dependency
28
+ version_requirements: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ prerelease: false
34
+ name: turn
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ description: outbanker is Ruby wrapper for Outbank CSV files.
42
+ email:
43
+ - me@phillipoertel.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .gitignore
49
+ - .travis.yml
50
+ - Gemfile
51
+ - LICENSE.txt
52
+ - README.md
53
+ - Rakefile
54
+ - lib/outbanker.rb
55
+ - lib/outbanker/money_string_parser.rb
56
+ - lib/outbanker/statement_line.rb
57
+ - lib/outbanker/statement_lines.rb
58
+ - lib/outbanker/version.rb
59
+ - outbanker.gemspec
60
+ - test/fixtures/outbank-cc.csv
61
+ - test/fixtures/outbank-fixture.csv
62
+ - test/outbanker/money_string_parser_test.rb
63
+ - test/outbanker/statement_line_test.rb
64
+ - test/outbanker/statement_lines_test.rb
65
+ - test/test_helper.rb
66
+ homepage: ''
67
+ licenses: []
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 2.2.2
86
+ signing_key:
87
+ specification_version: 4
88
+ summary: outbanker reads a CSV file exported from Outbanker/MAC and converts the types
89
+ to Ruby, as well as doing some cleanups.
90
+ test_files:
91
+ - test/fixtures/outbank-cc.csv
92
+ - test/fixtures/outbank-fixture.csv
93
+ - test/outbanker/money_string_parser_test.rb
94
+ - test/outbanker/statement_line_test.rb
95
+ - test/outbanker/statement_lines_test.rb
96
+ - test/test_helper.rb