Skip to content

Commit

Permalink
Merge pull request #1887 from magicmonty/reportgenerator
Browse files Browse the repository at this point in the history
Ported ReportGeneratorHelper to FAKE 5
  • Loading branch information
matthid authored Apr 26, 2018
2 parents 5e0cce0 + 5db0a5e commit 23b1bd9
Show file tree
Hide file tree
Showing 9 changed files with 224 additions and 0 deletions.
15 changes: 15 additions & 0 deletions Fake.sln
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.JavaScript.Yarn", "src
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Sql.DacPac", "src/app/Fake.Sql.DacPac/Fake.Sql.DacPac.fsproj", "{3BC4A91C-3381-4BF9-BF11-8E06706CF878}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Testing.ReportGenerator", "src/app/Fake.Testing.ReportGenerator/Fake.Testing.ReportGenerator.fsproj", "{4E702236-A2B1-4920-B56D-4746CC0726D3}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.DotNet.Testing.SpecFlow", "src/app/Fake.DotNet.Testing.SpecFlow/Fake.DotNet.Testing.SpecFlow.fsproj", "{DA58D728-C36A-4DC7-8D92-F2BA13667EA5}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.DotNet.Mage", "src/app/Fake.DotNet.Mage/Fake.DotNet.Mage.fsproj", "{D8CFE7F9-8E14-4B22-9729-7FF431AFE36B}"
Expand Down Expand Up @@ -742,6 +744,18 @@ Global
{3BC4A91C-3381-4BF9-BF11-8E06706CF878}.Release|x64.Build.0 = Release|Any CPU
{3BC4A91C-3381-4BF9-BF11-8E06706CF878}.Release|x86.ActiveCfg = Release|Any CPU
{3BC4A91C-3381-4BF9-BF11-8E06706CF878}.Release|x86.Build.0 = Release|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Debug|x64.ActiveCfg = Debug|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Debug|x64.Build.0 = Debug|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Debug|x86.ActiveCfg = Debug|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Debug|x86.Build.0 = Debug|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Release|Any CPU.Build.0 = Release|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Release|x64.ActiveCfg = Release|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Release|x64.Build.0 = Release|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Release|x86.ActiveCfg = Release|Any CPU
{4E702236-A2B1-4920-B56D-4746CC0726D3}.Release|x86.Build.0 = Release|Any CPU
{DA58D728-C36A-4DC7-8D92-F2BA13667EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DA58D728-C36A-4DC7-8D92-F2BA13667EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DA58D728-C36A-4DC7-8D92-F2BA13667EA5}.Debug|x64.ActiveCfg = Debug|Any CPU
Expand Down Expand Up @@ -837,6 +851,7 @@ Global
{B636A082-4DB4-439D-8A37-E5214BDC00A3} = {901F162F-8925-4390-89C5-9EE2C343F744}
{DE7579F2-C20F-4C35-BC04-C10362912243} = {901F162F-8925-4390-89C5-9EE2C343F744}
{3BC4A91C-3381-4BF9-BF11-8E06706CF878} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{4E702236-A2B1-4920-B56D-4746CC0726D3} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{DA58D728-C36A-4DC7-8D92-F2BA13667EA5} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{2EC1798B-3AD5-42FE-9406-F358B995ACC3} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
EndGlobalSection
Expand Down
1 change: 1 addition & 0 deletions build.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ let dotnetAssemblyInfos =
"Fake.Tracing.NAntXml", "NAntXml"
"Fake.Windows.Chocolatey", "Running and packaging with Chocolatey"
"Fake.Testing.SonarQube", "Analyzing your project with SonarQube"
"Fake.Testing.ReportGenerator", "Convert XML coverage output to various formats"
"Fake.DotNet.Testing.OpenCover", "Code coverage with OpenCover"
"Fake.Sql.DacPac", "Sql Server Data Tools DacPac operations"
"Fake.Documentation.DocFx", "Documentation with DocFx" ]
Expand Down
40 changes: 40 additions & 0 deletions help/markdown/testing-reportgenerator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Fake.Testing.ReportGenerator

