Skip to content

Commit 2798f93

Browse files
committed
Add support for reading report arguments from .netconfig
The http://dotnetconfig.org/ format allows unifying configuration with other .NET core tools, making it easier to maintain multiple tool settings in a centralized fashion. By leveraging the format, ReportGenerator gains: * Simplified command line args in CI scripts (just run without parameters most of the time) * Support for hierarchical configurations * Standard way of updating and managing those configurations, via the `dotnet config` tool, such as `dotnet config --add reportgenerator.reporttype Html` The configuration is shared uniformly between the CLI and MSBuild task, for consistency. Updated the documentation too to showcase the new functionality.
1 parent 5c54844 commit 2798f93

File tree

5 files changed

+493
-35
lines changed

5 files changed

+493
-35
lines changed

README.md

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,52 @@ Examples:
103103
"-reports:coverage.xml" "-targetdir:C:\report" "-assemblyfilters:+Included;-Excluded.*"
104104
```
105105

106-
**MSBuild**
106+
#### .netconfig support
107+
108+
All the above parameters can also be persisted in a [.netconfig](https://dotnetconfig.org) file, under a `[ReportGenerator]`
109+
section. Examples:
110+
111+
```
112+
[ReportGenerator]
113+
reports = coverage.xml
114+
targetdir = "C:\report"
115+
reporttypes = Latex;HtmlSummary
116+
assemblyfilters = +Test;-Test
117+
classfilters = +Test2;-Test2
118+
```
119+
120+
All the plural options can also be specified as multiple singular entries, like:
121+
122+
```
123+
[ReportGenerator]
124+
report = coverage1.xml
125+
report = coverage2.xml
126+
reporttype = Latex
127+
reporttype = HtmlSummary
128+
assemblyfilter = +Test
129+
assemblyfilter = -Test
130+
classfilter = +Test2
131+
classfilter = -Test2
132+
filefilter = +cs
133+
filefilter = -vb
134+
sourcedir = src
135+
sourcedir = test
136+
```
137+
138+
Adding/removing values is trivial using the [dotnet-config](https://dotnetconfig.org) CLI:
139+
140+
```
141+
# set a single-valued variable
142+
dotnet config reportgenerator.reporttypes Latex;HtmlSummary
143+
# add to multi-valued variable
144+
dotnet config --add reportgenerator.report coverage3.xml
145+
# clear all multi-valued entries for a variable
146+
dotnet config --unset-all reportgenerator.assemblyfilter
147+
```
148+
149+
Of course it's equally trivial to just edit the `.netconfig` file by hand.
150+
151+
#### MSBuild
107152
A MSBuild task also exists:
108153

109154
```xml
@@ -116,11 +161,41 @@ A MSBuild task also exists:
116161
<ItemGroup>
117162
<CoverageFiles Include="OpenCover.xml" />
118163
</ItemGroup>
119-
<ReportGenerator ReportFiles="@(CoverageFiles)" TargetDirectory="report" ReportTypes="Html;Latex" HistoryDirectory="history" Plugins="CustomReports.dll" AssemblyFilters="+Include;-Excluded" VerbosityLevel="Verbose" />
164+
<ReportGenerator ProjectDirectory="$(MSBuildProjectDirectory)" ReportFiles="@(CoverageFiles)" TargetDirectory="report" ReportTypes="Html;Latex" HistoryDirectory="history" Plugins="CustomReports.dll" AssemblyFilters="+Include;-Excluded" VerbosityLevel="Verbose" />
120165
</Target>
121166
</Project>
122167
```
123168

169+
The MSBuild task parameters can be complemented with the `.netconfig`, if used. That means that parameters
170+
can be omitted if they are provided via `.netconfig`, which is useful when reusing fixed settings across
171+
multiple projects in a solution, where the MSBuild task is only provided the dynamic values for the current
172+
project:
173+
174+
Given the following `.netconfig`:
175+
176+
```
177+
[ReportGenerator]
178+
reporttypes = Html;Latex
179+
targetdirectory = report
180+
historydirectory = history
181+
assemblyfilters = +Include;-Excluded
182+
verbosityLevel = Verbose
183+
```
184+
185+
The above target could be simplified as:
186+
187+
```xml
188+
<Target Name="Coverage">
189+
<ItemGroup>
190+
<CoverageFiles Include="OpenCover.xml" />
191+
</ItemGroup>
192+
<ReportGenerator ProjectDirectory="$(MSBuildProjectDirectory)"
193+
ReportFiles="@(CoverageFiles)"
194+
Plugins="CustomReports.dll" />
195+
</Target>
196+
```
197+
198+
124199
## Supported input and output file formats
125200
*ReportGenerator* supports several input and output formats.
126201
The wiki explains the different [output formats](https://github.com/danielpalme/ReportGenerator/wiki/Output-formats) or you can download [sample reports](https://danielpalme.github.io/ReportGenerator/resources/SampleReports.zip) of all formats.

src/ReportGenerator.Core.Test/ReportConfigurationBuilderTest.cs

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
using System;
12
using System.IO;
23
using System.Linq;
4+
using DotNetConfig;
35
using Palmmedia.ReportGenerator.Core.Logging;
46
using Xunit;
57

@@ -10,17 +12,21 @@ namespace Palmmedia.ReportGenerator.Core.Test
1012
/// to contain all ReportConfigurationBuilder Unit Tests
1113
/// </summary>
1214
[Collection("FileManager")]
13-
public class ReportConfigurationBuilderTest
15+
public class ReportConfigurationBuilderTest : IDisposable
1416
{
1517
private static readonly string ReportPath = Path.Combine(FileManager.GetCSharpReportDirectory(), "OpenCover.xml");
1618

1719
private ReportConfigurationBuilder reportConfigurationBuilder;
20+
private string currentDir;
1821

1922
public ReportConfigurationBuilderTest()
2023
{
2124
this.reportConfigurationBuilder = new ReportConfigurationBuilder();
25+
this.currentDir = Directory.GetCurrentDirectory();
2226
}
2327

28+
public void Dispose() => Directory.SetCurrentDirectory(this.currentDir);
29+
2430
[Fact]
2531
public void InitWithNamedArguments_OldFilters_AllPropertiesApplied()
2632
{
@@ -70,5 +76,92 @@ public void InitWithNamedArguments_NewFilters_AllPropertiesApplied()
7076
Assert.NotNull(configuration.AssemblyFilters);
7177
Assert.NotNull(configuration.ClassFilters);
7278
}
79+
80+
81+
[Fact]
82+
public void ConfigProvidesMissingArguments()
83+
{
84+
var dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
85+
Directory.CreateDirectory(dir);
86+
var config = Config.Build(dir).GetSection(ReportConfigurationBuilder.SectionName);
87+
88+
config.SetString("reports", ReportPath);
89+
config.SetString("targetdir", "C:\\temp");
90+
config.SetString("reporttype", "Latex");
91+
config.SetString("assemblyfilters", "+Test;-Test");
92+
config.SetString("classfilters", "+Test2;-Test2");
93+
config.SetString("verbosity", VerbosityLevel.Info.ToString());
94+
95+
Directory.SetCurrentDirectory(dir);
96+
97+
string[] namedArguments = new string[0];
98+
99+
var configuration = this.reportConfigurationBuilder.Create(namedArguments);
100+
101+
Assert.True(configuration.ReportFiles.Contains(ReportPath), "ReportPath does not exist in ReportFiles.");
102+
Assert.Equal("C:\\temp", configuration.TargetDirectory);
103+
Assert.True(configuration.ReportTypes.Contains("Latex"), "Wrong report type applied.");
104+
Assert.True(configuration.AssemblyFilters.Contains("+Test"), "AssemblyFilters does not exist in ReportFiles.");
105+
Assert.True(configuration.ClassFilters.Contains("+Test2"), "ClassFilters does not exist in ReportFiles.");
106+
Assert.True(configuration.AssemblyFilters.Contains("-Test"), "AssemblyFilters does not exist in ReportFiles.");
107+
Assert.True(configuration.ClassFilters.Contains("-Test2"), "ClassFilters does not exist in ReportFiles.");
108+
Assert.NotNull(configuration.ReportFiles);
109+
Assert.NotNull(configuration.AssemblyFilters);
110+
Assert.NotNull(configuration.ClassFilters);
111+
}
112+
113+
[Fact]
114+
public void ConfigProvidesMultiValuedSettings()
115+
{
116+
var dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
117+
Directory.CreateDirectory(dir);
118+
var config = Config.Build(dir).GetSection(ReportConfigurationBuilder.SectionName);
119+
120+
config.SetString("reports", ReportPath);
121+
122+
config.AddString("reporttype", "Latex");
123+
config.AddString("reporttype", "Html");
124+
125+
config.AddString("assemblyfilter", "+Test");
126+
config.AddString("assemblyfilter", "-Test");
127+
128+
config.AddString("classfilter", "+Test2");
129+
config.AddString("classfilter", "-Test2");
130+
131+
config.AddString("filefilter", "+cs");
132+
config.AddString("filefilter", "-vb");
133+
134+
config.AddString("sourcedir", "src");
135+
config.AddString("sourcedir", "test");
136+
137+
config.AddString("plugin", "xunit");
138+
config.AddString("plugin", "moq");
139+
140+
Directory.SetCurrentDirectory(dir);
141+
142+
string[] namedArguments = new string[0];
143+
144+
var configuration = this.reportConfigurationBuilder.Create(namedArguments);
145+
146+
Assert.Contains(ReportPath, configuration.ReportFiles);
147+
148+
Assert.Contains("Latex", configuration.ReportTypes);
149+
Assert.Contains("Html", configuration.ReportTypes);
150+
151+
Assert.Contains("+Test", configuration.AssemblyFilters);
152+
Assert.Contains("-Test", configuration.AssemblyFilters);
153+
154+
Assert.Contains("+Test2", configuration.ClassFilters);
155+
Assert.Contains("-Test2", configuration.ClassFilters);
156+
157+
Assert.Contains("+cs", configuration.FileFilters);
158+
Assert.Contains("-vb", configuration.FileFilters);
159+
160+
Assert.Contains("src", configuration.SourceDirectories);
161+
Assert.Contains("test", configuration.SourceDirectories);
162+
163+
Assert.Contains("xunit", configuration.Plugins);
164+
Assert.Contains("moq", configuration.Plugins);
165+
}
73166
}
74167
}

0 commit comments

Comments
 (0)