baldr 0.3.17 → 0.3.18
Sign up to get free protection for your applications and to get access to all the features.
- 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