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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f2c04ee6768afa1d21f139da326fb010b854930b
4
- data.tar.gz: 9db6a55b1157b60a5c1152f1c160094480d752a3
3
+ metadata.gz: 6f5e18fc594f98b2ceb5cb96264dfe9108b0e25f
4
+ data.tar.gz: da574cd070d87a669b0cb77718bcdcf976c7bf66
5
5
  SHA512:
6
- metadata.gz: bfc36832e27bd0ea30bf86f89a31dff2aeddbc107153a7ab24b883c2bb99e43fbc34930b8c2fc72c324c34e3751655ac798ade2b304d1d970449941ab84537c9
7
- data.tar.gz: 2c0365b3dab99454e5ec557d71d7c2a1e3bcf865935abb689e04b24feaa415c179aaad66231f481807d7b8e5b070380695847c37a45e71e6416698bb522d4c19
6
+ metadata.gz: 539817f1790d87fb42e0f6457aca4854e1dbb2f4380c70a9206ec01f35f4ac1a2289d12ee0f873f47699f386fd7739132460254d606ea6c0d2cd58fb9b7affc7
7
+ data.tar.gz: c58ae3f7e2ca77b2ed3312d298595e22387877b9037dd72331b5fe4914869a6d091d6e06f774e89ef420becae5170ced80df975bc6b33797f206e7204252ca69
data/.gitignore CHANGED
@@ -16,4 +16,7 @@ spec/reports
16
16
  test/tmp
17
17
  test/version_tmp
18
18
  tmp
19
+ .DS_Store
19
20
  CREMUL0002_23-05-14.DAT
21
+ CREMUL_multi_message.DAT
22
+ CREMUL_multi_message_segments.txt
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.
@@ -69,7 +69,7 @@ module Cremul
69
69
  end
70
70
 
71
71
  def msg_id_segment_index(segments)
72
- segments.index { |x| /UNH.*/.match(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, /DTM.*/)
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, /MOA.*/)
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, /LIN\+\d/)
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, /SEQ\+\+\d/)
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, /DOC.*/)
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, /FTX\+PMD.*/)
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, /FTX\+AAG.*/)
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, /RFF.*/)
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, /FII\+BF.*/)
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, /FII\+OR.*/)
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, /NAD.*/)
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| /CNT\+LIN?:\d/.match(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)
@@ -1,3 +1,3 @@
1
1
  module Cremul
2
- VERSION = '0.0.6'
2
+ VERSION = '0.8.0'
3
3
  end
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, :msg
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
- if @segments[@segments.size-1].strip.empty?
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
- @msg = CremulMessage.new(@segments)
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
+
@@ -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.msg.must_be_instance_of CremulMessage
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.msg
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.msg.must_be_instance_of CremulMessage
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.msg
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.msg.must_be_instance_of CremulMessage
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.msg
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.msg.must_be_instance_of CremulMessage
157
+ @parser.messages[0].must_be_instance_of CremulMessage
156
158
 
157
- msg = @parser.msg
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.msg.must_be_instance_of CremulMessage
170
+ @parser.messages[0].must_be_instance_of CremulMessage
169
171
 
170
- msg = @parser.msg
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.msg.must_be_instance_of CremulMessage
187
+ @parser.messages[0].must_be_instance_of CremulMessage
186
188
 
187
- msg = @parser.msg
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
- # the following test is commented out as the corresponding cremul test file is not included in the Git repo
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.msg.must_be_instance_of CremulMessage
205
+ @parser.messages[0].must_be_instance_of CremulMessage
200
206
 
201
- msg = @parser.msg
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.msg.must_be_instance_of CremulMessage
244
+ @parser.messages[0].must_be_instance_of CremulMessage
221
245
 
222
- msg = @parser.msg
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.6
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-05-27 00:00:00.000000000 Z
11
+ date: 2014-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler