norma43_parser 1.0.1 → 2.0.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 +5 -5
- data/.github/ISSUE_TEMPLATE.md +13 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +5 -0
- data/.rubocop.yml +234 -0
- data/Gemfile +7 -1
- data/Gemfile.lock +73 -0
- data/README.md +1 -1
- data/Rakefile +2 -0
- data/lib/norma43.rb +9 -3
- data/lib/norma43/line_handlers.rb +2 -3
- data/lib/norma43/line_parsers/account_end.rb +18 -0
- data/lib/norma43/line_parsers/account_start.rb +18 -0
- data/lib/norma43/line_parsers/additional_currency.rb +12 -0
- data/lib/norma43/line_parsers/additional_item.rb +11 -0
- data/lib/norma43/line_parsers/document_end.rb +9 -0
- data/lib/norma43/line_parsers/document_start.rb +13 -0
- data/lib/norma43/line_parsers/file_format_validator.rb +15 -12
- data/lib/norma43/line_parsers/line_parser.rb +29 -28
- data/lib/norma43/line_parsers/transaction.rb +18 -0
- data/lib/norma43/line_processors.rb +2 -2
- data/lib/norma43/models.rb +5 -4
- data/lib/norma43/parser.rb +38 -42
- data/lib/norma43/utils/contexts.rb +40 -37
- data/lib/norma43/utils/string_helpers.rb +10 -6
- data/lib/norma43/utils/typecaster.rb +16 -12
- data/lib/norma43/version.rb +3 -1
- data/norma43_parser.gemspec +11 -9
- data/spec/example1_parse_spec.rb +12 -11
- data/spec/norma43/line_parsers/account_end_spec.rb +1 -1
- data/spec/norma43/line_parsers/account_start_spec.rb +1 -2
- data/spec/norma43/line_parsers/additional_currency_spec.rb +1 -1
- data/spec/norma43/line_parsers/additional_items_spec.rb +1 -1
- data/spec/norma43/line_parsers/document_end_spec.rb +1 -2
- data/spec/norma43/line_parsers/document_start_spec.rb +1 -1
- data/spec/norma43/line_parsers/transaction_spec.rb +1 -3
- data/spec/norma43/line_processors/account_end_spec.rb +6 -8
- data/spec/norma43/line_processors/account_start_spec.rb +8 -9
- data/spec/norma43/line_processors/additional_currency_spec.rb +6 -7
- data/spec/norma43/line_processors/additional_items_spec.rb +6 -7
- data/spec/norma43/line_processors/document_end_spec.rb +5 -6
- data/spec/norma43/line_processors/document_start_spec.rb +3 -4
- data/spec/norma43/line_processors/transaction_spec.rb +6 -7
- data/spec/norma43/parser_spec.rb +5 -4
- data/spec/norma43_spec.rb +2 -0
- data/spec/spec_helper.rb +1 -4
- data/spec/support/shared_examples_for_values_line_parsers.rb +2 -0
- metadata +41 -32
- data/lib/norma43/line_parsers/line_parsers.rb +0 -69
@@ -1,19 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "time"
|
2
4
|
|
3
5
|
module Norma43
|
4
|
-
module
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
module Utils
|
7
|
+
module Typecaster
|
8
|
+
def self.cast(value, type)
|
9
|
+
casters.fetch(type).call(value) unless value == ""
|
10
|
+
end
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
def self.casters
|
13
|
+
{
|
14
|
+
integer: ->(value) { value.to_i },
|
15
|
+
time: ->(value) { Time.strptime(value, "%Y%m%d%H%M%S%N") },
|
16
|
+
date: ->(value) { Date.strptime(value, "%y%m%d") },
|
17
|
+
string: ->(value) { value unless value.match?(/\A0+\Z/) },
|
18
|
+
raw: ->(value) { value }
|
19
|
+
}
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
data/lib/norma43/version.rb
CHANGED
data/norma43_parser.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require "norma43/version"
|
5
6
|
|
@@ -8,20 +9,21 @@ Gem::Specification.new do |spec|
|
|
8
9
|
spec.version = Norma43::VERSION
|
9
10
|
spec.authors = ["Sequra engineering"]
|
10
11
|
spec.email = ["dev@sequra.es"]
|
11
|
-
spec.summary =
|
12
|
+
spec.summary = "Parses banks transactions files specified in rule 43"
|
12
13
|
spec.homepage = "https://github.com/sequra/norma43_parser"
|
13
14
|
spec.license = "MIT"
|
14
15
|
|
15
|
-
spec.required_ruby_version = "~> 2.
|
16
|
+
spec.required_ruby_version = "~> 2.4"
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0")
|
18
19
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
21
|
spec.require_paths = ["lib"]
|
21
22
|
|
22
|
-
spec.
|
23
|
-
spec.
|
24
|
-
|
25
|
-
spec.add_development_dependency "
|
26
|
-
spec.
|
23
|
+
spec.add_runtime_dependency "virtus", "~> 1.0"
|
24
|
+
spec.add_runtime_dependency "zeitwerk", "~> 2.0"
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.0"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
27
29
|
end
|
data/spec/example1_parse_spec.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "norma43"
|
2
4
|
|
3
5
|
RSpec.describe Norma43 do
|
4
6
|
describe "parse" do
|
5
|
-
|
6
7
|
let(:document) do
|
7
|
-
file = File.open(
|
8
|
+
file = File.open(File.join(__dir__, "fixtures/example1.n43"),
|
8
9
|
encoding: "iso-8859-1")
|
9
10
|
Norma43.parse file
|
10
11
|
end
|
@@ -17,7 +18,7 @@ RSpec.describe Norma43 do
|
|
17
18
|
let(:account) { document.accounts.first }
|
18
19
|
|
19
20
|
it "stores expected attributes from AccountStart parser" do
|
20
|
-
expect(account).to have_attributes(
|
21
|
+
expect(account).to have_attributes(
|
21
22
|
"bank_code" => 9999,
|
22
23
|
"branch_code" => 1111,
|
23
24
|
"account_number" => 123456789,
|
@@ -26,18 +27,18 @@ RSpec.describe Norma43 do
|
|
26
27
|
"currency_code" => 1,
|
27
28
|
"information_mode_code" => 3,
|
28
29
|
"abbreviated_name" => "MY ACCOUNT"
|
29
|
-
|
30
|
+
)
|
30
31
|
end
|
31
32
|
|
32
33
|
it "stores expected attributes from AccountEnd parser" do
|
33
|
-
expect(account).to have_attributes(
|
34
|
+
expect(account).to have_attributes(
|
34
35
|
"balance_code" => 2,
|
35
36
|
"balance_amount" => 78889999999999,
|
36
37
|
"debit_entries" => 4,
|
37
38
|
"debit_amount" => 4936,
|
38
39
|
"credit_entries" => 2,
|
39
40
|
"credit_amount" => 999999,
|
40
|
-
|
41
|
+
)
|
41
42
|
end
|
42
43
|
|
43
44
|
describe "transactions" do
|
@@ -48,7 +49,7 @@ RSpec.describe Norma43 do
|
|
48
49
|
describe "first transaction" do
|
49
50
|
let(:transaction) { account.transactions[0] }
|
50
51
|
it "stores expected attributes" do
|
51
|
-
expect(transaction).to have_attributes(
|
52
|
+
expect(transaction).to have_attributes(
|
52
53
|
"origin_branch_code" => 6700,
|
53
54
|
"transaction_date" => Date.parse("2004-04-08"),
|
54
55
|
"value_date" => Date.parse("2004-04-08"),
|
@@ -59,7 +60,7 @@ RSpec.describe Norma43 do
|
|
59
60
|
"document_number" => 0,
|
60
61
|
"reference_1" => 0,
|
61
62
|
"reference_2" => nil,
|
62
|
-
|
63
|
+
)
|
63
64
|
end
|
64
65
|
end
|
65
66
|
|
@@ -70,13 +71,13 @@ RSpec.describe Norma43 do
|
|
70
71
|
end
|
71
72
|
|
72
73
|
describe "first additional item" do
|
73
|
-
let(:additional_item) { account.transactions[0].additional_items[0]}
|
74
|
+
let(:additional_item) { account.transactions[0].additional_items[0] }
|
74
75
|
it "stores expected attributes" do
|
75
|
-
expect(additional_item).to have_attributes(
|
76
|
+
expect(additional_item).to have_attributes(
|
76
77
|
"data_code" => 1,
|
77
78
|
"item_1" => "XXXXXXXXX",
|
78
79
|
"item_2" => nil
|
79
|
-
|
80
|
+
)
|
80
81
|
end
|
81
82
|
end
|
82
83
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Norma43
|
4
4
|
module LineParsers
|
@@ -49,7 +49,6 @@ module Norma43
|
|
49
49
|
it "parses the abbreviated name" do
|
50
50
|
expect(account_start.abbreviated_name).to eq "MY ACCOUNT"
|
51
51
|
end
|
52
|
-
|
53
52
|
end
|
54
53
|
end
|
55
54
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Norma43
|
4
4
|
module LineParsers
|
@@ -10,7 +10,6 @@ module Norma43
|
|
10
10
|
it "parses the record number" do
|
11
11
|
expect(document_end.record_number).to eq 48
|
12
12
|
end
|
13
|
-
|
14
13
|
end
|
15
14
|
end
|
16
15
|
end
|
@@ -1,10 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Norma43
|
4
4
|
module LineParsers
|
5
5
|
RSpec.describe Transaction do
|
6
6
|
let :transaction do
|
7
|
-
|
8
7
|
Transaction.new "2256781127040805040805020092000000000012340000000000000000000000 REF 2"
|
9
8
|
end
|
10
9
|
|
@@ -52,4 +51,3 @@ module Norma43
|
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
55
|
-
|
@@ -1,19 +1,18 @@
|
|
1
|
-
|
2
|
-
require "norma43/line_processors"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Norma43
|
5
4
|
module LineProcessors
|
6
|
-
RSpec.describe
|
5
|
+
RSpec.describe AccountEnd do
|
7
6
|
let :line do
|
8
7
|
double "Line", attributes: {}
|
9
8
|
end
|
10
9
|
|
11
|
-
let(:account){ Models::Account.new }
|
12
|
-
let(:contexts){ Contexts.new(
|
10
|
+
let(:account) { Norma43::Models::Account.new }
|
11
|
+
let(:contexts) { Norma43::Utils::Contexts.new(
|
13
12
|
[
|
14
|
-
Models::Document.new,
|
13
|
+
Norma43::Models::Document.new,
|
15
14
|
account,
|
16
|
-
Models::Transaction.new
|
15
|
+
Norma43::Models::Transaction.new
|
17
16
|
])
|
18
17
|
}
|
19
18
|
|
@@ -31,4 +30,3 @@ module Norma43
|
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
34
|
-
|
@@ -1,29 +1,28 @@
|
|
1
|
-
|
2
|
-
require "norma43/line_processors"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Norma43
|
5
4
|
module LineProcessors
|
6
5
|
RSpec.describe "AccountStart" do
|
7
|
-
let(:line){ double "Line", attributes: {} }
|
8
|
-
let(:document) { Models::Document.new }
|
9
|
-
let(:contexts){ Contexts.new}
|
6
|
+
let(:line) { double "Line", attributes: {} }
|
7
|
+
let(:document) { Norma43::Models::Document.new }
|
8
|
+
let(:contexts) { Norma43::Utils::Contexts.new }
|
10
9
|
|
11
10
|
before do
|
12
11
|
contexts.add document
|
13
12
|
end
|
14
13
|
|
15
14
|
it "instantiates a new account with the line attributes" do
|
16
|
-
allow(Models::Account).to receive :new
|
15
|
+
allow(Norma43::Models::Account).to receive :new
|
17
16
|
|
18
17
|
AccountStart.call line, contexts
|
19
18
|
|
20
|
-
expect(Models::Account).to have_received(:new).with line.attributes
|
19
|
+
expect(Norma43::Models::Account).to have_received(:new).with line.attributes
|
21
20
|
end
|
22
21
|
|
23
22
|
context "when AccountStart is called" do
|
24
|
-
let(:fake_account) { double "Models::Account" }
|
23
|
+
let(:fake_account) { double "Norma43::Models::Account" }
|
25
24
|
before do
|
26
|
-
allow(Models::Account).to receive(:new) { fake_account }
|
25
|
+
allow(Norma43::Models::Account).to receive(:new) { fake_account }
|
27
26
|
end
|
28
27
|
let!(:subject) { AccountStart.call line, contexts }
|
29
28
|
|
@@ -1,15 +1,14 @@
|
|
1
|
-
|
2
|
-
require "norma43/line_processors"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Norma43
|
5
4
|
module LineProcessors
|
6
5
|
RSpec.describe "AdditionalCurrency" do
|
7
|
-
let(:line){ double "Line", attributes: {} }
|
8
|
-
let(:transaction){ Models::Transaction.new }
|
9
|
-
let(:contexts){ Contexts.new(
|
6
|
+
let(:line) { double "Line", attributes: {} }
|
7
|
+
let(:transaction) { Norma43::Models::Transaction.new }
|
8
|
+
let(:contexts) { Norma43::Utils::Contexts.new(
|
10
9
|
[
|
11
|
-
Models::Document.new
|
12
|
-
Models::Account.new
|
10
|
+
Norma43::Models::Document.new,
|
11
|
+
Norma43::Models::Account.new,
|
13
12
|
transaction
|
14
13
|
])
|
15
14
|
}
|
@@ -1,15 +1,14 @@
|
|
1
|
-
|
2
|
-
require "norma43/line_processors"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Norma43
|
5
4
|
module LineProcessors
|
6
5
|
RSpec.describe "AdditionalItems" do
|
7
|
-
let(:line){ double "Line", attributes: {} }
|
8
|
-
let(:transaction){ Models::Transaction.new }
|
9
|
-
let(:contexts){ Contexts.new(
|
6
|
+
let(:line) { double "Line", attributes: {} }
|
7
|
+
let(:transaction) { Norma43::Models::Transaction.new }
|
8
|
+
let(:contexts) { Norma43::Utils::Contexts.new(
|
10
9
|
[
|
11
|
-
Models::Document.new
|
12
|
-
Models::Account.new
|
10
|
+
Norma43::Models::Document.new,
|
11
|
+
Norma43::Models::Account.new,
|
13
12
|
transaction
|
14
13
|
])
|
15
14
|
}
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require "norma43/line_processors"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Norma43
|
5
4
|
module LineProcessors
|
@@ -10,8 +9,8 @@ module Norma43
|
|
10
9
|
let(:line) { double "Line", record_number: 35 }
|
11
10
|
|
12
11
|
it "moves to the nearest document context" do
|
13
|
-
document = Models::Document.new
|
14
|
-
contexts = Contexts.new [Thing.new, document, Thing.new, Thing.new]
|
12
|
+
document = Norma43::Models::Document.new
|
13
|
+
contexts = Norma43::Utils::Contexts.new [Thing.new, document, Thing.new, Thing.new]
|
15
14
|
|
16
15
|
DocumentEnd.call line, contexts
|
17
16
|
|
@@ -19,9 +18,9 @@ module Norma43
|
|
19
18
|
end
|
20
19
|
|
21
20
|
it "sets the number of lines on the document" do
|
22
|
-
document = Models::Document.new
|
21
|
+
document = Norma43::Models::Document.new
|
23
22
|
|
24
|
-
DocumentEnd.call line, Contexts.new(document)
|
23
|
+
DocumentEnd.call line, Norma43::Utils::Contexts.new(document)
|
25
24
|
|
26
25
|
expect(document.number_of_lines).to eq 35
|
27
26
|
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require "norma43/line_processors"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Norma43
|
5
4
|
module LineProcessors
|
@@ -9,7 +8,7 @@ module Norma43
|
|
9
8
|
it "instantiates a new document with the line attributes" do
|
10
9
|
allow(Models::Document).to receive :new
|
11
10
|
|
12
|
-
DocumentStart.call line, Contexts.new
|
11
|
+
DocumentStart.call line, Norma43::Utils::Contexts.new
|
13
12
|
|
14
13
|
expect(Models::Document).to have_received(:new).with line.attributes
|
15
14
|
end
|
@@ -18,7 +17,7 @@ module Norma43
|
|
18
17
|
fake_document = double "Models::Document"
|
19
18
|
allow(Models::Document).to receive(:new) { fake_document }
|
20
19
|
|
21
|
-
contexts = DocumentStart.call line, Contexts.new
|
20
|
+
contexts = DocumentStart.call line, Norma43::Utils::Contexts.new
|
22
21
|
|
23
22
|
expect(contexts.current).to be fake_document
|
24
23
|
end
|
@@ -1,16 +1,15 @@
|
|
1
|
-
|
2
|
-
require "norma43/line_processors"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Norma43
|
5
4
|
module LineProcessors
|
6
5
|
RSpec.describe "Transaction" do
|
7
|
-
let(:line){ double "Line", attributes: {} }
|
8
|
-
let(:account){ Models::Account.new }
|
9
|
-
let(:contexts){ Contexts.new(
|
6
|
+
let(:line) { double "Line", attributes: {} }
|
7
|
+
let(:account) { Norma43::Models::Account.new }
|
8
|
+
let(:contexts) { Norma43::Utils::Contexts.new(
|
10
9
|
[
|
11
|
-
Models::Document.new
|
10
|
+
Norma43::Models::Document.new,
|
12
11
|
account,
|
13
|
-
Models::Transaction.new
|
12
|
+
Norma43::Models::Transaction.new
|
14
13
|
])
|
15
14
|
}
|
16
15
|
|
data/spec/norma43/parser_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "norma43/parser"
|
2
4
|
|
3
5
|
module Norma43
|
@@ -5,18 +7,17 @@ module Norma43
|
|
5
7
|
describe "ensuring the file is valid" do
|
6
8
|
it "accepts a valid file starting with document" do
|
7
9
|
valid_file = "00TI222222 2011102504133012345601TL1Norma43 "
|
8
|
-
expect{ Parser.new(valid_file) }.to_not raise_error
|
10
|
+
expect { Parser.new(valid_file) }.to_not raise_error
|
9
11
|
end
|
10
12
|
|
11
13
|
it "accepts a valid file starting with an account" do
|
12
|
-
|
13
14
|
valid_file = "119999111101234567890408040409052000000001234569783MY ACCOUNT "
|
14
|
-
expect{ Parser.new(valid_file) }.to_not raise_error
|
15
|
+
expect { Parser.new(valid_file) }.to_not raise_error
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should start with 00 or 11" do
|
18
19
|
invalid_file = "99TI222222 2011102504133012345601TL1Norma43 "
|
19
|
-
expect{ Parser.new(invalid_file) }.to raise_error{ Norma43::InvalidFileFormatError }
|
20
|
+
expect { Parser.new(invalid_file) }.to raise_error { Norma43::InvalidFileFormatError }
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|