legendary-doc-site/script/coverage-json-to-cobertura
2021-07-22 15:39:17 -05:00

105 lines
2 KiB
Elixir
Executable file

#!/usr/bin/env elixir
Mix.install([
{:jason, "~> 1.0"},
{:xml_builder, "~> 2.1"}
])
%{"source_files" => data} =
"cover/excoveralls.json"
|> File.read!()
|> Jason.decode!()
{total_covered, total_total} =
data
|> Enum.reduce({0,0}, fn %{"coverage" => cover}, {covered, total} ->
file_covered =
cover
|> Enum.reduce(0, &(if is_integer(&1) && &1 > 0, do: &2 + 1, else: &2))
file_total =
cover
|> Enum.reduce(0, &(if is_nil(&1), do: &2, else: &2 + 1))
{covered + file_covered, total + file_total}
end)
ratio = total_covered / total_total
files =
data
|> Enum.map(fn %{"coverage" => cover, "name" => name} ->
file_covered =
cover
|> Enum.reduce(0, &(if is_integer(&1) && &1 > 0, do: &2 + 1, else: &2))
file_total =
cover
|> Enum.reduce(0, &(if is_nil(&1), do: &2, else: &2 + 1))
lines =
cover
|> Enum.with_index
|> Enum.map(fn
{nil, _index} ->
nil
{line, index} ->
{:line, %{"number" => index, "hits" => line}, []}
end)
|> Enum.reject(&is_nil/1)
ratio =
if file_total == 0 do
1.0
else
file_covered / file_total
end
{
:class,
%{"filename" => name, "line-rate" => ratio},
[
{
:lines,
%{},
lines
}
]
}
end)
buffer =
XmlBuilder.document([
XmlBuilder.doctype(
"coverage",
system: ["http://cobertura.sourceforge.net/xml/coverage-03.dtd"]
),
{
:coverage,
%{
"line-rate" => ratio,
},
[
{
:packages,
%{},
[
{
:package,
%{"name" => "", "line-rate" => ratio},
[
{
:classes,
%{},
files
}
]
}
]
}
]
}
])
|> XmlBuilder.generate
File.write!("cover/cobertura.xml", buffer)