ynab_convert 1.0.8 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/publish.yml +36 -0
- data/.github/workflows/test.yml +31 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +10 -2
- data/Gemfile.lock +39 -14
- data/Guardfile +1 -29
- data/README.md +82 -7
- data/lib/ynab_convert/api_clients/api_client.rb +24 -0
- data/lib/ynab_convert/api_clients/currency_api.rb +66 -0
- data/lib/ynab_convert/documents/statements/example_statement.rb +16 -0
- data/lib/ynab_convert/documents/statements/n26_statement.rb +24 -0
- data/lib/ynab_convert/documents/statements/statement.rb +39 -0
- data/lib/ynab_convert/documents/statements/ubs_chequing_statement.rb +20 -0
- data/lib/ynab_convert/documents/statements/ubs_credit_statement.rb +19 -0
- data/lib/ynab_convert/documents/statements/wise_statement.rb +17 -0
- data/lib/ynab_convert/documents/ynab4_files/ynab4_file.rb +58 -0
- data/lib/ynab_convert/documents.rb +17 -0
- data/lib/ynab_convert/logger.rb +1 -1
- data/lib/ynab_convert/processors/example_processor.rb +24 -0
- data/lib/ynab_convert/processors/n26_processor.rb +26 -0
- data/lib/ynab_convert/processors/processor.rb +75 -0
- data/lib/ynab_convert/processors/ubs_chequing_processor.rb +21 -0
- data/lib/ynab_convert/processors/ubs_credit_processor.rb +17 -0
- data/lib/ynab_convert/processors/wise_processor.rb +19 -0
- data/lib/ynab_convert/processors.rb +2 -2
- data/lib/ynab_convert/transformers/cleaners/cleaner.rb +17 -0
- data/lib/ynab_convert/transformers/cleaners/n26_cleaner.rb +13 -0
- data/lib/ynab_convert/transformers/cleaners/ubs_chequing_cleaner.rb +98 -0
- data/lib/ynab_convert/transformers/cleaners/ubs_credit_cleaner.rb +45 -0
- data/lib/ynab_convert/transformers/cleaners/wise_cleaner.rb +39 -0
- data/lib/ynab_convert/transformers/enhancers/enhancer.rb +20 -0
- data/lib/ynab_convert/transformers/enhancers/n26_enhancer.rb +74 -0
- data/lib/ynab_convert/transformers/enhancers/wise_enhancer.rb +87 -0
- data/lib/ynab_convert/transformers/formatters/example_formatter.rb +12 -0
- data/lib/ynab_convert/transformers/formatters/formatter.rb +91 -0
- data/lib/ynab_convert/transformers/formatters/n26_formatter.rb +19 -0
- data/lib/ynab_convert/transformers/formatters/ubs_chequing_formatter.rb +12 -0
- data/lib/ynab_convert/transformers/formatters/ubs_credit_formatter.rb +12 -0
- data/lib/ynab_convert/transformers/formatters/wise_formatter.rb +35 -0
- data/lib/ynab_convert/transformers.rb +18 -0
- data/lib/ynab_convert/validators/ynab4_row_validator.rb +83 -0
- data/lib/ynab_convert/validators.rb +9 -0
- data/lib/ynab_convert/version.rb +1 -1
- data/lib/ynab_convert.rb +22 -3
- data/ynab_convert.gemspec +4 -0
- metadata +94 -10
- data/.travis.yml +0 -20
- data/lib/ynab_convert/processor/base.rb +0 -226
- data/lib/ynab_convert/processor/example.rb +0 -124
- data/lib/ynab_convert/processor/n26.rb +0 -70
- data/lib/ynab_convert/processor/revolut.rb +0 -103
- data/lib/ynab_convert/processor/ubs_chequing.rb +0 -137
- data/lib/ynab_convert/processor/ubs_credit.rb +0 -83
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Transformers
|
4
|
+
module Formatters
|
5
|
+
# Formats Statements rows into YNAB4 rows (Date, Payee, Memo, Amount or
|
6
|
+
# Outflow and Inflow.)
|
7
|
+
class Formatter
|
8
|
+
# @param [Hash] headers_indices the indices at which to find each
|
9
|
+
# header's name
|
10
|
+
# @option headers_indices [Array<Numeric>] :date transaction date
|
11
|
+
# @option headers_indices [Array<Numeric>] :payee transaction
|
12
|
+
# payee/description
|
13
|
+
# @option headers_indices [Array<Numeric>] :memo transaction memo or
|
14
|
+
# currency if currency conversion will be performed
|
15
|
+
# @option headers_indices [Array<Numeric>] :amount transaction amount (if
|
16
|
+
# Statement is using the :amounts format)
|
17
|
+
# @option headers_indices [Array<Numeric>] :outflow transaction outflow
|
18
|
+
# (if using the :flows format)
|
19
|
+
# @option headers_indices [Array<Numeric>] :inflow transaction inflow (if
|
20
|
+
# using the :flows format)
|
21
|
+
def initialize(**headers_indices)
|
22
|
+
default_values = {
|
23
|
+
memo: [] # The Memo field tends to be empty for most institutions
|
24
|
+
}
|
25
|
+
|
26
|
+
@format = :flows
|
27
|
+
unless headers_indices[:amount].nil? || headers_indices[:amount].empty?
|
28
|
+
@format = :amounts
|
29
|
+
end
|
30
|
+
@headers_indices = default_values.merge(headers_indices)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Turns CSV rows into YNAB4 rows (Date, Payee, Memo, Amount or Outflow and
|
34
|
+
# Inflow)
|
35
|
+
# @param row [CSV::Row] The CSV row to parse
|
36
|
+
# @return [Array<String>] The YNAB4 formatted row
|
37
|
+
def run(row)
|
38
|
+
ynab_row = [date(row), payee(row), memo(row)]
|
39
|
+
|
40
|
+
if @format == :amounts
|
41
|
+
ynab_row << amount(row)
|
42
|
+
else
|
43
|
+
ynab_row << outflow(row)
|
44
|
+
ynab_row << inflow(row)
|
45
|
+
end
|
46
|
+
|
47
|
+
ynab_row
|
48
|
+
end
|
49
|
+
|
50
|
+
# Processes columns for each row. Based on the method name that is called,
|
51
|
+
# it will extract the corresponding column (field).
|
52
|
+
# @note In more complex cases, some heuristics are required to format some
|
53
|
+
# of the columns. In that case, any of the aliased #field methods
|
54
|
+
# (#date, #payee, #memo, #amount, #outflow, #inflow) can be
|
55
|
+
# overridden in the child.
|
56
|
+
# @param row [CSV::Row] The row to process
|
57
|
+
# @return [String] The corresponding field(s)
|
58
|
+
def field(row)
|
59
|
+
# Figure out the aliased name the method was called with, to derive
|
60
|
+
# which field to return from the row.
|
61
|
+
requested_field = __callee__.to_sym
|
62
|
+
assembled_field = @headers_indices[requested_field].reduce([]) do
|
63
|
+
|fields_data, i|
|
64
|
+
fields_data << row[i]
|
65
|
+
end
|
66
|
+
|
67
|
+
# Avoid turning Dates and Numerics back to strings
|
68
|
+
# If the assembled_field isn't a composite from several Statement
|
69
|
+
# fields, there is no need to join(' ') and turn it into a String
|
70
|
+
formatted_field = assembled_field[0]
|
71
|
+
if assembled_field.length > 1
|
72
|
+
formatted_field = assembled_field.join(' ')
|
73
|
+
end
|
74
|
+
|
75
|
+
# Avoid "nil" values in the output
|
76
|
+
return '' if formatted_field.nil?
|
77
|
+
|
78
|
+
formatted_field
|
79
|
+
end
|
80
|
+
|
81
|
+
# Create alias names for the field method. This allows the function to
|
82
|
+
# figure out which field to extract from its method name.
|
83
|
+
alias date field
|
84
|
+
alias payee field
|
85
|
+
alias memo field
|
86
|
+
alias amount field
|
87
|
+
alias outflow field
|
88
|
+
alias inflow field
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ynab_convert/transformers'
|
4
|
+
|
5
|
+
module Transformers
|
6
|
+
module Formatters
|
7
|
+
# Formats N26 statement values to YNAB4 value
|
8
|
+
class N26 < Formatter
|
9
|
+
def initialize
|
10
|
+
super({ date: [0], payee: [1], amount: [5] })
|
11
|
+
end
|
12
|
+
|
13
|
+
# All amounts are always in EUR
|
14
|
+
def memo(_row)
|
15
|
+
'EUR'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Transformers
|
4
|
+
module Formatters
|
5
|
+
# UBS Switzerland Chequing accounts formatter
|
6
|
+
class UBSChequing < Formatter
|
7
|
+
def initialize
|
8
|
+
super({ date: [9], payee: [12], outflow: [18], inflow: [19] })
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Transformers
|
4
|
+
module Formatters
|
5
|
+
# UBS Switzerland Credit Card accounts formatter
|
6
|
+
class UBSCredit < Formatter
|
7
|
+
def initialize
|
8
|
+
super({ date: [3], payee: [4], outflow: [10], inflow: [11] })
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Transformers
|
4
|
+
module Formatters
|
5
|
+
# Wise card accounts formatter
|
6
|
+
class Wise < Formatter
|
7
|
+
def initialize
|
8
|
+
super({ date: [1], payee: [13], amount: [2] })
|
9
|
+
end
|
10
|
+
|
11
|
+
def payee(row)
|
12
|
+
merchant = row[13]
|
13
|
+
description = row[4]
|
14
|
+
|
15
|
+
return description if merchant.nil?
|
16
|
+
|
17
|
+
merchant
|
18
|
+
end
|
19
|
+
|
20
|
+
def memo(row)
|
21
|
+
# Description goes in Memo because we'll need to extract the original
|
22
|
+
# amount from it in the enhancer.
|
23
|
+
description = row[4]
|
24
|
+
amount_currency = row[3]
|
25
|
+
original_amount = description.scan(/\d+\.\d{2}\s\w{3}/).first
|
26
|
+
|
27
|
+
memo = amount_currency
|
28
|
+
# Topups don't have an original amount
|
29
|
+
memo = "#{memo},#{original_amount}" unless original_amount.nil?
|
30
|
+
|
31
|
+
memo
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Regroups all the classes involved in transforming a given Statement into a
|
4
|
+
# YNAB4File
|
5
|
+
module Transformers
|
6
|
+
transformers = %w[cleaner enhancer formatter]
|
7
|
+
|
8
|
+
# Load all known Transformers
|
9
|
+
transformers.each do |t|
|
10
|
+
# Require the base classes first so that its children can find the parent
|
11
|
+
# class since files are otherwise loaded in alphabetical order
|
12
|
+
require File.join(__dir__, 'transformers', "#{t}s", "#{t}.rb")
|
13
|
+
|
14
|
+
Dir[File.join(__dir__, 'transformers', "#{t}s", '*.rb')].sort.each do |file|
|
15
|
+
require file
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Validators
|
4
|
+
# Checks YNAB4 row for validity. A row is valid if it has a Date, Payee, and
|
5
|
+
# one of Amount, Outflow, Inflow.
|
6
|
+
module YNAB4Row
|
7
|
+
# Validates a row
|
8
|
+
# @param row [Array<String, Numeric, Date>] The row to validate
|
9
|
+
# @return [Boolean] Whether the row is valid
|
10
|
+
def self.valid?(row)
|
11
|
+
# we are dealing with a YNAB4 row:
|
12
|
+
# %w[Date Payee Memo Amount|Outflow Inflow]
|
13
|
+
amount_valid?(row) &&
|
14
|
+
transaction_date_valid?(row) &&
|
15
|
+
payee_valid?(row)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Indicates which format the row is in (:flows or :amounts)
|
19
|
+
# @param row [CSV::Row] the row to check
|
20
|
+
# @return [:flows, :amounts] the row's format
|
21
|
+
def self.row_format(row)
|
22
|
+
format = :flows
|
23
|
+
# :flows has 5 columns: Date, Payee, Memo, Outflow, Inflow
|
24
|
+
# :amounts has 4 columns: Date, Payee, Memo, Amount
|
25
|
+
format = :amounts if row.length == 4
|
26
|
+
|
27
|
+
format
|
28
|
+
end
|
29
|
+
|
30
|
+
# Indicates whether the amount on the row is valid
|
31
|
+
# @param row [CSV::Row] the row to check
|
32
|
+
# @return [Boolean] whether the amount is invalid
|
33
|
+
def self.amount_valid?(row)
|
34
|
+
format = row_format(row)
|
35
|
+
indices = [3]
|
36
|
+
indices << 4 if format == :flows
|
37
|
+
|
38
|
+
if format == :amounts
|
39
|
+
return indices.reduce(true) do |valid, i|
|
40
|
+
valid && value_valid?(row[i])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
indices.reduce(false) do |valid, i|
|
45
|
+
valid || value_valid?(row[i])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Indicates whether a value is valid
|
50
|
+
# @note Prefer using the #valid? method
|
51
|
+
# @param value [#zero?, #nil?, #to_s] the value to check
|
52
|
+
# @return [Boolean] whether the value is valid
|
53
|
+
def self.value_valid?(value)
|
54
|
+
if value.respond_to? :zero?
|
55
|
+
!value.zero?
|
56
|
+
else
|
57
|
+
!value.nil? && !value.to_s.empty?
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Validates the Date value
|
62
|
+
# @note Prefer using the #valid? method
|
63
|
+
# @param row [Array<String, Numeric, Date] The row to validate
|
64
|
+
# @return [Boolean] Whether the row's Date is invalid
|
65
|
+
def self.transaction_date_valid?(row)
|
66
|
+
date_index = 0
|
67
|
+
date = row[date_index]
|
68
|
+
|
69
|
+
value_valid?(date)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Validates the Payee value
|
73
|
+
# @note Prefer using the #valid? method
|
74
|
+
# @param row [Array<String, Numeric, Date] The row to validate
|
75
|
+
# @return [Boolean] Whether the row's Payee is valid
|
76
|
+
def self.payee_valid?(row)
|
77
|
+
payee_index = 1
|
78
|
+
payee = row[payee_index]
|
79
|
+
|
80
|
+
value_valid?(payee)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/ynab_convert/version.rb
CHANGED
data/lib/ynab_convert.rb
CHANGED
@@ -3,7 +3,11 @@
|
|
3
3
|
require 'ynab_convert/version'
|
4
4
|
require 'slop'
|
5
5
|
require 'ynab_convert/logger'
|
6
|
-
require 'core_extensions/string
|
6
|
+
require 'core_extensions/string'
|
7
|
+
require 'byebug' if ENV['YNAB_CONVERT_DEBUG']
|
8
|
+
|
9
|
+
# FIXME: The architecture in here is not the greatest... It should be
|
10
|
+
# redesigned entirely.
|
7
11
|
|
8
12
|
# The application
|
9
13
|
module YnabConvert
|
@@ -32,7 +36,7 @@ module YnabConvert
|
|
32
36
|
|
33
37
|
begin
|
34
38
|
@processor = opts[:processor].new(
|
35
|
-
|
39
|
+
filepath: @file
|
36
40
|
)
|
37
41
|
rescue Errno::ENOENT
|
38
42
|
handle_file_not_found
|
@@ -98,7 +102,22 @@ module YnabConvert
|
|
98
102
|
end
|
99
103
|
|
100
104
|
def processor_class_name
|
101
|
-
|
105
|
+
# Processor class names don't always match camelcasing the `-i` argument
|
106
|
+
# from the command line. For those classes that don't, a lookup is
|
107
|
+
# performed to find the proper class name.
|
108
|
+
institution = @options[:institution].to_sym
|
109
|
+
institution_to_classname = {
|
110
|
+
ubs_chequing: 'UBSChequing',
|
111
|
+
ubs_credit: 'UBSCredit'
|
112
|
+
}
|
113
|
+
|
114
|
+
classname = institution_to_classname.fetch(institution) do |el|
|
115
|
+
# If the class name is "regular", it will be found by camelcasing the
|
116
|
+
# name passed as the `-i` argument from the command line.
|
117
|
+
el.to_s.camel_case
|
118
|
+
end
|
119
|
+
|
120
|
+
"Processors::#{classname}"
|
102
121
|
end
|
103
122
|
|
104
123
|
def processor
|
data/ynab_convert.gemspec
CHANGED
@@ -59,9 +59,13 @@ Gem::Specification.new do |spec|
|
|
59
59
|
spec.add_development_dependency 'rspec-core'
|
60
60
|
spec.add_development_dependency 'rubocop'
|
61
61
|
spec.add_development_dependency 'rubocop-rake'
|
62
|
+
spec.add_development_dependency 'rubocop-rspec'
|
62
63
|
spec.add_development_dependency 'simplecov'
|
63
64
|
spec.add_development_dependency 'solargraph'
|
65
|
+
spec.add_development_dependency 'vcr'
|
66
|
+
spec.add_development_dependency 'webmock'
|
64
67
|
|
65
68
|
spec.add_dependency 'i18n'
|
66
69
|
spec.add_dependency 'slop'
|
70
|
+
spec.add_dependency 'timecop'
|
67
71
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ynab_convert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- coaxial
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: simplecov
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +178,34 @@ dependencies:
|
|
164
178
|
- - ">="
|
165
179
|
- !ruby/object:Gem::Version
|
166
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: vcr
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: webmock
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
167
209
|
- !ruby/object:Gem::Dependency
|
168
210
|
name: i18n
|
169
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +234,20 @@ dependencies:
|
|
192
234
|
- - ">="
|
193
235
|
- !ruby/object:Gem::Version
|
194
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: timecop
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :runtime
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
195
251
|
description: |
|
196
252
|
Utility to convert CSV statements into the YNAB4 format for easier
|
197
253
|
transation import. Supports several banks and can easily be extended to
|
@@ -205,13 +261,14 @@ executables:
|
|
205
261
|
extensions: []
|
206
262
|
extra_rdoc_files: []
|
207
263
|
files:
|
264
|
+
- ".github/workflows/publish.yml"
|
265
|
+
- ".github/workflows/test.yml"
|
208
266
|
- ".gitignore"
|
209
267
|
- ".rspec"
|
210
268
|
- ".rubocop.yml"
|
211
269
|
- ".ruby-gemset"
|
212
270
|
- ".ruby-version"
|
213
271
|
- ".solargraph.yml"
|
214
|
-
- ".travis.yml"
|
215
272
|
- Gemfile
|
216
273
|
- Gemfile.lock
|
217
274
|
- Guardfile
|
@@ -224,15 +281,42 @@ files:
|
|
224
281
|
- lib/core_extensions/string.rb
|
225
282
|
- lib/slop/symbol.rb
|
226
283
|
- lib/ynab_convert.rb
|
284
|
+
- lib/ynab_convert/api_clients/api_client.rb
|
285
|
+
- lib/ynab_convert/api_clients/currency_api.rb
|
286
|
+
- lib/ynab_convert/documents.rb
|
287
|
+
- lib/ynab_convert/documents/statements/example_statement.rb
|
288
|
+
- lib/ynab_convert/documents/statements/n26_statement.rb
|
289
|
+
- lib/ynab_convert/documents/statements/statement.rb
|
290
|
+
- lib/ynab_convert/documents/statements/ubs_chequing_statement.rb
|
291
|
+
- lib/ynab_convert/documents/statements/ubs_credit_statement.rb
|
292
|
+
- lib/ynab_convert/documents/statements/wise_statement.rb
|
293
|
+
- lib/ynab_convert/documents/ynab4_files/ynab4_file.rb
|
227
294
|
- lib/ynab_convert/error.rb
|
228
295
|
- lib/ynab_convert/logger.rb
|
229
|
-
- lib/ynab_convert/processor/base.rb
|
230
|
-
- lib/ynab_convert/processor/example.rb
|
231
|
-
- lib/ynab_convert/processor/n26.rb
|
232
|
-
- lib/ynab_convert/processor/revolut.rb
|
233
|
-
- lib/ynab_convert/processor/ubs_chequing.rb
|
234
|
-
- lib/ynab_convert/processor/ubs_credit.rb
|
235
296
|
- lib/ynab_convert/processors.rb
|
297
|
+
- lib/ynab_convert/processors/example_processor.rb
|
298
|
+
- lib/ynab_convert/processors/n26_processor.rb
|
299
|
+
- lib/ynab_convert/processors/processor.rb
|
300
|
+
- lib/ynab_convert/processors/ubs_chequing_processor.rb
|
301
|
+
- lib/ynab_convert/processors/ubs_credit_processor.rb
|
302
|
+
- lib/ynab_convert/processors/wise_processor.rb
|
303
|
+
- lib/ynab_convert/transformers.rb
|
304
|
+
- lib/ynab_convert/transformers/cleaners/cleaner.rb
|
305
|
+
- lib/ynab_convert/transformers/cleaners/n26_cleaner.rb
|
306
|
+
- lib/ynab_convert/transformers/cleaners/ubs_chequing_cleaner.rb
|
307
|
+
- lib/ynab_convert/transformers/cleaners/ubs_credit_cleaner.rb
|
308
|
+
- lib/ynab_convert/transformers/cleaners/wise_cleaner.rb
|
309
|
+
- lib/ynab_convert/transformers/enhancers/enhancer.rb
|
310
|
+
- lib/ynab_convert/transformers/enhancers/n26_enhancer.rb
|
311
|
+
- lib/ynab_convert/transformers/enhancers/wise_enhancer.rb
|
312
|
+
- lib/ynab_convert/transformers/formatters/example_formatter.rb
|
313
|
+
- lib/ynab_convert/transformers/formatters/formatter.rb
|
314
|
+
- lib/ynab_convert/transformers/formatters/n26_formatter.rb
|
315
|
+
- lib/ynab_convert/transformers/formatters/ubs_chequing_formatter.rb
|
316
|
+
- lib/ynab_convert/transformers/formatters/ubs_credit_formatter.rb
|
317
|
+
- lib/ynab_convert/transformers/formatters/wise_formatter.rb
|
318
|
+
- lib/ynab_convert/validators.rb
|
319
|
+
- lib/ynab_convert/validators/ynab4_row_validator.rb
|
236
320
|
- lib/ynab_convert/version.rb
|
237
321
|
- ynab_convert.gemspec
|
238
322
|
homepage: https://github.com/coaxial/ynab_convert
|
@@ -259,7 +343,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
343
|
- !ruby/object:Gem::Version
|
260
344
|
version: '0'
|
261
345
|
requirements: []
|
262
|
-
rubygems_version: 3.0.
|
346
|
+
rubygems_version: 3.0.3
|
263
347
|
signing_key:
|
264
348
|
specification_version: 4
|
265
349
|
summary: Convert online banking CSV files to YNAB 4 format.
|
data/.travis.yml
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
---
|
2
|
-
language: ruby
|
3
|
-
cache: bundler
|
4
|
-
rvm:
|
5
|
-
- 2.6
|
6
|
-
- 2.7
|
7
|
-
before_install: gem install bundler
|
8
|
-
|
9
|
-
jobs:
|
10
|
-
include:
|
11
|
-
- stage: test
|
12
|
-
script: echo "Running tests for $(ruby -v)..." && bundle exec rake ci
|
13
|
-
- stage: gem release
|
14
|
-
rvm: 2.6
|
15
|
-
script: echo "Publishing to rubygems.org..."
|
16
|
-
deploy:
|
17
|
-
provider: rubygems
|
18
|
-
gem: ynab_convert
|
19
|
-
api_key: $RUBYGEMS_API_KEY
|
20
|
-
on: master
|