cfonb 0.0.2 → 0.0.4
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/lib/cfonb/error.rb +4 -0
- data/lib/cfonb/operation_detail/rcn.rb +4 -2
- data/lib/cfonb/operation_detail/ref.rb +3 -1
- data/lib/cfonb/parser.rb +26 -0
- data/lib/cfonb/refinements/strings.rb +4 -1
- data/lib/cfonb.rb +4 -0
- data/spec/cfonb/parser_spec.rb +153 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45c55ed710afa4873c8d7cbb73412d9255ad5992c619e4a00918429b691517ce
|
4
|
+
data.tar.gz: 82075981bcd15526501ebf5fd965b97a0e09fdc7ace490c48c3de4cbbd2c7662
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a985ece7273a2f4a06c5915c30d65e873d624b0be138ea141fc18237316ce248740ee6b5c384e3a3da021bffc918273f19abe4b27e8b161974838b105f1587ae
|
7
|
+
data.tar.gz: '0185ec1ef15211cd9dafa449d968a67a43e736083de9648761e054959ddb0485a7cf14aa45e2e83f64edc9bff6b9732779cec059abb9dc560a47e22a866ed31e'
|
data/lib/cfonb/error.rb
CHANGED
@@ -3,13 +3,15 @@
|
|
3
3
|
module CFONB
|
4
4
|
module OperationDetail
|
5
5
|
class RCN
|
6
|
+
using CFONB::Refinements::Strings
|
7
|
+
|
6
8
|
ATTRIBUTES = %i[reference purpose].freeze
|
7
9
|
|
8
10
|
def self.apply(operation, line)
|
9
11
|
operation.reference = [
|
10
12
|
operation.reference,
|
11
|
-
line.detail[0..34].strip
|
12
|
-
].
|
13
|
+
line.detail[0..34].strip,
|
14
|
+
].filter_map(&:presence).join(' - ')
|
13
15
|
|
14
16
|
operation.purpose = line.detail[35..-1]&.strip
|
15
17
|
end
|
@@ -3,13 +3,15 @@
|
|
3
3
|
module CFONB
|
4
4
|
module OperationDetail
|
5
5
|
class REF
|
6
|
+
using CFONB::Refinements::Strings
|
7
|
+
|
6
8
|
ATTRIBUTES = %i[reference].freeze
|
7
9
|
|
8
10
|
def self.apply(operation, line)
|
9
11
|
operation.reference = [
|
10
12
|
operation.reference,
|
11
13
|
line.detail.strip
|
12
|
-
].
|
14
|
+
].filter_map(&:presence).join(' - ')
|
13
15
|
end
|
14
16
|
|
15
17
|
CFONB::OperationDetail.register('REF', self)
|
data/lib/cfonb/parser.rb
CHANGED
@@ -26,6 +26,15 @@ module CFONB
|
|
26
26
|
statements
|
27
27
|
end
|
28
28
|
|
29
|
+
def parse_operation(optimistic: false)
|
30
|
+
@current_operation = nil
|
31
|
+
@optimistic = optimistic
|
32
|
+
|
33
|
+
each_line { parse_operation_line(_1) }
|
34
|
+
|
35
|
+
current_operation
|
36
|
+
end
|
37
|
+
|
29
38
|
private
|
30
39
|
|
31
40
|
attr_reader :input, :statements, :current_statement, :current_operation, :optimistic
|
@@ -75,6 +84,23 @@ module CFONB
|
|
75
84
|
handle_error(e)
|
76
85
|
end
|
77
86
|
|
87
|
+
def parse_operation_line(line)
|
88
|
+
line = CFONB::LineParser.parse(line)
|
89
|
+
|
90
|
+
case line.code
|
91
|
+
when OPERATION_CODE
|
92
|
+
return handle_error(AlreadyDefinedOperationError) if current_operation
|
93
|
+
|
94
|
+
@current_operation = CFONB::Operation.new(line)
|
95
|
+
when OPERATION_DETAIL_CODE
|
96
|
+
return handle_error(UnstartedOperationError) unless current_operation
|
97
|
+
|
98
|
+
current_operation.merge_detail(line)
|
99
|
+
else
|
100
|
+
return handle_error(UnhandledLineCodeError)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
78
104
|
def handle_error(error)
|
79
105
|
raise error unless optimistic
|
80
106
|
end
|
@@ -4,7 +4,6 @@ module CFONB
|
|
4
4
|
module Refinements
|
5
5
|
module Strings
|
6
6
|
refine String do
|
7
|
-
|
8
7
|
def first(count = 1)
|
9
8
|
self[..(count - 1)]
|
10
9
|
end
|
@@ -12,6 +11,10 @@ module CFONB
|
|
12
11
|
def last(count = 1)
|
13
12
|
self[-count..]
|
14
13
|
end
|
14
|
+
|
15
|
+
def presence
|
16
|
+
strip.empty? ? nil : self
|
17
|
+
end
|
15
18
|
end
|
16
19
|
end
|
17
20
|
end
|
data/lib/cfonb.rb
CHANGED
data/spec/cfonb/parser_spec.rb
CHANGED
@@ -37,7 +37,8 @@ describe CFONB::Parser do
|
|
37
37
|
internal_code: '9162',
|
38
38
|
label: "PRLV SEPA TEST CABINET\nMENSUEAUHTR13133",
|
39
39
|
number: 0,
|
40
|
-
reference: '',
|
40
|
+
reference: 'REFERENCE - OTHER REFERENCE',
|
41
|
+
purpose: 'PURPOSE',
|
41
42
|
rejection_code: '',
|
42
43
|
unavailability_code: '0',
|
43
44
|
value_date: Date.new(2019, 5, 16),
|
@@ -55,7 +56,7 @@ describe CFONB::Parser do
|
|
55
56
|
internal_code: '9162',
|
56
57
|
label: 'VIR SEPA DEMONSTRATION',
|
57
58
|
number: 0,
|
58
|
-
reference: '',
|
59
|
+
reference: 'REFERENCE',
|
59
60
|
rejection_code: '',
|
60
61
|
unavailability_code: '0',
|
61
62
|
value_date: Date.new(2019, 5, 16),
|
@@ -227,7 +228,7 @@ describe CFONB::Parser do
|
|
227
228
|
internal_code: '9162',
|
228
229
|
label: "PRLV SEPA TEST CABINET\nMENSUEAUHTR13133",
|
229
230
|
number: 0,
|
230
|
-
reference: '',
|
231
|
+
reference: 'REFERENCE - OTHER REFERENCE',
|
231
232
|
rejection_code: '',
|
232
233
|
unavailability_code: '0',
|
233
234
|
value_date: Date.new(2019, 5, 16),
|
@@ -245,7 +246,7 @@ describe CFONB::Parser do
|
|
245
246
|
internal_code: '9162',
|
246
247
|
label: 'VIR SEPA DEMONSTRATION',
|
247
248
|
number: 0,
|
248
|
-
reference: '',
|
249
|
+
reference: 'REFERENCE',
|
249
250
|
rejection_code: '',
|
250
251
|
unavailability_code: '0',
|
251
252
|
value_date: Date.new(2019, 5, 16),
|
@@ -466,4 +467,152 @@ describe CFONB::Parser do
|
|
466
467
|
end
|
467
468
|
end
|
468
469
|
end
|
470
|
+
|
471
|
+
describe '.parse_operation' do
|
472
|
+
subject(:operation) { described_class.new(input).parse_operation }
|
473
|
+
|
474
|
+
let(:input) { File.read('spec/files/operation.txt') }
|
475
|
+
|
476
|
+
context 'with a valid input' do
|
477
|
+
it 'returns CFONB::Operation' do
|
478
|
+
expect(operation).to be_an_instance_of(CFONB::Operation)
|
479
|
+
end
|
480
|
+
|
481
|
+
it 'parses correctly' do
|
482
|
+
expect(operation).to have_attributes(
|
483
|
+
amount: -32.21,
|
484
|
+
currency: 'EUR',
|
485
|
+
date: Date.new(2019, 5, 16),
|
486
|
+
exoneration_code: '0',
|
487
|
+
interbank_code: 'B1',
|
488
|
+
internal_code: '9162',
|
489
|
+
label: "PRLV SEPA TEST CABINET\nMENSUEAUHTR13133",
|
490
|
+
number: 0,
|
491
|
+
reference: 'REFERENCE - OTHER REFERENCE',
|
492
|
+
rejection_code: '',
|
493
|
+
unavailability_code: '0',
|
494
|
+
value_date: Date.new(2019, 5, 16),
|
495
|
+
original_currency: nil,
|
496
|
+
original_amount: nil,
|
497
|
+
debtor: 'INTERNET SFR'
|
498
|
+
)
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
context 'with an already defined operation' do
|
503
|
+
let(:input) { File.read('spec/files/operation_already_defined.txt') }
|
504
|
+
|
505
|
+
it 'raises AlreadyDefinedOperationError' do
|
506
|
+
expect do
|
507
|
+
operation
|
508
|
+
end.to raise_error(CFONB::AlreadyDefinedOperationError)
|
509
|
+
end
|
510
|
+
end
|
511
|
+
|
512
|
+
context 'with an unstarted operation' do
|
513
|
+
let(:input) { File.read('spec/files/operation_unstarted.txt') }
|
514
|
+
|
515
|
+
it 'raises UnstartedOperationError' do
|
516
|
+
expect do
|
517
|
+
operation
|
518
|
+
end.to raise_error(CFONB::UnstartedOperationError)
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
522
|
+
context 'with an unhandled line code' do
|
523
|
+
let(:input) { File.read('spec/files/example.txt') }
|
524
|
+
|
525
|
+
it 'raises UnhandledLineCodeError' do
|
526
|
+
expect do
|
527
|
+
operation
|
528
|
+
end.to raise_error(CFONB::UnhandledLineCodeError)
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
context 'with an optimistic parse' do
|
533
|
+
subject(:operation) { described_class.new(input).parse_operation(optimistic: true) }
|
534
|
+
|
535
|
+
context 'with a valid input' do
|
536
|
+
it 'returns CFONB::Operation' do
|
537
|
+
expect(operation).to be_an_instance_of(CFONB::Operation)
|
538
|
+
end
|
539
|
+
|
540
|
+
it 'parses correctly' do
|
541
|
+
expect(operation).to have_attributes(
|
542
|
+
amount: -32.21,
|
543
|
+
currency: 'EUR',
|
544
|
+
date: Date.new(2019, 5, 16),
|
545
|
+
exoneration_code: '0',
|
546
|
+
interbank_code: 'B1',
|
547
|
+
internal_code: '9162',
|
548
|
+
label: "PRLV SEPA TEST CABINET\nMENSUEAUHTR13133",
|
549
|
+
number: 0,
|
550
|
+
reference: 'REFERENCE - OTHER REFERENCE',
|
551
|
+
rejection_code: '',
|
552
|
+
unavailability_code: '0',
|
553
|
+
value_date: Date.new(2019, 5, 16),
|
554
|
+
original_currency: nil,
|
555
|
+
original_amount: nil,
|
556
|
+
debtor: 'INTERNET SFR'
|
557
|
+
)
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
context 'with an already defined operation' do
|
562
|
+
let(:input) { File.read('spec/files/operation_already_defined.txt') }
|
563
|
+
|
564
|
+
it 'ignores the second operation' do
|
565
|
+
expect(operation).to have_attributes(
|
566
|
+
amount: -32.21,
|
567
|
+
currency: 'EUR',
|
568
|
+
date: Date.new(2019, 5, 16),
|
569
|
+
exoneration_code: '0',
|
570
|
+
interbank_code: 'B1',
|
571
|
+
internal_code: '9162',
|
572
|
+
label: "PRLV SEPA TEST CABINET\nMENSUEAUHTR13133",
|
573
|
+
number: 0,
|
574
|
+
reference: 'REFERENCE - OTHER REFERENCE',
|
575
|
+
rejection_code: '',
|
576
|
+
unavailability_code: '0',
|
577
|
+
value_date: Date.new(2019, 5, 16),
|
578
|
+
original_currency: nil,
|
579
|
+
original_amount: nil,
|
580
|
+
debtor: 'INTERNET SFR'
|
581
|
+
)
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
context 'with an unstarted operation' do
|
586
|
+
let(:input) { File.read('spec/files/operation_unstarted.txt') }
|
587
|
+
|
588
|
+
it 'returns no operation' do
|
589
|
+
expect(operation).to be_nil
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
context 'with an unhandled line code' do
|
594
|
+
let(:input) { File.read('spec/files/example.txt') }
|
595
|
+
|
596
|
+
it 'ignores the unhandled lines' do
|
597
|
+
expect(operation).to have_attributes(
|
598
|
+
amount: -32.21,
|
599
|
+
currency: 'EUR',
|
600
|
+
date: Date.new(2019, 5, 16),
|
601
|
+
exoneration_code: '0',
|
602
|
+
interbank_code: 'B1',
|
603
|
+
internal_code: '9162',
|
604
|
+
label: "PRLV SEPA TEST CABINET\nMENSUEAUHTR13133\nP051928612 22793301700040",
|
605
|
+
number: 0,
|
606
|
+
reference: 'REFERENCE - OTHER REFERENCE',
|
607
|
+
rejection_code: '',
|
608
|
+
unavailability_code: '0',
|
609
|
+
value_date: Date.new(2019, 5, 16),
|
610
|
+
original_currency: nil,
|
611
|
+
original_amount: nil,
|
612
|
+
debtor: 'ELEC ERDF'
|
613
|
+
)
|
614
|
+
end
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
469
618
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfonb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johan Le Bray
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-09-
|
12
|
+
date: 2023-09-28 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: An easy to use CFONB format parser
|
15
15
|
email: ''
|
@@ -66,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '0'
|
68
68
|
requirements: []
|
69
|
-
rubygems_version: 3.
|
69
|
+
rubygems_version: 3.3.26
|
70
70
|
signing_key:
|
71
71
|
specification_version: 4
|
72
72
|
summary: CFONB parser
|