edir 0.1.0 → 1.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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +4 -3
- data/lib/edir/convert.rb +73 -0
- data/lib/edir/document.rb +32 -0
- data/lib/edir/functional_group.rb +30 -0
- data/lib/edir/interchange.rb +30 -0
- data/lib/edir/parser.rb +4 -140
- data/lib/edir/parser.y +3 -139
- data/lib/edir/segment.rb +40 -0
- data/lib/edir/transaction_set.rb +24 -0
- data/lib/edir/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2cebacb3d342e6e849b771d06dde5931bdce5b118d82be793a9830dd0d087bee
|
|
4
|
+
data.tar.gz: 117315ab268afe2d40b7016a907a831e068280d94c649fbacc56b0f679e9374f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: faf065948fe8d41ccaafe5900480f9e576805335b4225d2eb026722f23c1728a89fa5e2b6b288b7453ef53c227a4cee72495f29d12e1dcdf91e56f0621d50258
|
|
7
|
+
data.tar.gz: 3844441935e8fa8e7d5567ac82ca242f392f7f378042901e6549bb3dfa408e40b412869b043816d341a11b53c21f8a804ccd97f2f1a01e4a5c79e5751f6aa217
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Edir
|
|
2
2
|
|
|
3
|
-
This is a Gem for parsing files. Right now there's no configuration and offers essentially 1 feature: reading EDI and outputting it as formatted Ruby data.
|
|
3
|
+
This is a Gem for parsing EDI files. Right now there's no configuration and offers essentially 1 feature: reading EDI and outputting it as formatted Ruby data or JSON.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ Or install it yourself as:
|
|
|
20
20
|
|
|
21
21
|
## Usage
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
There's not a lot to it. Use the parser like so:
|
|
24
24
|
|
|
25
25
|
```ruby
|
|
26
26
|
require 'edir'
|
|
@@ -30,7 +30,8 @@ edi_data = Edir::Parser.new.parse(edi_string)
|
|
|
30
30
|
|
|
31
31
|
### Example
|
|
32
32
|
```ruby
|
|
33
|
-
Edir::Parser.new.parse(File.read('spec/fixtures/files/204_example_1.txt'))
|
|
33
|
+
parsed = Edir::Parser.new.parse(File.read('spec/fixtures/files/204_example_1.txt'))
|
|
34
|
+
parsed.to_h # or .to_json
|
|
34
35
|
```
|
|
35
36
|
|
|
36
37
|
The lexer is implemented in pure ruby, so changes in `lexer.rb` are always current. However,
|
data/lib/edir/convert.rb
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "document"
|
|
4
|
+
require_relative "interchange"
|
|
5
|
+
require_relative "functional_group"
|
|
6
|
+
require_relative "transaction_set"
|
|
7
|
+
require_relative "segment"
|
|
8
|
+
|
|
9
|
+
module Edir
|
|
10
|
+
# Converter methods for parsed EDI
|
|
11
|
+
module Convert
|
|
12
|
+
# For each transaction set start/end, create a unique transaction set object with
|
|
13
|
+
# the corrsponding segments.
|
|
14
|
+
# For each functional group start/end, create a unique functional group object with
|
|
15
|
+
# the corresponding transaction sets.
|
|
16
|
+
# For each interchange start/end, create a unique interchange object with the corresponding
|
|
17
|
+
# functional groups.
|
|
18
|
+
def convert_document(segments)
|
|
19
|
+
interchanges = partition_by_seg_types(segments: segments, seg_start: "ISA", seg_end: "IEA")
|
|
20
|
+
converted_interchanges = interchanges.map do |inter|
|
|
21
|
+
convert_interchange(inter)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
Edir::Document.new(interchanges: converted_interchanges)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def convert_interchange(inter)
|
|
28
|
+
func_groups = partition_by_seg_types(segments: inter[1..-2], seg_start: "GS", seg_end: "GE")
|
|
29
|
+
converted_func_groups = func_groups.map do |func_group|
|
|
30
|
+
convert_functional_group(func_group)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Edir::Interchange.new(
|
|
34
|
+
header: inter.first,
|
|
35
|
+
footer: inter.last,
|
|
36
|
+
func_groups: converted_func_groups
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def convert_functional_group(func_group)
|
|
41
|
+
transac_sets = partition_by_seg_types(segments: func_group[1..-2], seg_start: "ST", seg_end: "SE")
|
|
42
|
+
converted_transac_sets = transac_sets.map do |transac_set|
|
|
43
|
+
convert_transaction_set(transac_set)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
Edir::FunctionalGroup.new(
|
|
47
|
+
header: func_group.first,
|
|
48
|
+
footer: func_group.last,
|
|
49
|
+
transac_sets: converted_transac_sets
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def convert_transaction_set(transac_set)
|
|
54
|
+
Edir::TransactionSet.new(
|
|
55
|
+
header: transac_set.first,
|
|
56
|
+
footer: transac_set.last,
|
|
57
|
+
segments: transac_set[1..-2]
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def partition_by_seg_types(segments:, seg_start:, seg_end:)
|
|
62
|
+
partitions = []
|
|
63
|
+
while segments.length.positive?
|
|
64
|
+
part_start = segments.find_index { |s| s.name == seg_start }
|
|
65
|
+
part_end = segments.find_index { |s| s.name == seg_end }
|
|
66
|
+
partitions << segments[part_start..part_end]
|
|
67
|
+
segments = segments[part_end + 1..]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
partitions
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
|
|
5
|
+
module Edir
|
|
6
|
+
# Data class for documents
|
|
7
|
+
class Document
|
|
8
|
+
attr_reader :interchanges
|
|
9
|
+
|
|
10
|
+
def initialize(interchanges:)
|
|
11
|
+
@interchanges = interchanges
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def segments
|
|
15
|
+
@interchanges.map(&:segments).flatten
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def elements
|
|
19
|
+
segments.map(&:elements)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def to_h
|
|
23
|
+
{
|
|
24
|
+
"interchanges" => @interchanges.map(&:to_h).flatten
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def to_json(*)
|
|
29
|
+
to_h.to_json
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Edir
|
|
4
|
+
# Data class for functional groups
|
|
5
|
+
class FunctionalGroup
|
|
6
|
+
attr_reader :transac_sets
|
|
7
|
+
|
|
8
|
+
def initialize(header:, footer:, transac_sets:)
|
|
9
|
+
@header = header
|
|
10
|
+
@footer = footer
|
|
11
|
+
@transac_sets = transac_sets
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def segments
|
|
15
|
+
[@header] + @transac_sets.map(&:segments) + [@footer]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def elements
|
|
19
|
+
segments.map(&:elements)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def to_h
|
|
23
|
+
@header.to_h.merge(
|
|
24
|
+
{
|
|
25
|
+
"transaction_sets" => @transac_sets.map(&:to_h).flatten
|
|
26
|
+
}
|
|
27
|
+
).merge(@footer.to_h)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Edir
|
|
4
|
+
# Data class for interchanges
|
|
5
|
+
class Interchange
|
|
6
|
+
attr_reader :func_groups
|
|
7
|
+
|
|
8
|
+
def initialize(header:, footer:, func_groups:)
|
|
9
|
+
@header = header
|
|
10
|
+
@footer = footer
|
|
11
|
+
@func_groups = func_groups
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def segments
|
|
15
|
+
[@header] + @func_groups.map(&:segments).flatten + [@footer]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def elements
|
|
19
|
+
segments.map(&:elements)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def to_h
|
|
23
|
+
@header.to_h.merge(
|
|
24
|
+
{
|
|
25
|
+
"functional_groups" => @func_groups.map(&:to_h).flatten
|
|
26
|
+
}
|
|
27
|
+
).merge(@footer.to_h)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
data/lib/edir/parser.rb
CHANGED
|
@@ -7,87 +7,14 @@
|
|
|
7
7
|
require 'racc/parser.rb'
|
|
8
8
|
|
|
9
9
|
require_relative 'lexer'
|
|
10
|
-
|
|
11
|
-
class Edir::Interchange
|
|
12
|
-
attr_reader :func_groups
|
|
13
|
-
def initialize(header:, footer:, func_groups:)
|
|
14
|
-
@header = header
|
|
15
|
-
@footer = footer
|
|
16
|
-
@func_groups = func_groups
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def segments
|
|
20
|
-
[@header] + @func_groups.map(&:segments).flatten + [@footer]
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def elements
|
|
24
|
-
segments.map(&:elements)
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
class Edir::FunctionalGroup
|
|
29
|
-
attr_reader :transac_sets
|
|
30
|
-
|
|
31
|
-
def initialize(header:, footer:, transac_sets:)
|
|
32
|
-
@header = header
|
|
33
|
-
@footer = footer
|
|
34
|
-
@transac_sets = transac_sets
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def segments
|
|
38
|
-
[@header] + @transac_sets.map(&:segments) + [@footer]
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def elements
|
|
42
|
-
segments.map(&:elements)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
class Edir::TransactionSet
|
|
47
|
-
def initialize(header:, footer:, segments:)
|
|
48
|
-
@header = header
|
|
49
|
-
@footer = footer
|
|
50
|
-
@segments = segments
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def segments
|
|
54
|
-
[@header] + @segments + [@footer]
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def elements
|
|
58
|
-
segments.map(&:elements)
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
class Edir::Segment
|
|
63
|
-
attr_reader :elements
|
|
64
|
-
attr_reader :name
|
|
65
|
-
attr_reader :raw_data
|
|
66
|
-
|
|
67
|
-
def initialize(data)
|
|
68
|
-
@raw_data = data
|
|
69
|
-
|
|
70
|
-
@name = data.first
|
|
71
|
-
@elements = []
|
|
72
|
-
position = 0
|
|
73
|
-
@raw_data[1..].each do |element|
|
|
74
|
-
if element =~ /[*|]/
|
|
75
|
-
position += 1
|
|
76
|
-
else
|
|
77
|
-
@elements.push([element, position])
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def get_element(position)
|
|
83
|
-
@elements.detect { |e| e[1] == position}
|
|
84
|
-
end
|
|
85
|
-
end
|
|
10
|
+
require_relative 'convert'
|
|
86
11
|
|
|
87
12
|
module Edir
|
|
88
13
|
class Parser < Racc::Parser
|
|
89
14
|
|
|
90
|
-
module_eval(<<'...end parser.y/module_eval...', 'parser.y',
|
|
15
|
+
module_eval(<<'...end parser.y/module_eval...', 'parser.y', 24)
|
|
16
|
+
include Edir::Convert
|
|
17
|
+
|
|
91
18
|
def initialize(debug: false)
|
|
92
19
|
@yydebug = debug
|
|
93
20
|
end
|
|
@@ -106,69 +33,6 @@ end
|
|
|
106
33
|
def next_token
|
|
107
34
|
@q.shift
|
|
108
35
|
end
|
|
109
|
-
|
|
110
|
-
# For each transaction set start/end, create a unique transaction set object with
|
|
111
|
-
# the corrsponding segments.
|
|
112
|
-
# For each functional group start/end, create a unique functional group object with
|
|
113
|
-
# the corresponding transaction sets.
|
|
114
|
-
# For each interchange start/end, create a unique interchange object with the corresponding
|
|
115
|
-
# functional groups.
|
|
116
|
-
def convert_document(segments)
|
|
117
|
-
interchanges = partition_by_seg_types(segments: segments, seg_start: "ISA", seg_end: "IEA")
|
|
118
|
-
interchanges.map do |inter|
|
|
119
|
-
convert_interchange(inter)
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def convert_interchange(inter)
|
|
124
|
-
func_groups = partition_by_seg_types(segments: inter[1..-2], seg_start: "GS", seg_end: "GE")
|
|
125
|
-
converted_func_groups = func_groups.map do |func_group|
|
|
126
|
-
convert_functional_group(func_group)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
Edir::Interchange.new(
|
|
130
|
-
header: inter.first,
|
|
131
|
-
footer: inter.last,
|
|
132
|
-
func_groups: converted_func_groups
|
|
133
|
-
)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def convert_functional_group(func_group)
|
|
137
|
-
transac_sets = partition_by_seg_types(segments: func_group[1..-2], seg_start: "ST", seg_end: "SE")
|
|
138
|
-
converted_transac_sets = transac_sets.map do |transac_set|
|
|
139
|
-
convert_transaction_set(transac_set)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
Edir::FunctionalGroup.new(
|
|
143
|
-
header: func_group.first,
|
|
144
|
-
footer: func_group.last,
|
|
145
|
-
transac_sets: converted_transac_sets
|
|
146
|
-
)
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def convert_transaction_set(transac_set)
|
|
150
|
-
Edir::TransactionSet.new(
|
|
151
|
-
header: transac_set.first,
|
|
152
|
-
footer: transac_set.last,
|
|
153
|
-
segments: transac_set[1..-2]
|
|
154
|
-
)
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def partition_by_seg_types(segments:, seg_start:, seg_end:)
|
|
158
|
-
partitions = []
|
|
159
|
-
while segments.length > 0 do
|
|
160
|
-
part_start = segments.find_index do |segment|
|
|
161
|
-
segment.name == seg_start
|
|
162
|
-
end
|
|
163
|
-
part_end = segments.find_index do |segment|
|
|
164
|
-
segment.name == seg_end
|
|
165
|
-
end
|
|
166
|
-
partitions << segments[part_start..part_end]
|
|
167
|
-
segments = segments[part_end+1..]
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
partitions
|
|
171
|
-
end
|
|
172
36
|
...end parser.y/module_eval...
|
|
173
37
|
##### State transition tables begin ###
|
|
174
38
|
|
data/lib/edir/parser.y
CHANGED
|
@@ -18,84 +18,11 @@ end
|
|
|
18
18
|
|
|
19
19
|
---- header
|
|
20
20
|
require_relative 'lexer'
|
|
21
|
-
|
|
22
|
-
class Edir::Interchange
|
|
23
|
-
attr_reader :func_groups
|
|
24
|
-
def initialize(header:, footer:, func_groups:)
|
|
25
|
-
@header = header
|
|
26
|
-
@footer = footer
|
|
27
|
-
@func_groups = func_groups
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def segments
|
|
31
|
-
[@header] + @func_groups.map(&:segments).flatten + [@footer]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def elements
|
|
35
|
-
segments.map(&:elements)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
class Edir::FunctionalGroup
|
|
40
|
-
attr_reader :transac_sets
|
|
41
|
-
|
|
42
|
-
def initialize(header:, footer:, transac_sets:)
|
|
43
|
-
@header = header
|
|
44
|
-
@footer = footer
|
|
45
|
-
@transac_sets = transac_sets
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def segments
|
|
49
|
-
[@header] + @transac_sets.map(&:segments) + [@footer]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def elements
|
|
53
|
-
segments.map(&:elements)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
class Edir::TransactionSet
|
|
58
|
-
def initialize(header:, footer:, segments:)
|
|
59
|
-
@header = header
|
|
60
|
-
@footer = footer
|
|
61
|
-
@segments = segments
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def segments
|
|
65
|
-
[@header] + @segments + [@footer]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def elements
|
|
69
|
-
segments.map(&:elements)
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
class Edir::Segment
|
|
74
|
-
attr_reader :elements
|
|
75
|
-
attr_reader :name
|
|
76
|
-
attr_reader :raw_data
|
|
77
|
-
|
|
78
|
-
def initialize(data)
|
|
79
|
-
@raw_data = data
|
|
80
|
-
|
|
81
|
-
@name = data.first
|
|
82
|
-
@elements = []
|
|
83
|
-
position = 0
|
|
84
|
-
@raw_data[1..].each do |element|
|
|
85
|
-
if element =~ /[*|]/
|
|
86
|
-
position += 1
|
|
87
|
-
else
|
|
88
|
-
@elements.push([element, position])
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def get_element(position)
|
|
94
|
-
@elements.detect { |e| e[1] == position}
|
|
95
|
-
end
|
|
96
|
-
end
|
|
21
|
+
require_relative 'convert'
|
|
97
22
|
|
|
98
23
|
---- inner
|
|
24
|
+
include Edir::Convert
|
|
25
|
+
|
|
99
26
|
def initialize(debug: false)
|
|
100
27
|
@yydebug = debug
|
|
101
28
|
end
|
|
@@ -114,66 +41,3 @@ end
|
|
|
114
41
|
def next_token
|
|
115
42
|
@q.shift
|
|
116
43
|
end
|
|
117
|
-
|
|
118
|
-
# For each transaction set start/end, create a unique transaction set object with
|
|
119
|
-
# the corrsponding segments.
|
|
120
|
-
# For each functional group start/end, create a unique functional group object with
|
|
121
|
-
# the corresponding transaction sets.
|
|
122
|
-
# For each interchange start/end, create a unique interchange object with the corresponding
|
|
123
|
-
# functional groups.
|
|
124
|
-
def convert_document(segments)
|
|
125
|
-
interchanges = partition_by_seg_types(segments: segments, seg_start: "ISA", seg_end: "IEA")
|
|
126
|
-
interchanges.map do |inter|
|
|
127
|
-
convert_interchange(inter)
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def convert_interchange(inter)
|
|
132
|
-
func_groups = partition_by_seg_types(segments: inter[1..-2], seg_start: "GS", seg_end: "GE")
|
|
133
|
-
converted_func_groups = func_groups.map do |func_group|
|
|
134
|
-
convert_functional_group(func_group)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
Edir::Interchange.new(
|
|
138
|
-
header: inter.first,
|
|
139
|
-
footer: inter.last,
|
|
140
|
-
func_groups: converted_func_groups
|
|
141
|
-
)
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
def convert_functional_group(func_group)
|
|
145
|
-
transac_sets = partition_by_seg_types(segments: func_group[1..-2], seg_start: "ST", seg_end: "SE")
|
|
146
|
-
converted_transac_sets = transac_sets.map do |transac_set|
|
|
147
|
-
convert_transaction_set(transac_set)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
Edir::FunctionalGroup.new(
|
|
151
|
-
header: func_group.first,
|
|
152
|
-
footer: func_group.last,
|
|
153
|
-
transac_sets: converted_transac_sets
|
|
154
|
-
)
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def convert_transaction_set(transac_set)
|
|
158
|
-
Edir::TransactionSet.new(
|
|
159
|
-
header: transac_set.first,
|
|
160
|
-
footer: transac_set.last,
|
|
161
|
-
segments: transac_set[1..-2]
|
|
162
|
-
)
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def partition_by_seg_types(segments:, seg_start:, seg_end:)
|
|
166
|
-
partitions = []
|
|
167
|
-
while segments.length > 0 do
|
|
168
|
-
part_start = segments.find_index do |segment|
|
|
169
|
-
segment.name == seg_start
|
|
170
|
-
end
|
|
171
|
-
part_end = segments.find_index do |segment|
|
|
172
|
-
segment.name == seg_end
|
|
173
|
-
end
|
|
174
|
-
partitions << segments[part_start..part_end]
|
|
175
|
-
segments = segments[part_end+1..]
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
partitions
|
|
179
|
-
end
|
data/lib/edir/segment.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Edir
|
|
4
|
+
# Data class for segments
|
|
5
|
+
class Segment
|
|
6
|
+
attr_reader :elements, :name, :raw_data
|
|
7
|
+
|
|
8
|
+
def initialize(data)
|
|
9
|
+
@raw_data = data
|
|
10
|
+
@name = data.first
|
|
11
|
+
build_elements
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def build_elements
|
|
15
|
+
@elements = []
|
|
16
|
+
position = 0
|
|
17
|
+
@raw_data[1..].each do |element|
|
|
18
|
+
if separator?(element)
|
|
19
|
+
position += 1
|
|
20
|
+
else
|
|
21
|
+
@elements.push([element, position])
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def get_element(position)
|
|
27
|
+
@elements.detect { |e| e[1] == position }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def separator?(element)
|
|
31
|
+
element =~ /[*|]/
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def to_h
|
|
35
|
+
{
|
|
36
|
+
@name => @elements.to_h { |e| ["e#{e.last.to_s.rjust(2, "0")}", e.first] }
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Edir
|
|
4
|
+
# Data class for a transaction set
|
|
5
|
+
class TransactionSet
|
|
6
|
+
def initialize(header:, footer:, segments:)
|
|
7
|
+
@header = header
|
|
8
|
+
@footer = footer
|
|
9
|
+
@segments = segments
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def segments
|
|
13
|
+
[@header] + @segments + [@footer]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def elements
|
|
17
|
+
segments.map(&:elements)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_h
|
|
21
|
+
segments.map(&:to_h)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/edir/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: edir
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kaleb McKone
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-03-
|
|
11
|
+
date: 2023-03-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description:
|
|
14
14
|
email:
|
|
@@ -28,9 +28,15 @@ files:
|
|
|
28
28
|
- bin/console
|
|
29
29
|
- bin/setup
|
|
30
30
|
- lib/edir.rb
|
|
31
|
+
- lib/edir/convert.rb
|
|
32
|
+
- lib/edir/document.rb
|
|
33
|
+
- lib/edir/functional_group.rb
|
|
34
|
+
- lib/edir/interchange.rb
|
|
31
35
|
- lib/edir/lexer.rb
|
|
32
36
|
- lib/edir/parser.rb
|
|
33
37
|
- lib/edir/parser.y
|
|
38
|
+
- lib/edir/segment.rb
|
|
39
|
+
- lib/edir/transaction_set.rb
|
|
34
40
|
- lib/edir/version.rb
|
|
35
41
|
homepage: https://github.com/krmckone/edir
|
|
36
42
|
licenses:
|