baldr 0.3.17 → 0.3.18
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/baldr/functional_group.rb +2 -2
- data/lib/baldr/grammar/envelope.rb +13 -10
- data/lib/baldr/grammar/version4010.rb +24 -1
- data/lib/baldr/parser.rb +28 -32
- data/lib/baldr/segment.rb +2 -2
- data/lib/baldr/transaction.rb +2 -2
- data/lib/baldr/types.rb +9 -13
- data/lib/baldr/validator.rb +8 -10
- data/lib/baldr/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c26c11785b0b55caeee6ed6ff6cdb36d74c3760
|
4
|
+
data.tar.gz: 6b51462b8ab2585827b32835a5a57ac4b2028714
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 445a6079b0d3c44bd39c5a1a0f25987d673f913f8d5f98645370d1888ca6ecc2c0277e3a21c26b85c695c29996692776949337d3fb880b3394265efd1db04dc2
|
7
|
+
data.tar.gz: 172a1e6f0a406865f846aa13d1b6dcdd0d8def5aa89e6f701567f03d2fc79a64de5cc000feca4c7f1b5850bb4555646b30386f4340fa6257e199c2ba0b766b9d
|
@@ -30,8 +30,8 @@ class Baldr::FunctionalGroup < Baldr::Segment
|
|
30
30
|
trailer['GE02'] = group_control_number
|
31
31
|
end
|
32
32
|
|
33
|
-
def sub_version
|
34
|
-
|
33
|
+
def sub_version(grammar)
|
34
|
+
grammar.for_standard_version(version_release_industry_code)
|
35
35
|
end
|
36
36
|
|
37
37
|
def transactions
|
@@ -10,6 +10,12 @@ module Baldr::Grammar::Envelope
|
|
10
10
|
RECORD_DEFS
|
11
11
|
end
|
12
12
|
|
13
|
+
def sub_grammar(segment)
|
14
|
+
if segment.id == 'GS'
|
15
|
+
Baldr::Grammar.for_standard_version(segment.version_release_industry_code)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
13
19
|
def validate_st!(segment)
|
14
20
|
trailer = segment.children.last.segments.first
|
15
21
|
total_number = segment.number_of_segments
|
@@ -40,20 +46,17 @@ module Baldr::Grammar::Envelope
|
|
40
46
|
def validate_isa!(segment)
|
41
47
|
trailer = segment.children.last.segments.first
|
42
48
|
if trailer['IEA01'].to_i != segment.func_group_loop.segments.count
|
43
|
-
raise "wrong functional groups number: #{trailer['IEA01']} in IEA01, but real number is #{segment.func_group_loop.segments.count}"
|
49
|
+
raise Baldr::Error, "wrong functional groups number: #{trailer['IEA01']} in IEA01, but real number is #{segment.func_group_loop.segments.count}"
|
44
50
|
end
|
45
51
|
if trailer['IEA02'] != segment.interchange_control_number
|
46
|
-
raise "interchange control numbers don't match: #{trailer['IEA02']} in IEA02 and #{segment.interchange_control_number} in ISA13"
|
52
|
+
raise Baldr::Error, "interchange control numbers don't match: #{trailer['IEA02']} in IEA02 and #{segment.interchange_control_number} in ISA13"
|
47
53
|
end
|
48
54
|
end
|
49
55
|
|
50
56
|
STRUCTURE = {
|
51
57
|
id: 'ISA', min: 0, max: 99999, class: :envelope, level: [
|
52
58
|
{id: 'TA1', min: 0, max: 99999},
|
53
|
-
{id: 'GS', min: 0, class: :functional_group, max: 99999,
|
54
|
-
{id: 'ST', min: 0, class: :transaction, max: 99999},
|
55
|
-
{id: 'GE', min: 1, max: 1},
|
56
|
-
]},
|
59
|
+
{id: 'GS', min: 0, class: :functional_group, max: 99999},
|
57
60
|
{id: 'IEA', min: 1, max: 1}
|
58
61
|
]
|
59
62
|
}.freeze
|
@@ -91,10 +94,10 @@ module Baldr::Grammar::Envelope
|
|
91
94
|
{id: 'GE01', required: true, max: 6, type: :number, decimals: 0},
|
92
95
|
{id: 'GE02', required: true, max: 9, type: :number, decimals: 0},
|
93
96
|
],
|
94
|
-
'ST' => [
|
95
|
-
|
96
|
-
|
97
|
-
],
|
97
|
+
# 'ST' => [
|
98
|
+
# {id: 'ST01', required: true, max: 3, type: :id},
|
99
|
+
# {id: 'ST02', required: true, min: 4, max: 9, type: :string},
|
100
|
+
# ],
|
98
101
|
'IEA' => [
|
99
102
|
{id: 'IEA01', required: true, max: 5, type: :number, decimals: 0},
|
100
103
|
{id: 'IEA02', required: true, max: 9, type: :number, decimals: 0},
|
@@ -1,6 +1,14 @@
|
|
1
1
|
module Baldr::Grammar::Version4010
|
2
2
|
|
3
|
-
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def sub_grammar(segment)
|
6
|
+
if segment.id == 'ST'
|
7
|
+
for_transaction_set(segment.transaction_set_code)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def for_transaction_set(id)
|
4
12
|
const_name = "Set#{id}"
|
5
13
|
if self.const_defined?(const_name)
|
6
14
|
self.const_get(const_name)
|
@@ -9,6 +17,21 @@ module Baldr::Grammar::Version4010
|
|
9
17
|
end
|
10
18
|
end
|
11
19
|
|
20
|
+
def record_defs
|
21
|
+
RECORD_DEFS
|
22
|
+
end
|
23
|
+
|
24
|
+
def structure
|
25
|
+
STRUCTURE
|
26
|
+
end
|
27
|
+
|
28
|
+
STRUCTURE = {
|
29
|
+
id: 'GS', min: 0, class: :functional_group, max: 99999, level: [
|
30
|
+
{id: 'ST', min: 0, class: :transaction, max: 99999},
|
31
|
+
{id: 'GE', min: 1, max: 1},
|
32
|
+
]
|
33
|
+
}.freeze
|
34
|
+
|
12
35
|
RECORD_DEFS = {
|
13
36
|
'AAA' => [
|
14
37
|
{id: 'AAA01', required: true, max: 1, type: :id},
|
data/lib/baldr/parser.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
class Baldr::Parser
|
2
2
|
|
3
|
-
attr_reader :error, :separators, :input, :root_type
|
3
|
+
attr_reader :error, :separators, :input, :root_type, :grammar
|
4
4
|
|
5
5
|
def initialize(input, params = {})
|
6
|
-
@params = params
|
7
6
|
@input = input
|
8
|
-
|
7
|
+
@grammar = params[:grammar]
|
8
|
+
@separators = params[:separators]
|
9
|
+
|
9
10
|
parse
|
10
11
|
|
11
|
-
if
|
12
|
+
if params[:skip_validation] != true && successful?
|
12
13
|
validate
|
13
14
|
end
|
14
15
|
end
|
@@ -35,8 +36,8 @@ class Baldr::Parser
|
|
35
36
|
|
36
37
|
def validate
|
37
38
|
if @roots
|
38
|
-
@roots.each { |e| Baldr::Validator.validate!(e, @grammar
|
39
|
-
@roots.each { |e| Baldr::Types.convert_after_parse!(e, @grammar
|
39
|
+
@roots.each { |e| Baldr::Validator.validate!(e, @grammar) }
|
40
|
+
@roots.each { |e| Baldr::Types.convert_after_parse!(e, @grammar) }
|
40
41
|
end
|
41
42
|
rescue Baldr::Error => e
|
42
43
|
@error = e.message
|
@@ -45,30 +46,26 @@ class Baldr::Parser
|
|
45
46
|
protected
|
46
47
|
|
47
48
|
def parse
|
48
|
-
detect_first_segment
|
49
|
+
@root_type = detect_first_segment
|
49
50
|
if @root_type == :transaction
|
50
|
-
raise Baldr::Error::ParsingError, "separators must be manually defined for parsing transactions" unless @
|
51
|
-
@
|
52
|
-
|
53
|
-
|
54
|
-
@
|
51
|
+
raise Baldr::Error::ParsingError, "separators must be manually defined for parsing transactions" unless @separators
|
52
|
+
@grammar ||= Baldr::Grammar::Transaction
|
53
|
+
elsif @root_type == :envelope
|
54
|
+
@separators ||= detect_separators
|
55
|
+
@grammar ||= Baldr::Grammar::Envelope
|
55
56
|
else
|
56
|
-
|
57
|
-
@grammar = @params[:grammar] || Baldr::Grammar::Envelope
|
58
|
-
@version = nil
|
57
|
+
raise Baldr::Error::ParsingError, "doesn't begin with ISA or ST..."
|
59
58
|
end
|
60
|
-
@roots = build_tree(split_segments, @grammar
|
59
|
+
@roots = build_tree(split_segments(@separators), @grammar)
|
61
60
|
rescue Baldr::Error => e
|
62
61
|
@error = e.message
|
63
62
|
end
|
64
63
|
|
65
64
|
def detect_first_segment
|
66
65
|
if @input[0..2] == 'ISA'
|
67
|
-
|
66
|
+
:envelope
|
68
67
|
elsif @input[0..1] == 'ST'
|
69
|
-
|
70
|
-
else
|
71
|
-
raise Baldr::Error::ParsingError, "doesn't begin with ISA or ST..."
|
68
|
+
:transaction
|
72
69
|
end
|
73
70
|
end
|
74
71
|
|
@@ -87,14 +84,14 @@ class Baldr::Parser
|
|
87
84
|
segment << b
|
88
85
|
end
|
89
86
|
|
90
|
-
|
87
|
+
{
|
91
88
|
element: element.chr,
|
92
89
|
segment: segment,
|
93
90
|
component: component.chr
|
94
91
|
}
|
95
92
|
end
|
96
93
|
|
97
|
-
def split_segments
|
94
|
+
def split_segments(separators)
|
98
95
|
segments = []
|
99
96
|
buffer = []
|
100
97
|
skip = 0
|
@@ -104,9 +101,9 @@ class Baldr::Parser
|
|
104
101
|
if skip > 0
|
105
102
|
skip -= 1
|
106
103
|
else
|
107
|
-
if b ==
|
108
|
-
segments << buffer.pack('c*').split(
|
109
|
-
skip =
|
104
|
+
if b == separators[:segment].first
|
105
|
+
segments << buffer.pack('c*').split(separators[:element])
|
106
|
+
skip = separators[:segment].length - 1
|
110
107
|
buffer = []
|
111
108
|
else
|
112
109
|
buffer << b
|
@@ -119,12 +116,12 @@ class Baldr::Parser
|
|
119
116
|
segments
|
120
117
|
end
|
121
118
|
|
122
|
-
def build_tree(source, grammar
|
123
|
-
loop = build_segment(source.to_enum, grammar.structure
|
119
|
+
def build_tree(source, grammar)
|
120
|
+
loop = build_segment(source.to_enum, grammar, grammar.structure)
|
124
121
|
loop.segments
|
125
122
|
end
|
126
123
|
|
127
|
-
def build_segment(enumerator,
|
124
|
+
def build_segment(enumerator, grammar, structure)
|
128
125
|
current = enumerator.peek
|
129
126
|
|
130
127
|
while structure[:id] == current[0]
|
@@ -135,17 +132,16 @@ class Baldr::Parser
|
|
135
132
|
|
136
133
|
enumerator.next
|
137
134
|
|
138
|
-
|
139
|
-
sub_grammar = segment.sub_grammar(version)
|
135
|
+
sub_grammar = grammar.sub_grammar(segment) if grammar.respond_to?(:sub_grammar)
|
140
136
|
|
141
137
|
if sub_grammar
|
142
138
|
sub_grammar.structure.fetch(:level, []).each do |s|
|
143
|
-
child = build_segment(enumerator,
|
139
|
+
child = build_segment(enumerator, sub_grammar, s)
|
144
140
|
segment.children << child if child
|
145
141
|
end
|
146
142
|
else
|
147
143
|
structure.fetch(:level, []).each do |s|
|
148
|
-
child = build_segment(enumerator,
|
144
|
+
child = build_segment(enumerator, grammar, s)
|
149
145
|
segment.children << child if child
|
150
146
|
end
|
151
147
|
end
|
data/lib/baldr/segment.rb
CHANGED
data/lib/baldr/transaction.rb
CHANGED
@@ -18,8 +18,8 @@ class Baldr::Transaction < Baldr::Segment
|
|
18
18
|
trailer['SE02'] = transaction_control_number
|
19
19
|
end
|
20
20
|
|
21
|
-
def sub_grammar(version)
|
22
|
-
|
21
|
+
def sub_grammar(grammar, version)
|
22
|
+
grammar.for_transaction_set(transaction_set_code)
|
23
23
|
end
|
24
24
|
|
25
25
|
def functional_group(version)
|
data/lib/baldr/types.rb
CHANGED
@@ -2,9 +2,8 @@ module Baldr::Types
|
|
2
2
|
|
3
3
|
extend self
|
4
4
|
|
5
|
-
def convert_after_load!(envelope, grammar
|
6
|
-
grammar
|
7
|
-
convert_tree!(envelope, grammar, version) do |record_def, element|
|
5
|
+
def convert_after_load!(envelope, grammar)
|
6
|
+
convert_tree!(envelope, grammar) do |record_def, element|
|
8
7
|
case record_def[:type]
|
9
8
|
when :number
|
10
9
|
if element.is_a? String
|
@@ -22,9 +21,8 @@ module Baldr::Types
|
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
|
-
def convert_after_parse!(envelope, grammar
|
26
|
-
grammar
|
27
|
-
convert_tree!(envelope, grammar, version) do |record_def, element|
|
24
|
+
def convert_after_parse!(envelope, grammar)
|
25
|
+
convert_tree!(envelope, grammar) do |record_def, element|
|
28
26
|
case record_def[:type]
|
29
27
|
when :number
|
30
28
|
if element.is_a? String
|
@@ -42,9 +40,8 @@ module Baldr::Types
|
|
42
40
|
end
|
43
41
|
end
|
44
42
|
|
45
|
-
def convert_before_render!(envelope, grammar
|
46
|
-
grammar
|
47
|
-
convert_tree!(envelope, grammar, version) do |record_def, element|
|
43
|
+
def convert_before_render!(envelope, grammar)
|
44
|
+
convert_tree!(envelope, grammar) do |record_def, element|
|
48
45
|
case record_def[:type]
|
49
46
|
when :number
|
50
47
|
if element.is_a? String
|
@@ -64,7 +61,7 @@ module Baldr::Types
|
|
64
61
|
|
65
62
|
protected
|
66
63
|
|
67
|
-
def convert_tree!(segment, grammar,
|
64
|
+
def convert_tree!(segment, grammar, &block)
|
68
65
|
record_defs = grammar.record_defs
|
69
66
|
|
70
67
|
record_defs[segment.id].each.with_index do |r, i|
|
@@ -73,12 +70,11 @@ module Baldr::Types
|
|
73
70
|
end
|
74
71
|
end
|
75
72
|
|
76
|
-
|
77
|
-
sub_grammar = segment.sub_grammar(version)
|
73
|
+
sub_grammar = grammar.sub_grammar(segment) if grammar.respond_to?(:sub_grammar)
|
78
74
|
|
79
75
|
segment.children.each do |loop|
|
80
76
|
loop.segments.each do |child|
|
81
|
-
convert_tree!(child, sub_grammar || grammar,
|
77
|
+
convert_tree!(child, sub_grammar || grammar, &block)
|
82
78
|
end
|
83
79
|
end
|
84
80
|
end
|
data/lib/baldr/validator.rb
CHANGED
@@ -2,14 +2,13 @@ module Baldr::Validator
|
|
2
2
|
|
3
3
|
extend self
|
4
4
|
|
5
|
-
def validate!(envelope, grammar
|
6
|
-
grammar
|
7
|
-
validate_tree!(envelope, grammar, grammar.structure, version)
|
5
|
+
def validate!(envelope, grammar)
|
6
|
+
validate_tree!(envelope, grammar, grammar.structure)
|
8
7
|
end
|
9
8
|
|
10
9
|
protected
|
11
10
|
|
12
|
-
def validate_tree!(segment, grammar, structure
|
11
|
+
def validate_tree!(segment, grammar, structure)
|
13
12
|
record_defs = grammar.record_defs
|
14
13
|
raise Baldr::Error::ValidationError, "unknown segment #{segment.id}" unless record_defs[segment.id]
|
15
14
|
|
@@ -19,8 +18,7 @@ module Baldr::Validator
|
|
19
18
|
self.send("check_#{r[:type]}", r, element) unless element.nil?
|
20
19
|
end
|
21
20
|
|
22
|
-
|
23
|
-
sub_grammar = segment.sub_grammar(version)
|
21
|
+
sub_grammar = grammar.sub_grammar(segment) if grammar.respond_to?(:sub_grammar)
|
24
22
|
structure = sub_grammar.structure if sub_grammar
|
25
23
|
|
26
24
|
l = 0
|
@@ -29,7 +27,7 @@ module Baldr::Validator
|
|
29
27
|
if loop && loop.id.to_s == s[:id]
|
30
28
|
check_loop_count(loop, s)
|
31
29
|
|
32
|
-
loop.segments.each { |child| validate_tree!(child, sub_grammar || grammar, s
|
30
|
+
loop.segments.each { |child| validate_tree!(child, sub_grammar || grammar, s) }
|
33
31
|
|
34
32
|
l += 1
|
35
33
|
elsif loop
|
@@ -49,9 +47,9 @@ module Baldr::Validator
|
|
49
47
|
end
|
50
48
|
end
|
51
49
|
|
52
|
-
def check_loop_count(loop,
|
53
|
-
raise Baldr::Error::ValidationError, "#{loop.id} loop is too long: #{loop.count} segments, maximum #{
|
54
|
-
raise Baldr::Error::ValidationError, "#{loop.id} loop is too short: #{loop.count} segments, minimum #{
|
50
|
+
def check_loop_count(loop, s)
|
51
|
+
raise Baldr::Error::ValidationError, "#{loop.id} loop is too long: #{loop.count} segments, maximum #{s[:max]}" if loop.count > s[:max]
|
52
|
+
raise Baldr::Error::ValidationError, "#{loop.id} loop is too short: #{loop.count} segments, minimum #{s[:min]}" if loop.count < s[:min]
|
55
53
|
end
|
56
54
|
|
57
55
|
def check_required(r, element)
|
data/lib/baldr/version.rb
CHANGED