cremul-parser 0.8.0 → 0.9.1
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/CHANGELOG.md +7 -0
- data/README.md +10 -1
- data/cremul-parser.gemspec +1 -1
- data/lib/cremul/cremul_line.rb +6 -4
- data/lib/cremul/cremul_message.rb +6 -4
- data/lib/cremul/cremul_payment_tx.rb +3 -2
- data/lib/cremul/cremul_reference.rb +2 -2
- data/lib/cremul/parser_helper.rb +1 -1
- data/lib/cremul/version.rb +1 -1
- data/lib/cremul_parser.rb +12 -3
- data/test/unit/parser_test.rb +4 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8b899dbadb7e1c564cd1156b647acf50fb818f4
|
4
|
+
data.tar.gz: c9f86c8f677051c98481a91b1a751cb3193d654e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4adb22742847f7ef5f75588f51a837e0b3606a089f21a93907626b2f930169f0cbe37b726d8fc101802184bc8c2ae9a6ae5cde2d51317d06ed93bad36e7a1abe
|
7
|
+
data.tar.gz: e3633e40dd71dc802aeb77af7669e24f84d8447bec993835c2d2d5c31e364e13d4ad8901de329b292249c593706ae5937c652bcbe77e2daa26ca774292b3ca32
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.9.0
|
4
|
+
|
5
|
+
Added index numbers to CremulMessage, CremulLine and CremulPaymentTx. The hash of the file +
|
6
|
+
the index numbers can be used to create unique ids for each payment transaction. This can be
|
7
|
+
useful for instance when importing a large Cremul file into a database when you want to make
|
8
|
+
sure that none of the transactions have already been imported.
|
9
|
+
|
3
10
|
## 0.8.0
|
4
11
|
|
5
12
|
Bumped to version 0.8.0 to indicate that it is getting close to finished as a 1.0 version.
|
data/README.md
CHANGED
@@ -36,14 +36,23 @@ f = File.open(<CREMUL-file>)
|
|
36
36
|
parser = CremulParser.new
|
37
37
|
parser.parse(f)
|
38
38
|
f.close
|
39
|
+
```
|
39
40
|
|
40
|
-
|
41
|
+
or if the file is not utf-8 encoded
|
41
42
|
|
43
|
+
```
|
42
44
|
f = File.open(<CREMUL-file>)
|
43
45
|
parser = CremulParser.new
|
44
46
|
parser.parse(f, <encoding>) # for instance 'ISO-8859-1'
|
45
47
|
f.close
|
48
|
+
```
|
46
49
|
|
50
|
+
A file may contain one or more Cremul messages. A Cremul message consists of 'message segments'.
|
51
|
+
Each segment starts with a Cremul keyword. A group of segments make up a logical element of the
|
52
|
+
Cremul message. The overall logical structure of a Cremul file is as follows:
|
53
|
+
|
54
|
+
```
|
55
|
+
[ Cremul file ] 1 --- * [ Cremul message ] 1 --- * [ Line ] 1 --- * [ Payment TX ]
|
47
56
|
```
|
48
57
|
|
49
58
|
See the `parser_test.rb` file for more details.
|
data/cremul-parser.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = Cremul::VERSION
|
9
9
|
gem.platform = Gem::Platform::RUBY
|
10
10
|
gem.authors = ["Per Spilling"]
|
11
|
-
gem.email = ["per@
|
11
|
+
gem.email = ["per@perspilling.net"]
|
12
12
|
gem.summary = %q{A parser for CREMUL payment transaction files}
|
13
13
|
gem.description = %q{A parser for CREMUL payment transaction files. It parses the CREMUL file and creates a Ruby object structure corresponding to the elements in the file.}
|
14
14
|
gem.homepage = "https://github.com/perspilling/cremul-parser"
|
data/lib/cremul/cremul_line.rb
CHANGED
@@ -9,9 +9,10 @@ require_relative 'cremul_payment_tx'
|
|
9
9
|
class CremulLine
|
10
10
|
include Cremul::ParserHelper
|
11
11
|
|
12
|
-
attr_reader :posting_date, :money, :reference, :bf_account_number, :transactions
|
12
|
+
attr_reader :line_index, :posting_date, :money, :reference, :bf_account_number, :transactions
|
13
13
|
|
14
|
-
def initialize(segments, line_segment_pos)
|
14
|
+
def initialize(line_index, segments, line_segment_pos)
|
15
|
+
@line_index = line_index
|
15
16
|
d = segments[next_date_segment_index(segments, line_segment_pos)].split(':')
|
16
17
|
@posting_date = Date.parse(d[1])
|
17
18
|
|
@@ -23,8 +24,9 @@ class CremulLine
|
|
23
24
|
@transactions = []
|
24
25
|
n = number_of_transactions_in_line(segments, line_segment_pos)
|
25
26
|
tx_index = next_tx_sequence_segment_index(segments, line_segment_pos)
|
26
|
-
|
27
|
-
|
27
|
+
|
28
|
+
n.times do |i|
|
29
|
+
@transactions << CremulPaymentTx.new(i+1, segments, tx_index)
|
28
30
|
tx_index = next_tx_sequence_segment_index(segments, tx_index+1)
|
29
31
|
end
|
30
32
|
|
@@ -5,17 +5,19 @@ require_relative 'parser_helper'
|
|
5
5
|
class CremulMessage
|
6
6
|
include Cremul::ParserHelper
|
7
7
|
|
8
|
-
|
8
|
+
# The message_index is the index number of the Cremul message in the file.
|
9
|
+
attr_reader :message_index, :header, :number_of_lines, :lines
|
9
10
|
|
10
|
-
def initialize(segments)
|
11
|
+
def initialize(message_number, segments)
|
12
|
+
@message_index = message_number
|
11
13
|
@header = CremulHeader.new(segments)
|
12
14
|
@lines = []
|
13
15
|
@number_of_lines = number_of_lines_in_message(segments)
|
14
16
|
|
15
17
|
# instantiate the line items
|
16
18
|
line_segment_pos = next_line_segment_index(segments, 0)
|
17
|
-
@number_of_lines.times do
|
18
|
-
@lines << CremulLine.new(segments, line_segment_pos)
|
19
|
+
@number_of_lines.times do |n|
|
20
|
+
@lines << CremulLine.new(n+1, segments, line_segment_pos)
|
19
21
|
line_segment_pos = next_line_segment_index(segments, line_segment_pos+1)
|
20
22
|
end
|
21
23
|
|
@@ -20,10 +20,11 @@ class CremulPaymentTx
|
|
20
20
|
REF_TYPE_INVOICE_NUMBER = 380
|
21
21
|
|
22
22
|
attr_reader :posting_date, :money, :references, :invoice_ref_type, :invoice_ref, :free_text
|
23
|
-
attr_reader :payer_account_number, :payer_nad, :beneficiary_nad
|
23
|
+
attr_reader :payer_account_number, :payer_nad, :beneficiary_nad, :tx_index
|
24
24
|
|
25
25
|
|
26
|
-
def initialize(segments, tx_segment_pos)
|
26
|
+
def initialize(tx_index, segments, tx_segment_pos)
|
27
|
+
@tx_index = tx_index # the index number of this tx within it's parent line
|
27
28
|
s = segments[next_date_segment_index(segments, tx_segment_pos)].split(':')
|
28
29
|
@posting_date = Date.parse(s[1])
|
29
30
|
|
@@ -4,9 +4,9 @@ require_relative 'parser_helper'
|
|
4
4
|
# Represents a reference (RFF) segment in a CREMUL message.
|
5
5
|
# Type may be:
|
6
6
|
# - :ACK - Bank reference - KID in Norwegian
|
7
|
-
# - :AII - Bank’s reference number allocated by the bank to different
|
7
|
+
# - :AII - Bank’s reference number allocated by the bank to different underlying individual transactions
|
8
8
|
# - :CT - AutoGiro agreement ID
|
9
|
-
# - :ABO - Originator´s reference – for
|
9
|
+
# - :ABO - Originator´s reference – for example SWIFT reference senders bank
|
10
10
|
# - :ACD - Bank reference = Archive reference
|
11
11
|
# - :AEK - Payment order number
|
12
12
|
# - :AFO - Beneficiary’s reference
|
data/lib/cremul/parser_helper.rb
CHANGED
data/lib/cremul/version.rb
CHANGED
data/lib/cremul_parser.rb
CHANGED
@@ -3,6 +3,14 @@
|
|
3
3
|
require_relative 'cremul/parser_helper'
|
4
4
|
require_relative 'cremul/cremul_message'
|
5
5
|
|
6
|
+
|
7
|
+
#
|
8
|
+
# A file may contain one or more Cremul messages. A Cremul message consists of 'message segments'.
|
9
|
+
# Each segment starts with a Cremul keyword. A group of segments make up a logical element of the
|
10
|
+
# Cremul message. The overall logical structure of a Cremul message is as follows:
|
11
|
+
#
|
12
|
+
# [ Cremul message ] 1 --- * [ Line ] 1 --- * [ Payment TX ]
|
13
|
+
#
|
6
14
|
class CremulParser
|
7
15
|
include Cremul::ParserHelper
|
8
16
|
|
@@ -12,6 +20,7 @@ class CremulParser
|
|
12
20
|
@messages = []
|
13
21
|
end
|
14
22
|
|
23
|
+
# noinspection RubyResolve
|
15
24
|
def parse(file, file_encoding='utf-8')
|
16
25
|
file_as_a_string = ''
|
17
26
|
file.each do |line|
|
@@ -27,15 +36,15 @@ class CremulParser
|
|
27
36
|
@segments = @segments.slice(0, @segments.size-1)
|
28
37
|
end
|
29
38
|
|
30
|
-
m =
|
39
|
+
m = get_messages_in_file(@segments)
|
31
40
|
if m.size == 0
|
32
41
|
raise 'No CREMUL message found in file'
|
33
42
|
end
|
34
43
|
m.each do |n, start_index|
|
35
44
|
if n < m.size
|
36
|
-
@messages << CremulMessage.new(@segments[start_index, m[n+1] - start_index])
|
45
|
+
@messages << CremulMessage.new(n, @segments[start_index, m[n+1] - start_index])
|
37
46
|
else
|
38
|
-
@messages << CremulMessage.new(@segments[start_index, @segments.size - start_index])
|
47
|
+
@messages << CremulMessage.new(n, @segments[start_index, @segments.size - start_index])
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
data/test/unit/parser_test.rb
CHANGED
@@ -17,6 +17,7 @@ describe CremulParser do
|
|
17
17
|
d2014_03_12 = Date.new(2014,3,12)
|
18
18
|
|
19
19
|
msg = @parser.messages[0]
|
20
|
+
msg.message_index.must_equal 1
|
20
21
|
msg.header.must_be_instance_of CremulHeader
|
21
22
|
msg.header.msg_id.must_include 'CREMUL'
|
22
23
|
msg.header.created_date.must_equal d2014_03_12
|
@@ -26,6 +27,7 @@ describe CremulParser do
|
|
26
27
|
|
27
28
|
line = msg.lines[0]
|
28
29
|
line.must_be_instance_of CremulLine
|
30
|
+
line.line_index.must_equal 1
|
29
31
|
line.posting_date.must_equal d2014_03_12
|
30
32
|
line.bf_account_number.must_equal '12121212121'
|
31
33
|
line.money.must_be_instance_of CremulMoney
|
@@ -40,6 +42,7 @@ describe CremulParser do
|
|
40
42
|
line.transactions.size.must_equal 1
|
41
43
|
tx = line.transactions[0]
|
42
44
|
tx.must_be_instance_of CremulPaymentTx
|
45
|
+
tx.tx_index.must_equal 1
|
43
46
|
tx.posting_date.must_equal d2014_03_12
|
44
47
|
tx.money.amount.must_equal 1394.to_f
|
45
48
|
tx.money.currency.must_equal :NOK
|
@@ -213,6 +216,7 @@ describe CremulParser do
|
|
213
216
|
braekstad_tx = msg.lines[2].transactions[0]
|
214
217
|
braekstad_tx.invoice_ref.must_equal '20140453869'
|
215
218
|
end
|
219
|
+
=end
|
216
220
|
|
217
221
|
|
218
222
|
it 'should parse a multi-message file' do
|
@@ -223,7 +227,6 @@ describe CremulParser do
|
|
223
227
|
|
224
228
|
#write_segments_to_file(@parser.segments, File.open('files/CREMUL_multi_message_segments.txt', 'w'))
|
225
229
|
end
|
226
|
-
=end
|
227
230
|
|
228
231
|
def write_segments_to_file(msg, file)
|
229
232
|
begin
|
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.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Per Spilling
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -41,7 +41,7 @@ dependencies:
|
|
41
41
|
description: A parser for CREMUL payment transaction files. It parses the CREMUL file
|
42
42
|
and creates a Ruby object structure corresponding to the elements in the file.
|
43
43
|
email:
|
44
|
-
- per@
|
44
|
+
- per@perspilling.net
|
45
45
|
executables: []
|
46
46
|
extensions: []
|
47
47
|
extra_rdoc_files: []
|