77 lines
1.3 KiB
Ruby
Executable File
77 lines
1.3 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# 2018 Luke Shumaker
|
|
|
|
require 'yaml'
|
|
|
|
def indent(para, depth)
|
|
pfix = " "*depth
|
|
return para.lines.map{|line|pfix+line}.join
|
|
end
|
|
|
|
def bail(reason)
|
|
puts "Bail out! #{reason}"
|
|
exit
|
|
end
|
|
|
|
puts "TAP version 13"
|
|
section = nil
|
|
yblock = nil
|
|
plan = nil
|
|
head = ""
|
|
STDIN.each_line do |line|
|
|
if section.nil?
|
|
case line.chomp
|
|
when /^--- (.*) ---$/
|
|
section = $1
|
|
yblock[section] = ""
|
|
when /^\s*$/
|
|
# ignore
|
|
when /^\s*([0-9]+)\/([0-9]+) (.*\S)\s+(OK|FAIL|SKIP)\s+(\S* \S*) (.*)$/
|
|
n = $1
|
|
m = $2
|
|
if plan.nil?
|
|
puts "1..#{m}"
|
|
plan = m
|
|
print head
|
|
elsif m != plan
|
|
bail("m:#{m} != plan:#{plan}")
|
|
end
|
|
name = $3
|
|
result = $4
|
|
duration = $5
|
|
comment = $6
|
|
case result
|
|
when "OK"
|
|
puts "ok #{n} #{name}"
|
|
when "FAIL"
|
|
puts "not ok #{n} #{name}"
|
|
when "SKIP"
|
|
puts "ok #{n} #{name} # SKIP"
|
|
else
|
|
bail("unparsable line: #{line}")
|
|
end
|
|
yblock = {}
|
|
yblock['_duration'] = duration
|
|
yblock['_exitstatus'] = comment
|
|
else
|
|
if plan.nil?
|
|
head += "# #{line}"
|
|
else
|
|
print "# #{line}"
|
|
end
|
|
end
|
|
else
|
|
case line.chomp
|
|
when "-------"
|
|
puts indent(YAML::dump(yblock), 4)
|
|
yblock = nil
|
|
section = nil
|
|
when /^--- (.*) ---$/
|
|
section = $1
|
|
yblock[section] = ""
|
|
else
|
|
yblock[section] += line
|
|
end
|
|
end
|
|
end
|