edir 0.1.0 → 1.1.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 +0 -9
- data/Gemfile.lock +23 -38
- data/README.md +4 -3
- data/Rakefile +0 -9
- data/lib/edir/converter.rb +75 -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/parsing.rb +27 -0
- data/lib/edir/segment.rb +40 -0
- data/lib/edir/transaction_set.rb +24 -0
- data/lib/edir/version.rb +1 -1
- data/lib/edir.rb +1 -2
- metadata +9 -5
- data/lib/edir/lexer.rb +0 -95
- data/lib/edir/parser.rb +0 -317
- data/lib/edir/parser.y +0 -179
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6edf58c25b7fef2c55e00d2b0f2a7e92b7bd8abf138ceb20dc7f2a22411c1379
|
|
4
|
+
data.tar.gz: 2fe71607b7d9f657180cb44637bad0d92a91aad67615954e41d9716e8ddf8e24
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 596ffc51ec1505d1132bf08fca9b7ce379dcd77a199db41497ec6792efa24f551a134b96ce9944a8518386c77fd844e2edc0a13f97d00e77f7cf44adb0ff2af4
|
|
7
|
+
data.tar.gz: 8fd97a4152917829cdb846757824ebc2b6631ddec6f47f85a7990d6ea7de43d7bba172732c8febe7337b4edd860782dcaf70790dfec267185d22926745d64b81
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,59 +1,48 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
edir (
|
|
4
|
+
edir (1.1.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
8
8
|
specs:
|
|
9
9
|
ast (2.4.2)
|
|
10
|
-
byebug (11.1.3)
|
|
11
|
-
coderay (1.1.3)
|
|
12
10
|
diff-lcs (1.5.0)
|
|
13
|
-
json (2.6.
|
|
14
|
-
lex (0.1.0)
|
|
15
|
-
method_source (1.0.0)
|
|
11
|
+
json (2.6.3)
|
|
16
12
|
parallel (1.22.1)
|
|
17
|
-
parser (3.
|
|
13
|
+
parser (3.2.2.0)
|
|
18
14
|
ast (~> 2.4.1)
|
|
19
|
-
pry (0.14.1)
|
|
20
|
-
coderay (~> 1.1)
|
|
21
|
-
method_source (~> 1.0)
|
|
22
|
-
pry-byebug (3.8.0)
|
|
23
|
-
byebug (~> 11.0)
|
|
24
|
-
pry (~> 0.10)
|
|
25
|
-
racc (1.6.0)
|
|
26
15
|
rainbow (3.1.1)
|
|
27
16
|
rake (13.0.6)
|
|
28
|
-
regexp_parser (2.
|
|
17
|
+
regexp_parser (2.7.0)
|
|
29
18
|
rexml (3.2.5)
|
|
30
|
-
rspec (3.
|
|
31
|
-
rspec-core (~> 3.
|
|
32
|
-
rspec-expectations (~> 3.
|
|
33
|
-
rspec-mocks (~> 3.
|
|
34
|
-
rspec-core (3.
|
|
35
|
-
rspec-support (~> 3.
|
|
36
|
-
rspec-expectations (3.
|
|
19
|
+
rspec (3.12.0)
|
|
20
|
+
rspec-core (~> 3.12.0)
|
|
21
|
+
rspec-expectations (~> 3.12.0)
|
|
22
|
+
rspec-mocks (~> 3.12.0)
|
|
23
|
+
rspec-core (3.12.1)
|
|
24
|
+
rspec-support (~> 3.12.0)
|
|
25
|
+
rspec-expectations (3.12.2)
|
|
37
26
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
38
|
-
rspec-support (~> 3.
|
|
39
|
-
rspec-mocks (3.
|
|
27
|
+
rspec-support (~> 3.12.0)
|
|
28
|
+
rspec-mocks (3.12.5)
|
|
40
29
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
41
|
-
rspec-support (~> 3.
|
|
42
|
-
rspec-support (3.
|
|
43
|
-
rubocop (1.
|
|
30
|
+
rspec-support (~> 3.12.0)
|
|
31
|
+
rspec-support (3.12.0)
|
|
32
|
+
rubocop (1.50.1)
|
|
44
33
|
json (~> 2.3)
|
|
45
34
|
parallel (~> 1.10)
|
|
46
|
-
parser (>= 3.
|
|
35
|
+
parser (>= 3.2.0.0)
|
|
47
36
|
rainbow (>= 2.2.2, < 4.0)
|
|
48
37
|
regexp_parser (>= 1.8, < 3.0)
|
|
49
38
|
rexml (>= 3.2.5, < 4.0)
|
|
50
|
-
rubocop-ast (>= 1.
|
|
39
|
+
rubocop-ast (>= 1.28.0, < 2.0)
|
|
51
40
|
ruby-progressbar (~> 1.7)
|
|
52
|
-
unicode-display_width (>=
|
|
53
|
-
rubocop-ast (1.
|
|
54
|
-
parser (>= 3.
|
|
55
|
-
ruby-progressbar (1.
|
|
56
|
-
unicode-display_width (2.
|
|
41
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
|
42
|
+
rubocop-ast (1.28.0)
|
|
43
|
+
parser (>= 3.2.1.0)
|
|
44
|
+
ruby-progressbar (1.13.0)
|
|
45
|
+
unicode-display_width (2.4.2)
|
|
57
46
|
|
|
58
47
|
PLATFORMS
|
|
59
48
|
ruby
|
|
@@ -62,10 +51,6 @@ PLATFORMS
|
|
|
62
51
|
|
|
63
52
|
DEPENDENCIES
|
|
64
53
|
edir!
|
|
65
|
-
lex (~> 0.1.0)
|
|
66
|
-
pry
|
|
67
|
-
pry-byebug
|
|
68
|
-
racc (~> 1.6.0)
|
|
69
54
|
rake (~> 13.0)
|
|
70
55
|
rspec (~> 3.0)
|
|
71
56
|
rubocop (~> 1.21)
|
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/Rakefile
CHANGED
|
@@ -10,12 +10,3 @@ require "rubocop/rake_task"
|
|
|
10
10
|
RuboCop::RakeTask.new
|
|
11
11
|
|
|
12
12
|
task default: %i[spec rubocop]
|
|
13
|
-
|
|
14
|
-
desc "Generate Parser"
|
|
15
|
-
task :parser do
|
|
16
|
-
`racc lib/edir/parser.y -o lib/edir/parser.rb`
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
task :parser_debug do
|
|
20
|
-
`racc -g lib/edir/parser.y -o lib/edir/parser.rb`
|
|
21
|
-
end
|
|
@@ -0,0 +1,75 @@
|
|
|
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 Converter
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
# For each transaction set start/end, create a unique transaction set object with
|
|
15
|
+
# the corrsponding segments.
|
|
16
|
+
# For each functional group start/end, create a unique functional group object with
|
|
17
|
+
# the corresponding transaction sets.
|
|
18
|
+
# For each interchange start/end, create a unique interchange object with the corresponding
|
|
19
|
+
# functional groups.
|
|
20
|
+
def convert_document(segments)
|
|
21
|
+
interchanges = partition_by_seg_types(segments: segments, seg_start: "ISA", seg_end: "IEA")
|
|
22
|
+
converted_interchanges = interchanges.map do |inter|
|
|
23
|
+
convert_interchange(inter)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Edir::Document.new(interchanges: converted_interchanges)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def convert_interchange(inter)
|
|
30
|
+
func_groups = partition_by_seg_types(segments: inter[1..-2], seg_start: "GS", seg_end: "GE")
|
|
31
|
+
converted_func_groups = func_groups.map do |func_group|
|
|
32
|
+
convert_functional_group(func_group)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
Edir::Interchange.new(
|
|
36
|
+
header: inter.first,
|
|
37
|
+
footer: inter.last,
|
|
38
|
+
func_groups: converted_func_groups
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def convert_functional_group(func_group)
|
|
43
|
+
transac_sets = partition_by_seg_types(segments: func_group[1..-2], seg_start: "ST", seg_end: "SE")
|
|
44
|
+
converted_transac_sets = transac_sets.map do |transac_set|
|
|
45
|
+
convert_transaction_set(transac_set)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
Edir::FunctionalGroup.new(
|
|
49
|
+
header: func_group.first,
|
|
50
|
+
footer: func_group.last,
|
|
51
|
+
transac_sets: converted_transac_sets
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def convert_transaction_set(transac_set)
|
|
56
|
+
Edir::TransactionSet.new(
|
|
57
|
+
header: transac_set.first,
|
|
58
|
+
footer: transac_set.last,
|
|
59
|
+
segments: transac_set[1..-2]
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def partition_by_seg_types(segments:, seg_start:, seg_end:)
|
|
64
|
+
partitions = []
|
|
65
|
+
while segments.length.positive?
|
|
66
|
+
part_start = segments.find_index { |s| s.name == seg_start }
|
|
67
|
+
part_end = segments.find_index { |s| s.name == seg_end }
|
|
68
|
+
partitions << segments[part_start..part_end]
|
|
69
|
+
segments = segments[part_end + 1..]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
partitions
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
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/parsing.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "converter"
|
|
4
|
+
|
|
5
|
+
module Edir
|
|
6
|
+
# Top level parsing module
|
|
7
|
+
# Edir::Parsing.parse(raw_edi)
|
|
8
|
+
module Parsing
|
|
9
|
+
extend Edir::Converter
|
|
10
|
+
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
def parse(raw_edi)
|
|
14
|
+
# TODO: Figure out the segment/element separators dynamically
|
|
15
|
+
segments = raw_edi.gsub("\n", "").gsub("\r", "").split("~")
|
|
16
|
+
segments = segments.map do |segment|
|
|
17
|
+
Edir::Segment.new(segment)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
if segments.length > 1
|
|
21
|
+
convert_document(segments)
|
|
22
|
+
else
|
|
23
|
+
segments
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
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
|
+
@raw_elements = @raw_data.split("*")
|
|
11
|
+
@name = @raw_elements.first
|
|
12
|
+
build_elements
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def build_elements
|
|
16
|
+
@elements = []
|
|
17
|
+
@raw_elements[1..].each_with_index do |element, index|
|
|
18
|
+
@elements.push([element.strip, index + 1])
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def get_element(position)
|
|
23
|
+
@elements.detect { |e| e[1] == position }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def separator?(element)
|
|
27
|
+
element =~ /[*|]/
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_h
|
|
31
|
+
{
|
|
32
|
+
@name => @elements.to_h { |e| ["e#{e.last.to_s.rjust(2, "0")}", e.first] }
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def to_s
|
|
37
|
+
"#<Edir::Segment #{@name} #{@elements}>"
|
|
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
data/lib/edir.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.1.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-
|
|
11
|
+
date: 2023-04-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description:
|
|
14
14
|
email:
|
|
@@ -28,9 +28,13 @@ files:
|
|
|
28
28
|
- bin/console
|
|
29
29
|
- bin/setup
|
|
30
30
|
- lib/edir.rb
|
|
31
|
-
- lib/edir/
|
|
32
|
-
- lib/edir/
|
|
33
|
-
- lib/edir/
|
|
31
|
+
- lib/edir/converter.rb
|
|
32
|
+
- lib/edir/document.rb
|
|
33
|
+
- lib/edir/functional_group.rb
|
|
34
|
+
- lib/edir/interchange.rb
|
|
35
|
+
- lib/edir/parsing.rb
|
|
36
|
+
- lib/edir/segment.rb
|
|
37
|
+
- lib/edir/transaction_set.rb
|
|
34
38
|
- lib/edir/version.rb
|
|
35
39
|
homepage: https://github.com/krmckone/edir
|
|
36
40
|
licenses:
|
data/lib/edir/lexer.rb
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "lex"
|
|
4
|
-
|
|
5
|
-
module Edir
|
|
6
|
-
# Top level API class for providing EDI lexing
|
|
7
|
-
class Lexer < Lex::Lexer
|
|
8
|
-
tokens(
|
|
9
|
-
:SEGSTART,
|
|
10
|
-
:SEGEND,
|
|
11
|
-
:ELEMSEP,
|
|
12
|
-
:ELEM
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
states(
|
|
16
|
-
insegment: :exclusive,
|
|
17
|
-
inelement: :exclusive
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
rule(:SEGSTART, /\w{2,3}(?=[*|~])/) do |lexer, token|
|
|
21
|
-
lexer.push_state(:insegment)
|
|
22
|
-
token
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Rule to match when we have started a segment
|
|
26
|
-
# but it has no elements
|
|
27
|
-
rule(:insegment_SEGEND, /~|\n/) do |lexer, token|
|
|
28
|
-
lexer.pop_state
|
|
29
|
-
token
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
rule(:insegment_ELEMSEP, /\*|\|/) do |lexer, token|
|
|
33
|
-
# If we are insegment, when we encounter an element separator it means
|
|
34
|
-
# we should now be inelement. Otherwise, we were inelement and should
|
|
35
|
-
# leave the state, back to insegment.
|
|
36
|
-
if lexer.current_state == :insegment
|
|
37
|
-
lexer.push_state(:inelement)
|
|
38
|
-
else
|
|
39
|
-
lexer.pop_state
|
|
40
|
-
end
|
|
41
|
-
token
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
rule(:inelement_ELEMSEP, /\*|\|/)
|
|
45
|
-
|
|
46
|
-
rule(:inelement_ELEM, /[\w\s\-().,!:@>'^]+/) do |_lexer, token|
|
|
47
|
-
token.value = token.value.strip
|
|
48
|
-
token
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
rule(:inelement_SEGEND, /~|\n/) do |lexer, token|
|
|
52
|
-
lexer.pop_state
|
|
53
|
-
lexer.pop_state
|
|
54
|
-
token
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
ignore "\n"
|
|
58
|
-
ignore :insegment, "\s"
|
|
59
|
-
ignore :inelement, "\s"
|
|
60
|
-
|
|
61
|
-
error :insegment do |lexer, token|
|
|
62
|
-
error_handler(lexer, token)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
error :inelement do |lexer, token|
|
|
66
|
-
error_handler(lexer, token)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def lex_str(str)
|
|
70
|
-
# NOTE: Need to decide if this is really what we want to do here.
|
|
71
|
-
# Do the token objects contain any more useful information we
|
|
72
|
-
# should be passing on?
|
|
73
|
-
with_empty_elements_added = []
|
|
74
|
-
tokens = lex(str).map { |o| [o.name, o.value] }
|
|
75
|
-
# TODO: There's got to be a better way to do this
|
|
76
|
-
# I just want to know if two adjacent tokens are :ELEMSEP so we can
|
|
77
|
-
# add back the empty element that isn't easily handled by the lexer
|
|
78
|
-
tokens.each_with_index.map do |token, i|
|
|
79
|
-
with_empty_elements_added << token
|
|
80
|
-
if token.first == :ELEMSEP && i + 1 < tokens.length && tokens[i + 1].first == :ELEMSEP
|
|
81
|
-
with_empty_elements_added << [:ELEM, ""]
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
with_empty_elements_added
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
class << self
|
|
88
|
-
private
|
|
89
|
-
|
|
90
|
-
def error_handler(_lexer, token)
|
|
91
|
-
puts "Illegal character #{token.value}"
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
data/lib/edir/parser.rb
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# DO NOT MODIFY!!!!
|
|
3
|
-
# This file is automatically generated by Racc 1.6.0
|
|
4
|
-
# from Racc grammar file "".
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
require 'racc/parser.rb'
|
|
8
|
-
|
|
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
|
|
86
|
-
|
|
87
|
-
module Edir
|
|
88
|
-
class Parser < Racc::Parser
|
|
89
|
-
|
|
90
|
-
module_eval(<<'...end parser.y/module_eval...', 'parser.y', 99)
|
|
91
|
-
def initialize(debug: false)
|
|
92
|
-
@yydebug = debug
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def parse(str)
|
|
96
|
-
@q = Edir::Lexer.new.lex_str(str)
|
|
97
|
-
data = do_parse
|
|
98
|
-
# Implicit segment vs document mode
|
|
99
|
-
if data.length > 1
|
|
100
|
-
convert_document(data)
|
|
101
|
-
else
|
|
102
|
-
data
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def next_token
|
|
107
|
-
@q.shift
|
|
108
|
-
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
|
-
...end parser.y/module_eval...
|
|
173
|
-
##### State transition tables begin ###
|
|
174
|
-
|
|
175
|
-
racc_action_table = [
|
|
176
|
-
7, 8, 9, 8, 9, 8, 9, 3, 4, 3,
|
|
177
|
-
10, 11 ]
|
|
178
|
-
|
|
179
|
-
racc_action_check = [
|
|
180
|
-
3, 3, 3, 8, 8, 9, 9, 0, 1, 2,
|
|
181
|
-
4, 6 ]
|
|
182
|
-
|
|
183
|
-
racc_action_pointer = [
|
|
184
|
-
5, 8, 7, -3, 10, nil, 8, nil, -1, 1,
|
|
185
|
-
nil, nil, nil, nil ]
|
|
186
|
-
|
|
187
|
-
racc_action_default = [
|
|
188
|
-
-8, -8, -2, -8, -8, -1, -8, -4, -8, -7,
|
|
189
|
-
14, -3, -5, -6 ]
|
|
190
|
-
|
|
191
|
-
racc_goto_table = [
|
|
192
|
-
6, 1, nil, 5, nil, 12, 13 ]
|
|
193
|
-
|
|
194
|
-
racc_goto_check = [
|
|
195
|
-
3, 1, nil, 1, nil, 3, 3 ]
|
|
196
|
-
|
|
197
|
-
racc_goto_pointer = [
|
|
198
|
-
nil, 1, nil, -3 ]
|
|
199
|
-
|
|
200
|
-
racc_goto_default = [
|
|
201
|
-
nil, nil, 2, nil ]
|
|
202
|
-
|
|
203
|
-
racc_reduce_table = [
|
|
204
|
-
0, 0, :racc_error,
|
|
205
|
-
2, 7, :_reduce_1,
|
|
206
|
-
1, 7, :_reduce_2,
|
|
207
|
-
3, 8, :_reduce_3,
|
|
208
|
-
2, 8, :_reduce_4,
|
|
209
|
-
2, 9, :_reduce_5,
|
|
210
|
-
2, 9, :_reduce_6,
|
|
211
|
-
1, 9, :_reduce_7 ]
|
|
212
|
-
|
|
213
|
-
racc_reduce_n = 8
|
|
214
|
-
|
|
215
|
-
racc_shift_n = 14
|
|
216
|
-
|
|
217
|
-
racc_token_table = {
|
|
218
|
-
false => 0,
|
|
219
|
-
:error => 1,
|
|
220
|
-
:SEGSTART => 2,
|
|
221
|
-
:SEGEND => 3,
|
|
222
|
-
:ELEMSEP => 4,
|
|
223
|
-
:ELEM => 5 }
|
|
224
|
-
|
|
225
|
-
racc_nt_base = 6
|
|
226
|
-
|
|
227
|
-
racc_use_result_var = true
|
|
228
|
-
|
|
229
|
-
Racc_arg = [
|
|
230
|
-
racc_action_table,
|
|
231
|
-
racc_action_check,
|
|
232
|
-
racc_action_default,
|
|
233
|
-
racc_action_pointer,
|
|
234
|
-
racc_goto_table,
|
|
235
|
-
racc_goto_check,
|
|
236
|
-
racc_goto_default,
|
|
237
|
-
racc_goto_pointer,
|
|
238
|
-
racc_nt_base,
|
|
239
|
-
racc_reduce_table,
|
|
240
|
-
racc_token_table,
|
|
241
|
-
racc_shift_n,
|
|
242
|
-
racc_reduce_n,
|
|
243
|
-
racc_use_result_var ]
|
|
244
|
-
|
|
245
|
-
Racc_token_to_s_table = [
|
|
246
|
-
"$end",
|
|
247
|
-
"error",
|
|
248
|
-
"SEGSTART",
|
|
249
|
-
"SEGEND",
|
|
250
|
-
"ELEMSEP",
|
|
251
|
-
"ELEM",
|
|
252
|
-
"$start",
|
|
253
|
-
"segments",
|
|
254
|
-
"segment",
|
|
255
|
-
"elems" ]
|
|
256
|
-
|
|
257
|
-
Racc_debug_parser = false
|
|
258
|
-
|
|
259
|
-
##### State transition tables end #####
|
|
260
|
-
|
|
261
|
-
# reduce 0 omitted
|
|
262
|
-
|
|
263
|
-
module_eval(<<'.,.,', 'parser.y', 9)
|
|
264
|
-
def _reduce_1(val, _values, result)
|
|
265
|
-
result = [val[0]] + val[1]
|
|
266
|
-
result
|
|
267
|
-
end
|
|
268
|
-
.,.,
|
|
269
|
-
|
|
270
|
-
module_eval(<<'.,.,', 'parser.y', 10)
|
|
271
|
-
def _reduce_2(val, _values, result)
|
|
272
|
-
result = val
|
|
273
|
-
result
|
|
274
|
-
end
|
|
275
|
-
.,.,
|
|
276
|
-
|
|
277
|
-
module_eval(<<'.,.,', 'parser.y', 11)
|
|
278
|
-
def _reduce_3(val, _values, result)
|
|
279
|
-
result = Edir::Segment.new([val[0]] + val[1])
|
|
280
|
-
result
|
|
281
|
-
end
|
|
282
|
-
.,.,
|
|
283
|
-
|
|
284
|
-
module_eval(<<'.,.,', 'parser.y', 12)
|
|
285
|
-
def _reduce_4(val, _values, result)
|
|
286
|
-
result = Edir::Segment.new([val[0]])
|
|
287
|
-
result
|
|
288
|
-
end
|
|
289
|
-
.,.,
|
|
290
|
-
|
|
291
|
-
module_eval(<<'.,.,', 'parser.y', 13)
|
|
292
|
-
def _reduce_5(val, _values, result)
|
|
293
|
-
result = [val[0]] + val[1]
|
|
294
|
-
result
|
|
295
|
-
end
|
|
296
|
-
.,.,
|
|
297
|
-
|
|
298
|
-
module_eval(<<'.,.,', 'parser.y', 14)
|
|
299
|
-
def _reduce_6(val, _values, result)
|
|
300
|
-
result = [val[0]] + val[1]
|
|
301
|
-
result
|
|
302
|
-
end
|
|
303
|
-
.,.,
|
|
304
|
-
|
|
305
|
-
module_eval(<<'.,.,', 'parser.y', 15)
|
|
306
|
-
def _reduce_7(val, _values, result)
|
|
307
|
-
result = val
|
|
308
|
-
result
|
|
309
|
-
end
|
|
310
|
-
.,.,
|
|
311
|
-
|
|
312
|
-
def _reduce_none(val, _values, result)
|
|
313
|
-
val[0]
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
end # class Parser
|
|
317
|
-
end # module Edir
|
data/lib/edir/parser.y
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
class Edir::Parser
|
|
2
|
-
token SEGSTART SEGEND ELEMSEP ELEM
|
|
3
|
-
# local variables that racc provides in the environment of action:
|
|
4
|
-
# * val is the right hand side
|
|
5
|
-
# * result is the left hand side
|
|
6
|
-
# The plural definitions return an array while the singular ones
|
|
7
|
-
# return a single element. In order to build a sensibly flat representation of the
|
|
8
|
-
# document, we concatenate the single elements with the ones that return an array
|
|
9
|
-
rule
|
|
10
|
-
segments : segment segments { result = [val[0]] + val[1] }
|
|
11
|
-
| segment { result = val }
|
|
12
|
-
segment : SEGSTART elems SEGEND { result = Edir::Segment.new([val[0]] + val[1]) }
|
|
13
|
-
| SEGSTART SEGEND { result = Edir::Segment.new([val[0]]) }
|
|
14
|
-
elems : ELEMSEP elems { result = [val[0]] + val[1] }
|
|
15
|
-
| ELEM elems { result = [val[0]] + val[1] }
|
|
16
|
-
| ELEM { result = val }
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
---- header
|
|
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
|
|
97
|
-
|
|
98
|
-
---- inner
|
|
99
|
-
def initialize(debug: false)
|
|
100
|
-
@yydebug = debug
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def parse(str)
|
|
104
|
-
@q = Edir::Lexer.new.lex_str(str)
|
|
105
|
-
data = do_parse
|
|
106
|
-
# Implicit segment vs document mode
|
|
107
|
-
if data.length > 1
|
|
108
|
-
convert_document(data)
|
|
109
|
-
else
|
|
110
|
-
data
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def next_token
|
|
115
|
-
@q.shift
|
|
116
|
-
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
|