124 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Elixir
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
	
		
			2.3 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)
 | 
						|
 | 
						|
source =
 | 
						|
  if System.get_env("CI_PROJECT_NAME") do
 | 
						|
    "#{System.get_env("CI_BUILDS_DIR")}/#{System.get_env("CI_PROJECT_NAMESPACE")}/#{System.get_env("CI_PROJECT_NAME")}"
 | 
						|
  else
 | 
						|
    File.cwd!
 | 
						|
  end
 | 
						|
 | 
						|
 | 
						|
buffer =
 | 
						|
  XmlBuilder.document([
 | 
						|
    XmlBuilder.doctype(
 | 
						|
      "coverage",
 | 
						|
      system: ["http://cobertura.sourceforge.net/xml/coverage-03.dtd"]
 | 
						|
    ),
 | 
						|
    {
 | 
						|
      :coverage,
 | 
						|
      %{
 | 
						|
        "line-rate" => ratio,
 | 
						|
      },
 | 
						|
      [
 | 
						|
        {
 | 
						|
          :sources,
 | 
						|
          %{},
 | 
						|
          [
 | 
						|
            {
 | 
						|
              :source,
 | 
						|
              %{},
 | 
						|
              source
 | 
						|
            }
 | 
						|
          ]
 | 
						|
        },
 | 
						|
        {
 | 
						|
          :packages,
 | 
						|
          %{},
 | 
						|
          [
 | 
						|
            {
 | 
						|
              :package,
 | 
						|
              %{"name" => "", "line-rate" => ratio},
 | 
						|
              [
 | 
						|
                {
 | 
						|
                  :classes,
 | 
						|
                  %{},
 | 
						|
                  files
 | 
						|
                }
 | 
						|
              ]
 | 
						|
            }
 | 
						|
          ]
 | 
						|
        }
 | 
						|
      ]
 | 
						|
    }
 | 
						|
  ])
 | 
						|
  |> XmlBuilder.generate
 | 
						|
 | 
						|
File.write!("cover/cobertura.xml", buffer)
 |