docs: document default values for Filters properties in XML docs
Continues the work started for #5917 (already covered Targets, Layouts, LayoutRenderers and Target Wrappers), extending the same pattern to the NLog.Filters namespace so default values show up in IntelliSense and the generated API docs. Adds a regression test that scans all settable NLog.Filters properties against the generated XML documentation file and fails if any of them is missing a documented default value.
This commit is contained in:
1 parent
2154098b97
commit
44df43fabd
9 files changed
+114
No files matched your search
@@ -50,6 +50,7 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the condition expression.
|
/// Gets or sets the condition expression.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks><b>[Required]</b> Default: <see langword="null"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public ConditionExpression Condition { get; set; } = ConditionLiteralExpression.Null;
|
public ConditionExpression Condition { get; set; } = ConditionLiteralExpression.Null;
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the action to be taken when filter matches.
|
/// Gets or sets the action to be taken when filter matches.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see cref="FilterResult.Neutral"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public FilterResult Action { get; set; }
|
public FilterResult Action { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ namespace NLog.Filters
|
|||||||
/// Gets or sets the layout to be used to filter log messages.
|
/// Gets or sets the layout to be used to filter log messages.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The layout.</value>
|
/// <value>The layout.</value>
|
||||||
|
/// <remarks><b>[Required]</b> Default: <see cref="Layout.Empty"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public Layout Layout { get; set; } = Layout.Empty;
|
public Layout Layout { get; set; } = Layout.Empty;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,12 +45,14 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see langword="false"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public bool IgnoreCase { get; set; }
|
public bool IgnoreCase { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the substring to be matched.
|
/// Gets or sets the substring to be matched.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks><b>[Required]</b> Default: <see cref="string.Empty"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public string Substring { get; set; } = string.Empty;
|
public string Substring { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|||||||
@@ -45,12 +45,14 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see langword="false"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public bool IgnoreCase { get; set; }
|
public bool IgnoreCase { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a string to compare the layout to.
|
/// Gets or sets a string to compare the layout to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see cref="string.Empty"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public string CompareTo { get; set; } = string.Empty;
|
public string CompareTo { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|||||||
@@ -45,12 +45,14 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the substring to be matched.
|
/// Gets or sets the substring to be matched.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks><b>[Required]</b> Default: <see cref="string.Empty"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public string Substring { get; set; } = string.Empty;
|
public string Substring { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see langword="false"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public bool IgnoreCase { get; set; }
|
public bool IgnoreCase { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -52,12 +52,14 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a string to compare the layout to.
|
/// Gets or sets a string to compare the layout to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see cref="string.Empty"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public string CompareTo { get; set; } = string.Empty;
|
public string CompareTo { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
/// Gets or sets a value indicating whether to ignore case when comparing strings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see langword="false"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public bool IgnoreCase { get; set; }
|
public bool IgnoreCase { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -54,12 +54,14 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// How long before a filter expires, and logging is accepted again
|
/// How long before a filter expires, and logging is accepted again
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <c>10</c></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public int TimeoutSeconds { get; set; } = 10;
|
public int TimeoutSeconds { get; set; } = 10;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Max length of filter values, will truncate if above limit
|
/// Max length of filter values, will truncate if above limit
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <c>1000</c></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public int MaxLength { get; set; } = 1000;
|
public int MaxLength { get; set; } = 1000;
|
||||||
|
|
||||||
@@ -67,30 +69,35 @@ namespace NLog.Filters
|
|||||||
/// Applies the configured action to the initial logevent that starts the timeout period.
|
/// Applies the configured action to the initial logevent that starts the timeout period.
|
||||||
/// Used to configure that it should ignore all events until timeout.
|
/// Used to configure that it should ignore all events until timeout.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see langword="false"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public bool IncludeFirst { get; set; }
|
public bool IncludeFirst { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Max number of unique filter values to expect simultaneously
|
/// Max number of unique filter values to expect simultaneously
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <c>50000</c></remarks>
|
||||||
/// <docgen category='Filtering Options' order='100' />
|
/// <docgen category='Filtering Options' order='100' />
|
||||||
public int MaxFilterCacheSize { get; set; } = 50000;
|
public int MaxFilterCacheSize { get; set; } = 50000;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Default number of unique filter values to expect, will automatically increase if needed
|
/// Default number of unique filter values to expect, will automatically increase if needed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <c>1000</c></remarks>
|
||||||
/// <docgen category='Filtering Options' order='100' />
|
/// <docgen category='Filtering Options' order='100' />
|
||||||
public int DefaultFilterCacheSize { get; set; } = 1000;
|
public int DefaultFilterCacheSize { get; set; } = 1000;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Insert FilterCount value into <see cref="LogEventInfo.Properties"/> when an event is no longer filtered
|
/// Insert FilterCount value into <see cref="LogEventInfo.Properties"/> when an event is no longer filtered
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see cref="string.Empty"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public string FilterCountPropertyName { get; set; } = string.Empty;
|
public string FilterCountPropertyName { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Append FilterCount to the <see cref="LogEventInfo.Message"/> when an event is no longer filtered
|
/// Append FilterCount to the <see cref="LogEventInfo.Message"/> when an event is no longer filtered
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <see cref="string.Empty"/></remarks>
|
||||||
/// <docgen category='Filtering Options' order='10' />
|
/// <docgen category='Filtering Options' order='10' />
|
||||||
public string FilterCountMessageAppendFormat { get; set; } = string.Empty;
|
public string FilterCountMessageAppendFormat { get; set; } = string.Empty;
|
||||||
|
|
||||||
@@ -106,6 +113,7 @@ namespace NLog.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Default buffer size for the internal buffers
|
/// Default buffer size for the internal buffers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Default: <c>1000</c></remarks>
|
||||||
/// <docgen category='Filtering Options' order='100' />
|
/// <docgen category='Filtering Options' order='100' />
|
||||||
public int OptimizeBufferDefaultLength { get; set; } = 1000;
|
public int OptimizeBufferDefaultLength { get; set; } = 1000;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2004-2024 Jaroslaw Kowalski <jaak@jkowalski.net>, Kim Christensen, Julian Verdurmen
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions
|
||||||
|
// are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * Neither the name of Jaroslaw Kowalski nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from this
|
||||||
|
// software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||||
|
// THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
|
||||||
|
namespace NLog.UnitTests.Filters
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Verifies that every settable property under the <see cref="NLog.Filters"/> namespace
|
||||||
|
/// documents its default value in the generated XML docs, so it shows up in IntelliSense
|
||||||
|
/// and the Sandcastle API docs. See https://github.com/NLog/NLog/issues/5917
|
||||||
|
/// </summary>
|
||||||
|
public class FilterDefaultValueDocsTests : NLogTestBase
|
||||||
|
{
|
||||||
|
// Properties that intentionally do not document a default value.
|
||||||
|
private static readonly HashSet<string> ExcludedMembers = new HashSet<string>
|
||||||
|
{
|
||||||
|
// Obsolete since NLog 5.0, always returns true, no meaningful default to document.
|
||||||
|
"P:NLog.Filters.WhenRepeatedFilter.OptimizeBufferReuse",
|
||||||
|
};
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void SettablePropertiesDocumentDefaultValue()
|
||||||
|
{
|
||||||
|
var nlogAssembly = typeof(LogManager).Assembly;
|
||||||
|
var xmlDocPath = Path.ChangeExtension(nlogAssembly.Location, ".xml");
|
||||||
|
Assert.True(File.Exists(xmlDocPath), $"Generated XML doc file not found at '{xmlDocPath}'. Build NLog.csproj with GenerateDocumentationFile enabled.");
|
||||||
|
|
||||||
|
var documentedMembers = XDocument.Load(xmlDocPath)
|
||||||
|
.Descendants("member")
|
||||||
|
.ToDictionary(member => (string)member.Attribute("name"), member => member.ToString());
|
||||||
|
|
||||||
|
var propertiesMissingDefaultValueDocs = new List<string>();
|
||||||
|
|
||||||
|
foreach (var type in nlogAssembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (type.Namespace != "NLog.Filters" || !type.IsPublic)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
|
||||||
|
{
|
||||||
|
if (!property.CanWrite || property.GetCustomAttribute<ObsoleteAttribute>() != null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var memberName = $"P:{type.FullName}.{property.Name}";
|
||||||
|
if (ExcludedMembers.Contains(memberName))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!documentedMembers.TryGetValue(memberName, out var memberDocs) || !memberDocs.Contains("Default:"))
|
||||||
|
{
|
||||||
|
propertiesMissingDefaultValueDocs.Add(memberName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.Empty(propertiesMissingDefaultValueDocs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user