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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/publish.yml +36 -0
  3. data/.github/workflows/test.yml +31 -0
  4. data/.gitignore +2 -0
  5. data/.rubocop.yml +10 -2
  6. data/Gemfile.lock +39 -14
  7. data/Guardfile +1 -29
  8. data/README.md +82 -7
  9. data/lib/ynab_convert/api_clients/api_client.rb +24 -0
  10. data/lib/ynab_convert/api_clients/currency_api.rb +66 -0
  11. data/lib/ynab_convert/documents/statements/example_statement.rb +16 -0
  12. data/lib/ynab_convert/documents/statements/n26_statement.rb +24 -0
  13. data/lib/ynab_convert/documents/statements/statement.rb +39 -0
  14. data/lib/ynab_convert/documents/statements/ubs_chequing_statement.rb +20 -0
  15. data/lib/ynab_convert/documents/statements/ubs_credit_statement.rb +19 -0
  16. data/lib/ynab_convert/documents/statements/wise_statement.rb +17 -0
  17. data/lib/ynab_convert/documents/ynab4_files/ynab4_file.rb +58 -0
  18. data/lib/ynab_convert/documents.rb +17 -0
  19. data/lib/ynab_convert/logger.rb +1 -1
  20. data/lib/ynab_convert/processors/example_processor.rb +24 -0
  21. data/lib/ynab_convert/processors/n26_processor.rb +26 -0
  22. data/lib/ynab_convert/processors/processor.rb +75 -0
  23. data/lib/ynab_convert/processors/ubs_chequing_processor.rb +21 -0
  24. data/lib/ynab_convert/processors/ubs_credit_processor.rb +17 -0
  25. data/lib/ynab_convert/processors/wise_processor.rb +19 -0
  26. data/lib/ynab_convert/processors.rb +2 -2
  27. data/lib/ynab_convert/transformers/cleaners/cleaner.rb +17 -0
  28. data/lib/ynab_convert/transformers/cleaners/n26_cleaner.rb +13 -0
  29. data/lib/ynab_convert/transformers/cleaners/ubs_chequing_cleaner.rb +98 -0
  30. data/lib/ynab_convert/transformers/cleaners/ubs_credit_cleaner.rb +45 -0
  31. data/lib/ynab_convert/transformers/cleaners/wise_cleaner.rb +39 -0
  32. data/lib/ynab_convert/transformers/enhancers/enhancer.rb +20 -0
  33. data/lib/ynab_convert/transformers/enhancers/n26_enhancer.rb +74 -0
  34. data/lib/ynab_convert/transformers/enhancers/wise_enhancer.rb +87 -0
  35. data/lib/ynab_convert/transformers/formatters/example_formatter.rb +12 -0
  36. data/lib/ynab_convert/transformers/formatters/formatter.rb +91 -0
  37. data/lib/ynab_convert/transformers/formatters/n26_formatter.rb +19 -0
  38. data/lib/ynab_convert/transformers/formatters/ubs_chequing_formatter.rb +12 -0
  39. data/lib/ynab_convert/transformers/formatters/ubs_credit_formatter.rb +12 -0
  40. data/lib/ynab_convert/transformers/formatters/wise_formatter.rb +35 -0
  41. data/lib/ynab_convert/transformers.rb +18 -0
  42. data/lib/ynab_convert/validators/ynab4_row_validator.rb +83 -0
  43. data/lib/ynab_convert/validators.rb +9 -0
  44. data/lib/ynab_convert/version.rb +1 -1
  45. data/lib/ynab_convert.rb +22 -3
  46. data/ynab_convert.gemspec +4 -0
  47. metadata +94 -10
  48. data/.travis.yml +0 -20
  49. data/lib/ynab_convert/processor/base.rb +0 -226
  50. data/lib/ynab_convert/processor/example.rb +0 -124
  51. data/lib/ynab_convert/processor/n26.rb +0 -70
  52. data/lib/ynab_convert/processor/revolut.rb +0 -103
  53. data/lib/ynab_convert/processor/ubs_chequing.rb +0 -137
  54. data/lib/ynab_convert/processor/ubs_credit.rb +0 -83
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Transformers
4
+ module Formatters
5
+ # Example Formatter
6
+ class Example < Formatter
7
+ def initialize
8
+ super({ date: [0], payee: [2], outflow: [3], inflow: [4] })
9
+ end
10
+ end
11
+ end
12
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Regroups all the row validators
4
+ module Validators
5
+ # Load all known Validators
6
+ Dir[File.join(__dir__, 'validators', '*.rb')].sort.each do |file|
7
+ require file
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module YnabConvert
4
- VERSION = '1.0.8'
4
+ VERSION = '2.0.3'
5
5
  end
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.rb'
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
- file: @file
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
- "Processor::#{@options[:institution].camel_case}"
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: 1.0.8
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-03-07 00:00:00.000000000 Z
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.8
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