111 lines
2.1 KiB
Crystal
111 lines
2.1 KiB
Crystal
require "tap"
|
|
require "option_parser"
|
|
|
|
args = Array(String).new
|
|
|
|
OptionParser.parse! do |parser|
|
|
parser.banner = "usage: tap-aggregator <command> [options]"
|
|
|
|
parser.on("-h", "--help", "Show this help") do
|
|
puts parser
|
|
exit 0
|
|
end
|
|
|
|
parser.invalid_option do |flag|
|
|
STDERR.puts "ERROR: #{flag} is not a valid option."
|
|
STDERR.puts parser
|
|
exit 1
|
|
end
|
|
|
|
parser.unknown_args do |x|
|
|
args = x
|
|
|
|
if args.size < 1
|
|
puts parser
|
|
exit 1
|
|
end
|
|
end
|
|
end
|
|
|
|
command = args[0]
|
|
|
|
class Storage
|
|
def initialize(@root : String = "storage")
|
|
end
|
|
|
|
def store(project, environment, revision, content)
|
|
date = Time.utc.to_unix
|
|
file_path = "#{@root}/#{project}/#{environment}/#{date}##{revision}.tap"
|
|
Dir.mkdir_p File.dirname file_path
|
|
File.write file_path, content
|
|
end
|
|
|
|
def projects
|
|
Dir.children @root
|
|
end
|
|
|
|
def environments(project)
|
|
Dir.children "#{@root}/#{project}"
|
|
end
|
|
|
|
def results(project, environment)
|
|
dir_name = "#{@root}/#{project}/#{environment}"
|
|
Dir.children(dir_name).compact_map do |file_name|
|
|
unless file_name.match /.tap$/
|
|
next
|
|
end
|
|
|
|
tap = Tap.parse File.read "#{dir_name}/#{file_name}"
|
|
next unless tap
|
|
|
|
md = file_name.match /^([^#]*)#(.*).tap$/
|
|
unless md
|
|
next
|
|
end
|
|
|
|
revision = md[2]
|
|
timestamp = md[1]
|
|
|
|
{revision, timestamp, tap}
|
|
end
|
|
end
|
|
end
|
|
|
|
storage = Storage.new
|
|
|
|
enum Tap::Entry::Status
|
|
def to_s
|
|
if self == NotOk
|
|
"not ok"
|
|
elsif self == Ok
|
|
"ok"
|
|
end
|
|
end
|
|
end
|
|
|
|
case command
|
|
when "add"
|
|
if args.size != 4
|
|
STDERR.puts "usage: tap-aggregator add <project> <environment> <revision> [options]"
|
|
exit 1
|
|
end
|
|
|
|
project = args[1]
|
|
environment = args[2]
|
|
revision = args[3]
|
|
|
|
storage.store project, environment, revision, STDIN.gets_to_end
|
|
when "show"
|
|
storage.projects.each do |project|
|
|
storage.environments(project).each do |environment|
|
|
storage.results(project, environment).each do |revision, timestamp, suite|
|
|
puts "#{project}, #{environment}, #{revision} (#{timestamp}) [ #{suite.size} tests ]"
|
|
suite.each do |test|
|
|
puts " -> #{test.id} #{test.status} #{test.title}"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|