cremul-parser 0.0.6 → 0.8.0
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/.gitignore +3 -0
- data/CHANGELOG.md +8 -0
- data/lib/cremul/parser_helper.rb +26 -13
- data/lib/cremul/version.rb +1 -1
- data/lib/cremul_parser.rb +18 -3
- data/test/unit/parser_test.rb +41 -17
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f5e18fc594f98b2ceb5cb96264dfe9108b0e25f
|
4
|
+
data.tar.gz: da574cd070d87a669b0cb77718bcdcf976c7bf66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 539817f1790d87fb42e0f6457aca4854e1dbb2f4380c70a9206ec01f35f4ac1a2289d12ee0f873f47699f386fd7739132460254d606ea6c0d2cd58fb9b7affc7
|
7
|
+
data.tar.gz: c58ae3f7e2ca77b2ed3312d298595e22387877b9037dd72331b5fe4914869a6d091d6e06f774e89ef420becae5170ced80df975bc6b33797f206e7204252ca69
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.8.0
|
4
|
+
|
5
|
+
Bumped to version 0.8.0 to indicate that it is getting close to finished as a 1.0 version.
|
6
|
+
|
7
|
+
- Corrected a bug in the regular expressions
|
8
|
+
- Added support for multiple CREMUL messages in a single file
|
9
|
+
- Changed CremulParser.msg attr to CremulParser.messages (an array)
|
10
|
+
|
3
11
|
## 0.0.6
|
4
12
|
|
5
13
|
- Corrected a bug in CremulPaymentTx so that it is now able to handle empty FII segments.
|
data/lib/cremul/parser_helper.rb
CHANGED
@@ -69,7 +69,7 @@ module Cremul
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def msg_id_segment_index(segments)
|
72
|
-
segments.index { |x|
|
72
|
+
segments.index { |x| /^UNH.*/.match(x) }
|
73
73
|
end
|
74
74
|
|
75
75
|
def find_index_by_regex(segments, start_pos, end_pos=nil, regex)
|
@@ -88,54 +88,54 @@ module Cremul
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def next_date_segment_index(segments, start_pos, end_pos=nil)
|
91
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
91
|
+
find_index_by_regex(segments, start_pos, end_pos, /^DTM.*/)
|
92
92
|
end
|
93
93
|
|
94
94
|
def next_amount_segment_index(segments, start_pos, end_pos=nil)
|
95
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
95
|
+
find_index_by_regex(segments, start_pos, end_pos, /^MOA.*/)
|
96
96
|
end
|
97
97
|
|
98
98
|
def next_line_segment_index(segments, start_pos)
|
99
|
-
find_index_by_regex(segments, start_pos, segments.size,
|
99
|
+
find_index_by_regex(segments, start_pos, segments.size, /^LIN\+\d/)
|
100
100
|
end
|
101
101
|
|
102
102
|
def next_tx_sequence_segment_index(segments, start_pos)
|
103
|
-
find_index_by_regex(segments, start_pos, segments.size,
|
103
|
+
find_index_by_regex(segments, start_pos, segments.size, /^SEQ\+\+\d/)
|
104
104
|
end
|
105
105
|
|
106
106
|
def doc_segment_index(segments, start_pos, end_pos=nil)
|
107
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
107
|
+
find_index_by_regex(segments, start_pos, end_pos, /^DOC.*/)
|
108
108
|
end
|
109
109
|
|
110
110
|
def payment_details_segment_index(segments, start_pos, end_pos=nil)
|
111
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
111
|
+
find_index_by_regex(segments, start_pos, end_pos, /^FTX\+PMD.*/)
|
112
112
|
end
|
113
113
|
|
114
114
|
# Optional segment with free text info regarding the payment
|
115
115
|
def payment_advice_segment_index(segments, start_pos, end_pos=nil)
|
116
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
116
|
+
find_index_by_regex(segments, start_pos, end_pos, /^FTX\+AAG.*/)
|
117
117
|
end
|
118
118
|
|
119
119
|
def next_ref_segment_index(segments, start_pos, end_pos=nil)
|
120
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
120
|
+
find_index_by_regex(segments, start_pos, end_pos, /^RFF.*/)
|
121
121
|
end
|
122
122
|
|
123
123
|
# Bank account of beneficiary
|
124
124
|
def next_fii_bf_segment_index(segments, start_pos, end_pos=nil)
|
125
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
125
|
+
find_index_by_regex(segments, start_pos, end_pos, /^FII\+BF.*/)
|
126
126
|
end
|
127
127
|
|
128
128
|
# Bank account of payer
|
129
129
|
def next_fii_or_segment_index(segments, start_pos, end_pos=nil)
|
130
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
130
|
+
find_index_by_regex(segments, start_pos, end_pos, /^FII\+OR.*/)
|
131
131
|
end
|
132
132
|
|
133
133
|
def next_nad_segment_index(segments, start_pos, end_pos=nil)
|
134
|
-
find_index_by_regex(segments, start_pos, end_pos,
|
134
|
+
find_index_by_regex(segments, start_pos, end_pos, /^NAD.*/)
|
135
135
|
end
|
136
136
|
|
137
137
|
def line_count_segment_index(segments)
|
138
|
-
segments.index { |x|
|
138
|
+
segments.index { |x| /^CNT\+LIN?:\d/.match(x) }
|
139
139
|
end
|
140
140
|
|
141
141
|
def number_of_lines_in_message(segments)
|
@@ -183,6 +183,19 @@ module Cremul
|
|
183
183
|
n
|
184
184
|
end
|
185
185
|
|
186
|
+
def number_of_messages_in_file(segments)
|
187
|
+
m = {}
|
188
|
+
n = 0
|
189
|
+
segments.each_index do |i|
|
190
|
+
if /^UNA.*/.match(segments[i])
|
191
|
+
n += 1
|
192
|
+
m[n] = i
|
193
|
+
end
|
194
|
+
end
|
195
|
+
m
|
196
|
+
end
|
197
|
+
|
198
|
+
|
186
199
|
def last_segment_index_in_tx(segments, tx_segment_pos)
|
187
200
|
next_tx_index = next_tx_sequence_segment_index(segments, tx_segment_pos+1)
|
188
201
|
next_line_index = next_line_segment_index(segments, tx_segment_pos)
|
data/lib/cremul/version.rb
CHANGED
data/lib/cremul_parser.rb
CHANGED
@@ -6,9 +6,10 @@ require_relative 'cremul/cremul_message'
|
|
6
6
|
class CremulParser
|
7
7
|
include Cremul::ParserHelper
|
8
8
|
|
9
|
-
attr_reader :segments, :
|
9
|
+
attr_reader :segments, :messages
|
10
10
|
|
11
11
|
def initialize
|
12
|
+
@messages = []
|
12
13
|
end
|
13
14
|
|
14
15
|
def parse(file, file_encoding='utf-8')
|
@@ -20,10 +21,24 @@ class CremulParser
|
|
20
21
|
file_as_a_string += line.chomp # remove \n and \r from the end of the line
|
21
22
|
end
|
22
23
|
@segments = file_as_a_string.split("'")
|
23
|
-
|
24
|
+
@segments.each { |s| s.strip! }
|
25
|
+
# remove last segment if it is an empty string
|
26
|
+
if @segments[@segments.size-1].empty?
|
24
27
|
@segments = @segments.slice(0, @segments.size-1)
|
25
28
|
end
|
26
|
-
|
29
|
+
|
30
|
+
m = number_of_messages_in_file(@segments)
|
31
|
+
if m.size == 0
|
32
|
+
raise 'No CREMUL message found in file'
|
33
|
+
end
|
34
|
+
m.each do |n, start_index|
|
35
|
+
if n < m.size
|
36
|
+
@messages << CremulMessage.new(@segments[start_index, m[n+1] - start_index])
|
37
|
+
else
|
38
|
+
@messages << CremulMessage.new(@segments[start_index, @segments.size - start_index])
|
39
|
+
end
|
40
|
+
end
|
27
41
|
end
|
28
42
|
|
29
43
|
end
|
44
|
+
|
data/test/unit/parser_test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative '../test_helper'
|
2
|
+
require 'tempfile'
|
2
3
|
|
3
4
|
describe CremulParser do
|
4
5
|
|
@@ -10,11 +11,12 @@ describe CremulParser do
|
|
10
11
|
it 'should parse a valid cremul file with 1 line item' do
|
11
12
|
@parser.parse(File.open('files/CREMUL0001-utf-8.txt'))
|
12
13
|
@parser.segments.must_be_instance_of Array
|
13
|
-
@parser.
|
14
|
+
@parser.messages.size.must_equal 1
|
15
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
14
16
|
|
15
17
|
d2014_03_12 = Date.new(2014,3,12)
|
16
18
|
|
17
|
-
msg = @parser.
|
19
|
+
msg = @parser.messages[0]
|
18
20
|
msg.header.must_be_instance_of CremulHeader
|
19
21
|
msg.header.msg_id.must_include 'CREMUL'
|
20
22
|
msg.header.created_date.must_equal d2014_03_12
|
@@ -65,11 +67,11 @@ describe CremulParser do
|
|
65
67
|
it 'should parse a valid cremul file with multiple line items' do
|
66
68
|
@parser.parse(File.open('files/cremul_multi_lines.txt'))
|
67
69
|
@parser.segments.must_be_instance_of Array
|
68
|
-
@parser.
|
70
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
69
71
|
|
70
72
|
d2011_01_11 = Date.new(2011,1,11)
|
71
73
|
|
72
|
-
msg = @parser.
|
74
|
+
msg = @parser.messages[0]
|
73
75
|
msg.header.must_be_instance_of CremulHeader
|
74
76
|
msg.header.msg_id.must_include 'CREMUL'
|
75
77
|
msg.header.created_date.must_equal d2011_01_11
|
@@ -117,11 +119,11 @@ describe CremulParser do
|
|
117
119
|
it 'should parse a valid long cremul file' do
|
118
120
|
@parser.parse(File.open('files/CREMUL0003-utf-8.txt'))
|
119
121
|
@parser.segments.must_be_instance_of Array
|
120
|
-
@parser.
|
122
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
121
123
|
|
122
124
|
d2013_04_11 = Date.new(2013,4,11)
|
123
125
|
|
124
|
-
msg = @parser.
|
126
|
+
msg = @parser.messages[0]
|
125
127
|
msg.header.must_be_instance_of CremulHeader
|
126
128
|
msg.header.msg_id.must_include 'CREMUL'
|
127
129
|
msg.header.created_date.must_equal d2013_04_11
|
@@ -152,9 +154,9 @@ describe CremulParser do
|
|
152
154
|
it 'should convert a non-utf-8 file to utf-8 on the fly' do
|
153
155
|
@parser.parse(File.open('files/CREMUL0001.dat'), 'ISO-8859-1')
|
154
156
|
@parser.segments.must_be_instance_of Array
|
155
|
-
@parser.
|
157
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
156
158
|
|
157
|
-
msg = @parser.
|
159
|
+
msg = @parser.messages[0]
|
158
160
|
line = msg.lines[0]
|
159
161
|
tx = line.transactions[0]
|
160
162
|
tx.must_be_instance_of CremulPaymentTx
|
@@ -165,9 +167,9 @@ describe CremulParser do
|
|
165
167
|
it 'should parse name and address correctly' do
|
166
168
|
@parser.parse(File.open('files/CREMUL0002-27.05.14.DAT'), 'ISO-8859-1')
|
167
169
|
@parser.segments.must_be_instance_of Array
|
168
|
-
@parser.
|
170
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
169
171
|
|
170
|
-
msg = @parser.
|
172
|
+
msg = @parser.messages[0]
|
171
173
|
|
172
174
|
tx = msg.lines[0].transactions[0]
|
173
175
|
tx.must_be_instance_of CremulPaymentTx
|
@@ -182,23 +184,27 @@ describe CremulParser do
|
|
182
184
|
it 'should be able to parse a file with empty FII elements' do
|
183
185
|
@parser.parse(File.open('files/CREMUL0001-27.05.14.DAT'), 'ISO-8859-1')
|
184
186
|
@parser.segments.must_be_instance_of Array
|
185
|
-
@parser.
|
187
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
186
188
|
|
187
|
-
msg = @parser.
|
189
|
+
msg = @parser.messages[0]
|
188
190
|
msg.header.must_be_instance_of CremulHeader
|
189
191
|
msg.header.msg_id.must_include 'CREMUL'
|
190
192
|
msg.lines[0].transactions[0].payer_account_number.must_be_nil
|
191
193
|
end
|
192
194
|
|
193
195
|
|
194
|
-
#
|
196
|
+
# ----------------------------------------------------------------------
|
197
|
+
# the following tests are commented out as the corresponding cremul test file is not included in the Git repo
|
198
|
+
# ----------------------------------------------------------------------
|
199
|
+
|
200
|
+
|
195
201
|
=begin
|
196
202
|
it 'should parse a long file with multiple payment transactions' do
|
197
203
|
@parser.parse(File.open('files/CREMUL0002_23-05-14.dat'), 'ISO-8859-1')
|
198
204
|
@parser.segments.must_be_instance_of Array
|
199
|
-
@parser.
|
205
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
200
206
|
|
201
|
-
msg = @parser.
|
207
|
+
msg = @parser.messages[0]
|
202
208
|
|
203
209
|
froland_tx = msg.lines[1].transactions[1]
|
204
210
|
froland_tx.must_be_instance_of CremulPaymentTx
|
@@ -207,8 +213,26 @@ describe CremulParser do
|
|
207
213
|
braekstad_tx = msg.lines[2].transactions[0]
|
208
214
|
braekstad_tx.invoice_ref.must_equal '20140453869'
|
209
215
|
end
|
216
|
+
|
217
|
+
|
218
|
+
it 'should parse a multi-message file' do
|
219
|
+
@parser.parse(File.open('files/CREMUL_multi_message.dat'), 'ISO-8859-1')
|
220
|
+
@parser.segments.must_be_instance_of Array
|
221
|
+
@parser.messages.size.must_equal 3
|
222
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
223
|
+
|
224
|
+
#write_segments_to_file(@parser.segments, File.open('files/CREMUL_multi_message_segments.txt', 'w'))
|
225
|
+
end
|
210
226
|
=end
|
211
227
|
|
228
|
+
def write_segments_to_file(msg, file)
|
229
|
+
begin
|
230
|
+
msg.each { |segment| file.puts segment }
|
231
|
+
ensure
|
232
|
+
file.close
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
212
236
|
|
213
237
|
# ----------------------------------------------------------------------
|
214
238
|
# Some tests to handle file format errors (?) that we have encountered
|
@@ -217,9 +241,9 @@ describe CremulParser do
|
|
217
241
|
it 'should parse a file with a CNT:LIN symbol instead of CNT:LI as the standard says' do
|
218
242
|
@parser.parse(File.open('files/CREMUL0001_1.dat'), 'ISO-8859-1')
|
219
243
|
@parser.segments.must_be_instance_of Array
|
220
|
-
@parser.
|
244
|
+
@parser.messages[0].must_be_instance_of CremulMessage
|
221
245
|
|
222
|
-
msg = @parser.
|
246
|
+
msg = @parser.messages[0]
|
223
247
|
line = msg.lines[0]
|
224
248
|
tx = line.transactions[0]
|
225
249
|
tx.must_be_instance_of CremulPaymentTx
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cremul-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Per Spilling
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|