ReportGenerator converts XML reports generated by OpenCover, PartCover, dotCover, Visual Studio, NCover or Cobertura into human readable reports in various formats.

he reports do not only show the coverage quota, but also include the source code and visualize which lines have been covered.

ReportGenerator supports merging several reports into one. It is also possible to pass one XML file containing several reports to ReportGenerator (e.g. a build log file).

See https://github.com/danielpalme/ReportGenerator

## Minimal working example

```fsharp
"#r "paket:
nuget Fake.Core.Target
nuget Fake.Testing.ReportGenerator"
open Fake.Core
open Fake.Core.TargetOperators
open Fake.Testing
...
Target.create "Generate Reports" (fun _ ->
let parameters p = { p with TargetDir = "c:/reports/" }
!! "**/opencover.xml"
|> ReportGenerator.generateReports parameters
)
Target.create "Default" DoNothing
"Clean"
==> "SetAssemblyInfo"
==> "Build"
==> "RunCoverage"
==> "Generate Reports"
==> "Default"
Target.runOrDefault "Default"
```
1 change: 1 addition & 0 deletions help/templates/template.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@
<a href="@(prefix)apidocs/index.html#Fake.Testing">Testing</a>
<ul>
<li><a href="@(prefix)testing-sonarqube.html">SonarQube</a></li>
<li><a href="@(prefix)testing-reportgenerator.html">ReportGenerator</a></li>
</ul>
</li>
<li>
Expand Down
17 changes: 17 additions & 0 deletions src/app/Fake.Testing.ReportGenerator/AssemblyInfo.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Auto-Generated by FAKE; do not edit
namespace System
open System.Reflection

[<assembly: AssemblyTitleAttribute("FAKE - F# Make Convert XML coverage output to various formats")>]
[<assembly: AssemblyProductAttribute("FAKE - F# Make")>]
[<assembly: AssemblyVersionAttribute("5.0.0")>]
[<assembly: AssemblyInformationalVersionAttribute("5.0.0-beta025")>]
[<assembly: AssemblyFileVersionAttribute("5.0.0")>]
do ()

module internal AssemblyVersionInformation =
let [<Literal>] AssemblyTitle = "FAKE - F# Make Convert XML coverage output to various formats"
let [<Literal>] AssemblyProduct = "FAKE - F# Make"
let [<Literal>] AssemblyVersion = "5.0.0"
let [<Literal>] AssemblyInformationalVersion = "5.0.0-beta025"
let [<Literal>] AssemblyFileVersion = "5.0.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetFrameworks>net46;netstandard1.6;netstandard2.0</TargetFrameworks>
<DefineConstants>$(DefineConstants);NO_DOTNETCORE_BOOTSTRAP</DefineConstants>
<AssemblyName>Fake.Testing.ReportGenerator</AssemblyName>
<OutputType>Library</OutputType>
</PropertyGroup>
<PropertyGroup>
<DefineConstants>$(DefineConstants);NETSTANDARD;USE_HTTPCLIENT</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DefineConstants>$(DefineConstants);RELEASE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.fs" />
<Compile Include="ReportGenerator.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Fake.Core.Trace\Fake.Core.Trace.fsproj" />
<ProjectReference Include="..\Fake.Core.Process\Fake.Core.Process.fsproj" />
<ProjectReference Include="..\Fake.IO.FileSystem\Fake.IO.FileSystem.fsproj" />
</ItemGroup>
<Import Project="..\..\..\.paket\Paket.Restore.targets" />
</Project>
115 changes: 115 additions & 0 deletions src/app/Fake.Testing.ReportGenerator/ReportGenerator.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/// Contains a task which can be used to run [ReportGenerator](https://github.com/danielpalme/ReportGenerator),
/// which converts XML reports generated by PartCover, OpenCover or NCover into a readable report in various formats.
///
/// ## Sample
///
/// ```
/// open Fake.Testing
///
/// Target.create "Generate Reports" (fun _ ->
/// let parameters p = { p with TargetDir = "c:/reports/" }
/// !! "**/opencover.xml"
/// |> ReportGenerator.generateReports parameters
/// )
/// ```
[<RequireQualifiedAccess>]
module Fake.Testing.ReportGenerator

