ynab_convert 1.0.8 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.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
|