From d0a1ba01fb92bc92c0ad1c83dacc73e2aaa28c77 Mon Sep 17 00:00:00 2001 From: Christoffer Gersen Date: Sat, 24 Feb 2024 11:34:10 +0100 Subject: [PATCH 01/23] Support collections as constructor arguments --- .../Configuration/ObjectArgumentValue.cs | 222 ++++++++++----- .../ObjectArgumentValueTests.cs | 268 +++++++++++++++++- 2 files changed, 415 insertions(+), 75 deletions(-) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs index 151ce5b..4751a2a 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs @@ -1,5 +1,4 @@ using System.Diagnostics.CodeAnalysis; -using System.Linq.Expressions; using System.Reflection; using Microsoft.Extensions.Configuration; @@ -46,13 +45,16 @@ public ObjectArgumentValue(IConfigurationSection section, IReadOnlyCollection>(ctorExpression).Compile().Invoke(); - } + // Without a type explicitly specified, attempt to call ctor of toType + if (TryCallCtorImplicit(_section, toType, resolutionContext, out ctorResult)) + return ctorResult; // MS Config binding can work with a limited set of primitive types and collections return _section.Get(toType); @@ -76,33 +78,41 @@ bool TryCreateContainer([NotNullWhen(true)] out object? result) { result = null; - if (toType.GetConstructor(Type.EmptyTypes) == null) - return false; - - // https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers#collection-initializers - var addMethod = toType.GetMethods().FirstOrDefault(m => !m.IsStatic && m.Name == "Add" && m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == elementType); - if (addMethod == null) - return false; + if (IsConstructableDictionary(toType, elementType, out var concreteType, out var keyType, out var valueType, out var addMethod)) + { + result = Activator.CreateInstance(concreteType) ?? throw new InvalidOperationException($"Activator.CreateInstance returned null for {concreteType}"); - var configurationElements = _section.GetChildren().ToArray(); - result = Activator.CreateInstance(toType) ?? throw new InvalidOperationException($"Activator.CreateInstance returned null for {toType}"); + foreach (var section in _section.GetChildren()) + { + var argumentValue = ConfigurationReader.GetArgumentValue(section, _configurationAssemblies); + var key = new StringArgumentValue(section.Key).ConvertTo(keyType, resolutionContext); + var value = argumentValue.ConvertTo(valueType, resolutionContext); + addMethod.Invoke(result, new[] { key, value }); + } + return true; + } + else if (IsConstructableContainer(toType, elementType, out concreteType, out addMethod)) + { + result = Activator.CreateInstance(concreteType) ?? throw new InvalidOperationException($"Activator.CreateInstance returned null for {concreteType}"); - for (int i = 0; i < configurationElements.Length; ++i) + foreach (var section in _section.GetChildren()) + { + var argumentValue = ConfigurationReader.GetArgumentValue(section, _configurationAssemblies); + var value = argumentValue.ConvertTo(elementType, resolutionContext); + addMethod.Invoke(result, new[] { value }); + } + return true; + } + else { - var argumentValue = ConfigurationReader.GetArgumentValue(configurationElements[i], _configurationAssemblies); - var value = argumentValue.ConvertTo(elementType, resolutionContext); - addMethod.Invoke(result, new[] { value }); + return false; } - - return true; } } - internal static bool TryBuildCtorExpression( - IConfigurationSection section, Type parameterType, ResolutionContext resolutionContext, [NotNullWhen(true)] out NewExpression? ctorExpression) + bool TryCallCtorExplicit( + IConfigurationSection section, ResolutionContext resolutionContext, [NotNullWhen(true)] out object? value) { - ctorExpression = null; - var typeDirective = section.GetValue("$type") switch { not null => "$type", @@ -116,21 +126,39 @@ internal static bool TryBuildCtorExpression( var type = typeDirective switch { not null => Type.GetType(section.GetValue(typeDirective)!, throwOnError: false), - null => parameterType, + null => null, }; if (type is null or { IsAbstract: true }) { + value = null; return false; } + else + { + var suppliedArguments = section.GetChildren().Where(s => s.Key != typeDirective) + .ToDictionary(s => s.Key, StringComparer.OrdinalIgnoreCase); + return TryCallCtor(type, suppliedArguments, resolutionContext, out value); + } - var suppliedArguments = section.GetChildren().Where(s => s.Key != typeDirective) + } + + bool TryCallCtorImplicit( + IConfigurationSection section, Type parameterType, ResolutionContext resolutionContext, out object? value) + { + var suppliedArguments = section.GetChildren() .ToDictionary(s => s.Key, StringComparer.OrdinalIgnoreCase); + return TryCallCtor(parameterType, suppliedArguments, resolutionContext, out value); + } + + bool TryCallCtor(Type type, Dictionary suppliedArguments, ResolutionContext resolutionContext, [NotNullWhen(true)] out object? value) + { + value = null; if (suppliedArguments.Count == 0 && type.GetConstructor(Type.EmptyTypes) is ConstructorInfo parameterlessCtor) { - ctorExpression = Expression.New(parameterlessCtor); + value = parameterlessCtor.Invoke([]); return true; } @@ -163,76 +191,126 @@ where gr.All(z => z.argumentBindResult.success) return false; } - var ctorArguments = new List(); - foreach (var argumentValue in ctor.ArgumentValues) + var ctorArguments = new object?[ctor.ArgumentValues.Count]; + for (var i = 0; i < ctor.ArgumentValues.Count; i++) { - if (TryBindToCtorArgument(argumentValue.Value, argumentValue.Type, resolutionContext, out var argumentExpression)) + var argument = ctor.ArgumentValues[i]; + var valueValue = argument.Value; + if (valueValue is IConfigurationSection s) { - ctorArguments.Add(argumentExpression); - } - else - { - return false; + var argumentValue = ConfigurationReader.GetArgumentValue(s, _configurationAssemblies); + valueValue = argumentValue.ConvertTo(argument.Type, resolutionContext); } + ctorArguments[i] = valueValue; } - ctorExpression = Expression.New(ctor.ConstructorInfo, ctorArguments); + value = ctor.ConstructorInfo.Invoke(ctorArguments); return true; + } - static bool TryBindToCtorArgument(object value, Type type, ResolutionContext resolutionContext, [NotNullWhen(true)] out Expression? argumentExpression) + static bool IsContainer(Type type, [NotNullWhen(true)] out Type? elementType) + { + elementType = null; + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { - argumentExpression = null; - - if (value is IConfigurationSection s) + elementType = type.GetGenericArguments()[0]; + return true; + } + foreach (var iface in type.GetInterfaces()) + { + if (iface.IsGenericType) { - if (s.Value is string argValue) + if (iface.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { - var stringArgumentValue = new StringArgumentValue(argValue); - try - { - argumentExpression = Expression.Constant( - stringArgumentValue.ConvertTo(type, resolutionContext), - type); - - return true; - } - catch (Exception) - { - return false; - } + elementType = iface.GetGenericArguments()[0]; + return true; } - else if (s.GetChildren().Any()) - { - if (TryBuildCtorExpression(s, type, resolutionContext, out var ctorExpression)) - { - argumentExpression = ctorExpression; - return true; - } + } + } - return false; + return false; + } + + static bool IsConstructableDictionary(Type type, Type elementType, [NotNullWhen(true)] out Type? concreteType, [NotNullWhen(true)] out Type? keyType, [NotNullWhen(true)] out Type? valueType, [NotNullWhen(true)] out MethodInfo? addMethod) + { + concreteType = null; + keyType = null; + valueType = null; + addMethod = null; + if (!elementType.IsGenericType || elementType.GetGenericTypeDefinition() != typeof(KeyValuePair<,>)) + { + return false; + } + var argumentTypes = elementType.GetGenericArguments(); + keyType = argumentTypes[0]; + valueType = argumentTypes[1]; + if (type.IsAbstract) + { + concreteType = typeof(Dictionary<,>).MakeGenericType(argumentTypes); + if (!type.IsAssignableFrom(concreteType)) + { + return false; + } + } + else + { + concreteType = type; + } + if (concreteType.GetConstructor(Type.EmptyTypes) == null) + { + return false; + } + foreach (var method in concreteType.GetMethods()) + { + if (!method.IsStatic && method.Name == "Add") + { + var parameters = method.GetParameters(); + if (parameters.Length == 2 && parameters[0].ParameterType == keyType && parameters[1].ParameterType == valueType) + { + addMethod = method; + return true; } } - - argumentExpression = Expression.Constant(value, type); - return true; } + return false; } - static bool IsContainer(Type type, [NotNullWhen(true)] out Type? elementType) + static bool IsConstructableContainer(Type type, Type elementType, [NotNullWhen(true)] out Type? concreteType, [NotNullWhen(true)] out MethodInfo? addMethod) { - elementType = null; - foreach (var iface in type.GetInterfaces()) + addMethod = null; + if (type.IsAbstract) { - if (iface.IsGenericType) + concreteType = typeof(List<>).MakeGenericType(elementType); + if (!type.IsAssignableFrom(concreteType)) { - if (iface.GetGenericTypeDefinition() == typeof(IEnumerable<>)) + concreteType = typeof(HashSet<>).MakeGenericType(elementType); + if (!type.IsAssignableFrom(concreteType)) { - elementType = iface.GetGenericArguments()[0]; + concreteType = null; + return false; + } + } + } + else + { + concreteType = type; + } + if (concreteType.GetConstructor(Type.EmptyTypes) == null) + { + return false; + } + foreach (var method in concreteType.GetMethods()) + { + if (!method.IsStatic && method.Name == "Add") + { + var parameters = method.GetParameters(); + if (parameters.Length == 1 && parameters[0].ParameterType == elementType) + { + addMethod = method; return true; } } } - return false; } } diff --git a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs index 49f8d5a..51ff402 100644 --- a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs @@ -345,8 +345,11 @@ public void ConvertToUnsupportedContainerWillBeCreatedButWillRemainEmpty() } [Theory] + [InlineData(typeof(IEnumerable))] [InlineData(typeof(ICollection))] + [InlineData(typeof(IReadOnlyCollection))] [InlineData(typeof(IList))] + [InlineData(typeof(IReadOnlyList))] [InlineData(typeof(List))] public void ConvertToContainerUsingList(Type containerType) { @@ -364,8 +367,13 @@ public void ConvertToContainerUsingList(Type containerType) Assert.Equal([1, 1], list); } - [Fact] - public void ConvertToContainerUsingHashSet() + [Theory] + [InlineData(typeof(ISet))] +#if NET5_0_OR_GREATER + [InlineData(typeof(IReadOnlySet))] +#endif + [InlineData(typeof(HashSet))] + public void ConvertToContainerUsingHashSet(Type containerType) { // language=json var section = JsonStringConfigSource.LoadSection(""" @@ -375,13 +383,48 @@ public void ConvertToContainerUsingHashSet() """, "Container"); var value = new ObjectArgumentValue(section, []); - var container = value.ConvertTo(typeof(HashSet), new()); + var container = value.ConvertTo(containerType, new()); var set = Assert.IsType>(container); Assert.Equal([1, 2], set); } + [Fact] + public void ConvertToForcedHashSetImplementationWithCustomComparer() + { + // In .Net Framework HashSet is not part of mscorlib, but inside System.Core + // As a result the type string "System.Collections.Generic.HashSet`1[[System.String]]" will fail + // Using AssemblyQualifiedName to automatically switch to the correct type string, depending of framework + + // language=json + var json = $$""" + { + "Container": + { + "type": "{{typeof(HashSet).AssemblyQualifiedName}}", + "collection": [ + "a", + "A", + "b", + "b" + ], + "comparer": "System.StringComparer::OrdinalIgnoreCase" + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); + var value = new ObjectArgumentValue(section, []); + + var container = value.ConvertTo(typeof(IEnumerable), new()); + + var set = Assert.IsType>(container); + Assert.Equal(["a", "b"], set); + } + [Theory] + [InlineData(typeof(IEnumerable>))] + [InlineData(typeof(ICollection>))] + [InlineData(typeof(IReadOnlyCollection>))] [InlineData(typeof(IDictionary))] [InlineData(typeof(IReadOnlyDictionary))] [InlineData(typeof(Dictionary))] @@ -405,6 +448,9 @@ public void ConvertToContainerUsingDictionary(Type containerType) } [Theory] + [InlineData(typeof(IEnumerable>))] + [InlineData(typeof(ICollection>))] + [InlineData(typeof(IReadOnlyCollection>))] [InlineData(typeof(IDictionary))] [InlineData(typeof(IReadOnlyDictionary))] [InlineData(typeof(Dictionary))] @@ -500,6 +546,29 @@ IEnumerator IEnumerable.GetEnumerator() } } + [Fact] + public void ConvertToContainerUsingDictionaryWithoutPublicDefaultConstructor() + { + // language=json + var json = """ + { + "Container": { + "values": + { + "a": 1, + "b": 2 + } + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); + var value = new ObjectArgumentValue(section, []); + + var dictionary = ConvertToReturnsType(value); + + Assert.Equal(new Dictionary { { "a", 1 }, { "b", 2 } }, dictionary); + } + abstract class CustomAbstractDictionary : IDictionary { public abstract int this[string key] { get; set; } @@ -832,6 +901,199 @@ class WithParamsArray : IAmAnInterface public WithParamsArray(params int[] values) { Values = values; } } + [Fact] + public void ConvertToExplicitTypeWithParamsConstructorArgument() + { + // language=json + var json = """ + { + "Ctor": { + "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithParamsArray, Serilog.Settings.Configuration.Tests", + "values": [1, 2, 3] + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); + var value = new ObjectArgumentValue(section, []); + + var result = value.ConvertTo(typeof(IAmAnInterface), new()); + + var actual = Assert.IsType(result); + Assert.Equal([1, 2, 3], actual.Values); + } + + [Theory] + [InlineData(typeof(IEnumerable))] + [InlineData(typeof(ICollection))] + [InlineData(typeof(IReadOnlyCollection))] + [InlineData(typeof(IList))] + [InlineData(typeof(IReadOnlyList))] + [InlineData(typeof(List))] + public void ConvertToExplicitTypeWithContainerConstructorArgument(Type containerType) + { + var expectedType = typeof(GenericClass<>).MakeGenericType(containerType); + var valueProp = expectedType.GetProperty(nameof(GenericClass.Value)); + + // language=json + var json = $$""" + { + "Ctor": { + "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[{{containerType.AssemblyQualifiedName}}]], Serilog.Settings.Configuration.Tests", + "value": [1, 2, 3] + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); + var value = new ObjectArgumentValue(section, []); + + var result = value.ConvertTo(typeof(IAmAnInterface), new()); + + Assert.IsType(expectedType, result); + var list = Assert.IsType>(valueProp?.GetValue(result)); + Assert.Equal([1, 2, 3], list); + } + + [Theory] + [InlineData(typeof(ISet))] +#if NET5_0_OR_GREATER + [InlineData(typeof(IReadOnlySet))] +#endif + [InlineData(typeof(HashSet))] + public void ConvertToExplicitTypeWithSetConstructorArgument(Type containerType) + { + var expectedType = typeof(GenericClass<>).MakeGenericType(containerType); + var valueProp = expectedType.GetProperty(nameof(GenericClass.Value)); + + // language=json + var json = $$""" + { + "Ctor": { + "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[{{containerType.AssemblyQualifiedName}}]], Serilog.Settings.Configuration.Tests", + "value": [ 1, 1, 2, 2 ] + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); + var value = new ObjectArgumentValue(section, []); + + var result = value.ConvertTo(typeof(IAmAnInterface), new()); + + Assert.IsType(expectedType, result); + var set = Assert.IsType>(valueProp?.GetValue(result)); + Assert.Equal([1, 2], set); + } + + + [Theory] + [InlineData(typeof(IEnumerable>))] + [InlineData(typeof(ICollection>))] + [InlineData(typeof(IReadOnlyCollection>))] + [InlineData(typeof(IDictionary))] + [InlineData(typeof(IReadOnlyDictionary))] + [InlineData(typeof(Dictionary))] + public void ConvertToExplicitTypeWithDictionaryConstructorArgument(Type containerType) + { + var expectedType = typeof(GenericClass<>).MakeGenericType(containerType); + var valueProp = expectedType.GetProperty(nameof(GenericClass.Value)); + + // language=json + var json = $$""" + { + "Ctor": { + "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[{{containerType.AssemblyQualifiedName}}]], Serilog.Settings.Configuration.Tests", + "value": { + "a": 1, + "b": 2 + } + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); + var value = new ObjectArgumentValue(section, []); + + var result = value.ConvertTo(typeof(IAmAnInterface), new()); + + Assert.IsType(expectedType, result); + var dictionary = Assert.IsType>(valueProp?.GetValue(result)); + Assert.Equal(new Dictionary { { "a", 1 }, { "b", 2 } }, dictionary); + } + + [Fact] + public void ConvertToExplicitTypeWithStructConstructorArgument() + { + // language=json + var json = """ + { + "Ctor": { + "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+PlainStruct, Serilog.Settings.Configuration.Tests]], Serilog.Settings.Configuration.Tests", + "value": { "A" : "1" } + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); + var value = new ObjectArgumentValue(section, []); + + var result = value.ConvertTo(typeof(IAmAnInterface), new()); + + var actual = Assert.IsType>(result); + Assert.Equal("1", actual.Value.A); + Assert.Null(actual.Value.B); + } + + [Fact] + public void ConvertToExplicitTypeWithClassConstructorArgument() + { + // language=json + var json = """ + { + "Ctor": { + "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[TestDummies.DummyLoggerConfigurationExtensions+Binding, TestDummies]], Serilog.Settings.Configuration.Tests", + "value": { "foo" : "bar" } + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); + var value = new ObjectArgumentValue(section, []); + + var result = value.ConvertTo(typeof(IAmAnInterface), new()); + + var actual = Assert.IsType>(result); + Assert.Equal("bar", actual.Value.Foo); + Assert.Null(actual.Value.Abc); + } + + readonly struct Struct : IAmAnInterface + { + public readonly string String { get; } + + public Struct(string str) { String = str; } + } + + [Fact] + public void ConvertToExplicitTypeWithExplicitStructConstructorArgument() + { + // language=json + var json = """ + { + "Ctor": { + "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[Serilog.Settings.Configuration.Tests.Support.IAmAnInterface, Serilog.Settings.Configuration.Tests]], Serilog.Settings.Configuration.Tests", + "value": { + "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+Struct, Serilog.Settings.Configuration.Tests", + "str" : "abc" + } + } + } + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); + var value = new ObjectArgumentValue(section, []); + + var result = value.ConvertTo(typeof(IAmAnInterface), new()); + + var actual = Assert.IsType>(result); + var structValue = Assert.IsType(actual.Value); + Assert.Equal("abc", structValue.String); + } + [Fact] public void ConvertToExplicitTypeWithExplicitTypeConstructorArgument() { From 64a0130b0437e9c9fedffaa30d8f2d4d7cb5df6b Mon Sep 17 00:00:00 2001 From: Christoffer Gersen Date: Sat, 24 Feb 2024 11:38:21 +0100 Subject: [PATCH 02/23] Place JSON strings in variable before use To avoid JSON001 Invalid JSON pattern analyzer errors in IDE --- .../ObjectArgumentValueTests.cs | 169 +++++++++++------- 1 file changed, 101 insertions(+), 68 deletions(-) diff --git a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs index 51ff402..d038a6c 100644 --- a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs @@ -24,11 +24,12 @@ static T ConvertToReturnsType(ObjectArgumentValue value, ResolutionContext? r public void ConvertToIConfigurationSection() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Serilog": {} } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(IConfigurationSection), new()); @@ -40,7 +41,7 @@ public void ConvertToIConfigurationSection() public void ConvertToLoggerConfigurationCallback() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Serilog": { "WriteTo": [{ @@ -50,7 +51,8 @@ public void ConvertToLoggerConfigurationCallback() "Enrich": ["WithDummyThreadId"] } } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, [typeof(DummyRollingFileSink).Assembly]); var configure = ConvertToReturnsType>(value); @@ -70,7 +72,7 @@ public void ConvertToLoggerConfigurationCallback() public void ConvertToLoggerSinkConfigurationCallback() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "WriteTo": [{ "Name": "Dummy", @@ -79,7 +81,8 @@ public void ConvertToLoggerSinkConfigurationCallback() } }] } - """, "WriteTo"); + """; + var section = JsonStringConfigSource.LoadSection(json, "WriteTo"); var value = new ObjectArgumentValue(section, [typeof(DummyConfigurationSink).Assembly]); var configureSinks = ConvertToReturnsType>(value); @@ -100,7 +103,7 @@ public void ConvertToLoggerSinkConfigurationCallback() public void ConvertToLoggerEnrichmentConfiguration() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Enrich": [{ "Name": "AtLevel", @@ -110,7 +113,8 @@ public void ConvertToLoggerEnrichmentConfiguration() } }] } - """, "Enrich"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Enrich"); var value = new ObjectArgumentValue(section, [typeof(LoggerEnrichmentConfiguration).Assembly, typeof(DummyThreadIdEnricher).Assembly]); var configureEnrichment = ConvertToReturnsType>(value); @@ -134,11 +138,12 @@ public void ConvertToLoggerEnrichmentConfiguration() public void ConvertToConfigurationCallbackThrows() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Configure": {} } - """, "Configure"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Configure"); var value = new ObjectArgumentValue(section, []); var ex = Assert.Throws(() => value.ConvertTo(typeof(Action), new())); @@ -150,11 +155,12 @@ public void ConvertToConfigurationCallbackThrows() public void ConvertToArrayUsingStringArgumentValueForElements() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Array": [ "Information", 3, null ] } - """, "Array"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Array"); var value = new ObjectArgumentValue(section, []); var array = ConvertToReturnsType(value); @@ -190,11 +196,12 @@ public void ConvertToArrayOfArraysPassingContext() public void ConvertToArrayRecursingObjectArgumentValuePassingAssemblies() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Array": [{ "WriteTo": [{ "Name": "DummyConsole", "Args": {} }] }] } - """, "Array"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Array"); var value = new ObjectArgumentValue(section, [typeof(DummyConsoleSink).Assembly]); var configureCalls = ConvertToReturnsType[]>(value); @@ -214,14 +221,15 @@ public void ConvertToArrayRecursingObjectArgumentValuePassingAssemblies() public void ConvertToArrayWithDifferentImplementations() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Array": [ "Serilog.Settings.Configuration.Tests.Support.ConcreteImpl::Instance, Serilog.Settings.Configuration.Tests", "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+PrivateImplWithPublicCtor, Serilog.Settings.Configuration.Tests" ] } - """, "Array"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Array"); var value = new ObjectArgumentValue(section, []); var array = ConvertToReturnsType(value); @@ -235,11 +243,12 @@ public void ConvertToArrayWithDifferentImplementations() public void ConvertToContainerUsingStringArgumentValueForElements() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "List": [ "Information", 3, null ] } - """, "List"); + """; + var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); var list = ConvertToReturnsType>(value); @@ -258,11 +267,12 @@ public void ConvertToNestedContainerPassingContext() }; // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "List": [ [ 1, 2 ], [ 3, 4 ], [ "1.234,56" ] ] } - """, "List"); + """; + var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); var array = ConvertToReturnsType>>(value, new(readerOptions: new() { FormatProvider = formatProvider })); @@ -274,11 +284,12 @@ public void ConvertToNestedContainerPassingContext() public void ConvertToContainerRecursingObjectArgumentValuePassingAssemblies() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "List": [{ "WriteTo": [{ "Name": "DummyConsole", "Args": {} }] }] } - """, "List"); + """; + var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, [typeof(DummyConsoleSink).Assembly]); var configureCalls = ConvertToReturnsType>>(value); @@ -298,14 +309,15 @@ public void ConvertToContainerRecursingObjectArgumentValuePassingAssemblies() public void ConvertToListWithDifferentImplementations() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "List": [ "Serilog.Settings.Configuration.Tests.Support.ConcreteImpl::Instance, Serilog.Settings.Configuration.Tests", "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+PrivateImplWithPublicCtor, Serilog.Settings.Configuration.Tests" ] } - """, "List"); + """; + var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); var list = ConvertToReturnsType>(value); @@ -332,11 +344,12 @@ IEnumerator IEnumerable.GetEnumerator() public void ConvertToUnsupportedContainerWillBeCreatedButWillRemainEmpty() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "List": ["a", "b"] } - """, "List"); + """; + var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); var unsupported = ConvertToReturnsType(value); @@ -354,11 +367,12 @@ public void ConvertToUnsupportedContainerWillBeCreatedButWillRemainEmpty() public void ConvertToContainerUsingList(Type containerType) { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Container": [ 1, 1 ] } - """, "Container"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); var container = value.ConvertTo(containerType, new()); @@ -376,11 +390,12 @@ public void ConvertToContainerUsingList(Type containerType) public void ConvertToContainerUsingHashSet(Type containerType) { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Container": [ 1, 1, 2, 2 ] } - """, "Container"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); var container = value.ConvertTo(containerType, new()); @@ -431,14 +446,15 @@ public void ConvertToForcedHashSetImplementationWithCustomComparer() public void ConvertToContainerUsingDictionary(Type containerType) { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Container": { "a": 1, "b": 2 } } - """, "Container"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); var container = value.ConvertTo(containerType, new()); @@ -457,14 +473,15 @@ public void ConvertToContainerUsingDictionary(Type containerType) public void ConvertToContainerUsingDictionaryUsingStringArgumentValueToConvertKey(Type containerType) { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Container": { "1": 2, "3": 4 } } - """, "Container"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); var container = value.ConvertTo(containerType, new()); @@ -599,14 +616,15 @@ IEnumerator IEnumerable.GetEnumerator() public void ConvertToCustomAbstractDictionaryThrows() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Container": { "a": 1, "b": 2 } } - """, "Container"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); Assert.Throws(() => value.ConvertTo(typeof(CustomAbstractDictionary), new())); @@ -647,14 +665,15 @@ IEnumerator IEnumerable.GetEnumerator() public void ConvertToCustomReadOnlyDictionaryCreatesEmpty() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Container": { "a": 1, "b": 2 } } - """, "Container"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); ConvertToReturnsType(value); @@ -670,11 +689,12 @@ class PrivateImplWithPublicCtor : AnAbstractClass, IAmAnInterface; public void ConvertToExplicitType(Type targetType, Type expectedType) { // language=json - var section = JsonStringConfigSource.LoadSection($$""" + var json = $$""" { "Ctor": { "type": "{{expectedType.AssemblyQualifiedName}}"} } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(targetType, new()); @@ -693,14 +713,15 @@ class WithTypeArgumentClassCtor : AnAbstractClass public void ConvertToExplicitTypeUsingTypeAsConstructorArgument() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Ctor": { "$type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithTypeArgumentClassCtor, Serilog.Settings.Configuration.Tests", "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+PrivateImplWithPublicCtor, Serilog.Settings.Configuration.Tests" } } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(typeof(AnAbstractClass), new()); @@ -738,7 +759,7 @@ public WithOverloads(int a, TimeSpan b, Uri c, string d = "d") public void ConvertToExplicitTypePickingConstructorOverloadWithMostMatchingArguments(string dJson, string? d) { // language=json - var section = JsonStringConfigSource.LoadSection($$""" + var json = $$""" { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithOverloads, Serilog.Settings.Configuration.Tests", @@ -748,7 +769,8 @@ public void ConvertToExplicitTypePickingConstructorOverloadWithMostMatchingArgum {{dJson}} } } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(typeof(IAmAnInterface), new()); @@ -764,7 +786,7 @@ public void ConvertToExplicitTypePickingConstructorOverloadWithMostMatchingArgum public void ConvertToExplicitTypeMatchingArgumentsCaseInsensitively() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithOverloads, Serilog.Settings.Configuration.Tests", @@ -773,7 +795,8 @@ public void ConvertToExplicitTypeMatchingArgumentsCaseInsensitively() "C": "http://dot.com/" } } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(typeof(IAmAnInterface), new()); @@ -800,7 +823,7 @@ class WithSimilarOverloads : IAmAnInterface public void ConvertToExplicitTypePickingConstructorOverloadWithMostStrings() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithSimilarOverloads, Serilog.Settings.Configuration.Tests", @@ -809,7 +832,8 @@ public void ConvertToExplicitTypePickingConstructorOverloadWithMostStrings() "c": 3 } } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(typeof(IAmAnInterface), new()); @@ -836,14 +860,15 @@ class OnlyDifferentTypeOverloads : IAmAnInterface public void ConvertToExplicitTypePickingFirstMatchWhenOtherwiseAmbiguous() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+OnlyDifferentTypeOverloads, Serilog.Settings.Configuration.Tests", "value": 123 } } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(typeof(IAmAnInterface), new()); @@ -872,18 +897,19 @@ public WithDefaults(int a, int b = 2, int c = 3) [InlineData(",\"b\": 5", 5, 3)] [InlineData(",\"c\": 6", 2, 6)] [InlineData(",\"b\": 7, \"c\": 8", 7, 8)] - public void ConvertToExplicitTypeFillingInDefaultsInConstructor(string json, int b, int c) + public void ConvertToExplicitTypeFillingInDefaultsInConstructor(string jsonPart, int b, int c) { // language=json - var section = JsonStringConfigSource.LoadSection($$""" + var json = $$""" { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithDefaults, Serilog.Settings.Configuration.Tests", "a": 1 - {{json}} + {{jsonPart}} } } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(typeof(IAmAnInterface), new()); @@ -1098,7 +1124,7 @@ public void ConvertToExplicitTypeWithExplicitStructConstructorArgument() public void ConvertToExplicitTypeWithExplicitTypeConstructorArgument() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[Serilog.Settings.Configuration.Tests.Support.IAmAnInterface, Serilog.Settings.Configuration.Tests]], Serilog.Settings.Configuration.Tests", @@ -1107,7 +1133,8 @@ public void ConvertToExplicitTypeWithExplicitTypeConstructorArgument() } } } - """, "Ctor"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Ctor"); var value = new ObjectArgumentValue(section, []); var result = value.ConvertTo(typeof(IAmAnInterface), new()); @@ -1134,11 +1161,12 @@ public void ConvertToExplicitTypeWithExplicitTypeConstructorArgument() public void ConvertToPrimitives(Type type, object expected, string sectionValue) { // language=json - var section = JsonStringConfigSource.LoadSection($$""" + var json = $$""" { "Serilog": {{sectionValue}} } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(type, new()); @@ -1152,11 +1180,12 @@ public void ConvertToPrimitives(Type type, object expected, string sectionValue) public void ConvertToNullablePrimitive() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Serilog": 123 } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(int?), new()); @@ -1169,11 +1198,12 @@ public void ConvertToNullablePrimitive() public void ConvertToNullWhenEmptyNullable() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Serilog": null } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(int?), new()); @@ -1185,11 +1215,12 @@ public void ConvertToNullWhenEmptyNullable() public void ConvertToPlainClass() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Serilog": { "foo" : "bar" } } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(TestDummies.DummyLoggerConfigurationExtensions.Binding), new()); @@ -1209,11 +1240,12 @@ struct PlainStruct public void ConvertToPlainStruct() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Serilog": { "A" : "1" } } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(PlainStruct), new()); @@ -1230,11 +1262,12 @@ public void ConvertToPlainStruct() public void ConvertToNullWhenStructIsNull() { // language=json - var section = JsonStringConfigSource.LoadSection(""" + var json = """ { "Serilog": null } - """, "Serilog"); + """; + var section = JsonStringConfigSource.LoadSection(json, "Serilog"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(PlainStruct), new()); From 464871ca161b9f406f1a49c308400d546af89c58 Mon Sep 17 00:00:00 2001 From: David Allardyce Date: Fri, 15 Mar 2024 12:54:28 -0400 Subject: [PATCH 03/23] Use value from `Serilog:MinimumLevel:Default` if value from `Serilog:MinimumLevel` is an empty string --- .../Configuration/ConfigurationReader.cs | 4 ++-- .../LoggerConfigurationExtensionsTests.cs | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs index 1049b85..bad9fdc 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs @@ -200,12 +200,12 @@ void ApplyMinimumLevelConfiguration(IConfigurationSection directive, Action + { + ["Serilog"] = "", + ["Serilog:MinimumLevel"] = "", + ["Serilog:MinimumLevel:Default"] = "Information", + + }) + .Build(); + + new LoggerConfiguration() + .ReadFrom.Configuration(configuration) + .CreateLogger(); + } } From 1d62cc4b44c14ac49813541d82b81bde9a8cc7fc Mon Sep 17 00:00:00 2001 From: David Allardyce <93950725+DavidAllardyce@users.noreply.github.com> Date: Mon, 18 Mar 2024 09:48:26 -0400 Subject: [PATCH 04/23] Update test/Serilog.Settings.Configuration.Tests/LoggerConfigurationExtensionsTests.cs Co-authored-by: Ivan Maximov --- .../LoggerConfigurationExtensionsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Serilog.Settings.Configuration.Tests/LoggerConfigurationExtensionsTests.cs b/test/Serilog.Settings.Configuration.Tests/LoggerConfigurationExtensionsTests.cs index 4787df0..583a53a 100644 --- a/test/Serilog.Settings.Configuration.Tests/LoggerConfigurationExtensionsTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/LoggerConfigurationExtensionsTests.cs @@ -142,7 +142,7 @@ public void ReadFromConfigurationSectionDoesNotThrowWhenTryingToCallConfiguratio [Fact] [Trait("BugFix", "https://github.com/serilog/serilog-settings-configuration/issues/332")] - public void ReadFromConfigurationThrowsWhenMinimumLevelDefaultSetButMinimumLevelValueIsEmptyString() + public void ReadFromConfiguration_ShouldNot_Throw_When_MinimumLevel_Default_Set_But_MinimumLevel_Value_Is_Empty_String() { var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary From eca00c29d4dd85d6e7488098e5a1713052f07d7a Mon Sep 17 00:00:00 2001 From: eleazarcelis Date: Wed, 20 Mar 2024 11:29:34 -0300 Subject: [PATCH 05/23] Clarification of the location of the 'Serilog' section in appsettings.json file. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8fb3e07..2eb4531 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A Serilog settings provider that reads from [Microsoft.Extensions.Configuration](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1) sources, including .NET Core's `appsettings.json` file. -By default, configuration is read from the `Serilog` section. +By default, configuration is read from the `Serilog` section that should be at the **top level** of the configuration file. ```json { From 39c07a90de0dabf2223bfaaa24a50fffc520857d Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 13 May 2024 16:26:37 +1000 Subject: [PATCH 06/23] Minor version bump - new features incoming --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 8e5a021..c8338fc 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -3,7 +3,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - 8.0.1 + 8.1.0 Serilog Contributors From cfe1b523c3354f153a14a93796ec9a8d8ab70ea4 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 13 May 2024 16:29:17 +1000 Subject: [PATCH 07/23] Revert minor version bump - forgot about the versioning policy used here :) [skip ci] --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index c8338fc..8e5a021 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -3,7 +3,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - 8.1.0 + 8.0.1 Serilog Contributors From a502598b0f5134ea82298a71940b018f50ee95b7 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 6 Jun 2024 19:02:39 +1000 Subject: [PATCH 08/23] Dev version bump [skip ci] --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 8e5a021..dd70188 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -3,7 +3,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - 8.0.1 + 8.0.2 Serilog Contributors From 80b30e1c1a869f9506b31e3782e6501c7e274f1f Mon Sep 17 00:00:00 2001 From: Richard Webb Date: Thu, 11 Jul 2024 10:20:40 +0100 Subject: [PATCH 09/23] Update xunit to 2.9.0 --- .../ConfigurationSettingsTests.cs | 2 +- .../Serilog.Settings.Configuration.Tests.csproj | 4 ++-- .../StringArgumentValueTests.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs b/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs index d505ec1..5aeec1f 100644 --- a/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs @@ -60,7 +60,7 @@ public void PropertyEnrichmentIsApplied() [Theory] [InlineData(null)] [InlineData("")] - public void CanReadWithoutSerilogSection(string sectionName) + public void CanReadWithoutSerilogSection(string? sectionName) { LogEvent? evt = null; diff --git a/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj b/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj index e79a4d5..37df7b5 100644 --- a/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj +++ b/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj @@ -1,4 +1,4 @@ - + net48 @@ -25,7 +25,7 @@ - + diff --git a/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs b/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs index 6ab7e5c..3a312ba 100644 --- a/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs @@ -54,7 +54,7 @@ public void StringValuesConvertToDefaultInstancesIfTargetIsAbstractClass() // a full-qualified type name should not be considered a static member accessor [InlineData("My.NameSpace.Class, MyAssembly, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", null, null)] - public void TryParseStaticMemberAccessorReturnsExpectedResults(string input, string? expectedAccessorType, string expectedPropertyName) + public void TryParseStaticMemberAccessorReturnsExpectedResults(string? input, string? expectedAccessorType, string? expectedPropertyName) { var actual = StringArgumentValue.TryParseStaticMemberAccessor(input, out var actualAccessorType, From 6c231a3da539d657336c606645c32258687f62d2 Mon Sep 17 00:00:00 2001 From: Richard Webb Date: Thu, 11 Jul 2024 11:27:06 +0100 Subject: [PATCH 10/23] Update Microsoft.Extensions.DependencyModel to 8.0.1 Updates the transitive dependency on System.Text.Json to 8.0.4 to fix https://github.com/advisories/GHSA-hh2w-p6rv-4g7w --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index dd70188..808b065 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -38,6 +38,6 @@ - + From 76f8d5e006b751df15354c65d94e78dce8430b13 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 3 Aug 2024 10:16:49 +1000 Subject: [PATCH 11/23] Minor ObjectArgumentValueTests naming tweaks (following xUnit 'fact' conventions) --- ...log-settings-configuration.sln.DotSettings | 16 ++ .../Configuration/ObjectArgumentValue.cs | 2 +- .../ObjectArgumentValueTests.cs | 205 +++++++++--------- 3 files changed, 119 insertions(+), 104 deletions(-) diff --git a/serilog-settings-configuration.sln.DotSettings b/serilog-settings-configuration.sln.DotSettings index c946077..d47fb00 100644 --- a/serilog-settings-configuration.sln.DotSettings +++ b/serilog-settings-configuration.sln.DotSettings @@ -514,6 +514,21 @@ II.2.12 <HandlesEvent /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> <Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Type parameters"><ElementKinds><Kind Name="TYPE_PARAMETER" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Instance" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Instance fields (not private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Local variables"><ElementKinds><Kind Name="LOCAL_VARIABLE" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Constant fields (not private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Static fields (not private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Parameters"><ElementKinds><Kind Name="PARAMETER" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Enum members"><ElementKinds><Kind Name="ENUM_MEMBER" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Types and namespaces"><ElementKinds><Kind Name="NAMESPACE" /><Kind Name="CLASS" /><Kind Name="STRUCT" /><Kind Name="ENUM" /><Kind Name="DELEGATE" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Local constants"><ElementKinds><Kind Name="LOCAL_CONSTANT" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Interfaces"><ElementKinds><Kind Name="INTERFACE" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Static readonly fields (not private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></Policy> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> @@ -550,6 +565,7 @@ II.2.12 <HandlesEvent /> True True True + True True True True diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs index 4751a2a..a180927 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs @@ -38,7 +38,7 @@ public ObjectArgumentValue(IConfigurationSection section, IReadOnlyCollection new Action(configReader.Configure), _ when configType == typeof(LoggerSinkConfiguration) => new Action(configReader.ApplySinks), _ when configType == typeof(LoggerEnrichmentConfiguration) => new Action(configReader.ApplyEnrichment), - _ => throw new ArgumentException($"Configuration resolution for Action<{configType.Name}> parameter type at the path {_section.Path} is not implemented.") + _ => throw new ArgumentException($"Configuration resolution for `Action<{configType.Name}>` parameter type at the path `{_section.Path}` is not implemented.") }; } diff --git a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs index d038a6c..f5f6e35 100644 --- a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs @@ -6,6 +6,8 @@ using Serilog.Settings.Configuration.Tests.Support; using TestDummies; using TestDummies.Console; +// ReSharper disable NotDisposedResourceIsReturned +// ReSharper disable UnusedAutoPropertyAccessor.Local // ReSharper disable UnusedMember.Local // ReSharper disable UnusedParameter.Local @@ -15,21 +17,21 @@ namespace Serilog.Settings.Configuration.Tests; public class ObjectArgumentValueTests { - static T ConvertToReturnsType(ObjectArgumentValue value, ResolutionContext? resolutionContext = null) + static T AssertConvertsToType(ObjectArgumentValue value, ResolutionContext? resolutionContext = null) { return Assert.IsType(value.ConvertTo(typeof(T), resolutionContext ?? new())); } [Fact] - public void ConvertToIConfigurationSection() + public void ConvertsToIConfigurationSection() { // language=json - var json = """ + const string json = """ { - "Serilog": {} + "section": {} } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "section"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(IConfigurationSection), new()); @@ -38,12 +40,12 @@ public void ConvertToIConfigurationSection() } [Fact] - public void ConvertToLoggerConfigurationCallback() + public void ConvertsToLoggerConfigurationCallback() { // language=json - var json = """ + const string json = """ { - "Serilog": { + "callback": { "WriteTo": [{ "Name": "DummyRollingFile", "Args": {"pathFormat" : "C:\\"} @@ -52,10 +54,10 @@ public void ConvertToLoggerConfigurationCallback() } } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "callback"); var value = new ObjectArgumentValue(section, [typeof(DummyRollingFileSink).Assembly]); - var configure = ConvertToReturnsType>(value); + var configure = AssertConvertsToType>(value); var config = new LoggerConfiguration(); configure(config); @@ -69,10 +71,10 @@ public void ConvertToLoggerConfigurationCallback() } [Fact] - public void ConvertToLoggerSinkConfigurationCallback() + public void ConvertsToLoggerSinkConfigurationCallback() { // language=json - var json = """ + const string json = """ { "WriteTo": [{ "Name": "Dummy", @@ -85,7 +87,7 @@ public void ConvertToLoggerSinkConfigurationCallback() var section = JsonStringConfigSource.LoadSection(json, "WriteTo"); var value = new ObjectArgumentValue(section, [typeof(DummyConfigurationSink).Assembly]); - var configureSinks = ConvertToReturnsType>(value); + var configureSinks = AssertConvertsToType>(value); var config = new LoggerConfiguration(); configureSinks(config.WriteTo); @@ -100,10 +102,10 @@ public void ConvertToLoggerSinkConfigurationCallback() } [Fact] - public void ConvertToLoggerEnrichmentConfiguration() + public void ConvertsToLoggerEnrichmentConfiguration() { // language=json - var json = """ + const string json = """ { "Enrich": [{ "Name": "AtLevel", @@ -117,7 +119,7 @@ public void ConvertToLoggerEnrichmentConfiguration() var section = JsonStringConfigSource.LoadSection(json, "Enrich"); var value = new ObjectArgumentValue(section, [typeof(LoggerEnrichmentConfiguration).Assembly, typeof(DummyThreadIdEnricher).Assembly]); - var configureEnrichment = ConvertToReturnsType>(value); + var configureEnrichment = AssertConvertsToType>(value); var config = new LoggerConfiguration(); config.WriteTo.DummyRollingFile(""); @@ -135,27 +137,27 @@ public void ConvertToLoggerEnrichmentConfiguration() } [Fact] - public void ConvertToConfigurationCallbackThrows() + public void ConvertToUnrecognizedConfigurationCallbackThrows() { // language=json - var json = """ + const string json = """ { - "Configure": {} + "configure": {} } """; - var section = JsonStringConfigSource.LoadSection(json, "Configure"); + var section = JsonStringConfigSource.LoadSection(json, "configure"); var value = new ObjectArgumentValue(section, []); var ex = Assert.Throws(() => value.ConvertTo(typeof(Action), new())); - Assert.Equal("Configuration resolution for Action parameter type at the path Configure is not implemented.", ex.Message); + Assert.Equal("Configuration resolution for `Action` parameter type at the path `configure` is not implemented.", ex.Message); } [Fact] - public void ConvertToArrayUsingStringArgumentValueForElements() + public void ConvertsToEnumArrayUsingStringArgumentValueForElements() { // language=json - var json = """ + const string json = """ { "Array": [ "Information", 3, null ] } @@ -163,13 +165,13 @@ public void ConvertToArrayUsingStringArgumentValueForElements() var section = JsonStringConfigSource.LoadSection(json, "Array"); var value = new ObjectArgumentValue(section, []); - var array = ConvertToReturnsType(value); + var array = AssertConvertsToType(value); Assert.Equal([LogEventLevel.Information, LogEventLevel.Warning, null], array); } [Fact] - public void ConvertToArrayOfArraysPassingContext() + public void ConvertsToArrayOfArraysPassingContext() { var formatProvider = new NumberFormatInfo { @@ -179,7 +181,7 @@ public void ConvertToArrayOfArraysPassingContext() }; // language=json - var json = """ + const string json = """ { "Array": [ [ 1, 2 ], [ 3, 4 ], [ "1.234,56" ] ] } @@ -187,16 +189,16 @@ public void ConvertToArrayOfArraysPassingContext() var section = JsonStringConfigSource.LoadSection(json, "Array"); var value = new ObjectArgumentValue(section, []); - var array = ConvertToReturnsType(value, new(readerOptions: new() { FormatProvider = formatProvider })); + var array = AssertConvertsToType(value, new(readerOptions: new() { FormatProvider = formatProvider })); Assert.Equal([[1, 2], [3, 4], [1_234.56M]], array); } [Fact] - public void ConvertToArrayRecursingObjectArgumentValuePassingAssemblies() + public void ConvertsToArrayRecursingObjectArgumentValuePassingAssemblies() { // language=json - var json = """ + const string json = """ { "Array": [{ "WriteTo": [{ "Name": "DummyConsole", "Args": {} }] }] } @@ -204,7 +206,7 @@ public void ConvertToArrayRecursingObjectArgumentValuePassingAssemblies() var section = JsonStringConfigSource.LoadSection(json, "Array"); var value = new ObjectArgumentValue(section, [typeof(DummyConsoleSink).Assembly]); - var configureCalls = ConvertToReturnsType[]>(value); + var configureCalls = AssertConvertsToType[]>(value); var configure = Assert.Single(configureCalls); var config = new LoggerConfiguration(); @@ -218,10 +220,10 @@ public void ConvertToArrayRecursingObjectArgumentValuePassingAssemblies() } [Fact] - public void ConvertToArrayWithDifferentImplementations() + public void ConvertsToArrayWithDifferentImplementations() { // language=json - var json = """ + const string json = """ { "Array": [ "Serilog.Settings.Configuration.Tests.Support.ConcreteImpl::Instance, Serilog.Settings.Configuration.Tests", @@ -232,7 +234,7 @@ public void ConvertToArrayWithDifferentImplementations() var section = JsonStringConfigSource.LoadSection(json, "Array"); var value = new ObjectArgumentValue(section, []); - var array = ConvertToReturnsType(value); + var array = AssertConvertsToType(value); Assert.Collection(array, first => Assert.IsType(first), @@ -240,10 +242,10 @@ public void ConvertToArrayWithDifferentImplementations() } [Fact] - public void ConvertToContainerUsingStringArgumentValueForElements() + public void ConvertsToContainerUsingStringArgumentValueForElements() { // language=json - var json = """ + const string json = """ { "List": [ "Information", 3, null ] } @@ -251,13 +253,13 @@ public void ConvertToContainerUsingStringArgumentValueForElements() var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); - var list = ConvertToReturnsType>(value); + var list = AssertConvertsToType>(value); Assert.Equal([LogEventLevel.Information, LogEventLevel.Warning, null], list); } [Fact] - public void ConvertToNestedContainerPassingContext() + public void ConvertsToNestedContainerPassingContext() { var formatProvider = new NumberFormatInfo { @@ -267,7 +269,7 @@ public void ConvertToNestedContainerPassingContext() }; // language=json - var json = """ + const string json = """ { "List": [ [ 1, 2 ], [ 3, 4 ], [ "1.234,56" ] ] } @@ -275,16 +277,16 @@ public void ConvertToNestedContainerPassingContext() var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); - var array = ConvertToReturnsType>>(value, new(readerOptions: new() { FormatProvider = formatProvider })); + var array = AssertConvertsToType>>(value, new(readerOptions: new() { FormatProvider = formatProvider })); Assert.Equal([[1, 2], [3, 4], [1_234.56M]], array); } [Fact] - public void ConvertToContainerRecursingObjectArgumentValuePassingAssemblies() + public void ConvertsToContainerRecursingObjectArgumentValuePassingAssemblies() { // language=json - var json = """ + const string json = """ { "List": [{ "WriteTo": [{ "Name": "DummyConsole", "Args": {} }] }] } @@ -292,7 +294,7 @@ public void ConvertToContainerRecursingObjectArgumentValuePassingAssemblies() var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, [typeof(DummyConsoleSink).Assembly]); - var configureCalls = ConvertToReturnsType>>(value); + var configureCalls = AssertConvertsToType>>(value); var configure = Assert.Single(configureCalls); var config = new LoggerConfiguration(); @@ -306,10 +308,10 @@ public void ConvertToContainerRecursingObjectArgumentValuePassingAssemblies() } [Fact] - public void ConvertToListWithDifferentImplementations() + public void ConvertsToListWithDifferentImplementations() { // language=json - var json = """ + const string json = """ { "List": [ "Serilog.Settings.Configuration.Tests.Support.ConcreteImpl::Instance, Serilog.Settings.Configuration.Tests", @@ -320,7 +322,7 @@ public void ConvertToListWithDifferentImplementations() var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); - var list = ConvertToReturnsType>(value); + var list = AssertConvertsToType>(value); Assert.Collection(list, first => Assert.IsType(first), @@ -331,7 +333,7 @@ class UnsupportedContainer : IEnumerable { public IEnumerator GetEnumerator() { - return Enumerable.Empty().GetEnumerator(); + yield break; } IEnumerator IEnumerable.GetEnumerator() @@ -344,7 +346,7 @@ IEnumerator IEnumerable.GetEnumerator() public void ConvertToUnsupportedContainerWillBeCreatedButWillRemainEmpty() { // language=json - var json = """ + const string json = """ { "List": ["a", "b"] } @@ -352,7 +354,7 @@ public void ConvertToUnsupportedContainerWillBeCreatedButWillRemainEmpty() var section = JsonStringConfigSource.LoadSection(json, "List"); var value = new ObjectArgumentValue(section, []); - var unsupported = ConvertToReturnsType(value); + var unsupported = AssertConvertsToType(value); Assert.Empty(unsupported); } @@ -367,7 +369,7 @@ public void ConvertToUnsupportedContainerWillBeCreatedButWillRemainEmpty() public void ConvertToContainerUsingList(Type containerType) { // language=json - var json = """ + const string json = """ { "Container": [ 1, 1 ] } @@ -387,10 +389,10 @@ public void ConvertToContainerUsingList(Type containerType) [InlineData(typeof(IReadOnlySet))] #endif [InlineData(typeof(HashSet))] - public void ConvertToContainerUsingHashSet(Type containerType) + public void ConvertsToContainerUsingHashSet(Type containerType) { // language=json - var json = """ + const string json = """ { "Container": [ 1, 1, 2, 2 ] } @@ -405,11 +407,11 @@ public void ConvertToContainerUsingHashSet(Type containerType) } [Fact] - public void ConvertToForcedHashSetImplementationWithCustomComparer() + public void ConvertsToForcedHashSetImplementationWithCustomComparer() { // In .Net Framework HashSet is not part of mscorlib, but inside System.Core // As a result the type string "System.Collections.Generic.HashSet`1[[System.String]]" will fail - // Using AssemblyQualifiedName to automatically switch to the correct type string, depending of framework + // Using AssemblyQualifiedName to automatically switch to the correct type string, depending on framework // language=json var json = $$""" @@ -443,10 +445,10 @@ public void ConvertToForcedHashSetImplementationWithCustomComparer() [InlineData(typeof(IDictionary))] [InlineData(typeof(IReadOnlyDictionary))] [InlineData(typeof(Dictionary))] - public void ConvertToContainerUsingDictionary(Type containerType) + public void ConvertsToContainerUsingDictionary(Type containerType) { // language=json - var json = """ + const string json = """ { "Container": { "a": 1, @@ -470,10 +472,10 @@ public void ConvertToContainerUsingDictionary(Type containerType) [InlineData(typeof(IDictionary))] [InlineData(typeof(IReadOnlyDictionary))] [InlineData(typeof(Dictionary))] - public void ConvertToContainerUsingDictionaryUsingStringArgumentValueToConvertKey(Type containerType) + public void ConvertsToContainerUsingDictionaryUsingStringArgumentValueToConvertKey(Type containerType) { // language=json - var json = """ + const string json = """ { "Container": { "1": 2, @@ -564,10 +566,10 @@ IEnumerator IEnumerable.GetEnumerator() } [Fact] - public void ConvertToContainerUsingDictionaryWithoutPublicDefaultConstructor() + public void ConvertsToContainerUsingDictionaryWithoutPublicDefaultConstructor() { // language=json - var json = """ + const string json = """ { "Container": { "values": @@ -581,7 +583,7 @@ public void ConvertToContainerUsingDictionaryWithoutPublicDefaultConstructor() var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); - var dictionary = ConvertToReturnsType(value); + var dictionary = AssertConvertsToType(value); Assert.Equal(new Dictionary { { "a", 1 }, { "b", 2 } }, dictionary); } @@ -616,7 +618,7 @@ IEnumerator IEnumerable.GetEnumerator() public void ConvertToCustomAbstractDictionaryThrows() { // language=json - var json = """ + const string json = """ { "Container": { "a": 1, @@ -665,7 +667,7 @@ IEnumerator IEnumerable.GetEnumerator() public void ConvertToCustomReadOnlyDictionaryCreatesEmpty() { // language=json - var json = """ + const string json = """ { "Container": { "a": 1, @@ -676,7 +678,7 @@ public void ConvertToCustomReadOnlyDictionaryCreatesEmpty() var section = JsonStringConfigSource.LoadSection(json, "Container"); var value = new ObjectArgumentValue(section, []); - ConvertToReturnsType(value); + AssertConvertsToType(value); } class PrivateImplWithPublicCtor : AnAbstractClass, IAmAnInterface; @@ -686,7 +688,7 @@ class PrivateImplWithPublicCtor : AnAbstractClass, IAmAnInterface; [InlineData(typeof(IAmAnInterface), typeof(PrivateImplWithPublicCtor))] [InlineData(typeof(AnAbstractClass), typeof(PrivateImplWithPublicCtor))] [InlineData(typeof(AConcreteClass), typeof(ConcreteImplOfConcreteClass))] - public void ConvertToExplicitType(Type targetType, Type expectedType) + public void ConvertsToExplicitType(Type targetType, Type expectedType) { // language=json var json = $$""" @@ -710,10 +712,10 @@ class WithTypeArgumentClassCtor : AnAbstractClass } [Fact] - public void ConvertToExplicitTypeUsingTypeAsConstructorArgument() + public void ConvertsToExplicitTypeUsingTypeAsConstructorArgument() { // language=json - var json = """ + const string json = """ { "Ctor": { "$type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithTypeArgumentClassCtor, Serilog.Settings.Configuration.Tests", @@ -756,16 +758,15 @@ public WithOverloads(int a, TimeSpan b, Uri c, string d = "d") [Theory] [InlineData("", null)] [InlineData(",\"d\": \"DValue\"", "DValue")] - public void ConvertToExplicitTypePickingConstructorOverloadWithMostMatchingArguments(string dJson, string? d) + public void ConvertsToExplicitTypePickingConstructorOverloadWithMostMatchingArguments(string dJson, string? d) { - // language=json var json = $$""" { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithOverloads, Serilog.Settings.Configuration.Tests", "a": 1, "b": "23:59:59", - "c": "http://dot.com/" + "c": "https://example.com/" {{dJson}} } } @@ -778,21 +779,21 @@ public void ConvertToExplicitTypePickingConstructorOverloadWithMostMatchingArgum var actual = Assert.IsType(result); Assert.Equal(1, actual.A); Assert.Equal(new TimeSpan(23, 59, 59), actual.B); - Assert.Equal(new Uri("http://dot.com/"), actual.C); + Assert.Equal(new Uri("https://example.com/"), actual.C); Assert.Equal(d, actual.D); } [Fact] - public void ConvertToExplicitTypeMatchingArgumentsCaseInsensitively() + public void ConvertsToExplicitTypeMatchingArgumentsCaseInsensitively() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithOverloads, Serilog.Settings.Configuration.Tests", "A": 1, "B": "23:59:59", - "C": "http://dot.com/" + "C": "https://example.com/" } } """; @@ -804,7 +805,7 @@ public void ConvertToExplicitTypeMatchingArgumentsCaseInsensitively() var actual = Assert.IsType(result); Assert.Equal(1, actual.A); Assert.Equal(new TimeSpan(23, 59, 59), actual.B); - Assert.Equal(new Uri("http://dot.com/"), actual.C); + Assert.Equal(new Uri("https://example.com/"), actual.C); } class WithSimilarOverloads : IAmAnInterface @@ -823,7 +824,7 @@ class WithSimilarOverloads : IAmAnInterface public void ConvertToExplicitTypePickingConstructorOverloadWithMostStrings() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithSimilarOverloads, Serilog.Settings.Configuration.Tests", @@ -860,7 +861,7 @@ class OnlyDifferentTypeOverloads : IAmAnInterface public void ConvertToExplicitTypePickingFirstMatchWhenOtherwiseAmbiguous() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+OnlyDifferentTypeOverloads, Serilog.Settings.Configuration.Tests", @@ -897,9 +898,8 @@ public WithDefaults(int a, int b = 2, int c = 3) [InlineData(",\"b\": 5", 5, 3)] [InlineData(",\"c\": 6", 2, 6)] [InlineData(",\"b\": 7, \"c\": 8", 7, 8)] - public void ConvertToExplicitTypeFillingInDefaultsInConstructor(string jsonPart, int b, int c) + public void ConvertsToExplicitTypeFillingInDefaultsInConstructor(string jsonPart, int b, int c) { - // language=json var json = $$""" { "Ctor": { @@ -928,10 +928,10 @@ class WithParamsArray : IAmAnInterface } [Fact] - public void ConvertToExplicitTypeWithParamsConstructorArgument() + public void ConvertsToExplicitTypeWithParamsConstructorArgument() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+WithParamsArray, Serilog.Settings.Configuration.Tests", @@ -955,7 +955,7 @@ public void ConvertToExplicitTypeWithParamsConstructorArgument() [InlineData(typeof(IList))] [InlineData(typeof(IReadOnlyList))] [InlineData(typeof(List))] - public void ConvertToExplicitTypeWithContainerConstructorArgument(Type containerType) + public void ConvertsToExplicitTypeWithContainerConstructorArgument(Type containerType) { var expectedType = typeof(GenericClass<>).MakeGenericType(containerType); var valueProp = expectedType.GetProperty(nameof(GenericClass.Value)); @@ -1017,7 +1017,7 @@ public void ConvertToExplicitTypeWithSetConstructorArgument(Type containerType) [InlineData(typeof(IDictionary))] [InlineData(typeof(IReadOnlyDictionary))] [InlineData(typeof(Dictionary))] - public void ConvertToExplicitTypeWithDictionaryConstructorArgument(Type containerType) + public void ConvertsToExplicitTypeWithDictionaryConstructorArgument(Type containerType) { var expectedType = typeof(GenericClass<>).MakeGenericType(containerType); var valueProp = expectedType.GetProperty(nameof(GenericClass.Value)); @@ -1045,10 +1045,10 @@ public void ConvertToExplicitTypeWithDictionaryConstructorArgument(Type containe } [Fact] - public void ConvertToExplicitTypeWithStructConstructorArgument() + public void ConvertsToExplicitTypeWithStructConstructorArgument() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[Serilog.Settings.Configuration.Tests.ObjectArgumentValueTests+PlainStruct, Serilog.Settings.Configuration.Tests]], Serilog.Settings.Configuration.Tests", @@ -1067,10 +1067,10 @@ public void ConvertToExplicitTypeWithStructConstructorArgument() } [Fact] - public void ConvertToExplicitTypeWithClassConstructorArgument() + public void ConvertsToExplicitTypeWithClassConstructorArgument() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[TestDummies.DummyLoggerConfigurationExtensions+Binding, TestDummies]], Serilog.Settings.Configuration.Tests", @@ -1090,16 +1090,15 @@ public void ConvertToExplicitTypeWithClassConstructorArgument() readonly struct Struct : IAmAnInterface { - public readonly string String { get; } - + public string String { get; } public Struct(string str) { String = str; } } [Fact] - public void ConvertToExplicitTypeWithExplicitStructConstructorArgument() + public void ConvertsToExplicitTypeWithExplicitStructConstructorArgument() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[Serilog.Settings.Configuration.Tests.Support.IAmAnInterface, Serilog.Settings.Configuration.Tests]], Serilog.Settings.Configuration.Tests", @@ -1121,10 +1120,10 @@ public void ConvertToExplicitTypeWithExplicitStructConstructorArgument() } [Fact] - public void ConvertToExplicitTypeWithExplicitTypeConstructorArgument() + public void ConvertsToExplicitTypeWithExplicitTypeConstructorArgument() { // language=json - var json = """ + const string json = """ { "Ctor": { "type": "Serilog.Settings.Configuration.Tests.Support.GenericClass`1[[Serilog.Settings.Configuration.Tests.Support.IAmAnInterface, Serilog.Settings.Configuration.Tests]], Serilog.Settings.Configuration.Tests", @@ -1158,7 +1157,7 @@ public void ConvertToExplicitTypeWithExplicitTypeConstructorArgument() [InlineData(typeof(ulong), 8UL, "8")] [InlineData(typeof(float), -9.1F, "-9.1")] [InlineData(typeof(double), 10.2D, "10.2")] - public void ConvertToPrimitives(Type type, object expected, string sectionValue) + public void ConvertsToPrimitives(Type type, object expected, string sectionValue) { // language=json var json = $$""" @@ -1177,10 +1176,10 @@ public void ConvertToPrimitives(Type type, object expected, string sectionValue) // While ObjectArgumentValue supports converting to a nullable primitive, this is normally handled by StringArgumentValue // ObjectArgumentValue will not honor ConfigurationReaderOptions.FormatProvider, it will use InvariantCulture [Fact] - public void ConvertToNullablePrimitive() + public void ConvertsToNullablePrimitive() { // language=json - var json = """ + const string json = """ { "Serilog": 123 } @@ -1195,10 +1194,10 @@ public void ConvertToNullablePrimitive() // While ObjectArgumentValue supports converting to a nullable primitive, this is normally handled by StringArgumentValue [Fact] - public void ConvertToNullWhenEmptyNullable() + public void ConvertsToNullWhenEmptyNullable() { // language=json - var json = """ + const string json = """ { "Serilog": null } @@ -1212,10 +1211,10 @@ public void ConvertToNullWhenEmptyNullable() } [Fact] - public void ConvertToPlainClass() + public void ConvertsToPlainClass() { // language=json - var json = """ + const string json = """ { "Serilog": { "foo" : "bar" } } @@ -1237,10 +1236,10 @@ struct PlainStruct } [Fact] - public void ConvertToPlainStruct() + public void ConvertsToPlainStruct() { // language=json - var json = """ + const string json = """ { "Serilog": { "A" : "1" } } @@ -1259,10 +1258,10 @@ public void ConvertToPlainStruct() // This is because IConfigurationSection will resolve null to an empty string // This behavior is under review, see https://github.com/dotnet/runtime/issues/36510 [Fact] - public void ConvertToNullWhenStructIsNull() + public void ConvertsToNullWhenStructIsNull() { // language=json - var json = """ + const string json = """ { "Serilog": null } From 04d694dda584d8da5fc74f8a7aef69fcf2469009 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 3 Aug 2024 11:23:10 +1000 Subject: [PATCH 12/23] Use consistent binding logic for nested properties in object argument values --- .../ConfigurationArgumentValue.cs | 34 +++++ .../Configuration/ConfigurationReader.cs | 33 +---- .../IConfigurationArgumentValue.cs | 6 - .../Configuration/ObjectArgumentValue.cs | 136 +++++++++++------- .../Configuration/StringArgumentValue.cs | 4 +- .../ObjectArgumentValueTests.cs | 61 ++++++-- 6 files changed, 170 insertions(+), 104 deletions(-) create mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationArgumentValue.cs delete mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationArgumentValue.cs new file mode 100644 index 0000000..239853e --- /dev/null +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationArgumentValue.cs @@ -0,0 +1,34 @@ +using System.Reflection; +using Microsoft.Extensions.Configuration; + +namespace Serilog.Settings.Configuration; + +abstract class ConfigurationArgumentValue +{ + public abstract object? ConvertTo(Type toType, ResolutionContext resolutionContext); + + public static ConfigurationArgumentValue FromSection(IConfigurationSection argumentSection, IReadOnlyCollection configurationAssemblies) + { + ConfigurationArgumentValue argumentValue; + + // Reject configurations where an element has both scalar and complex + // values as a result of reading multiple configuration sources. + if (argumentSection.Value != null && argumentSection.GetChildren().Any()) + throw new InvalidOperationException( + $"The value for the argument '{argumentSection.Path}' is assigned different value " + + "types in more than one configuration source. Ensure all configurations consistently " + + "use either a scalar (int, string, boolean) or a complex (array, section, list, " + + "POCO, etc.) type for this argument value."); + + if (argumentSection.Value != null) + { + argumentValue = new StringArgumentValue(argumentSection.Value); + } + else + { + argumentValue = new ObjectArgumentValue(argumentSection, configurationAssemblies); + } + + return argumentValue; + } +} diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs index 1049b85..6828a65 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs @@ -303,14 +303,14 @@ void ApplyEnrichment(LoggerConfiguration loggerConfiguration) } } - internal ILookup> GetMethodCalls(IConfiguration directive) + internal ILookup> GetMethodCalls(IConfiguration directive) { var children = directive.GetChildren().ToList(); var result = (from child in children where child.Value != null // Plain string - select new { Name = child.Value, Args = new Dictionary() }) + select new { Name = child.Value, Args = new Dictionary() }) .Concat( (from child in children where child.Value == null @@ -319,7 +319,7 @@ internal ILookup> GetMet select new { Name = argument.Key, - Value = GetArgumentValue(argument, _configurationAssemblies) + Value = ConfigurationArgumentValue.FromSection(argument, _configurationAssemblies) }).ToDictionary(p => p.Name, p => p.Value) select new { Name = name, Args = callArgs })) .ToLookup(p => p.Name, p => p.Args); @@ -336,31 +336,6 @@ static string GetSectionName(IConfigurationSection s) } } - internal static IConfigurationArgumentValue GetArgumentValue(IConfigurationSection argumentSection, IReadOnlyCollection configurationAssemblies) - { - IConfigurationArgumentValue argumentValue; - - // Reject configurations where an element has both scalar and complex - // values as a result of reading multiple configuration sources. - if (argumentSection.Value != null && argumentSection.GetChildren().Any()) - throw new InvalidOperationException( - $"The value for the argument '{argumentSection.Path}' is assigned different value " + - "types in more than one configuration source. Ensure all configurations consistently " + - "use either a scalar (int, string, boolean) or a complex (array, section, list, " + - "POCO, etc.) type for this argument value."); - - if (argumentSection.Value != null) - { - argumentValue = new StringArgumentValue(argumentSection.Value); - } - else - { - argumentValue = new ObjectArgumentValue(argumentSection, configurationAssemblies); - } - - return argumentValue; - } - static IReadOnlyCollection LoadConfigurationAssemblies(IConfiguration section, AssemblyFinder assemblyFinder) { var serilogAssembly = typeof(ILogger).Assembly; @@ -404,7 +379,7 @@ This is most likely because the application is published as single-file. return assemblies; } - void CallConfigurationMethods(ILookup> methods, IReadOnlyCollection configurationMethods, object receiver) + void CallConfigurationMethods(ILookup> methods, IReadOnlyCollection configurationMethods, object receiver) { foreach (var method in methods.SelectMany(g => g.Select(x => new { g.Key, Value = x }))) { diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs deleted file mode 100644 index 8a1e86f..0000000 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Serilog.Settings.Configuration; - -interface IConfigurationArgumentValue -{ - object? ConvertTo(Type toType, ResolutionContext resolutionContext); -} diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs index a180927..af6df52 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs @@ -4,10 +4,11 @@ using Microsoft.Extensions.Configuration; using Serilog.Configuration; +using Serilog.Debugging; namespace Serilog.Settings.Configuration; -class ObjectArgumentValue : IConfigurationArgumentValue +class ObjectArgumentValue : ConfigurationArgumentValue { readonly IConfigurationSection _section; readonly IReadOnlyCollection _configurationAssemblies; @@ -20,7 +21,7 @@ public ObjectArgumentValue(IConfigurationSection section, IReadOnlyCollection logger/sink config parameter? var typeInfo = toType.GetTypeInfo(); if (typeInfo.IsGenericType && - typeInfo.GetGenericTypeDefinition() is Type genericType && genericType == typeof(Action<>)) + typeInfo.GetGenericTypeDefinition() is {} genericType && genericType == typeof(Action<>)) { var configType = typeInfo.GenericTypeArguments[0]; IConfigurationReader configReader = new ConfigurationReader(_section, _configurationAssemblies, resolutionContext); @@ -64,9 +65,9 @@ object CreateArray() var arrayElementType = toType.GetElementType()!; var configurationElements = _section.GetChildren().ToArray(); var array = Array.CreateInstance(arrayElementType, configurationElements.Length); - for (int i = 0; i < configurationElements.Length; ++i) + for (var i = 0; i < configurationElements.Length; ++i) { - var argumentValue = ConfigurationReader.GetArgumentValue(configurationElements[i], _configurationAssemblies); + var argumentValue = FromSection(configurationElements[i], _configurationAssemblies); var value = argumentValue.ConvertTo(arrayElementType, resolutionContext); array.SetValue(value, i); } @@ -84,29 +85,28 @@ bool TryCreateContainer([NotNullWhen(true)] out object? result) foreach (var section in _section.GetChildren()) { - var argumentValue = ConfigurationReader.GetArgumentValue(section, _configurationAssemblies); + var argumentValue = FromSection(section, _configurationAssemblies); var key = new StringArgumentValue(section.Key).ConvertTo(keyType, resolutionContext); var value = argumentValue.ConvertTo(valueType, resolutionContext); - addMethod.Invoke(result, new[] { key, value }); + addMethod.Invoke(result, [key, value]); } return true; } - else if (IsConstructableContainer(toType, elementType, out concreteType, out addMethod)) + + if (IsConstructableContainer(toType, elementType, out concreteType, out addMethod)) { result = Activator.CreateInstance(concreteType) ?? throw new InvalidOperationException($"Activator.CreateInstance returned null for {concreteType}"); foreach (var section in _section.GetChildren()) { - var argumentValue = ConfigurationReader.GetArgumentValue(section, _configurationAssemblies); + var argumentValue = FromSection(section, _configurationAssemblies); var value = argumentValue.ConvertTo(elementType, resolutionContext); addMethod.Invoke(result, new[] { value }); } return true; } - else - { - return false; - } + + return false; } } @@ -153,58 +153,84 @@ bool TryCallCtorImplicit( bool TryCallCtor(Type type, Dictionary suppliedArguments, ResolutionContext resolutionContext, [NotNullWhen(true)] out object? value) { - value = null; + var binding = type.GetConstructors() + .Select(ci => + { + var args = new List(); + var matches = 0; + var stringMatches = 0; + var suppliedNames = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var p in ci.GetParameters()) + { + if (suppliedArguments.TryGetValue(p.Name ?? "", out var argValue)) + { + args.Add(argValue); + matches += 1; + + if (p.ParameterType == typeof(string)) + { + stringMatches += 1; + } + + if (p.Name != null) + { + suppliedNames.Add(p.Name); + } + } + else + { + if (p.HasDefaultValue) + { + args.Add(p.DefaultValue); + } + else + { + return new { ci, args, isCallable = false, matches, stringMatches, suppliedNames }; + } + } + } - if (suppliedArguments.Count == 0 && - type.GetConstructor(Type.EmptyTypes) is ConstructorInfo parameterlessCtor) + return new { ci, args, isCallable = true, matches, stringMatches, suppliedNames }; + }) + .Where(binding => binding.isCallable) + .OrderByDescending(binding => binding.matches) + .ThenByDescending(binding => binding.stringMatches) + .ThenBy(binding => binding.args.Count) + .FirstOrDefault(); + + if (binding == null) { - value = parameterlessCtor.Invoke([]); - return true; + value = null; + return false; } - var ctor = - (from c in type.GetConstructors() - from p in c.GetParameters() - let argumentBindResult = suppliedArguments.TryGetValue(p.Name ?? "", out var argValue) switch - { - true => new { success = true, hasMatch = true, value = (object?)argValue }, - false => p.HasDefaultValue switch - { - true => new { success = true, hasMatch = false, value = (object?)p.DefaultValue }, - false => new { success = false, hasMatch = false, value = (object?)null }, - }, - } - group new { argumentBindResult, p.ParameterType } by c into gr - where gr.All(z => z.argumentBindResult.success) - let matchedArgs = gr.Where(z => z.argumentBindResult.hasMatch).ToList() - orderby matchedArgs.Count descending, - matchedArgs.Count(p => p.ParameterType == typeof(string)) descending - select new - { - ConstructorInfo = gr.Key, - ArgumentValues = gr.Select(z => new { Value = z.argumentBindResult.value, Type = z.ParameterType }) - .ToList() - }).FirstOrDefault(); - - if (ctor is null) + for (var i = 0; i < binding.ci.GetParameters().Length; ++i) { - return false; + if (binding.args[i] is IConfigurationSection section) + { + var argumentValue = FromSection(section, _configurationAssemblies); + binding.args[i] = argumentValue.ConvertTo(binding.ci.GetParameters()[i].ParameterType, resolutionContext); + } } - var ctorArguments = new object?[ctor.ArgumentValues.Count]; - for (var i = 0; i < ctor.ArgumentValues.Count; i++) + value = binding.ci.Invoke(binding.args.ToArray()); + + foreach (var pi in type.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { - var argument = ctor.ArgumentValues[i]; - var valueValue = argument.Value; - if (valueValue is IConfigurationSection s) + if (!binding.suppliedNames.Contains(pi.Name) && suppliedArguments.TryGetValue(pi.Name, out var section) && pi.CanWrite) { - var argumentValue = ConfigurationReader.GetArgumentValue(s, _configurationAssemblies); - valueValue = argumentValue.ConvertTo(argument.Type, resolutionContext); + var propertyValue = FromSection(section, _configurationAssemblies); + try + { + pi.SetValue(value, propertyValue.ConvertTo(pi.PropertyType, resolutionContext)); + } + catch (Exception ex) + { + SelfLog.WriteLine($"Serilog.Settings.Configuration: Property setter on {type} failed: {ex}"); + } } - ctorArguments[i] = valueValue; } - value = ctor.ConstructorInfo.Invoke(ctorArguments); return true; } @@ -262,7 +288,7 @@ static bool IsConstructableDictionary(Type type, Type elementType, [NotNullWhen( } foreach (var method in concreteType.GetMethods()) { - if (!method.IsStatic && method.Name == "Add") + if (method is { IsStatic: false, Name: "Add" }) { var parameters = method.GetParameters(); if (parameters.Length == 2 && parameters[0].ParameterType == keyType && parameters[1].ParameterType == valueType) @@ -301,7 +327,7 @@ static bool IsConstructableContainer(Type type, Type elementType, [NotNullWhen(t } foreach (var method in concreteType.GetMethods()) { - if (!method.IsStatic && method.Name == "Add") + if (method is { IsStatic: false, Name: "Add" }) { var parameters = method.GetParameters(); if (parameters.Length == 1 && parameters[0].ParameterType == elementType) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs index 2ba8dcc..15a4a44 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs @@ -6,7 +6,7 @@ namespace Serilog.Settings.Configuration; -class StringArgumentValue : IConfigurationArgumentValue +class StringArgumentValue : ConfigurationArgumentValue { readonly string _providedValue; @@ -24,7 +24,7 @@ public StringArgumentValue(string providedValue) { typeof(Type), s => Type.GetType(s, throwOnError:true)! }, }; - public object? ConvertTo(Type toType, ResolutionContext resolutionContext) + public override object? ConvertTo(Type toType, ResolutionContext resolutionContext) { var argumentValue = Environment.ExpandEnvironmentVariables(_providedValue); diff --git a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs index f5f6e35..b7f3791 100644 --- a/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/ObjectArgumentValueTests.cs @@ -3,6 +3,8 @@ using Microsoft.Extensions.Configuration; using Serilog.Configuration; using Serilog.Events; +using Serilog.Formatting; +using Serilog.Formatting.Display; using Serilog.Settings.Configuration.Tests.Support; using TestDummies; using TestDummies.Console; @@ -1162,10 +1164,10 @@ public void ConvertsToPrimitives(Type type, object expected, string sectionValue // language=json var json = $$""" { - "Serilog": {{sectionValue}} + "value": {{sectionValue}} } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "value"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(type, new()); @@ -1181,10 +1183,10 @@ public void ConvertsToNullablePrimitive() // language=json const string json = """ { - "Serilog": 123 + "value": 123 } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "value"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(int?), new()); @@ -1199,10 +1201,10 @@ public void ConvertsToNullWhenEmptyNullable() // language=json const string json = """ { - "Serilog": null + "value": null } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "value"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(int?), new()); @@ -1216,10 +1218,10 @@ public void ConvertsToPlainClass() // language=json const string json = """ { - "Serilog": { "foo" : "bar" } + "value": { "foo" : "bar" } } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "value"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(TestDummies.DummyLoggerConfigurationExtensions.Binding), new()); @@ -1241,10 +1243,10 @@ public void ConvertsToPlainStruct() // language=json const string json = """ { - "Serilog": { "A" : "1" } + "value": { "A" : "1" } } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "value"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(PlainStruct), new()); @@ -1263,14 +1265,49 @@ public void ConvertsToNullWhenStructIsNull() // language=json const string json = """ { - "Serilog": null + "value": null } """; - var section = JsonStringConfigSource.LoadSection(json, "Serilog"); + var section = JsonStringConfigSource.LoadSection(json, "value"); var value = new ObjectArgumentValue(section, []); var actual = value.ConvertTo(typeof(PlainStruct), new()); Assert.Null(actual); } + + // This is intended to mirror Serilog.Sinks.Email's options type. + // https://github.com/serilog/serilog-settings-configuration/issues/417 + public class NestedComplexType + { + public string? Host { get; set; } + public ITextFormatter? Subject { get; set; } + } + + [Fact] + public void ConstructsNestedComplexObjects() + { + // language=json + const string json = """ + { + "options": { + "subject": { + "type": "Serilog.Formatting.Display.MessageTemplateTextFormatter, Serilog", + "outputTemplate": "Serilog test" + }, + "host": "localhost" + } + } + """; + + var section = JsonStringConfigSource.LoadSection(json, "options"); + var value = new ObjectArgumentValue(section, []); + + var actual = AssertConvertsToType(value); + Assert.Equal("localhost", actual.Host); + var formatter = Assert.IsType(actual.Subject); + var sw = new StringWriter(); + formatter.Format(Some.LogEvent(), sw); + Assert.Equal("Serilog test", sw.ToString()); + } } From df8c383ed17305470b8604b28cb5306bb00a6a9b Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 3 Aug 2024 11:32:36 +1000 Subject: [PATCH 13/23] Make property set logic robust to irregular properties --- .../Settings/Configuration/ObjectArgumentValue.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs index af6df52..be6e57e 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs @@ -185,12 +185,14 @@ bool TryCallCtor(Type type, Dictionary suppliedAr } else { - return new { ci, args, isCallable = false, matches, stringMatches, suppliedNames }; + return new { ci, args, isCallable = false, matches, stringMatches, + usedArguments = suppliedNames }; } } } - return new { ci, args, isCallable = true, matches, stringMatches, suppliedNames }; + return new { ci, args, isCallable = true, matches, stringMatches, + usedArguments = suppliedNames }; }) .Where(binding => binding.isCallable) .OrderByDescending(binding => binding.matches) @@ -217,7 +219,11 @@ bool TryCallCtor(Type type, Dictionary suppliedAr foreach (var pi in type.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { - if (!binding.suppliedNames.Contains(pi.Name) && suppliedArguments.TryGetValue(pi.Name, out var section) && pi.CanWrite) + if (!binding.usedArguments.Contains(pi.Name) && + suppliedArguments.TryGetValue(pi.Name, out var section) + && pi.CanWrite && + // This avoids trying to call esoteric indexers and so on. + pi.GetSetMethod(false)?.GetParameters().Length == 1) { var propertyValue = FromSection(section, _configurationAssemblies); try From 47f447a1e78a44ebcae6b0596d9c3bc58b84dee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Luthi?= Date: Tue, 6 Aug 2024 14:12:02 +0200 Subject: [PATCH 14/23] Make string to enum conversion case insensitive All other enum parsing performed in the ConfigurationReader is also case insensitive. Fixes #431 --- .../Settings/Configuration/StringArgumentValue.cs | 2 +- .../StringArgumentValueTests.cs | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs index 2ba8dcc..15e3fec 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs @@ -51,7 +51,7 @@ public StringArgumentValue(string providedValue) } if (toTypeInfo.IsEnum) - return Enum.Parse(toType, argumentValue); + return Enum.Parse(toType, argumentValue, ignoreCase: true); var convertor = ExtendedTypeConversions .Where(t => t.Key.GetTypeInfo().IsAssignableFrom(toTypeInfo)) diff --git a/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs b/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs index 3a312ba..be172cd 100644 --- a/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs @@ -222,10 +222,12 @@ public void ReferencingUndeclaredLevelSwitchThrows() Assert.Contains("\"LevelSwitches\":{\"$mySwitch\":", ex.Message); } - [Fact] - public void StringValuesConvertToEnumByName() + [Theory] + [InlineData("Information")] + [InlineData("information")] + public void StringValuesConvertToEnumByName(string level) { - var value = new StringArgumentValue(nameof(LogEventLevel.Information)); + var value = new StringArgumentValue(level); var actual = value.ConvertTo(typeof(LogEventLevel), new()); From 53f5717725e6033502f85b4b24df6ad4f1446aeb Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Tue, 8 Oct 2024 09:45:17 +1000 Subject: [PATCH 15/23] Dev version bump [skip ci] --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 808b065..08e259c 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -3,7 +3,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - 8.0.2 + 8.0.3 Serilog Contributors From 77fcc2a0e8b2cf67ac49cc7b293035e9aadfa342 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Tue, 8 Oct 2024 12:47:52 +1000 Subject: [PATCH 16/23] Dev version bump [skip ci] --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 08e259c..85f9a96 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -3,7 +3,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - 8.0.3 + 8.0.4 Serilog Contributors From b0db34c66a77c9b9b68b528016b644619fa7f2d1 Mon Sep 17 00:00:00 2001 From: Richard Webb Date: Wed, 9 Oct 2024 11:59:48 +0100 Subject: [PATCH 17/23] Update Microsoft.Extensions.DependencyModel to 8.0.2 --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 85f9a96..1566444 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -38,6 +38,6 @@ - + From d60efa0cb5dd06ed2e268084f509bdd5a4e5b001 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 10 Oct 2024 10:03:38 +1000 Subject: [PATCH 18/23] Dev version bump [skip ci] --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 1566444..d3a5ca9 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -3,7 +3,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - 8.0.4 + 8.0.5 Serilog Contributors From dcadb8a82b8126d9b9d9e0e5af2baf1ac04a6a94 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Fri, 22 Nov 2024 18:24:54 +1000 Subject: [PATCH 19/23] Update to .NET 9 SDK and Microsoft.Extensions.Configuration 9.0.0 --- .github/workflows/ci.yml | 41 +++++++++ .gitignore | 2 + Build.ps1 | 91 ++++++++++++++----- Directory.Build.props | 18 +++- Directory.Version.props | 6 ++ appveyor.yml | 52 ----------- global.json | 2 +- sample/Sample/Sample.csproj | 17 ++-- serilog-settings-configuration.sln | 10 +- .../Serilog.Settings.Configuration.csproj | 20 ++-- ...erilog.Settings.Configuration.Tests.csproj | 21 +++-- test/TestApp/TestApp.csproj | 10 +- .../DummyLoggerConfigurationExtensions.cs | 7 +- test/TestDummies/TestDummies.csproj | 5 +- 14 files changed, 179 insertions(+), 123 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 Directory.Version.props delete mode 100644 appveyor.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..acd3bc6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +# If this file is renamed, the incrementing run attempt number will be reset. + +name: CI + +on: + push: + branches: [ "dev", "main" ] + pull_request: + branches: [ "dev", "main" ] + +env: + CI_BUILD_NUMBER_BASE: ${{ github.run_number }} + CI_TARGET_BRANCH: ${{ github.head_ref || github.ref_name }} + +jobs: + build: + + # The build must run on Windows so that .NET Framework targets can be built and tested. + runs-on: windows-latest + + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + - name: Setup + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + - name: Compute build number + shell: bash + run: | + echo "CI_BUILD_NUMBER=$(($CI_BUILD_NUMBER_BASE+2300))" >> $GITHUB_ENV + - name: Build and Publish + env: + DOTNET_CLI_TELEMETRY_OPTOUT: true + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: pwsh + run: | + ./Build.ps1 diff --git a/.gitignore b/.gitignore index c90bd95..29c6d4c 100644 --- a/.gitignore +++ b/.gitignore @@ -201,3 +201,5 @@ FakesAssemblies/ project.lock.json artifacts/ + +.DS_Store diff --git a/Build.ps1 b/Build.ps1 index 1513382..e798284 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -1,38 +1,79 @@ +Write-Output "build: Tool versions follow" + +dotnet --version +dotnet --list-sdks + Write-Output "build: Build started" Push-Location $PSScriptRoot +try { + if(Test-Path .\artifacts) { + Write-Output "build: Cleaning ./artifacts" + Remove-Item ./artifacts -Force -Recurse + } -if(Test-Path .\artifacts) { - Write-Output "build: Cleaning .\artifacts" - Remove-Item .\artifacts -Force -Recurse -} + & dotnet restore --no-cache -$branch = @{ $true = $env:APPVEYOR_REPO_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$env:APPVEYOR_REPO_BRANCH -ne $NULL]; -$revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:APPVEYOR_BUILD_NUMBER, 10); $false = "local" }[$env:APPVEYOR_BUILD_NUMBER -ne $NULL]; -$suffix = @{ $true = ""; $false = "$($branch.Substring(0, [math]::Min(10,$branch.Length)))-$revision"}[$branch -eq "main" -and $revision -ne "local"] -$commitHash = $(git rev-parse --short HEAD) -$buildSuffix = @{ $true = "$($suffix)-$($commitHash)"; $false = "$($branch)-$($commitHash)" }[$suffix -ne ""] + $dbp = [Xml] (Get-Content .\Directory.Version.props) + $versionPrefix = $dbp.Project.PropertyGroup.VersionPrefix -Write-Output "build: Package version suffix is $suffix" -Write-Output "build: Build version suffix is $buildSuffix" + Write-Output "build: Package version prefix is $versionPrefix" -& dotnet build --configuration Release --version-suffix=$buildSuffix /p:ContinuousIntegrationBuild=true + $branch = @{ $true = $env:CI_TARGET_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$NULL -ne $env:CI_TARGET_BRANCH]; + $revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:CI_BUILD_NUMBER, 10); $false = "local" }[$NULL -ne $env:CI_BUILD_NUMBER]; + $suffix = @{ $true = ""; $false = "$($branch.Substring(0, [math]::Min(10,$branch.Length)) -replace '([^a-zA-Z0-9\-]*)', '')-$revision"}[$branch -eq "main" -and $revision -ne "local"] + $commitHash = $(git rev-parse --short HEAD) + $buildSuffix = @{ $true = "$($suffix)-$($commitHash)"; $false = "$($branch)-$($commitHash)" }[$suffix -ne ""] -if($LASTEXITCODE -ne 0) { throw 'build failed' } + Write-Output "build: Package version suffix is $suffix" + Write-Output "build: Build version suffix is $buildSuffix" -if($suffix) { - & dotnet pack src\Serilog.Settings.Configuration --configuration Release --no-build --no-restore -o artifacts --version-suffix=$suffix -} else { - & dotnet pack src\Serilog.Settings.Configuration --configuration Release --no-build --no-restore -o artifacts -} + & dotnet build -c Release --version-suffix=$buildSuffix /p:ContinuousIntegrationBuild=true + if($LASTEXITCODE -ne 0) { throw "Build failed" } + + foreach ($src in Get-ChildItem src/*) { + Push-Location $src + + Write-Output "build: Packaging project in $src" + + if ($suffix) { + & dotnet pack -c Release --no-build --no-restore -o ../../artifacts --version-suffix=$suffix + } else { + & dotnet pack -c Release --no-build --no-restore -o ../../artifacts + } + if($LASTEXITCODE -ne 0) { throw "Packaging failed" } -if($LASTEXITCODE -ne 0) { throw 'pack failed' } + Pop-Location + } -Write-Output "build: Testing" + foreach ($test in Get-ChildItem test/*.Tests) { + Push-Location $test -# Dotnet test doesn't run separate TargetFrameworks in parallel: https://github.com/dotnet/sdk/issues/19147 -# Workaround: use `dotnet test` on dlls directly in order to pass the `--parallel` option to vstest. -# The _reported_ runtime is wrong but the _actual_ used runtime is correct, see https://github.com/microsoft/vstest/issues/2037#issuecomment-720549173 -& dotnet test test\Serilog.Settings.Configuration.Tests\bin\Release\*\Serilog.Settings.Configuration.Tests.dll --parallel + Write-Output "build: Testing project in $test" -if($LASTEXITCODE -ne 0) { throw 'unit tests failed' } \ No newline at end of file + & dotnet test -c Release --no-build --no-restore + if($LASTEXITCODE -ne 0) { throw "Testing failed" } + + Pop-Location + } + + if ($env:NUGET_API_KEY) { + # GitHub Actions will only supply this to branch builds and not PRs. We publish + # builds from any branch this action targets (i.e. main and dev). + + Write-Output "build: Publishing NuGet packages" + + foreach ($nupkg in Get-ChildItem artifacts/*.nupkg) { + & dotnet nuget push -k $env:NUGET_API_KEY -s https://api.nuget.org/v3/index.json "$nupkg" + if($LASTEXITCODE -ne 0) { throw "Publishing failed" } + } + + if (!($suffix)) { + Write-Output "build: Creating release for version $versionPrefix" + + iex "gh release create v$versionPrefix --title v$versionPrefix --generate-notes $(get-item ./artifacts/*.nupkg) $(get-item ./artifacts/*.snupkg)" + } + } +} finally { + Pop-Location +} diff --git a/Directory.Build.props b/Directory.Build.props index 736814b..c114992 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,11 +1,25 @@ + + latest True - true + + true $(MSBuildThisFileDirectory)assets/Serilog.snk - enable false enable + enable + true + true + true + true + snupkg + + + + + diff --git a/Directory.Version.props b/Directory.Version.props new file mode 100644 index 0000000..8c3cc16 --- /dev/null +++ b/Directory.Version.props @@ -0,0 +1,6 @@ + + + + 9.0.0 + + diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index eb9d04e..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,52 +0,0 @@ -version: '{build}' - -skip_tags: true - -image: - - Visual Studio 2022 - - Ubuntu - - macOS - -build_script: -- pwsh: | - if ($isWindows) { - Invoke-WebRequest "https://dot.net/v1/dotnet-install.ps1" -OutFile "./dotnet-install.ps1" - ./dotnet-install.ps1 -JSonFile global.json -Architecture x64 -InstallDir 'C:\Program Files\dotnet' - ./Build.ps1 - } - if ($isLinux) { - Invoke-WebRequest "https://dot.net/v1/dotnet-install.sh" -OutFile "./dotnet-install.sh" - sudo chmod u+x dotnet-install.sh - sudo ./dotnet-install.sh --jsonfile global.json --architecture x64 --install-dir '/usr/share/dotnet' - ./Build.ps1 - } - if ($isMacOS) { - Invoke-WebRequest "https://dot.net/v1/dotnet-install.sh" -OutFile "./dotnet-install.sh" - sudo chmod u+x dotnet-install.sh - sudo ./dotnet-install.sh --jsonfile global.json --architecture x64 --install-dir '/usr/local/share/dotnet' - ./Build.ps1 - } - -test: off - -artifacts: -- path: artifacts/Serilog.*.nupkg -- path: artifacts/Serilog.*.snupkg - -deploy: -- provider: NuGet - api_key: - secure: JIfNMRv3l/2dmM/i//mpeEKqgxyEcnGr8XFlEoSDgp2JDVmRP8nUxc4gYznBvXQV - on: - branch: /^(main|dev)$/ - OS: Windows_NT -- provider: GitHub - auth_token: - secure: p4LpVhBKxGS5WqucHxFQ5c7C8cP74kbNB0Z8k9Oxx/PMaDQ1+ibmoexNqVU5ZlmX - artifacts: - /Serilog.*\.nupkg/ - /Serilog.*\.snupkg/ - tag: v$(appveyor_build_version) - on: - branch: main - OS: Windows_NT diff --git a/global.json b/global.json index b7e3357..db8627a 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.100", + "version": "9.0.100", "allowPrerelease": false, "rollForward": "latestFeature" } diff --git a/sample/Sample/Sample.csproj b/sample/Sample/Sample.csproj index ce3fee4..1c8a2a7 100644 --- a/sample/Sample/Sample.csproj +++ b/sample/Sample/Sample.csproj @@ -1,8 +1,9 @@  - net462;net6.0;net7.0;net8.0 + net462;net8.0;net9.0 Exe + false @@ -14,15 +15,15 @@ - - - - - + + + + + - + - + diff --git a/serilog-settings-configuration.sln b/serilog-settings-configuration.sln index f0209fd..4e06158 100644 --- a/serilog-settings-configuration.sln +++ b/serilog-settings-configuration.sln @@ -9,7 +9,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "assets", "assets", "{62D0B9 ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig .gitignore = .gitignore - appveyor.yml = appveyor.yml Build.ps1 = Build.ps1 CHANGES.md = CHANGES.md Directory.Build.props = Directory.Build.props @@ -18,6 +17,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "assets", "assets", "{62D0B9 README.md = README.md serilog-settings-configuration.sln.DotSettings = serilog-settings-configuration.sln.DotSettings global.json = global.json + Directory.Version.props = Directory.Version.props EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{D551DCB0-7771-4D01-BEBD-F7B57D1CF0E3}" @@ -34,6 +34,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDummies", "test\TestDum EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "test\TestApp\TestApp.csproj", "{1B6E08F3-16C9-4912-BEEE-57DB78C92A12}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{21A409AD-2C11-41A8-88C8-360062EA8E48}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{391B84C5-A7BA-4BE1-95A0-E459FA61D971}" + ProjectSection(SolutionItems) = preProject + .github\workflows\ci.yml = .github\workflows\ci.yml + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -68,6 +75,7 @@ Global {A00E5E32-54F9-401A-BBA1-2F6FCB6366CD} = {D24872B9-57F3-42A7-BC8D-F9DA222FCE1B} {B7CF5068-DD19-4868-A268-5280BDE90361} = {D551DCB0-7771-4D01-BEBD-F7B57D1CF0E3} {1B6E08F3-16C9-4912-BEEE-57DB78C92A12} = {D551DCB0-7771-4D01-BEBD-F7B57D1CF0E3} + {391B84C5-A7BA-4BE1-95A0-E459FA61D971} = {21A409AD-2C11-41A8-88C8-360062EA8E48} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {485F8843-42D7-4267-B5FB-20FE9181DEE9} diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index d3a5ca9..0b8d72a 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -2,25 +2,18 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - - 8.0.5 Serilog Contributors - - net462;netstandard2.0;net6.0;net7.0;net8.0 + net462;netstandard2.0;net8.0;net9.0 true - Serilog.Settings.Configuration - serilog;json + serilog;json;appsettings icon.png README.md Apache-2.0 https://github.com/serilog/serilog-settings-configuration $(PackageProjectUrl)/releases Serilog - true - true - true - snupkg @@ -28,16 +21,15 @@ - - + - - + + diff --git a/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj b/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj index 37df7b5..d3ac6cc 100644 --- a/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj +++ b/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj @@ -2,8 +2,9 @@ net48 - $(TargetFrameworks);net6.0;net7.0;net8.0 + $(TargetFrameworks);net8.0;net9.0 false + false @@ -18,17 +19,17 @@ - - - - - - + + + + + + - - + + - + diff --git a/test/TestApp/TestApp.csproj b/test/TestApp/TestApp.csproj index b814a4d..05e2119 100644 --- a/test/TestApp/TestApp.csproj +++ b/test/TestApp/TestApp.csproj @@ -10,6 +10,7 @@ none true true + false @@ -22,9 +23,12 @@ - - - + + + + + + diff --git a/test/TestDummies/DummyLoggerConfigurationExtensions.cs b/test/TestDummies/DummyLoggerConfigurationExtensions.cs index ea87024..d7118f6 100644 --- a/test/TestDummies/DummyLoggerConfigurationExtensions.cs +++ b/test/TestDummies/DummyLoggerConfigurationExtensions.cs @@ -133,12 +133,9 @@ public static LoggerConfiguration Dummy( this LoggerSinkConfiguration loggerSinkConfiguration, Action wrappedSinkAction) { - return LoggerSinkConfiguration.Wrap( - loggerSinkConfiguration, + return loggerSinkConfiguration.Sink(LoggerSinkConfiguration.Wrap( s => new DummyWrappingSink(s), - wrappedSinkAction, - LogEventLevel.Verbose, - levelSwitch: null); + wrappedSinkAction)); } public static LoggerConfiguration WithDummyHardCodedString( diff --git a/test/TestDummies/TestDummies.csproj b/test/TestDummies/TestDummies.csproj index c5be233..25a7376 100644 --- a/test/TestDummies/TestDummies.csproj +++ b/test/TestDummies/TestDummies.csproj @@ -2,15 +2,16 @@ netstandard2.0;net462 + false - + - + From 407e54dbb1a4359394d4e388065f277383fdab81 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Fri, 22 Nov 2024 18:29:22 +1000 Subject: [PATCH 20/23] README build badge update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2eb4531..17d3910 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Serilog.Settings.Configuration [![Build status](https://ci.appveyor.com/api/projects/status/r2bgfimd9ocr61px/branch/master?svg=true)](https://ci.appveyor.com/project/serilog/serilog-settings-configuration/branch/master) [![NuGet Version](http://img.shields.io/nuget/v/Serilog.Settings.Configuration.svg?style=flat)](https://www.nuget.org/packages/Serilog.Settings.Configuration/) +# Serilog.Settings.Configuration [![Build status](https://github.com/serilog/serilog-settings-configuration/actions/workflows/ci.yml/badge.svg?branch=dev)](https://github.com/serilog/serilog-settings-configuration/actions) [![NuGet Version](http://img.shields.io/nuget/v/Serilog.Settings.Configuration.svg?style=flat)](https://www.nuget.org/packages/Serilog.Settings.Configuration/) A Serilog settings provider that reads from [Microsoft.Extensions.Configuration](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1) sources, including .NET Core's `appsettings.json` file. @@ -349,7 +349,7 @@ public record MyDto(int Id, int Name); public class FirstDestructuringPolicy : IDestructuringPolicy { - public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, + public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, [NotNullWhen(true)] out LogEventPropertyValue? result) { if (value is not MyDto dto) From 2ffe4f43e56d6b0f44ada696135e5ce05fe7e7bc Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sun, 24 Nov 2024 06:47:27 +1000 Subject: [PATCH 21/23] Try to get TestApp running happily in the new build configuration --- test/TestApp-net8.0/.gitignore | 2 + test/TestApp-net8.0/Program.cs | 70 ++++++++++++++++++ ...nfiguration.0.0.0-IntegrationTest.0.snupkg | Bin 0 -> 95141 bytes test/TestApp-net8.0/TestApp.csproj | 37 +++++++++ test/TestApp-net8.0/nuget.config | 11 +++ test/TestApp/TestApp.csproj | 3 + 6 files changed, 123 insertions(+) create mode 100644 test/TestApp-net8.0/.gitignore create mode 100644 test/TestApp-net8.0/Program.cs create mode 100644 test/TestApp-net8.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg create mode 100644 test/TestApp-net8.0/TestApp.csproj create mode 100644 test/TestApp-net8.0/nuget.config diff --git a/test/TestApp-net8.0/.gitignore b/test/TestApp-net8.0/.gitignore new file mode 100644 index 0000000..1cc29f1 --- /dev/null +++ b/test/TestApp-net8.0/.gitignore @@ -0,0 +1,2 @@ +FodyWeavers.xml +FodyWeavers.xsd diff --git a/test/TestApp-net8.0/Program.cs b/test/TestApp-net8.0/Program.cs new file mode 100644 index 0000000..033b43d --- /dev/null +++ b/test/TestApp-net8.0/Program.cs @@ -0,0 +1,70 @@ +using System.Reflection; +using Microsoft.Extensions.Configuration; +using Serilog; +using Serilog.Debugging; +using Serilog.Settings.Configuration; + +if (args.Length == 1 && args[0] == "is-single-file") +{ + if (typeof(Program).Assembly.GetManifestResourceNames().Any(e => e.StartsWith("costura."))) + { + Console.WriteLine(true); + return 0; + } + // IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app +#pragma warning disable IL3000 + Console.WriteLine(string.IsNullOrEmpty(Assembly.GetEntryAssembly()?.Location)); +#pragma warning restore + return 0; +} + +SelfLog.Enable(Console.Error); + +Thread.CurrentThread.Name = "Main thread"; +const string outputTemplate = "({ThreadName}) [{Level}] {Message}{NewLine}"; + +var configurationValues = new Dictionary(); +var minimumLevelOnly = args.Contains("--minimum-level-only"); +if (minimumLevelOnly) +{ + configurationValues["Serilog:MinimumLevel"] = "Verbose"; +} +else +{ + configurationValues["Serilog:Enrich:0"] = "WithThreadName"; + configurationValues["Serilog:WriteTo:0:Name"] = "Console"; + configurationValues["Serilog:WriteTo:0:Args:outputTemplate"] = outputTemplate; +} + +if (args.Contains("--using-thread")) configurationValues["Serilog:Using:Thread"] = "Serilog.Enrichers.Thread"; +if (args.Contains("--using-console")) configurationValues["Serilog:Using:Console"] = "Serilog.Sinks.Console"; + +var assemblies = new List(); +if (args.Contains("--assembly-thread")) assemblies.Add(typeof(ThreadLoggerConfigurationExtensions).Assembly); +if (args.Contains("--assembly-console")) assemblies.Add(typeof(ConsoleLoggerConfigurationExtensions).Assembly); + +try +{ + var configuration = new ConfigurationBuilder().AddInMemoryCollection(configurationValues).Build(); + var options = assemblies.Count > 0 ? new ConfigurationReaderOptions(assemblies.ToArray()) : null; + var loggerConfiguration = new LoggerConfiguration().ReadFrom.Configuration(configuration, options); + if (minimumLevelOnly) + { + loggerConfiguration + .Enrich.WithThreadName() + .WriteTo.Console(outputTemplate: outputTemplate); + } + var logger = loggerConfiguration.CreateLogger(); + logger.Information("Expected success"); + return 0; +} +catch (InvalidOperationException exception) when (exception.Message.StartsWith("No Serilog:Using configuration section is defined and no Serilog assemblies were found.")) +{ + Console.WriteLine("Expected exception"); + return 0; +} +catch (Exception exception) +{ + Console.Error.WriteLine(exception); + return 1; +} diff --git a/test/TestApp-net8.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg b/test/TestApp-net8.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg new file mode 100644 index 0000000000000000000000000000000000000000..deabba3a29d2ff1f9025e06a712dbaa05ce8494b GIT binary patch literal 95141 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 + + + Exe + net48 + embedded + false + false + false + none + true + true + false + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/TestApp-net8.0/nuget.config b/test/TestApp-net8.0/nuget.config new file mode 100644 index 0000000..cfec8fc --- /dev/null +++ b/test/TestApp-net8.0/nuget.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/test/TestApp/TestApp.csproj b/test/TestApp/TestApp.csproj index 05e2119..58a459a 100644 --- a/test/TestApp/TestApp.csproj +++ b/test/TestApp/TestApp.csproj @@ -26,6 +26,9 @@ + + + From f6a6e7fbb24949cfa8f770900b24127ecefca15c Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sun, 24 Nov 2024 06:49:12 +1000 Subject: [PATCH 22/23] Remove some temporaries --- test/TestApp-net8.0/.gitignore | 2 - test/TestApp-net8.0/Program.cs | 70 ------------------ ...nfiguration.0.0.0-IntegrationTest.0.snupkg | Bin 95141 -> 0 bytes test/TestApp-net8.0/TestApp.csproj | 37 --------- test/TestApp-net8.0/nuget.config | 11 --- 5 files changed, 120 deletions(-) delete mode 100644 test/TestApp-net8.0/.gitignore delete mode 100644 test/TestApp-net8.0/Program.cs delete mode 100644 test/TestApp-net8.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg delete mode 100644 test/TestApp-net8.0/TestApp.csproj delete mode 100644 test/TestApp-net8.0/nuget.config diff --git a/test/TestApp-net8.0/.gitignore b/test/TestApp-net8.0/.gitignore deleted file mode 100644 index 1cc29f1..0000000 --- a/test/TestApp-net8.0/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -FodyWeavers.xml -FodyWeavers.xsd diff --git a/test/TestApp-net8.0/Program.cs b/test/TestApp-net8.0/Program.cs deleted file mode 100644 index 033b43d..0000000 --- a/test/TestApp-net8.0/Program.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.Reflection; -using Microsoft.Extensions.Configuration; -using Serilog; -using Serilog.Debugging; -using Serilog.Settings.Configuration; - -if (args.Length == 1 && args[0] == "is-single-file") -{ - if (typeof(Program).Assembly.GetManifestResourceNames().Any(e => e.StartsWith("costura."))) - { - Console.WriteLine(true); - return 0; - } - // IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app -#pragma warning disable IL3000 - Console.WriteLine(string.IsNullOrEmpty(Assembly.GetEntryAssembly()?.Location)); -#pragma warning restore - return 0; -} - -SelfLog.Enable(Console.Error); - -Thread.CurrentThread.Name = "Main thread"; -const string outputTemplate = "({ThreadName}) [{Level}] {Message}{NewLine}"; - -var configurationValues = new Dictionary(); -var minimumLevelOnly = args.Contains("--minimum-level-only"); -if (minimumLevelOnly) -{ - configurationValues["Serilog:MinimumLevel"] = "Verbose"; -} -else -{ - configurationValues["Serilog:Enrich:0"] = "WithThreadName"; - configurationValues["Serilog:WriteTo:0:Name"] = "Console"; - configurationValues["Serilog:WriteTo:0:Args:outputTemplate"] = outputTemplate; -} - -if (args.Contains("--using-thread")) configurationValues["Serilog:Using:Thread"] = "Serilog.Enrichers.Thread"; -if (args.Contains("--using-console")) configurationValues["Serilog:Using:Console"] = "Serilog.Sinks.Console"; - -var assemblies = new List(); -if (args.Contains("--assembly-thread")) assemblies.Add(typeof(ThreadLoggerConfigurationExtensions).Assembly); -if (args.Contains("--assembly-console")) assemblies.Add(typeof(ConsoleLoggerConfigurationExtensions).Assembly); - -try -{ - var configuration = new ConfigurationBuilder().AddInMemoryCollection(configurationValues).Build(); - var options = assemblies.Count > 0 ? new ConfigurationReaderOptions(assemblies.ToArray()) : null; - var loggerConfiguration = new LoggerConfiguration().ReadFrom.Configuration(configuration, options); - if (minimumLevelOnly) - { - loggerConfiguration - .Enrich.WithThreadName() - .WriteTo.Console(outputTemplate: outputTemplate); - } - var logger = loggerConfiguration.CreateLogger(); - logger.Information("Expected success"); - return 0; -} -catch (InvalidOperationException exception) when (exception.Message.StartsWith("No Serilog:Using configuration section is defined and no Serilog assemblies were found.")) -{ - Console.WriteLine("Expected exception"); - return 0; -} -catch (Exception exception) -{ - Console.Error.WriteLine(exception); - return 1; -} diff --git a/test/TestApp-net8.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg b/test/TestApp-net8.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg deleted file mode 100644 index deabba3a29d2ff1f9025e06a712dbaa05ce8494b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95141 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 - - - Exe - net48 - embedded - false - false - false - none - true - true - false - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestApp-net8.0/nuget.config b/test/TestApp-net8.0/nuget.config deleted file mode 100644 index cfec8fc..0000000 --- a/test/TestApp-net8.0/nuget.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - From bc92b240f080739006782b7368a118e50e8dd75b Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sun, 24 Nov 2024 06:56:51 +1000 Subject: [PATCH 23/23] Ignore obsolete/vulernable package warnings in the compilation test app --- test/TestApp-net9.0/.gitignore | 2 + test/TestApp-net9.0/Program.cs | 70 ++++++++++++++++++ ...nfiguration.0.0.0-IntegrationTest.0.snupkg | Bin 0 -> 95162 bytes test/TestApp-net9.0/TestApp.csproj | 33 +++++++++ test/TestApp-net9.0/nuget.config | 11 +++ test/TestApp/TestApp.csproj | 8 +- 6 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 test/TestApp-net9.0/.gitignore create mode 100644 test/TestApp-net9.0/Program.cs create mode 100644 test/TestApp-net9.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg create mode 100644 test/TestApp-net9.0/TestApp.csproj create mode 100644 test/TestApp-net9.0/nuget.config diff --git a/test/TestApp-net9.0/.gitignore b/test/TestApp-net9.0/.gitignore new file mode 100644 index 0000000..1cc29f1 --- /dev/null +++ b/test/TestApp-net9.0/.gitignore @@ -0,0 +1,2 @@ +FodyWeavers.xml +FodyWeavers.xsd diff --git a/test/TestApp-net9.0/Program.cs b/test/TestApp-net9.0/Program.cs new file mode 100644 index 0000000..033b43d --- /dev/null +++ b/test/TestApp-net9.0/Program.cs @@ -0,0 +1,70 @@ +using System.Reflection; +using Microsoft.Extensions.Configuration; +using Serilog; +using Serilog.Debugging; +using Serilog.Settings.Configuration; + +if (args.Length == 1 && args[0] == "is-single-file") +{ + if (typeof(Program).Assembly.GetManifestResourceNames().Any(e => e.StartsWith("costura."))) + { + Console.WriteLine(true); + return 0; + } + // IL3000: 'System.Reflection.Assembly.Location' always returns an empty string for assemblies embedded in a single-file app +#pragma warning disable IL3000 + Console.WriteLine(string.IsNullOrEmpty(Assembly.GetEntryAssembly()?.Location)); +#pragma warning restore + return 0; +} + +SelfLog.Enable(Console.Error); + +Thread.CurrentThread.Name = "Main thread"; +const string outputTemplate = "({ThreadName}) [{Level}] {Message}{NewLine}"; + +var configurationValues = new Dictionary(); +var minimumLevelOnly = args.Contains("--minimum-level-only"); +if (minimumLevelOnly) +{ + configurationValues["Serilog:MinimumLevel"] = "Verbose"; +} +else +{ + configurationValues["Serilog:Enrich:0"] = "WithThreadName"; + configurationValues["Serilog:WriteTo:0:Name"] = "Console"; + configurationValues["Serilog:WriteTo:0:Args:outputTemplate"] = outputTemplate; +} + +if (args.Contains("--using-thread")) configurationValues["Serilog:Using:Thread"] = "Serilog.Enrichers.Thread"; +if (args.Contains("--using-console")) configurationValues["Serilog:Using:Console"] = "Serilog.Sinks.Console"; + +var assemblies = new List(); +if (args.Contains("--assembly-thread")) assemblies.Add(typeof(ThreadLoggerConfigurationExtensions).Assembly); +if (args.Contains("--assembly-console")) assemblies.Add(typeof(ConsoleLoggerConfigurationExtensions).Assembly); + +try +{ + var configuration = new ConfigurationBuilder().AddInMemoryCollection(configurationValues).Build(); + var options = assemblies.Count > 0 ? new ConfigurationReaderOptions(assemblies.ToArray()) : null; + var loggerConfiguration = new LoggerConfiguration().ReadFrom.Configuration(configuration, options); + if (minimumLevelOnly) + { + loggerConfiguration + .Enrich.WithThreadName() + .WriteTo.Console(outputTemplate: outputTemplate); + } + var logger = loggerConfiguration.CreateLogger(); + logger.Information("Expected success"); + return 0; +} +catch (InvalidOperationException exception) when (exception.Message.StartsWith("No Serilog:Using configuration section is defined and no Serilog assemblies were found.")) +{ + Console.WriteLine("Expected exception"); + return 0; +} +catch (Exception exception) +{ + Console.Error.WriteLine(exception); + return 1; +} diff --git a/test/TestApp-net9.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg b/test/TestApp-net9.0/Serilog.Settings.Configuration.0.0.0-IntegrationTest.0.snupkg new file mode 100644 index 0000000000000000000000000000000000000000..bf7bdf1a196bec4eea9cb4a053c5fbd3780e7221 GIT binary patch literal 95162 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 OJ3r{R + + + Exe + net48 + embedded + false + false + false + none + true + true + false + + NU1902;NU1903 + + + + + + + + + + + + + + + + + + diff --git a/test/TestApp-net9.0/nuget.config b/test/TestApp-net9.0/nuget.config new file mode 100644 index 0000000..cfec8fc --- /dev/null +++ b/test/TestApp-net9.0/nuget.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/test/TestApp/TestApp.csproj b/test/TestApp/TestApp.csproj index 58a459a..585e706 100644 --- a/test/TestApp/TestApp.csproj +++ b/test/TestApp/TestApp.csproj @@ -11,6 +11,8 @@ true true false + + NU1902;NU1903 @@ -28,10 +30,4 @@ - - - - - -