open System
open System.Text
open System.IO

open Fake.Core
open Fake.IO

type ReportType =
| Html = 0
| HtmlSummary = 1
| Xml = 2
| XmlSummary = 3
| Latex = 4
| LatexSummary = 5
| Badges = 6

type LogVerbosity =
| Verbose = 0
| Info = 1
| Error = 2

/// ReportGenerator parameters, for more details see: https://github.com/danielpalme/ReportGenerator.
type ReportGeneratorParams =
{ /// (Required) Path to the ReportGenerator exe file.
ExePath : string
/// (Required) The directory where the generated report should be saved.
TargetDir : string
/// The output formats and scope.
ReportTypes : ReportType list
/// Optional directories which contain the corresponding source code.
SourceDirs : string list
/// Optional directory for storing persistent coverage information.
/// Can be used in future reports to show coverage evolution.
HistoryDir : string
/// Optional list of assemblies that should be included or excluded
/// in the report. Exclusion filters take precedence over inclusion
/// filters. Wildcards are allowed.
Filters : string list
/// The verbosity level of the log messages.
LogVerbosity : LogVerbosity
/// The directory where the ReportGenerator process will be started.
WorkingDir : string
/// The timeout for the ReportGenerator process.
TimeOut : TimeSpan }

let private currentDirectory = Directory.GetCurrentDirectory ()

/// ReportGenerator default parameters
let private ReportGeneratorDefaultParams =
{ ExePath = "./tools/ReportGenerator/bin/ReportGenerator.exe"
TargetDir = currentDirectory
ReportTypes = [ ReportType.Html ]
SourceDirs = []
HistoryDir = String.Empty
Filters = []
LogVerbosity = LogVerbosity.Verbose
WorkingDir = currentDirectory
TimeOut = TimeSpan.FromMinutes 5. }

/// Builds the report generator command line arguments from the given parameters and reports
/// [omit]
let private buildReportGeneratorArgs parameters (reports : string seq) =
let reportTypes = parameters.ReportTypes |> List.map (fun rt -> rt.ToString())
let sourceDirs = sprintf "-sourcedirs:%s" (String.Join(";", parameters.SourceDirs))
let filters = sprintf "-filters:%s" (String.Join(";", parameters.Filters))

new StringBuilder()
|> StringBuilder.append (sprintf "-reports:%s" (String.Join(";", reports)))
|> StringBuilder.append (sprintf "-targetdir:%s" parameters.TargetDir)
|> StringBuilder.appendWithoutQuotes (sprintf "-reporttypes:%s" (String.Join(";", reportTypes)))
|> StringBuilder.appendIfTrue (parameters.SourceDirs.Length > 0) sourceDirs
|> StringBuilder.appendStringIfValueIsNotNullOrEmpty (parameters.HistoryDir) (sprintf "-historydir:%s" parameters.HistoryDir)
|> StringBuilder.appendIfTrue (parameters.Filters.Length > 0) filters
|> StringBuilder.appendWithoutQuotes (sprintf "-verbosity:%s" (parameters.LogVerbosity.ToString()))
|> StringBuilder.toText

/// Runs ReportGenerator on one or more coverage reports.
/// ## Parameters
///
/// - `setParams` - Function used to overwrite the default ReportGenerator parameters.
/// - `reports` - Coverage reports.
let generateReports setParams (reports : string list) =
let taskName = "ReportGenerator"
let description = "Generating reports"

use __ = Trace.traceTask taskName description
let param = setParams ReportGeneratorDefaultParams

