diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index d503d041..72bd4edd 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -2,12 +2,6 @@ "version": 1, "isRoot": true, "tools": { - "dotnet-format": { - "version": "5.1.250801", - "commands": [ - "dotnet-format" - ] - }, "docfx": { "version": "2.78.5", "commands": [ @@ -15,4 +9,4 @@ ] } } -} \ No newline at end of file +} diff --git a/.editorconfig b/.editorconfig index 7160019d..13901627 100644 --- a/.editorconfig +++ b/.editorconfig @@ -48,6 +48,9 @@ csharp_style_expression_bodied_indexers = true csharp_style_expression_bodied_accessors = true csharp_style_throw_expression = true +# Remove unnecessary usings +dotnet_diagnostic.IDE0005.severity = warning + # Default severity for analyzer diagnostics with category 'Style' (escalated to build warnings) # dotnet_analyzer_diagnostic.category-Style.severity = suggestion diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index c7091153..2d8adda3 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -1,13 +1,11 @@ name: Claude Code Review on: - pull_request: + pull_request_target: types: [opened, synchronize] jobs: claude-review: - # Only run on PRs from branches in the same repository, not from forks - if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest permissions: contents: read diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 38de20ab..85deb7b6 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -18,10 +18,6 @@ jobs: (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) - ) && ( - github.event_name == 'issues' || - github.event_name == 'issue_comment' || - github.event.pull_request.head.repo.full_name == github.repository ) runs-on: ubuntu-latest permissions: diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c428df7..9f5c6319 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [Unreleased changes](https://github.com/natemcmaster/CommandLineUtils/compare/v5.0.1...main) + +### Features +* [@Chris-Wolfgang]: Add support for keyed dependency injection via `[FromKeyedServices]` attribute ([#560]) + +[#560]: https://github.com/natemcmaster/CommandLineUtils/pull/560 + ## [v5.0.1](https://github.com/natemcmaster/CommandLineUtils/compare/v5.0.0...v5.0.1) ### Features diff --git a/Directory.Build.props b/Directory.Build.props index aa9c9601..6f1eca18 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -43,7 +43,7 @@ - 5.0.1 + 5.1.0 beta true $(GITHUB_RUN_NUMBER) @@ -60,6 +60,10 @@ + + true + + diff --git a/build.ps1 b/build.ps1 index a0b26fc9..0f37d9df 100755 --- a/build.ps1 +++ b/build.ps1 @@ -24,11 +24,11 @@ exec dotnet tool restore [string[]] $formatArgs=@() if ($ci) { - $formatArgs += '--check' + $formatArgs += '--verify-no-changes' } -exec dotnet tool run dotnet-format -- -v detailed @formatArgs "$PSScriptRoot/CommandLineUtils.sln" -exec dotnet tool run dotnet-format -- -v detailed @formatArgs "$PSScriptRoot/docs/samples/samples.sln" +exec dotnet format -- @formatArgs "$PSScriptRoot/CommandLineUtils.sln" +exec dotnet format -- @formatArgs "$PSScriptRoot/docs/samples/samples.sln" exec dotnet build --configuration $Configuration '-warnaserror:CS1591' exec dotnet pack --no-build --configuration $Configuration -o $artifacts exec dotnet build --configuration $Configuration "$PSScriptRoot/docs/samples/samples.sln" diff --git a/docs/samples/Directory.Build.targets b/docs/samples/Directory.Build.targets index 70c60c59..5650d4c0 100644 --- a/docs/samples/Directory.Build.targets +++ b/docs/samples/Directory.Build.targets @@ -2,7 +2,7 @@ - + diff --git a/docs/samples/dependency-injection/custom/CustomServices.csproj b/docs/samples/dependency-injection/custom/CustomServices.csproj index 716e65c4..f82de1fd 100644 --- a/docs/samples/dependency-injection/custom/CustomServices.csproj +++ b/docs/samples/dependency-injection/custom/CustomServices.csproj @@ -7,7 +7,7 @@ - + diff --git a/docs/samples/dependency-injection/custom/Program.cs b/docs/samples/dependency-injection/custom/Program.cs index 5b2abde7..4537ebcd 100644 --- a/docs/samples/dependency-injection/custom/Program.cs +++ b/docs/samples/dependency-injection/custom/Program.cs @@ -1,4 +1,6 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using McMaster.Extensions.CommandLineUtils; using Microsoft.Extensions.DependencyInjection; diff --git a/docs/samples/dependency-injection/generic-host/GenericHostDI.csproj b/docs/samples/dependency-injection/generic-host/GenericHostDI.csproj index b8f92381..771d842d 100644 --- a/docs/samples/dependency-injection/generic-host/GenericHostDI.csproj +++ b/docs/samples/dependency-injection/generic-host/GenericHostDI.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/docs/samples/dependency-injection/generic-host/Program.cs b/docs/samples/dependency-injection/generic-host/Program.cs index ba194167..fda080be 100644 --- a/docs/samples/dependency-injection/generic-host/Program.cs +++ b/docs/samples/dependency-injection/generic-host/Program.cs @@ -1,8 +1,9 @@ -using System; -using System.Threading; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils; -using McMaster.Extensions.Hosting.CommandLine; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; diff --git a/docs/samples/dependency-injection/keyed/KeyedServices.csproj b/docs/samples/dependency-injection/keyed/KeyedServices.csproj new file mode 100644 index 00000000..2e90c51b --- /dev/null +++ b/docs/samples/dependency-injection/keyed/KeyedServices.csproj @@ -0,0 +1,13 @@ + + + + Exe + net8.0 + + + + + + + + diff --git a/docs/samples/dependency-injection/keyed/Program.cs b/docs/samples/dependency-injection/keyed/Program.cs new file mode 100644 index 00000000..61e97480 --- /dev/null +++ b/docs/samples/dependency-injection/keyed/Program.cs @@ -0,0 +1,58 @@ +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using McMaster.Extensions.CommandLineUtils; +using Microsoft.Extensions.DependencyInjection; + +namespace KeyedServices +{ + [Command(Name = "keyed-di", Description = "Keyed Dependency Injection sample project")] + [HelpOption] + class Program + { + public static int Main(string[] args) + { + var services = new ServiceCollection() + .AddKeyedSingleton("formal") + .AddKeyedSingleton("casual") + .AddSingleton(PhysicalConsole.Singleton) + .BuildServiceProvider(); + + var app = new CommandLineApplication(); + app.Conventions.UseDefaultConventions() + .UseConstructorInjection(services); + return app.Execute(args); + } + + [Option(Description = "The subject to greet")] + public string Subject { get; set; } = "world"; + + [Option(Description = "Use casual greeting")] + public bool Casual { get; set; } + + private int OnExecute( + [FromKeyedServices("formal")] IGreeter formalGreeter, + [FromKeyedServices("casual")] IGreeter casualGreeter, + IConsole console) + { + var greeter = Casual ? casualGreeter : formalGreeter; + console.WriteLine(greeter.Greet(Subject)); + return 0; + } + } + + interface IGreeter + { + string Greet(string subject); + } + + class FormalGreeter : IGreeter + { + public string Greet(string subject) => $"Good day, {subject}. How do you do?"; + } + + class CasualGreeter : IGreeter + { + public string Greet(string subject) => $"Hey {subject}!"; + } +} diff --git a/docs/samples/dependency-injection/standard/Program.cs b/docs/samples/dependency-injection/standard/Program.cs index c90a8d1e..5ea1ab2b 100644 --- a/docs/samples/dependency-injection/standard/Program.cs +++ b/docs/samples/dependency-injection/standard/Program.cs @@ -1,4 +1,6 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils; diff --git a/docs/samples/generic-host/AttributeApi/AttributeApi.csproj b/docs/samples/generic-host/AttributeApi/AttributeApi.csproj index 425b4a3a..23d3f3d2 100644 --- a/docs/samples/generic-host/AttributeApi/AttributeApi.csproj +++ b/docs/samples/generic-host/AttributeApi/AttributeApi.csproj @@ -6,7 +6,7 @@ - + diff --git a/docs/samples/generic-host/AttributeApi/Program.cs b/docs/samples/generic-host/AttributeApi/Program.cs index fee1def9..84baff6b 100644 --- a/docs/samples/generic-host/AttributeApi/Program.cs +++ b/docs/samples/generic-host/AttributeApi/Program.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils; using Microsoft.Extensions.Hosting; diff --git a/docs/samples/generic-host/BuilderApi/BuilderApi.csproj b/docs/samples/generic-host/BuilderApi/BuilderApi.csproj index 425b4a3a..23d3f3d2 100644 --- a/docs/samples/generic-host/BuilderApi/BuilderApi.csproj +++ b/docs/samples/generic-host/BuilderApi/BuilderApi.csproj @@ -6,7 +6,7 @@ - + diff --git a/docs/samples/generic-host/BuilderApi/Program.cs b/docs/samples/generic-host/BuilderApi/Program.cs index 3efd199f..788eff56 100644 --- a/docs/samples/generic-host/BuilderApi/Program.cs +++ b/docs/samples/generic-host/BuilderApi/Program.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils; using Microsoft.Extensions.DependencyInjection; diff --git a/docs/samples/helloworld-async/Program.cs b/docs/samples/helloworld-async/Program.cs index 099cbd37..f6cd09a5 100644 --- a/docs/samples/helloworld-async/Program.cs +++ b/docs/samples/helloworld-async/Program.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils; diff --git a/docs/samples/helloworld-attributes/Program.cs b/docs/samples/helloworld-attributes/Program.cs index ddafdb34..baa222f7 100644 --- a/docs/samples/helloworld-attributes/Program.cs +++ b/docs/samples/helloworld-attributes/Program.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using McMaster.Extensions.CommandLineUtils; public class Program diff --git a/docs/samples/helloworld/Program.cs b/docs/samples/helloworld/Program.cs index 6a0e80d9..0504a022 100644 --- a/docs/samples/helloworld/Program.cs +++ b/docs/samples/helloworld/Program.cs @@ -1,3 +1,6 @@ +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using System; using McMaster.Extensions.CommandLineUtils; diff --git a/docs/samples/interactive-prompts/Program.cs b/docs/samples/interactive-prompts/Program.cs index 39424313..e9ab35bf 100644 --- a/docs/samples/interactive-prompts/Program.cs +++ b/docs/samples/interactive-prompts/Program.cs @@ -19,7 +19,7 @@ static void Main(string[] args) promptColor: ConsoleColor.White, promptBgColor: ConsoleColor.DarkGreen); - Console.WriteLine($"Hello, there { name ?? "anonymous console user"}."); + Console.WriteLine($"Hello, there {name ?? "anonymous console user"}."); var age = Prompt.GetInt("How old are you?", promptColor: ConsoleColor.White, @@ -32,13 +32,13 @@ static void Main(string[] args) Console.Write($"Your password contains {password.Length} characters. "); switch (password.Length) { - case int _ when (password.Length < 2): + case int _ when password.Length < 2: Console.WriteLine("Your password is so short you might as well not have one."); break; - case int _ when (password.Length < 4): + case int _ when password.Length < 4: Console.WriteLine("Your password is too short. You should pick a better one"); break; - case int _ when (password.Length < 10): + case int _ when password.Length < 10: Console.WriteLine("Your password is too okay, I guess."); break; default: diff --git a/docs/samples/pager/Program.cs b/docs/samples/pager/Program.cs index cbcd4e44..97a4abdd 100644 --- a/docs/samples/pager/Program.cs +++ b/docs/samples/pager/Program.cs @@ -1,4 +1,6 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using McMaster.Extensions.CommandLineUtils; class Program diff --git a/docs/samples/passthru-args/attributes/Program.cs b/docs/samples/passthru-args/attributes/Program.cs index 41726fd4..5433afb8 100644 --- a/docs/samples/passthru-args/attributes/Program.cs +++ b/docs/samples/passthru-args/attributes/Program.cs @@ -1,3 +1,6 @@ +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using System; using System.Diagnostics; using System.Linq; diff --git a/docs/samples/passthru-args/builder-api/Program.cs b/docs/samples/passthru-args/builder-api/Program.cs index 9ae023ff..99ec19a3 100644 --- a/docs/samples/passthru-args/builder-api/Program.cs +++ b/docs/samples/passthru-args/builder-api/Program.cs @@ -1,3 +1,6 @@ +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using System; using System.Diagnostics; using System.Linq; diff --git a/docs/samples/response-file-parsing/attributes/Program.cs b/docs/samples/response-file-parsing/attributes/Program.cs index d1052503..bfef221e 100644 --- a/docs/samples/response-file-parsing/attributes/Program.cs +++ b/docs/samples/response-file-parsing/attributes/Program.cs @@ -1,4 +1,6 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using McMaster.Extensions.CommandLineUtils; namespace ResponseFileParsing diff --git a/docs/samples/response-file-parsing/builder-api/Program.cs b/docs/samples/response-file-parsing/builder-api/Program.cs index d08855ed..2f18b5cb 100644 --- a/docs/samples/response-file-parsing/builder-api/Program.cs +++ b/docs/samples/response-file-parsing/builder-api/Program.cs @@ -1,4 +1,6 @@ -using System; +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using McMaster.Extensions.CommandLineUtils; namespace ResponseFileParsing diff --git a/docs/samples/samples.sln b/docs/samples/samples.sln index a8438486..60aedb76 100644 --- a/docs/samples/samples.sln +++ b/docs/samples/samples.sln @@ -65,6 +65,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorld", "helloworld\He EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorldAttributes", "helloworld-attributes\HelloWorldAttributes.csproj", "{81F83C18-B60C-4A3F-8896-4B280A8F06D6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeyedServices", "dependency-injection\keyed\KeyedServices.csproj", "{30674755-09B2-41DC-8AAD-31AC4541E562}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -375,6 +377,18 @@ Global {81F83C18-B60C-4A3F-8896-4B280A8F06D6}.Release|x64.Build.0 = Release|Any CPU {81F83C18-B60C-4A3F-8896-4B280A8F06D6}.Release|x86.ActiveCfg = Release|Any CPU {81F83C18-B60C-4A3F-8896-4B280A8F06D6}.Release|x86.Build.0 = Release|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Debug|x64.ActiveCfg = Debug|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Debug|x64.Build.0 = Debug|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Debug|x86.ActiveCfg = Debug|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Debug|x86.Build.0 = Debug|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Release|Any CPU.Build.0 = Release|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Release|x64.ActiveCfg = Release|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Release|x64.Build.0 = Release|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Release|x86.ActiveCfg = Release|Any CPU + {30674755-09B2-41DC-8AAD-31AC4541E562}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -394,6 +408,7 @@ Global {1EE15348-5FF4-4988-AEA4-3E267ED4C288} = {75E74B42-039E-4661-B39C-160363B6884A} {A4F3D30A-4124-49B0-A888-F81CE682F491} = {13EC390A-3D6F-4A7E-A02C-D3CBA197FA40} {B38FF032-9AFB-481F-A432-DFA7A5100C3A} = {13EC390A-3D6F-4A7E-A02C-D3CBA197FA40} + {30674755-09B2-41DC-8AAD-31AC4541E562} = {E03982B3-80F2-4D55-9501-378EACE93E5B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {43B81702-C1EF-43B6-B57D-C630AD1F555D} diff --git a/docs/samples/validation/attributes/Program.cs b/docs/samples/validation/attributes/Program.cs index a70af9f2..5afab299 100644 --- a/docs/samples/validation/attributes/Program.cs +++ b/docs/samples/validation/attributes/Program.cs @@ -3,7 +3,6 @@ using System; using System.ComponentModel.DataAnnotations; -using System.Linq; using McMaster.Extensions.CommandLineUtils; // This is required since .NET 8 introduced a new type System.ComponentModel.DataAnnotations.AllowedValuesAttribute // which conflicts with the attribute in this library (added long before .NET 8.) diff --git a/src/CommandLineUtils.Generators/CommandMetadataGenerator.cs b/src/CommandLineUtils.Generators/CommandMetadataGenerator.cs index b40f8966..1809b1d4 100644 --- a/src/CommandLineUtils.Generators/CommandMetadataGenerator.cs +++ b/src/CommandLineUtils.Generators/CommandMetadataGenerator.cs @@ -8,7 +8,6 @@ using System.Text; using System.Threading; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; diff --git a/src/CommandLineUtils/CommandLineApplication.cs b/src/CommandLineUtils/CommandLineApplication.cs index 9a9e5bd7..5aa4cea3 100644 --- a/src/CommandLineUtils/CommandLineApplication.cs +++ b/src/CommandLineUtils/CommandLineApplication.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.IO; using System.Linq; using System.Reflection; diff --git a/src/CommandLineUtils/Conventions/ExecuteMethodConvention.cs b/src/CommandLineUtils/Conventions/ExecuteMethodConvention.cs index d3254e14..0be24b54 100644 --- a/src/CommandLineUtils/Conventions/ExecuteMethodConvention.cs +++ b/src/CommandLineUtils/Conventions/ExecuteMethodConvention.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Threading; -using System.Threading.Tasks; namespace McMaster.Extensions.CommandLineUtils.Conventions { diff --git a/src/CommandLineUtils/Conventions/ParentPropertyConvention.cs b/src/CommandLineUtils/Conventions/ParentPropertyConvention.cs index e28f2dd6..9fca9018 100644 --- a/src/CommandLineUtils/Conventions/ParentPropertyConvention.cs +++ b/src/CommandLineUtils/Conventions/ParentPropertyConvention.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Reflection; using McMaster.Extensions.CommandLineUtils.Abstractions; diff --git a/src/CommandLineUtils/Conventions/SubcommandAttributeConvention.cs b/src/CommandLineUtils/Conventions/SubcommandAttributeConvention.cs index 4c2e5839..db527017 100644 --- a/src/CommandLineUtils/Conventions/SubcommandAttributeConvention.cs +++ b/src/CommandLineUtils/Conventions/SubcommandAttributeConvention.cs @@ -58,12 +58,7 @@ private static string GetSubcommandName(Type subcommandType, ICommandMetadataPro private void AddSubcommandFromMetadata( ConventionContext context, -#if NET6_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] -#elif NET472_OR_GREATER -#else -#error Target framework misconfiguration -#endif Type subcommandType, ICommandMetadataProvider provider, string name) diff --git a/src/CommandLineUtils/Conventions/SubcommandPropertyConvention.cs b/src/CommandLineUtils/Conventions/SubcommandPropertyConvention.cs index 5e7c67d0..99c2b430 100644 --- a/src/CommandLineUtils/Conventions/SubcommandPropertyConvention.cs +++ b/src/CommandLineUtils/Conventions/SubcommandPropertyConvention.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Reflection; using McMaster.Extensions.CommandLineUtils.Abstractions; diff --git a/src/CommandLineUtils/Internal/DictionaryExtensions.cs b/src/CommandLineUtils/Internal/DictionaryExtensions.cs index 5918f826..65da25c5 100644 --- a/src/CommandLineUtils/Internal/DictionaryExtensions.cs +++ b/src/CommandLineUtils/Internal/DictionaryExtensions.cs @@ -1,14 +1,14 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#if NET6_0_OR_GREATER +#elif NET472_OR_GREATER using System.Collections.Generic; namespace McMaster.Extensions.CommandLineUtils { internal static class DictionaryExtensions { -#if NET6_0_OR_GREATER -#elif NET472_OR_GREATER public static bool TryAdd(this IDictionary dictionary, TKey key, TValue value) { if (dictionary.ContainsKey(key)) @@ -18,8 +18,8 @@ public static bool TryAdd(this IDictionary dictionar dictionary.Add(key, value); return true; } + } +} #else #error Target framework misconfiguration #endif - } -} diff --git a/src/CommandLineUtils/McMaster.Extensions.CommandLineUtils.csproj b/src/CommandLineUtils/McMaster.Extensions.CommandLineUtils.csproj index 45fd2c8a..63f34efd 100644 --- a/src/CommandLineUtils/McMaster.Extensions.CommandLineUtils.csproj +++ b/src/CommandLineUtils/McMaster.Extensions.CommandLineUtils.csproj @@ -26,7 +26,7 @@ McMaster.Extensions.CommandLineUtils.ArgumentEscaper - + diff --git a/src/CommandLineUtils/SourceGeneration/ActivatorModelFactory.cs b/src/CommandLineUtils/SourceGeneration/ActivatorModelFactory.cs index b9967031..2ec3c8d9 100644 --- a/src/CommandLineUtils/SourceGeneration/ActivatorModelFactory.cs +++ b/src/CommandLineUtils/SourceGeneration/ActivatorModelFactory.cs @@ -11,12 +11,7 @@ namespace McMaster.Extensions.CommandLineUtils.SourceGeneration /// /// Model factory that uses Activator.CreateInstance or DI with constructor injection. /// -#if NET6_0_OR_GREATER [RequiresUnreferencedCode("Uses Activator.CreateInstance or DI with constructor injection")] -#elif NET472_OR_GREATER -#else -#error Target framework misconfiguration -#endif internal sealed class ActivatorModelFactory : IModelFactory { private readonly Type _modelType; diff --git a/src/CommandLineUtils/SourceGeneration/DefaultMetadataResolver.cs b/src/CommandLineUtils/SourceGeneration/DefaultMetadataResolver.cs index 1e6f95d9..1b1fcedb 100644 --- a/src/CommandLineUtils/SourceGeneration/DefaultMetadataResolver.cs +++ b/src/CommandLineUtils/SourceGeneration/DefaultMetadataResolver.cs @@ -30,12 +30,7 @@ private DefaultMetadataResolver() /// For full AOT compatibility, ensure the CommandLineUtils.Generators package is referenced /// and the source generator runs during compilation. /// -#if NET6_0_OR_GREATER [RequiresUnreferencedCode("Falls back to reflection when no generated metadata is available. Use the source generator for AOT compatibility.")] -#elif NET472_OR_GREATER -#else -#error Target framework misconfiguration -#endif public ICommandMetadataProvider GetProvider(Type modelType) { // Check for generated metadata first (AOT-safe path) diff --git a/src/CommandLineUtils/SourceGeneration/Handlers/IModelFactory.cs b/src/CommandLineUtils/SourceGeneration/Handlers/IModelFactory.cs index 6d312eba..561c72bc 100644 --- a/src/CommandLineUtils/SourceGeneration/Handlers/IModelFactory.cs +++ b/src/CommandLineUtils/SourceGeneration/Handlers/IModelFactory.cs @@ -1,8 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; - namespace McMaster.Extensions.CommandLineUtils.SourceGeneration { /// diff --git a/src/CommandLineUtils/SourceGeneration/ReflectionExecuteHandler.cs b/src/CommandLineUtils/SourceGeneration/ReflectionExecuteHandler.cs index f3e26c38..7ed1237c 100644 --- a/src/CommandLineUtils/SourceGeneration/ReflectionExecuteHandler.cs +++ b/src/CommandLineUtils/SourceGeneration/ReflectionExecuteHandler.cs @@ -12,12 +12,7 @@ namespace McMaster.Extensions.CommandLineUtils.SourceGeneration /// /// Execute handler that uses reflection to invoke OnExecute/OnExecuteAsync. /// -#if NET6_0_OR_GREATER [RequiresUnreferencedCode("Uses reflection to invoke method")] -#elif NET472_OR_GREATER -#else -#error Target framework misconfiguration -#endif internal sealed class ReflectionExecuteHandler : IExecuteHandler { private readonly MethodInfo _method; diff --git a/src/CommandLineUtils/SourceGeneration/ReflectionMetadataProvider.cs b/src/CommandLineUtils/SourceGeneration/ReflectionMetadataProvider.cs index 3659f241..e5b26f7d 100644 --- a/src/CommandLineUtils/SourceGeneration/ReflectionMetadataProvider.cs +++ b/src/CommandLineUtils/SourceGeneration/ReflectionMetadataProvider.cs @@ -15,12 +15,7 @@ namespace McMaster.Extensions.CommandLineUtils.SourceGeneration /// Provides command metadata by analyzing a type using reflection. /// This is the fallback when generated metadata is not available. /// -#if NET6_0_OR_GREATER [RequiresUnreferencedCode("Uses reflection to analyze the model type")] -#elif NET472_OR_GREATER -#else -#error Target framework misconfiguration -#endif internal sealed class ReflectionMetadataProvider : ICommandMetadataProvider { private const BindingFlags MethodLookup = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public; diff --git a/src/CommandLineUtils/SourceGeneration/ReflectionValidateHandler.cs b/src/CommandLineUtils/SourceGeneration/ReflectionValidateHandler.cs index 3ead1679..bb473e9f 100644 --- a/src/CommandLineUtils/SourceGeneration/ReflectionValidateHandler.cs +++ b/src/CommandLineUtils/SourceGeneration/ReflectionValidateHandler.cs @@ -12,12 +12,7 @@ namespace McMaster.Extensions.CommandLineUtils.SourceGeneration /// /// Validate handler that uses reflection to invoke OnValidate. /// -#if NET6_0_OR_GREATER [RequiresUnreferencedCode("Uses reflection to invoke method")] -#elif NET472_OR_GREATER -#else -#error Target framework misconfiguration -#endif internal sealed class ReflectionValidateHandler : IValidateHandler { private readonly MethodInfo _method; diff --git a/src/CommandLineUtils/SourceGeneration/ReflectionValidationErrorHandler.cs b/src/CommandLineUtils/SourceGeneration/ReflectionValidationErrorHandler.cs index 68dbf57f..0619433f 100644 --- a/src/CommandLineUtils/SourceGeneration/ReflectionValidationErrorHandler.cs +++ b/src/CommandLineUtils/SourceGeneration/ReflectionValidationErrorHandler.cs @@ -11,12 +11,7 @@ namespace McMaster.Extensions.CommandLineUtils.SourceGeneration /// /// Validation error handler that uses reflection to invoke OnValidationError. /// -#if NET6_0_OR_GREATER [RequiresUnreferencedCode("Uses reflection to invoke method")] -#elif NET472_OR_GREATER -#else -#error Target framework misconfiguration -#endif internal sealed class ReflectionValidationErrorHandler : IValidationErrorHandler { private readonly MethodInfo _method; diff --git a/src/CommandLineUtils/releasenotes.props b/src/CommandLineUtils/releasenotes.props index b857d9fc..ae607adb 100644 --- a/src/CommandLineUtils/releasenotes.props +++ b/src/CommandLineUtils/releasenotes.props @@ -1,5 +1,11 @@ + +Changes since 5.0: + +Features: +* @Chris-Wolfgang: Add support for keyed dependency injection via [FromKeyedServices] attribute (#560) + Changes since 4.1: diff --git a/src/Hosting.CommandLine/McMaster.Extensions.Hosting.CommandLine.csproj b/src/Hosting.CommandLine/McMaster.Extensions.Hosting.CommandLine.csproj index 242c9617..04e943c7 100644 --- a/src/Hosting.CommandLine/McMaster.Extensions.Hosting.CommandLine.csproj +++ b/src/Hosting.CommandLine/McMaster.Extensions.Hosting.CommandLine.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/test/CommandLineUtils.Tests/ExecuteMethodConventionTests.cs b/test/CommandLineUtils.Tests/ExecuteMethodConventionTests.cs index 56902c21..40793715 100644 --- a/test/CommandLineUtils.Tests/ExecuteMethodConventionTests.cs +++ b/test/CommandLineUtils.Tests/ExecuteMethodConventionTests.cs @@ -4,7 +4,6 @@ using System; using System.Threading; using System.Threading.Tasks; -using McMaster.Extensions.CommandLineUtils; using Microsoft.Extensions.DependencyInjection; using Moq; using Xunit; diff --git a/test/CommandLineUtils.Tests/McMaster.Extensions.CommandLineUtils.Tests.csproj b/test/CommandLineUtils.Tests/McMaster.Extensions.CommandLineUtils.Tests.csproj index 7d5a5661..1893b139 100644 --- a/test/CommandLineUtils.Tests/McMaster.Extensions.CommandLineUtils.Tests.csproj +++ b/test/CommandLineUtils.Tests/McMaster.Extensions.CommandLineUtils.Tests.csproj @@ -10,14 +10,14 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/test/CommandLineUtils.Tests/SourceGeneration/ArgumentMetadataTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/ArgumentMetadataTests.cs index f7d0eecf..0d787c5e 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/ArgumentMetadataTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/ArgumentMetadataTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using McMaster.Extensions.CommandLineUtils.SourceGeneration; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/CommandLineApplicationWithModelTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/CommandLineApplicationWithModelTests.cs index 9644c44c..d75a6678 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/CommandLineApplicationWithModelTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/CommandLineApplicationWithModelTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using McMaster.Extensions.CommandLineUtils.Abstractions; using McMaster.Extensions.CommandLineUtils.SourceGeneration; using Xunit; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/MetadataProviderTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/MetadataProviderTests.cs index fdfcdc46..a8db2a03 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/MetadataProviderTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/MetadataProviderTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Linq; using McMaster.Extensions.CommandLineUtils.SourceGeneration; using Xunit; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/OptionMetadataTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/OptionMetadataTests.cs index 63a99b9f..bb91f77d 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/OptionMetadataTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/OptionMetadataTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using McMaster.Extensions.CommandLineUtils.SourceGeneration; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/ReflectionExecuteHandlerTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/ReflectionExecuteHandlerTests.cs index a08541da..23206163 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/ReflectionExecuteHandlerTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/ReflectionExecuteHandlerTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Reflection; using System.Threading; using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils.SourceGeneration; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/ReflectionValidateHandlerTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/ReflectionValidateHandlerTests.cs index c60c69f1..fcf9a3a1 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/ReflectionValidateHandlerTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/ReflectionValidateHandlerTests.cs @@ -4,7 +4,6 @@ using System; using System.ComponentModel.DataAnnotations; using System.IO; -using System.Reflection; using McMaster.Extensions.CommandLineUtils.Abstractions; using McMaster.Extensions.CommandLineUtils.Internal; using McMaster.Extensions.CommandLineUtils.SourceGeneration; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/SpecialPropertiesMetadataTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/SpecialPropertiesMetadataTests.cs index f4b2a071..a3b9eb93 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/SpecialPropertiesMetadataTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/SpecialPropertiesMetadataTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Linq; using McMaster.Extensions.CommandLineUtils.SourceGeneration; using Xunit; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/SubcommandMetadataTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/SubcommandMetadataTests.cs index fee39c17..e1ea348f 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/SubcommandMetadataTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/SubcommandMetadataTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using McMaster.Extensions.CommandLineUtils.SourceGeneration; using Xunit; diff --git a/test/CommandLineUtils.Tests/SourceGeneration/TypedWrapperTests.cs b/test/CommandLineUtils.Tests/SourceGeneration/TypedWrapperTests.cs index 7dba49a9..2f96704b 100644 --- a/test/CommandLineUtils.Tests/SourceGeneration/TypedWrapperTests.cs +++ b/test/CommandLineUtils.Tests/SourceGeneration/TypedWrapperTests.cs @@ -1,8 +1,6 @@ // Copyright (c) Nate McMaster. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections.Generic; using McMaster.Extensions.CommandLineUtils.SourceGeneration; using Xunit; diff --git a/test/Directory.Build.props b/test/Directory.Build.props index ab31da95..138a4376 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -3,5 +3,8 @@ $(DefaultItemExcludes);TestResults\** $(MSBuildThisFileDirectory)\.runsettings + + true + $(NoWarn);CS1591 diff --git a/test/Hosting.CommandLine.Tests/McMaster.Extensions.Hosting.CommandLine.Tests.csproj b/test/Hosting.CommandLine.Tests/McMaster.Extensions.Hosting.CommandLine.Tests.csproj index 542f95ee..6d469475 100644 --- a/test/Hosting.CommandLine.Tests/McMaster.Extensions.Hosting.CommandLine.Tests.csproj +++ b/test/Hosting.CommandLine.Tests/McMaster.Extensions.Hosting.CommandLine.Tests.csproj @@ -10,13 +10,13 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + +