cmxl 1.5.0 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 661a3296bdc88ce9874f07cb4a1cf4220bf1a60ea559e289edc5c5c34774764b
4
- data.tar.gz: 4f0217f656646bd14540e5993f6419354641f30d901e8b7afc884b46fc5ac69e
3
+ metadata.gz: 1c172d6b56767a8860f57c4b802c7ed2ed2bae3658f6db104f44795a377bf067
4
+ data.tar.gz: ececb262e0d6a40c97e7ca54dcac08208e1942792c5f493be179ba3c81ece6b7
5
5
  SHA512:
6
- metadata.gz: 407ecb157601f8cc767ddb7699edbadc66582041cdcd8d1de3b3e169a41865d3f81ffdb794b7b9f8add8a55ecea1e16e4048f30a117cfe2401b05b487d2e1bcf
7
- data.tar.gz: 4cbfe3e46cc9a00527bfa1a4d465f5e0ad4311d915449b45a81b172e1a653ee3ec2605778bb1241aca752016651b8f54dad0daf00769349a6a80cb679cff0dcf
6
+ metadata.gz: f0f673453d6bbbc39313ed7ae86ff574c4c9d60a0ea5543283f38d1f3bf4f7477625e2bc87a1fbdc62714c86461735a7e16796edd54cd361d52d49d2eb05d8db
7
+ data.tar.gz: a197094a3ccd4235f8811a456dbd54c43bc3b49a47062a72f7b9ee53610ddbb4e79ce97e53e0f90670a0c5e3cb5f08ef490792506dc6cc1202d5442c4f724710
@@ -0,0 +1,30 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ ruby-version:
16
+ - 3.3
17
+ - 3.2
18
+ - 3.1
19
+ - "3.0"
20
+ - jruby-9.4
21
+
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - name: Set up Ruby ${{ matrix.ruby-version }}
25
+ uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: ${{ matrix.ruby-version }}
28
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
29
+ - name: Run tests
30
+ run: bundle exec rake
@@ -0,0 +1,26 @@
1
+ name: Release
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ push:
9
+ name: Push gem to RubyGems.org
10
+ runs-on: ubuntu-latest
11
+
12
+ permissions:
13
+ id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
14
+ contents: write # IMPORTANT: this permission is required for `rake release` to push the release tag
15
+
16
+ steps:
17
+ # Set up
18
+ - uses: actions/checkout@v4
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@v1
21
+ with:
22
+ bundler-cache: true
23
+ ruby-version: ruby
24
+
25
+ # Release
26
+ - uses: rubygems/release-gem@v1
data/.rspec CHANGED
@@ -1 +1 @@
1
- --color
1
+ --color
data/CHANGELOG.mdown CHANGED
@@ -1,5 +1,10 @@
1
1
  # NEXT release
2
2
 
