Class: LabParser

Inherits:
Object
  • Object
show all
Defined in:
lib/ecu/interfaces/lab/lab_parser.rb

Class Method Summary collapse

Class Method Details

.block_bounded_by(lines, upper, lower) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ecu/interfaces/lab/lab_parser.rb', line 36

def self.block_bounded_by(lines, upper, lower)
  upper = case upper
          when Integer then upper
          when String
            return [] unless lines.any? { |l| l.strip.downcase == upper.downcase }
            lines.index { |l| l.strip.downcase == upper.downcase } + 1
          when Regexp
            return [] unless lines.any? { |l| l.match?(upper) }
            lines.index { |l| l.match?(upper) } + 1
          end

  segment = lines[upper..-1]

  lower = case lower
          when Integer then lower
          when String
            return lines[upper..-1] unless segment.any? { |l| l.strip.downcase == lower.downcase }
            upper + segment.index { |l| l.strip.downcase == lower.downcase }
          when Regexp
            return lines[upper..-1] unless segment.any? { |l| l.match?(lower) }
            upper + segment.index { |l| l.match?(lower) }
          end

  lines[upper...lower]
end

.call(str) ⇒ Object



5
6
7
8
9
10
11
12
13
14
# File 'lib/ecu/interfaces/lab/lab_parser.rb', line 5

def self.call(str)
  lines = str.lines

  [
    extract_signals(block_bounded_by(lines, "[RAMCELL]", /\A\[/)),
    extract_labels(block_bounded_by(lines, "[Label]", /\A\[/)),
    extract_headers(block_bounded_by(lines, 0, "[SETTINGS]")),
    extract_headers(block_bounded_by(lines, "[SETTINGS]", /\A\[/)),
  ]
end

.extract_headers(lines) ⇒ Object



30
31
32
33
34
# File 'lib/ecu/interfaces/lab/lab_parser.rb', line 30

def self.extract_headers(lines)
  lines.
    select { |l| l.match(/\A; /) }.
    map { |l| l[2..-1].chomp }
end

.extract_labels(lines) ⇒ Object



16
17
18
19
20
21
# File 'lib/ecu/interfaces/lab/lab_parser.rb', line 16

def self.extract_labels(lines)
  Ecu::LabelList.new lines.
    reject { |l| l.blank? }.
    reject { |l| l.start_with?(";") }.
    map { |l| Ecu::Label.from_lab(l) }
end

.extract_signals(lines) ⇒ Object



23
24
25
26
27
28
# File 'lib/ecu/interfaces/lab/lab_parser.rb', line 23

def self.extract_signals(lines)
  Ecu::SignalList.new lines.
    reject { |l| l.blank? }.
    reject { |l| l.start_with?(";") }.
    map { |l| Ecu::Signal.from_lab(l) }
end