let processArgs = buildReportGeneratorArgs param reports
Trace.tracefn "ReportGenerator command\n%s %s" param.ExePath processArgs

let processStartInfo info =
{ info with FileName = param.ExePath
WorkingDirectory = if param.WorkingDir |> String.isNullOrEmpty then info.WorkingDirectory else param.WorkingDir
Arguments = processArgs }
match Process.execSimple processStartInfo param.TimeOut with
| 0 -> ()
| v -> failwithf "ReportGenerator reported errors: %i" v
4 changes: 4 additions & 0 deletions src/app/Fake.Testing.ReportGenerator/paket.references
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
group netcore

FSharp.Core
NETStandard.Library
7 changes: 7 additions & 0 deletions src/legacy/FakeLib/ReportGeneratorHelper.fs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
/// Contains a task which can be used to run [ReportGenerator](https://github.com/danielpalme/ReportGenerator),
/// which converts XML reports generated by PartCover, OpenCover or NCover into a readable report in various formats.
[<System.Obsolete("Open Fake.Testing instead (FAKE0001 - package: Fake.Testing.ReportGenerator, module: ReportGenerator)")>]
module Fake.ReportGeneratorHelper

open System
open System.Text

[<System.Obsolete("Open Fake.Testing instead (FAKE0001 - package: Fake.Testing.ReportGenerator, module: ReportGenerator, type: ReportType)")>]
type ReportGeneratorReportType =
| Html = 0
| HtmlSummary = 1
Expand All @@ -14,11 +16,13 @@ type ReportGeneratorReportType =
| LatexSummary = 5
| Badges = 6

[<System.Obsolete("Open Fake.Testing instead (FAKE0001 - package: Fake.Testing.ReportGenerator, module: ReportGenerator, type: LogVerbosity)")>]
type ReportGeneratorLogVerbosity =
| Verbose = 0
| Info = 1
| Error = 2

[<System.Obsolete("Open Fake.Testing instead (FAKE0001 - package: Fake.Testing.ReportGenerator, module: ReportGenerator, type: ReportGeneratorParams)")>]
/// ReportGenerator parameters, for more details see: https://github.com/danielpalme/ReportGenerator.
[<CLIMutable>]
type ReportGeneratorParams =
Expand All @@ -44,6 +48,7 @@ type ReportGeneratorParams =
/// The timeout for the ReportGenerator process.
TimeOut : TimeSpan }

[<System.Obsolete("Open Fake.Testing instead (FAKE0001 - package: Fake.Testing.ReportGenerator, module: ReportGenerator, function: ReportGeneratorDefaultParams)")>]
/// ReportGenerator default parameters
let ReportGeneratorDefaultParams =
{ ExePath = "./tools/ReportGenerator/bin/ReportGenerator.exe"
Expand All @@ -56,6 +61,7 @@ let ReportGeneratorDefaultParams =
WorkingDir = currentDirectory
TimeOut = TimeSpan.FromMinutes 5. }

[<System.Obsolete("Open Fake.Testing instead (FAKE0001 - package: Fake.Testing.ReportGenerator, module: ReportGenerator, function: buildReportGeneratorArgs (now private))")>]
/// Builds the report generator command line arguments from the given parameters and reports
/// [omit]
let buildReportGeneratorArgs parameters (reports : string seq) =
Expand All @@ -82,6 +88,7 @@ let buildReportGeneratorArgs parameters (reports : string seq) =
/// ## Sample
///
/// ReportGenerator (fun p -> { p with TargetDir = "c:/reports/" }) [ "c:/opencover.xml" ]
[<System.Obsolete("Open Fake.Testing instead (FAKE0001 - package: Fake.Testing.ReportGenerator, module: ReportGenerator, function: generateReports)")>]
let ReportGenerator setParams (reports : string list) =
let taskName = "ReportGenerator"
let description = "Generating reports"
Expand Down

0 comments on commit 23b1bd9

Please sign in to comment.