Skip to content

Commit b4866d3

Browse files
committed
#374: Added support for .netconfig
2 parents 681ffc3 + 2798f93 commit b4866d3

File tree

7 files changed

+497
-35
lines changed

7 files changed

+497
-35
lines changed

README.md

+77-2
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/Deployment/nuget/ReportGenerator.Core.nuspec

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ https://github.com/danielpalme/ReportGenerator/wiki/Custom-history-storage</desc
2929
<dependency id="Microsoft.Extensions.Configuration.CommandLine" version="2.2.0" />
3030
<dependency id="Microsoft.Extensions.Configuration.Json" version="2.2.0" />
3131
<dependency id="SixLabors.ImageSharp.Drawing" version="1.0.0-beta0008" />
32+
<dependency id="DotNetConfig" version="1.0.0-rc" />
3233
</group>
3334

3435
<group targetFramework="netcoreapp">
@@ -37,6 +38,7 @@ https://github.com/danielpalme/ReportGenerator/wiki/Custom-history-storage</desc
3738
<dependency id="Microsoft.Extensions.Configuration.CommandLine" version="2.2.0" />
3839
<dependency id="Microsoft.Extensions.Configuration.Json" version="2.2.0" />
3940
<dependency id="SixLabors.ImageSharp.Drawing" version="1.0.0-beta0008" />
41+
<dependency id="DotNetConfig" version="1.0.0-rc" />
4042
<dependency id="McMaster.NETCore.Plugins" version="0.2.4" />
4143
</group>
4244
</dependencies>

src/Readme.txt

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ CHANGELOG
6565

6666
4.6.7.0
6767

68+
* New: #374: Added support for .netconfig
6869
* Fix: #363: Improved handling of HTML generation (several HTML reports at once)
6970
* Fix: #385: Added filtering by namespace for classfilters in DynamicCodeCoverageParser
7071
* Fix: #388: Removed branch coverage columns if no branch coverage is available

src/ReportGenerator.Core.Test/ReportConfigurationBuilderTest.cs

+95-1
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,22 @@ 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;
1820

21+
private string currentDir;
22+
1923
public ReportConfigurationBuilderTest()
2024
{
2125
this.reportConfigurationBuilder = new ReportConfigurationBuilder();
26+
this.currentDir = Directory.GetCurrentDirectory();
2227
}
2328

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

0 commit comments

Comments
 (0)