3
+ # 2.0
4
+ - `[REFACTOR]` **DEPRECATED:** `storno?` and related methods `storno_credit`, `storno_debit`. Use `reversal?` and related methods `reversal_credit?`, `reversal_debit?` instead
5
+ - `[BUGFIX]` **DEPRECATED:** `funds_code` method returns the `credit_debit_indicator` from the SWIFT definition. Therefore the method is deprecated in favor of `credit_debit_indicator` method
6
+ - `[HOUSEKEEPING]` [Replace Travis CI with github actions](https://github.com/railslove/cmxl/pull/57)
7
+
3
8
  # 1.5.0
4
9
 
5
10
  - `[BUGFIX]` fix potential bug when generation_date is not provided in field 20 and 13 (issue: [#35](https://github.com/railslove/cmxl/issues/35) PR: [#36](https://github.com/railslove/cmxl/pull/36))
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- [![Build Status](https://travis-ci.org/railslove/cmxl.svg?branch=master)](https://travis-ci.org/railslove/cmxl)
2
- [![Gem Version](https://badge.fury.io/rb/cmxl.svg)](http://badge.fury.io/rb/cmxl)
1
+ [![CI](https://github.com/railslove/cmxl/actions/workflows/ci.yml/badge.svg)](https://github.com/railslove/cmxl/actions/workflows/ci.yml)
2
+ [![Gem Version](https://badge.fury.io/rb/cmxl.svg)](https://rubygems.org/gems/cmxl)
3
3
 
4
4
  # Cmxl - your friendly ruby MT940 parser
5
5
 
@@ -16,7 +16,7 @@ For more information have a look at the different [SWIFT message types](http://e
16
16
 
17
17
  At some point in the future MT940 file should be exchanged with newer XML documents - but banking institutions are slow, so MT940 will stick around for a while.
18
18
 
19
- ## Reqirements
19
+ ## Requirements
20
20
 
21
21
  Cmxl is a pure ruby parser and has no dependency on native extensions.
22
22
 
@@ -68,7 +68,7 @@ statements.each do |s|
68
68
  puts t.information
69
69
  puts t.description
70
70
  puts t.entry_date
71
- puts t.funds_code
71
+ puts t.credit_debit_indicator
72
72
  puts t.credit?
73
73
  puts t.debit?
74
74
  puts t.sign # -1 if it's a debit; 1 if it's a credit
@@ -96,7 +96,7 @@ If that fails, try to modify the file before you pass it to the parser - and ple
96
96
  ### MT940 SWIFT header data
97
97
 
98
98
  Cmxl currently does not support parsing of the SWIFT headers (like {1:F01AXISINBBA ....)
99
- If your file comes with these headers try the `strip_headers` configuration option to strip data execpt the actual MT940 fields.
99
+ If your file comes with these headers try the `strip_headers` configuration option to strip data except the actual MT940 fields.
100
100
 
101
101
  ```ruby
102
102
  Cmxl.config[:strip_headers] = true
@@ -187,6 +187,6 @@ other parsers:
187
187
 
188
188
  ---
189
189
  built with love by [Railslove](http://railslove.com) and some [amazing people](https://github.com/railslove/cmxl/graphs/contributors).
190
- Released under the MIT-Licence.
190
+ Released under the MIT-License.
191
191
 
192
192
  Railslove builds FinTech products, if you need support for your project we are happy to help. Please contact us at team@railslove.com.
data/cmxl.gemspec CHANGED
@@ -19,11 +19,11 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
+ spec.add_dependency 'rchardet'
23
+
22
24
  spec.add_development_dependency 'bundler'
23
25
  spec.add_development_dependency 'pry'
24
26
  spec.add_development_dependency 'rake'
25
27
  spec.add_development_dependency 'rspec', '~>3.0'
26
28
  spec.add_development_dependency 'simplecov'
27
-
28
- spec.add_dependency 'rchardet19'
29
29
  end
data/lib/cmxl/field.rb CHANGED
@@ -13,7 +13,7 @@ module Cmxl
13
13
 
14
14
  # The parser class variable is the registry of all available parser.
15
15
  # It is a hash with the tag (MT940 field number/tag) as key and the class as value
16
- # When parsing a statment line we look for a matching entry or use the Unknown class as default
16
+ # When parsing a statement line we look for a matching entry or use the Unknown class as default
17
17
  @@parsers = {}
18
18
  @@parsers.default = Unknown
19
19
  def self.parsers
@@ -2,7 +2,7 @@ module Cmxl
2
2
  module Fields
3
3
  class Transaction < Field
4
4
  self.tag = 61
5
- self.parser = %r{^(?<date>\d{6})(?<entry_date>\d{4})?(?<storno_flag>R?)(?<funds_code>[CD]{1})(?<currency_letter>[a-zA-Z])?(?<amount>\d{1,12},\d{0,2})(?<swift_code>(?:N|F|S).{3})(?<reference>NONREF|(.(?!\/\/)){,16}([^\/]){,1})((?:\/\/)(?<bank_reference>[^\n]{,16}))?((?:\n)(?<supplementary>.{,34}))?$}
5
+ self.parser = %r{^(?<date>\d{6})(?<entry_date>\d{4})?(?<credit_debit_indicator>D|C|RD|RC|ED|EC)(?<currency_letter>[a-zA-Z])?(?<amount>\d{1,12},\d{0,2})(?<swift_code>(?:N|F|S).{3})(?<reference>NONREF|(.(?!\/\/)){,16}([^\/]){,1})((?:\/\/)(?<bank_reference>[^\n]{,16}))?((?:\n)(?<supplementary>.{,34}))?$}
6
6
 
7
7
  attr_accessor :details
8
8
 
@@ -15,31 +15,63 @@ module Cmxl
15
15
  end
16
16
 
17
17
  def credit?
18
- data['funds_code'].to_s.casecmp('C').zero?
18
+ credit_debit_indicator.include?('C')
19
19
  end
20
20
 
21
21
  def debit?
22
- data['funds_code'].to_s.casecmp('D').zero?
22
+ credit_debit_indicator.include?('D')
23
23
  end
24
24
 
25
25
  def storno_credit?
26
+ warn "[DEPRECATION] `storno_credit?` is deprecated. Please use `reversal_credit?` instead. It will be removed in version 3.0."
27
+ reversal_credit?
28
+ end
29
+
30
+ def reversal_credit?
26
31
  credit? && storno?
27
32
  end
28
33
 
29
34
  def storno_debit?
35
+ warn "[DEPRECATION] `storno_debit?` is deprecated. Please use `reversal_debit?` instead. It will be removed in version 3.0."
36
+ reversal_debit?
37
+ end
38
+
39
+ def reversal_debit?
30
40
  debit? && storno?
31
41
  end
32
42
 
33
43
  def storno?
34
- !storno_flag.empty?
44
+ warn "[DEPRECATION] `storno?` is deprecated. Please use `reversal?` instead. It will be removed in version 3.0."
45
+ reversal?
46
+ end
47
+
48
+ def reversal?
49
+ credit_debit_indicator.include?('R')
50
+ end
51
+
52
+ def expected_credit?
53
+ credit? && expected?
54
+ end
55
+
56
+ def expected_debit?
57
+ debit? && expected?
58
+ end
59
+
60
+ def expected?
61
+ credit_debit_indicator.include?('E')
62
+ end
63
+
64
+ def credit_debit_indicator
65
+ data['credit_debit_indicator'].to_s
35
66
  end
36
67
 
37
68
  def funds_code
38
- data.values_at('storno_flag', 'funds_code').join
69
+ warn "[DEPRECATION] `funds_code` is deprecated. Please use `credit_debit_indicator` instead. It will be removed in version 3.0."
70
+ data['credit_debit_indicator'].to_s
39
71
  end
40
72
 
41
73
  def storno_flag
42
- data['storno_flag']
74
+ reversal? ? 'R' : ''
43
75
  end
44
76
 
45
77
  def sign
@@ -140,8 +172,11 @@ module Cmxl
140
172
  'sign' => sign,
141
173
  'debit' => debit?,
142
174
  'credit' => credit?,
143
- 'storno' => storno?,
144
- 'funds_code' => funds_code,
175
+ 'storno' => reversal?,
176
+ 'reversal' => reversal?,
177
+ 'expected' => expected?,
178
+ 'funds_code' => credit_debit_indicator,
179
+ 'credit_debit_indicator' => credit_debit_indicator,
145
180
  'swift_code' => swift_code,
146
181
  'reference' => reference,
147
182
  'bank_reference' => bank_reference,
data/lib/cmxl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cmxl
2
- VERSION = '1.5.0'.freeze
2
+ VERSION = '2.0'.freeze
3
3
  end
data/lib/cmxl.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'cmxl/version'
2
2
 
3
- require 'rchardet19'
3
+ require 'rchardet'
4
4
 
5
5
  require 'cmxl/field'
6
6
  require 'cmxl/statement'
@@ -31,8 +31,8 @@ module Cmxl
31
31
  def self.parse(data, options = {})
32
32
  options[:statement_separator] ||= config[:statement_separator]
33
33
  # if no encoding is provided we try to guess using CharDet
34
- if options[:encoding].nil? && cd = CharDet.detect(data, silent: true)
35
- options[:encoding] = cd.encoding
34
+ if options[:encoding].nil? && cd = CharDet.detect(data)
35
+ options[:encoding] = cd['encoding']
36
36
  end
37
37
 
38
38
  if options[:encoding]
@@ -7,7 +7,7 @@ describe Cmxl::Fields::Transaction do
7
7
  subject(:ocmt_cghs_transaction) { Cmxl::Fields::Transaction.parse(fixture_line(:statement_ocmt_chgs)) }
8
8
  subject(:supplementary_transaction) { Cmxl::Fields::Transaction.parse(fixture_line(:statement_supplementary_plain)) }
9
9
  subject(:complex_supplementary_transaction) { Cmxl::Fields::Transaction.parse(fixture_line(:statement_supplementary_complex)) }
10
- subject(:valuta_after_enty_date) { Cmxl::Fields::Transaction.parse(fixture[3]) }
10
+ subject(:valuta_after_entry_date) { Cmxl::Fields::Transaction.parse(fixture[3]) }
11
11
  subject(:entry_before_valuta_transaction) { Cmxl::Fields::Transaction.parse(fixture[2]) }
12
12
  subject(:transaction_type_swift) { Cmxl::Fields::Transaction.parse(fixture[4]) }
13
13
 
@@ -70,6 +70,11 @@ describe Cmxl::Fields::Transaction do
70
70
  end
71
71
 
72
72
  context 'statement with complex supplementary' do
73
+ it 'future reference' do
74
+ result = Cmxl::Fields::Transaction.parse(':61:2412121212ED162,57NDDTNONREF//950\n')
75
+ expect(result.amount).to eql(162.57)
76
+ end
77
+
73
78
  it { expect(complex_supplementary_transaction.initial_amount_in_cents).to eql(nil) }
74
79
  it { expect(complex_supplementary_transaction.initial_currency).to eql(nil) }
75
80
 
@@ -82,14 +87,14 @@ describe Cmxl::Fields::Transaction do
82
87
  end
83
88
 
84
89
  context 'valuta and entry-date assumptions' do
85
- it 'entry_date before valuta is recognized correclty when including year-change' do
90
+ it 'entry_date before valuta is recognized correctly when including year-change' do
86
91
  expect(entry_before_valuta_transaction.date).to eql(Date.new(2014, 1, 10))
87
92
  expect(entry_before_valuta_transaction.entry_date).to eql(Date.new(2013, 12, 24))
88
93
  end
89
94
 
90
95
  it 'entry_date after valuta is recognized correctly when including year-change' do
91
- expect(valuta_after_enty_date.date).to eql(Date.new(2014, 12, 24))
92
- expect(valuta_after_enty_date.entry_date).to eql(Date.new(2015, 1, 2))
96
+ expect(valuta_after_entry_date.date).to eql(Date.new(2014, 12, 24))
97
+ expect(valuta_after_entry_date.entry_date).to eql(Date.new(2015, 1, 2))
93
98
  end
94
99
  end
95
100
 
@@ -107,4 +112,77 @@ describe Cmxl::Fields::Transaction do
107
112
  it { expect(transaction_type_swift).not_to be_storno }
108
113
  it { expect(transaction_type_swift.sign).to eql(1) }
109
114
  end
115
+
116
+ describe '#credit_debit_indicator' do
117
+ it 'returns the credit_debit_indicator as debit' do
118
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902DR000000000001,62NTRF0000549855700010//025498557/000001')
119
+ expect(result.credit_debit_indicator).to eql('D')
120
+ end
121
+
122
+ it 'returns the credit_debit_indicator as credit' do
123
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902CR000000000001,62NTRF0000549855700010//025498557/000001')
124
+ expect(result.credit_debit_indicator).to eql('C')
125
+ end
126
+
127
+ it 'returns the credit_debit_indicator as reversal credit' do
128
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902RC000000000001,62NTRF0000549855700010//025498557/000001')
129
+ expect(result.credit_debit_indicator).to eql('RC')
130
+ end
131
+
132
+ it 'returns the credit_debit_indicator as reversal debit' do
133
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902RD000000000001,62NTRF0000549855700010//025498557/000001')
134
+ expect(result.credit_debit_indicator).to eql('RD')
135
+ end
136
+
137
+ it 'returns the credit_debit_indicator as expected credit' do
138
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902EC000000000001,62NTRF0000549855700010//025498557/000001')
139
+ expect(result.credit_debit_indicator).to eql('EC')
140
+ end
141
+ end
142
+
143
+ describe '#expected?' do
144
+ it 'returns true if the transaction is expected' do
145
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902EC000000000001,62NTRF0000549855700010//025498557/000001')
146
+ expect(result).to be_expected
147
+ end
148
+
149
+ it 'returns false if the transaction is not expected' do
150
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902RD000000000001,62NTRF0000549855700010//025498557/000001')
151
+ expect(result).not_to be_expected
152
+ end
153
+ end
154
+
155
+ describe '#expected_credit?' do
156
+ it 'returns true if the transaction is expected and credit' do
157
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902EC000000000001,62NTRF0000549855700010//025498557/000001')
158
+ expect(result).to be_expected_credit
159
+ end
160
+
161
+ it 'returns false if the transaction is not expected and credit' do
162
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902RC000000000001,62NTRF0000549855700010//025498557/000001')
163
+ expect(result).not_to be_expected_credit
164
+ end
165
+
166
+ it 'returns false if the transaction is expected and debit' do
167
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902ED000000000001,62NTRF0000549855700010//025498557/000001')
168
+ expect(result).not_to be_expected_credit
169
+ end
170
+ end
171
+
172
+ describe '#expected_debit?' do
173
+ it 'returns true if the transaction is expected and debit' do
174
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902ED000000000001,62NTRF0000549855700010//025498557/000001')
175
+ expect(result).to be_expected_debit
176
+ end
177
+
178
+ it 'returns false if the transaction is not expected and debit' do
179
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902RD000000000001,62NTRF0000549855700010//025498557/000001')
180
+ expect(result).not_to be_expected_debit
181
+ end
182
+
183
+ it 'returns false if the transaction is expected and credit' do
184
+ result = Cmxl::Fields::Transaction.parse(':61:1409010902EC000000000001,62NTRF0000549855700010//025498557/000001')
185
+ expect(result).not_to be_expected_debit
186
+ end
187
+ end
110
188
  end
@@ -27,9 +27,12 @@ describe Cmxl do
27
27
  'bank_reference' => '025498557/000001',
28
28
  'amount_in_cents' => 162,
29
29
  'sign' => -1,
30
+ 'credit_debit_indicator' => 'D',
30
31
  'debit' => true,
31
32
  'credit' => false,
32
33
  'storno' => false,
34
+ 'reversal' => false,
35
+ 'expected' => false,
33
36
  'bic' => 'HYVEDEMMXXX',
34
37
  'iban' => 'HUkkbbbsssskcccccccccccccccx',
35
38
  'name' => 'Peter Pan',
@@ -81,6 +84,7 @@ describe Cmxl do
81
84
  'sha' => '3c5e65aa3d3878b06b58b6f1ae2f3693004dfb04e3ab7119a1c1244e612293da',
82
85
  'entry_date' => Date.new(2014, 9, 2),
83
86
  'funds_code' => 'D',
87
+ 'credit_debit_indicator' => 'D',
84
88
  'currency_letter' => 'R',
85
89
  'amount' => 1.62,
86
90
  'swift_code' => 'NTRF',
@@ -90,7 +94,9 @@ describe Cmxl do
90
94
  'sign' => -1,
91
95
  'debit' => true,
92
96
  'credit' => false,
93
- 'storno' => false
97
+ 'storno' => false,
98
+ 'reversal' => false,
99
+ 'expected' => false,
94
100
  )
95
101
  end
96
102
  end
metadata CHANGED
@@ -1,15 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmxl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: '2.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bumann
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2020-07-10 00:00:00.000000000 Z
10
+ date: 2025-01-10 00:00:00.000000000 Z
12
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rchardet
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
13
26
  - !ruby/object:Gem::Dependency
14
27
  name: bundler
15
28
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +93,6 @@ dependencies:
80
93
  - - ">="
81
94
  - !ruby/object:Gem::Version
82
95
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rchardet19
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
96
  description: Cmxl provides an friendly, extensible and customizable parser for the
98
97
  MT940 bank statement format.
99
98
  email:
@@ -102,9 +101,10 @@ executables: []
102
101
  extensions: []
103
102
  extra_rdoc_files: []
104
103
  files:
104
+ - ".github/workflows/ci.yml"
105
+ - ".github/workflows/release.yml"
105
106
  - ".gitignore"
106
107
  - ".rspec"
107
- - ".travis.yml"
108
108
  - CHANGELOG.mdown
109
109
  - Gemfile
110
110
  - LICENSE.txt
@@ -198,8 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
198
  - !ruby/object:Gem::Version
199
199
  version: '0'
200
200
  requirements: []
201
- rubygems_version: 3.1.2
202
- signing_key:
201
+ rubygems_version: 3.6.2
203
202
  specification_version: 4
204
203
  summary: Cmxl is your friendly MT940 bank statement parser
205
204
  test_files:
data/.travis.yml DELETED
@@ -1,9 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.10
5
- - 2.5.8
6
- - 2.6.6
7
- - 2.7.1
8
- - jruby-9.1.17.0
9
- - jruby-9.2.11.1