From 4cc1db290d838c86cef0a2ed0951dbf2558a4db4 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 24 Jan 2022 09:38:53 +0300 Subject: [PATCH 01/17] Align the input and output params with kiota --- src/Microsoft.OpenApi.Hidi/Program.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index b3752ef97..ed4daa4e7 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -21,10 +21,16 @@ static async Task Main(string[] args) }; validateCommand.Handler = CommandHandler.Create(OpenApiService.ValidateOpenApiDocument); + var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL", typeof(string)); + descriptionOption.AddAlias("-d"); + + var outputOption = new Option("--output", "The output directory path for the generated file.", typeof(FileInfo), () => "./output", arity: ArgumentArity.ZeroOrOne); + outputOption.AddAlias("o"); + var transformCommand = new Command("transform") { - new Option("--input", "Input OpenAPI description file path or URL", typeof(string) ), - new Option("--output","Output OpenAPI description file", typeof(FileInfo), arity: ArgumentArity.ZeroOrOne), + descriptionOption, + outputOption, new Option("--version", "OpenAPI specification version", typeof(OpenApiSpecVersion)), new Option("--format", "File format",typeof(OpenApiFormat) ), new Option("--inline", "Inline $ref instances", typeof(bool) ), From fa4403e4f35fe4f4a30707ec8f8b5a1665ffeff5 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 24 Jan 2022 10:02:09 +0300 Subject: [PATCH 02/17] Add aliases --- src/Microsoft.OpenApi.Hidi/Program.cs | 38 +++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index ed4daa4e7..35a8cda22 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -21,23 +21,45 @@ static async Task Main(string[] args) }; validateCommand.Handler = CommandHandler.Create(OpenApiService.ValidateOpenApiDocument); + // transform command options var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL", typeof(string)); descriptionOption.AddAlias("-d"); var outputOption = new Option("--output", "The output directory path for the generated file.", typeof(FileInfo), () => "./output", arity: ArgumentArity.ZeroOrOne); - outputOption.AddAlias("o"); + outputOption.AddAlias("-o"); + + var versionOption = new Option("--version", "OpenAPI specification version", typeof(OpenApiSpecVersion)); + versionOption.AddAlias("-v"); + + var formatOption = new Option("--format", "File format", typeof(OpenApiFormat)); + formatOption.AddAlias("-f"); +; + var inlineOption = new Option("--inline", "Inline $ref instances", typeof(bool)); + inlineOption.AddAlias("-i"); +; + var resolveExternalOption = new Option("--resolveExternal", "Resolve external $refs", typeof(bool)); + resolveExternalOption.AddAlias("-ex"); +; + var filterByOperationIdsOption = new Option("--filterByOperationIds", "Filters OpenApiDocument by OperationId(s) provided", typeof(string)); + filterByOperationIdsOption.AddAlias("-op"); +; + var filterByTagsOption = new Option("--filterByTags", "Filters OpenApiDocument by Tag(s) provided", typeof(string)); + filterByTagsOption.AddAlias("-t"); +; + var filterByCollectionOption = new Option("--filterByCollection", "Filters OpenApiDocument by Postman collection provided", typeof(string)); + filterByCollectionOption.AddAlias("-c"); var transformCommand = new Command("transform") { descriptionOption, outputOption, - new Option("--version", "OpenAPI specification version", typeof(OpenApiSpecVersion)), - new Option("--format", "File format",typeof(OpenApiFormat) ), - new Option("--inline", "Inline $ref instances", typeof(bool) ), - new Option("--resolveExternal","Resolve external $refs", typeof(bool)), - new Option("--filterByOperationIds", "Filters OpenApiDocument by OperationId(s) provided", typeof(string)), - new Option("--filterByTags", "Filters OpenApiDocument by Tag(s) provided", typeof(string)), - new Option("--filterByCollection", "Filters OpenApiDocument by Postman collection provided", typeof(string)) + versionOption, + formatOption, + inlineOption, + resolveExternalOption, + filterByOperationIdsOption, + filterByTagsOption, + filterByCollectionOption }; transformCommand.Handler = CommandHandler.Create( OpenApiService.ProcessOpenApiDocument); From 57312fab212e4cb266567d601bbee33ddc1ec207 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 24 Jan 2022 10:41:57 +0300 Subject: [PATCH 03/17] Update the input command option for validate --- src/Microsoft.OpenApi.Hidi/Program.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index 35a8cda22..c4e27e29b 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -14,14 +14,8 @@ static async Task Main(string[] args) { var rootCommand = new RootCommand() { }; - - var validateCommand = new Command("validate") - { - new Option("--input", "Input OpenAPI description file path or URL", typeof(string) ) - }; - validateCommand.Handler = CommandHandler.Create(OpenApiService.ValidateOpenApiDocument); - - // transform command options + + // command option parameters and aliases var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL", typeof(string)); descriptionOption.AddAlias("-d"); @@ -49,6 +43,12 @@ static async Task Main(string[] args) var filterByCollectionOption = new Option("--filterByCollection", "Filters OpenApiDocument by Postman collection provided", typeof(string)); filterByCollectionOption.AddAlias("-c"); + var validateCommand = new Command("validate") + { + descriptionOption + }; + validateCommand.Handler = CommandHandler.Create(OpenApiService.ValidateOpenApiDocument); + var transformCommand = new Command("transform") { descriptionOption, From c1f37eee66574c69827aaef24626ea417f719c68 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 24 Jan 2022 10:53:27 +0300 Subject: [PATCH 04/17] Clean up code --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 30 ++++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index abef3617f..3ce75ee17 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -21,7 +21,7 @@ namespace Microsoft.OpenApi.Hidi public static class OpenApiService { public static void ProcessOpenApiDocument( - string input, + string openapi, FileInfo output, OpenApiSpecVersion? version, OpenApiFormat? format, @@ -31,9 +31,9 @@ public static void ProcessOpenApiDocument( bool inline, bool resolveExternal) { - if (string.IsNullOrEmpty(input)) + if (string.IsNullOrEmpty(openapi)) { - throw new ArgumentNullException(nameof(input)); + throw new ArgumentNullException(nameof(openapi)); } if(output == null) { @@ -44,7 +44,7 @@ public static void ProcessOpenApiDocument( throw new IOException("The file you're writing to already exists. Please input a new output path."); } - var stream = GetStream(input); + var stream = GetStream(openapi); var result = new OpenApiStreamReader(new OpenApiReaderSettings { ReferenceResolution = resolveExternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences, @@ -102,7 +102,7 @@ public static void ProcessOpenApiDocument( ReferenceInline = inline ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences }; - var openApiFormat = format ?? GetOpenApiFormat(input); + var openApiFormat = format ?? GetOpenApiFormat(openapi); var openApiVersion = version ?? result.OpenApiDiagnostic.SpecificationVersion; IOpenApiWriter writer = openApiFormat switch { @@ -115,10 +115,10 @@ public static void ProcessOpenApiDocument( textWriter.Flush(); } - private static Stream GetStream(string input) + private static Stream GetStream(string openapi) { Stream stream; - if (input.StartsWith("http")) + if (openapi.StartsWith("http")) { var httpClient = new HttpClient(new HttpClientHandler() { @@ -127,11 +127,11 @@ private static Stream GetStream(string input) { DefaultRequestVersion = HttpVersion.Version20 }; - stream = httpClient.GetStreamAsync(input).Result; + stream = httpClient.GetStreamAsync(openapi).Result; } else { - var fileInput = new FileInfo(input); + var fileInput = new FileInfo(openapi); stream = fileInput.OpenRead(); } @@ -170,14 +170,14 @@ public static Dictionary> ParseJsonCollectionFile(Stream st return requestUrls; } - internal static void ValidateOpenApiDocument(string input) + internal static void ValidateOpenApiDocument(string openapi) { - if (input == null) + if (openapi == null) { - throw new ArgumentNullException("input"); + throw new ArgumentNullException("openapi"); } - var stream = GetStream(input); + var stream = GetStream(openapi); OpenApiDocument document; @@ -202,9 +202,9 @@ internal static void ValidateOpenApiDocument(string input) Console.WriteLine(statsVisitor.GetStatisticsReport()); } - private static OpenApiFormat GetOpenApiFormat(string input) + private static OpenApiFormat GetOpenApiFormat(string openapi) { - return !input.StartsWith("http") && Path.GetExtension(input) == ".json" ? OpenApiFormat.Json : OpenApiFormat.Yaml; + return !openapi.StartsWith("http") && Path.GetExtension(openapi) == ".json" ? OpenApiFormat.Json : OpenApiFormat.Yaml; } } } From 08d9b24384918de7dcfa7ff5080abb0534ffde4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jan 2022 21:11:29 +0000 Subject: [PATCH 05/17] Bump FluentAssertions from 6.3.0 to 6.4.0 Bumps [FluentAssertions](https://github.com/fluentassertions/fluentassertions) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/fluentassertions/fluentassertions/releases) - [Changelog](https://github.com/fluentassertions/fluentassertions/blob/master/AcceptApiChanges.ps1) - [Commits](https://github.com/fluentassertions/fluentassertions/compare/6.3.0...6.4.0) --- updated-dependencies: - dependency-name: FluentAssertions dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .../Microsoft.OpenApi.Readers.Tests.csproj | 2 +- test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj index 13feb0bc9..7ed607fd3 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj +++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj @@ -243,7 +243,7 @@ - + diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 56bdd0983..8b40a3128 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -15,7 +15,7 @@ - + From f81167e5c2fd31feb9269f2b69412bc2e1f04372 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 27 Jan 2022 12:57:08 +0300 Subject: [PATCH 06/17] Use kebab case for multi-name params --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 24 ++++++++++---------- src/Microsoft.OpenApi.Hidi/Program.cs | 8 +++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 3ce75ee17..cad202fd9 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -25,11 +25,11 @@ public static void ProcessOpenApiDocument( FileInfo output, OpenApiSpecVersion? version, OpenApiFormat? format, - string filterByOperationIds, - string filterByTags, - string filterByCollection, + string filterbyoperationids, + string filterbytags, + string filterbycollection, bool inline, - bool resolveExternal) + bool resolveexternal) { if (string.IsNullOrEmpty(openapi)) { @@ -47,7 +47,7 @@ public static void ProcessOpenApiDocument( var stream = GetStream(openapi); var result = new OpenApiStreamReader(new OpenApiReaderSettings { - ReferenceResolution = resolveExternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences, + ReferenceResolution = resolveexternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences, RuleSet = ValidationRuleSet.GetDefaultRuleSet() } ).ReadAsync(stream).GetAwaiter().GetResult(); @@ -56,24 +56,24 @@ public static void ProcessOpenApiDocument( Func predicate; // Check if filter options are provided, then execute - if (!string.IsNullOrEmpty(filterByOperationIds) && !string.IsNullOrEmpty(filterByTags)) + if (!string.IsNullOrEmpty(filterbyoperationids) && !string.IsNullOrEmpty(filterbytags)) { throw new InvalidOperationException("Cannot filter by operationIds and tags at the same time."); } - if (!string.IsNullOrEmpty(filterByOperationIds)) + if (!string.IsNullOrEmpty(filterbyoperationids)) { - predicate = OpenApiFilterService.CreatePredicate(operationIds: filterByOperationIds); + predicate = OpenApiFilterService.CreatePredicate(operationIds: filterbyoperationids); document = OpenApiFilterService.CreateFilteredDocument(document, predicate); } - if (!string.IsNullOrEmpty(filterByTags)) + if (!string.IsNullOrEmpty(filterbytags)) { - predicate = OpenApiFilterService.CreatePredicate(tags: filterByTags); + predicate = OpenApiFilterService.CreatePredicate(tags: filterbytags); document = OpenApiFilterService.CreateFilteredDocument(document, predicate); } - if (!string.IsNullOrEmpty(filterByCollection)) + if (!string.IsNullOrEmpty(filterbycollection)) { - var fileStream = GetStream(filterByCollection); + var fileStream = GetStream(filterbycollection); var requestUrls = ParseJsonCollectionFile(fileStream); predicate = OpenApiFilterService.CreatePredicate(requestUrls: requestUrls, source:document); document = OpenApiFilterService.CreateFilteredDocument(document, predicate); diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index c4e27e29b..e5865d464 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -31,16 +31,16 @@ static async Task Main(string[] args) var inlineOption = new Option("--inline", "Inline $ref instances", typeof(bool)); inlineOption.AddAlias("-i"); ; - var resolveExternalOption = new Option("--resolveExternal", "Resolve external $refs", typeof(bool)); + var resolveExternalOption = new Option("--resolve-external", "Resolve external $refs", typeof(bool)); resolveExternalOption.AddAlias("-ex"); ; - var filterByOperationIdsOption = new Option("--filterByOperationIds", "Filters OpenApiDocument by OperationId(s) provided", typeof(string)); + var filterByOperationIdsOption = new Option("--filter-by-operationids", "Filters OpenApiDocument by OperationId(s) provided", typeof(string)); filterByOperationIdsOption.AddAlias("-op"); ; - var filterByTagsOption = new Option("--filterByTags", "Filters OpenApiDocument by Tag(s) provided", typeof(string)); + var filterByTagsOption = new Option("--filter-by-tags", "Filters OpenApiDocument by Tag(s) provided", typeof(string)); filterByTagsOption.AddAlias("-t"); ; - var filterByCollectionOption = new Option("--filterByCollection", "Filters OpenApiDocument by Postman collection provided", typeof(string)); + var filterByCollectionOption = new Option("--filter-by-collection", "Filters OpenApiDocument by Postman collection provided", typeof(string)); filterByCollectionOption.AddAlias("-c"); var validateCommand = new Command("validate") From 2f6e323d69fb8c1e944ac4299750e636ce571076 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 27 Jan 2022 19:33:36 +0300 Subject: [PATCH 07/17] Clean up code --- src/Microsoft.OpenApi.Hidi/Program.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index e5865d464..5dc4e3961 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -27,19 +27,19 @@ static async Task Main(string[] args) var formatOption = new Option("--format", "File format", typeof(OpenApiFormat)); formatOption.AddAlias("-f"); -; + var inlineOption = new Option("--inline", "Inline $ref instances", typeof(bool)); inlineOption.AddAlias("-i"); -; + var resolveExternalOption = new Option("--resolve-external", "Resolve external $refs", typeof(bool)); resolveExternalOption.AddAlias("-ex"); -; + var filterByOperationIdsOption = new Option("--filter-by-operationids", "Filters OpenApiDocument by OperationId(s) provided", typeof(string)); filterByOperationIdsOption.AddAlias("-op"); -; + var filterByTagsOption = new Option("--filter-by-tags", "Filters OpenApiDocument by Tag(s) provided", typeof(string)); filterByTagsOption.AddAlias("-t"); -; + var filterByCollectionOption = new Option("--filter-by-collection", "Filters OpenApiDocument by Postman collection provided", typeof(string)); filterByCollectionOption.AddAlias("-c"); From 526aa2928b6929632d27f81b1ca83fe73df62110 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 27 Jan 2022 19:33:57 +0300 Subject: [PATCH 08/17] Refactor param to be implicit --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index cad202fd9..a1fd8135d 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -115,10 +115,10 @@ public static void ProcessOpenApiDocument( textWriter.Flush(); } - private static Stream GetStream(string openapi) + private static Stream GetStream(string input) { Stream stream; - if (openapi.StartsWith("http")) + if (input.StartsWith("http")) { var httpClient = new HttpClient(new HttpClientHandler() { @@ -127,11 +127,11 @@ private static Stream GetStream(string openapi) { DefaultRequestVersion = HttpVersion.Version20 }; - stream = httpClient.GetStreamAsync(openapi).Result; + stream = httpClient.GetStreamAsync(input).Result; } else { - var fileInput = new FileInfo(openapi); + var fileInput = new FileInfo(input); stream = fileInput.OpenRead(); } From 1ea0f5b782e5e909af84c8835485d38e6bd5cf05 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 1 Feb 2022 12:58:28 +0300 Subject: [PATCH 09/17] Add logging configurations --- src/Microsoft.OpenApi.Hidi/appsettings.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/Microsoft.OpenApi.Hidi/appsettings.json diff --git a/src/Microsoft.OpenApi.Hidi/appsettings.json b/src/Microsoft.OpenApi.Hidi/appsettings.json new file mode 100644 index 000000000..882248cf8 --- /dev/null +++ b/src/Microsoft.OpenApi.Hidi/appsettings.json @@ -0,0 +1,7 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug" + } + } +} \ No newline at end of file From f2ee8d58ef5d35ec3b9b4573beb1a00c8c3ebf97 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 1 Feb 2022 12:59:15 +0300 Subject: [PATCH 10/17] Install packages --- src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj | 4 ++++ test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj | 1 + 2 files changed, 5 insertions(+) diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index 4db249c8f..c832225fd 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -10,6 +10,10 @@ + + + + diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 56bdd0983..1d7c6b1f9 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -17,6 +17,7 @@ + From 58700121ddeb7d89195a5f5a8c0f903853602d16 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 1 Feb 2022 13:00:29 +0300 Subject: [PATCH 11/17] Add a loglevel command option for additional logging --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 203 ++++++++++++++----- src/Microsoft.OpenApi.Hidi/Program.cs | 16 +- 2 files changed, 164 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index a1fd8135d..b85f68fcc 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -3,12 +3,15 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Http; +using System.Security; using System.Text; using System.Text.Json; +using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Readers; @@ -18,91 +21,135 @@ namespace Microsoft.OpenApi.Hidi { - public static class OpenApiService + public class OpenApiService { public static void ProcessOpenApiDocument( string openapi, FileInfo output, OpenApiSpecVersion? version, OpenApiFormat? format, + LogLevel loglevel, string filterbyoperationids, string filterbytags, string filterbycollection, bool inline, bool resolveexternal) { - if (string.IsNullOrEmpty(openapi)) + var logger = ConfigureLoggerInstance(loglevel); + + try { - throw new ArgumentNullException(nameof(openapi)); + if (string.IsNullOrEmpty(openapi)) + { + throw new ArgumentNullException(nameof(openapi)); + } + } + catch (ArgumentNullException ex) + { + logger.LogError(ex.Message); + return; + } + try + { + if(output == null) + { + throw new ArgumentException(nameof(output)); + } } - if(output == null) + catch (ArgumentException ex) { - throw new ArgumentException(nameof(output)); + logger.LogError(ex.Message); + return; } - if (output.Exists) + try { - throw new IOException("The file you're writing to already exists. Please input a new output path."); + if (output.Exists) + { + throw new IOException("The file you're writing to already exists. Please input a new file path."); + } } + catch (IOException ex) + { + logger.LogError(ex.Message); + return; + } + + var stream = GetStream(openapi, logger); - var stream = GetStream(openapi); + // Parsing OpenAPI file + var stopwatch = new Stopwatch(); + stopwatch.Start(); + logger.LogTrace("Parsing OpenApi file"); var result = new OpenApiStreamReader(new OpenApiReaderSettings { ReferenceResolution = resolveexternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences, RuleSet = ValidationRuleSet.GetDefaultRuleSet() } ).ReadAsync(stream).GetAwaiter().GetResult(); - var document = result.OpenApiDocument; + stopwatch.Stop(); + + var context = result.OpenApiDiagnostic; + if (context.Errors.Count > 0) + { + var errorReport = new StringBuilder(); + + foreach (var error in context.Errors) + { + errorReport.AppendLine(error.ToString()); + } + logger.LogError($"{stopwatch.ElapsedMilliseconds}ms: OpenApi Parsing errors {string.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray())}"); + } + else + { + logger.LogTrace("{timestamp}ms: Parsed OpenApi successfully. {count} paths found.", stopwatch.ElapsedMilliseconds, document.Paths.Count); + } + Func predicate; - // Check if filter options are provided, then execute + // Check if filter options are provided, then slice the OpenAPI document if (!string.IsNullOrEmpty(filterbyoperationids) && !string.IsNullOrEmpty(filterbytags)) { throw new InvalidOperationException("Cannot filter by operationIds and tags at the same time."); } if (!string.IsNullOrEmpty(filterbyoperationids)) { + logger.LogTrace("Creating predicate based on the operationIds supplied."); predicate = OpenApiFilterService.CreatePredicate(operationIds: filterbyoperationids); + + logger.LogTrace("Creating subset OpenApi document."); document = OpenApiFilterService.CreateFilteredDocument(document, predicate); } if (!string.IsNullOrEmpty(filterbytags)) { + logger.LogTrace("Creating predicate based on the tags supplied."); predicate = OpenApiFilterService.CreatePredicate(tags: filterbytags); - document = OpenApiFilterService.CreateFilteredDocument(document, predicate); - } - if (!string.IsNullOrEmpty(filterbycollection)) - { - var fileStream = GetStream(filterbycollection); - var requestUrls = ParseJsonCollectionFile(fileStream); - predicate = OpenApiFilterService.CreatePredicate(requestUrls: requestUrls, source:document); + logger.LogTrace("Creating subset OpenApi document."); document = OpenApiFilterService.CreateFilteredDocument(document, predicate); } - - var context = result.OpenApiDiagnostic; - - if (context.Errors.Count > 0) + if (!string.IsNullOrEmpty(filterbycollection)) { - var errorReport = new StringBuilder(); + var fileStream = GetStream(filterbycollection, logger); + var requestUrls = ParseJsonCollectionFile(fileStream, logger); - foreach (var error in context.Errors) - { - errorReport.AppendLine(error.ToString()); - } + logger.LogTrace("Creating predicate based on the paths and Http methods defined in the Postman collection."); + predicate = OpenApiFilterService.CreatePredicate(requestUrls: requestUrls, source:document); - throw new ArgumentException(string.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray())); + logger.LogTrace("Creating subset OpenApi document."); + document = OpenApiFilterService.CreateFilteredDocument(document, predicate); } - + + logger.LogTrace("Creating a new file"); using var outputStream = output?.Create(); - - var textWriter = outputStream != null ? new StreamWriter(outputStream) : Console.Out; + var textWriter = outputStream != null ? new StreamWriter(outputStream) : Console.Out; var settings = new OpenApiWriterSettings() { ReferenceInline = inline ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences }; - var openApiFormat = format ?? GetOpenApiFormat(openapi); + var openApiFormat = format ?? GetOpenApiFormat(openapi, logger); var openApiVersion = version ?? result.OpenApiDiagnostic.SpecificationVersion; IOpenApiWriter writer = openApiFormat switch { @@ -110,31 +157,64 @@ public static void ProcessOpenApiDocument( OpenApiFormat.Yaml => new OpenApiYamlWriter(textWriter, settings), _ => throw new ArgumentException("Unknown format"), }; + + logger.LogTrace("Serializing to OpenApi document using the provided spec version and writer"); + + stopwatch.Start(); document.Serialize(writer, openApiVersion); + stopwatch.Stop(); + + logger.LogTrace($"Finished serializing in {stopwatch.ElapsedMilliseconds}ms"); textWriter.Flush(); } - private static Stream GetStream(string input) + private static Stream GetStream(string input, ILogger logger) { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + Stream stream; if (input.StartsWith("http")) { - var httpClient = new HttpClient(new HttpClientHandler() + try { - SslProtocols = System.Security.Authentication.SslProtocols.Tls12, - }) + var httpClient = new HttpClient(new HttpClientHandler() + { + SslProtocols = System.Security.Authentication.SslProtocols.Tls12, + }) + { + DefaultRequestVersion = HttpVersion.Version20 + }; + stream = httpClient.GetStreamAsync(input).Result; + } + catch (HttpRequestException ex) { - DefaultRequestVersion = HttpVersion.Version20 - }; - stream = httpClient.GetStreamAsync(input).Result; + logger.LogError($"Could not download the file at {input}, reason{ex}"); + return null; + } } else { - var fileInput = new FileInfo(input); - stream = fileInput.OpenRead(); + try + { + var fileInput = new FileInfo(input); + stream = fileInput.OpenRead(); + } + catch (Exception ex) when (ex is FileNotFoundException || + ex is PathTooLongException || + ex is DirectoryNotFoundException || + ex is IOException || + ex is UnauthorizedAccessException || + ex is SecurityException || + ex is NotSupportedException) + { + logger.LogError($"Could not open the file at {input}, reason: {ex.Message}"); + return null; + } } - + stopwatch.Stop(); + logger.LogTrace("{timestamp}ms: Read file {input}", stopwatch.ElapsedMilliseconds, input); return stream; } @@ -143,11 +223,11 @@ private static Stream GetStream(string input) /// /// A file stream. /// A dictionary of request urls and http methods from a collection. - public static Dictionary> ParseJsonCollectionFile(Stream stream) + public static Dictionary> ParseJsonCollectionFile(Stream stream, ILogger logger) { var requestUrls = new Dictionary>(); - // Convert file to JsonDocument + logger.LogTrace("Parsing the json collection file into a JsonDocument"); using var document = JsonDocument.Parse(stream); var root = document.RootElement; var itemElement = root.GetProperty("item"); @@ -166,21 +246,21 @@ public static Dictionary> ParseJsonCollectionFile(Stream st requestUrls[path].Add(method); } } - + logger.LogTrace("Finished fetching the list of paths and Http methods defined in the Postman collection."); return requestUrls; } - internal static void ValidateOpenApiDocument(string openapi) + internal static void ValidateOpenApiDocument(string openapi, LogLevel loglevel) { - if (openapi == null) + if (string.IsNullOrEmpty(openapi)) { - throw new ArgumentNullException("openapi"); + throw new ArgumentNullException(nameof(openapi)); } - - var stream = GetStream(openapi); + var logger = ConfigureLoggerInstance(loglevel); + var stream = GetStream(openapi, logger); OpenApiDocument document; - + logger.LogTrace("Parsing the OpenApi file"); document = new OpenApiStreamReader(new OpenApiReaderSettings { RuleSet = ValidationRuleSet.GetDefaultRuleSet() @@ -199,12 +279,33 @@ internal static void ValidateOpenApiDocument(string openapi) var walker = new OpenApiWalker(statsVisitor); walker.Walk(document); + logger.LogTrace("Finished walking through the OpenApi document. Generating a statistics report.."); Console.WriteLine(statsVisitor.GetStatisticsReport()); } - private static OpenApiFormat GetOpenApiFormat(string openapi) + private static OpenApiFormat GetOpenApiFormat(string openapi, ILogger logger) { + logger.LogTrace("Getting the OpenApi format"); return !openapi.StartsWith("http") && Path.GetExtension(openapi) == ".json" ? OpenApiFormat.Json : OpenApiFormat.Yaml; } + + private static ILogger ConfigureLoggerInstance(LogLevel loglevel) + { + // Configure logger options + #if DEBUG + loglevel = loglevel > LogLevel.Debug ? LogLevel.Debug : loglevel; + #endif + + var logger = LoggerFactory.Create((builder) => { + builder + .AddConsole() + #if DEBUG + .AddDebug() + #endif + .SetMinimumLevel(loglevel); + }).CreateLogger(); + + return logger; + } } } diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index 5dc4e3961..2f6f8f272 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -5,6 +5,7 @@ using System.CommandLine.Invocation; using System.IO; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; namespace Microsoft.OpenApi.Hidi { @@ -27,7 +28,10 @@ static async Task Main(string[] args) var formatOption = new Option("--format", "File format", typeof(OpenApiFormat)); formatOption.AddAlias("-f"); - + + var logLevelOption = new Option("--loglevel", "The log level to use when logging messages to the main output.", typeof(LogLevel), () => LogLevel.Warning); + logLevelOption.AddAlias("-ll"); + var inlineOption = new Option("--inline", "Inline $ref instances", typeof(bool)); inlineOption.AddAlias("-i"); @@ -45,9 +49,11 @@ static async Task Main(string[] args) var validateCommand = new Command("validate") { - descriptionOption + descriptionOption, + logLevelOption }; - validateCommand.Handler = CommandHandler.Create(OpenApiService.ValidateOpenApiDocument); + + validateCommand.Handler = CommandHandler.Create(OpenApiService.ValidateOpenApiDocument); var transformCommand = new Command("transform") { @@ -55,13 +61,15 @@ static async Task Main(string[] args) outputOption, versionOption, formatOption, + logLevelOption, inlineOption, resolveExternalOption, filterByOperationIdsOption, filterByTagsOption, filterByCollectionOption }; - transformCommand.Handler = CommandHandler.Create( + + transformCommand.Handler = CommandHandler.Create( OpenApiService.ProcessOpenApiDocument); rootCommand.Add(transformCommand); From d4fa9c706b29513357def17dba645befba8742d0 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 1 Feb 2022 13:00:50 +0300 Subject: [PATCH 12/17] Configure a mock logger for testing --- .../Services/OpenApiFilterServiceTests.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.OpenApi.Tests/Services/OpenApiFilterServiceTests.cs b/test/Microsoft.OpenApi.Tests/Services/OpenApiFilterServiceTests.cs index f470b8577..78f8ec048 100644 --- a/test/Microsoft.OpenApi.Tests/Services/OpenApiFilterServiceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Services/OpenApiFilterServiceTests.cs @@ -3,10 +3,12 @@ using System; using System.IO; +using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Hidi; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Tests.UtilityFiles; +using Moq; using Xunit; namespace Microsoft.OpenApi.Tests.Services @@ -14,10 +16,14 @@ namespace Microsoft.OpenApi.Tests.Services public class OpenApiFilterServiceTests { private readonly OpenApiDocument _openApiDocumentMock; + private readonly Mock> _mockLogger; + private readonly ILogger _logger; public OpenApiFilterServiceTests() { _openApiDocumentMock = OpenApiDocumentMock.CreateOpenApiDocument(); + _mockLogger = new Mock>(); + _logger = _mockLogger.Object; } [Theory] @@ -53,7 +59,7 @@ public void ReturnFilteredOpenApiDocumentBasedOnPostmanCollection() var stream = fileInput.OpenRead(); // Act - var requestUrls = OpenApiService.ParseJsonCollectionFile(stream); + var requestUrls = OpenApiService.ParseJsonCollectionFile(stream, _logger); var predicate = OpenApiFilterService.CreatePredicate(requestUrls: requestUrls, source: _openApiDocumentMock); var subsetOpenApiDocument = OpenApiFilterService.CreateFilteredDocument(_openApiDocumentMock, predicate); @@ -72,7 +78,7 @@ public void ThrowsExceptionWhenUrlsInCollectionAreMissingFromSourceDocument() var stream = fileInput.OpenRead(); // Act - var requestUrls = OpenApiService.ParseJsonCollectionFile(stream); + var requestUrls = OpenApiService.ParseJsonCollectionFile(stream, _logger); // Assert var message = Assert.Throws(() => From a70ac02952f0d0e3456194873c9aeca075c3da9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Feb 2022 14:09:43 +0000 Subject: [PATCH 13/17] Bump Verify from 14.14.1 to 15.2.0 Bumps [Verify](https://github.com/VerifyTests/Verify) from 14.14.1 to 15.2.0. - [Release notes](https://github.com/VerifyTests/Verify/releases) - [Commits](https://github.com/VerifyTests/Verify/compare/14.14.1...15.2.0) --- updated-dependencies: - dependency-name: Verify dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 8b40a3128..a77f3905a 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -19,7 +19,7 @@ - + From fb2bf585d539cc0c6e928e3b55c88e766bcdda32 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 1 Feb 2022 18:14:42 +0300 Subject: [PATCH 14/17] Resolve PR feedback --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index b85f68fcc..d1dea081a 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -11,6 +11,7 @@ using System.Security; using System.Text; using System.Text.Json; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; @@ -23,7 +24,7 @@ namespace Microsoft.OpenApi.Hidi { public class OpenApiService { - public static void ProcessOpenApiDocument( + public static async void ProcessOpenApiDocument( string openapi, FileInfo output, OpenApiSpecVersion? version, @@ -74,7 +75,7 @@ public static void ProcessOpenApiDocument( return; } - var stream = GetStream(openapi, logger); + var stream = await GetStream(openapi, logger); // Parsing OpenAPI file var stopwatch = new Stopwatch(); @@ -130,7 +131,7 @@ public static void ProcessOpenApiDocument( } if (!string.IsNullOrEmpty(filterbycollection)) { - var fileStream = GetStream(filterbycollection, logger); + var fileStream = await GetStream(filterbycollection, logger); var requestUrls = ParseJsonCollectionFile(fileStream, logger); logger.LogTrace("Creating predicate based on the paths and Http methods defined in the Postman collection."); @@ -169,7 +170,7 @@ public static void ProcessOpenApiDocument( textWriter.Flush(); } - private static Stream GetStream(string input, ILogger logger) + private static async Task GetStream(string input, ILogger logger) { var stopwatch = new Stopwatch(); stopwatch.Start(); @@ -179,14 +180,15 @@ private static Stream GetStream(string input, ILogger logger) { try { - var httpClient = new HttpClient(new HttpClientHandler() + using var httpClientHandler = new HttpClientHandler() { SslProtocols = System.Security.Authentication.SslProtocols.Tls12, - }) + }; + using var httpClient = new HttpClient(httpClientHandler) { DefaultRequestVersion = HttpVersion.Version20 }; - stream = httpClient.GetStreamAsync(input).Result; + stream = await httpClient.GetStreamAsync(input); } catch (HttpRequestException ex) { @@ -250,14 +252,14 @@ public static Dictionary> ParseJsonCollectionFile(Stream st return requestUrls; } - internal static void ValidateOpenApiDocument(string openapi, LogLevel loglevel) + internal static async void ValidateOpenApiDocument(string openapi, LogLevel loglevel) { if (string.IsNullOrEmpty(openapi)) { throw new ArgumentNullException(nameof(openapi)); } var logger = ConfigureLoggerInstance(loglevel); - var stream = GetStream(openapi, logger); + var stream = await GetStream(openapi, logger); OpenApiDocument document; logger.LogTrace("Parsing the OpenApi file"); From 652379e5a22db04d4123a870a02e60de5f04cf1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Feb 2022 21:08:40 +0000 Subject: [PATCH 15/17] Bump Verify from 15.2.0 to 15.2.1 Bumps [Verify](https://github.com/VerifyTests/Verify) from 15.2.0 to 15.2.1. - [Release notes](https://github.com/VerifyTests/Verify/releases) - [Commits](https://github.com/VerifyTests/Verify/commits) --- updated-dependencies: - dependency-name: Verify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index a77f3905a..b56f5c6da 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -19,7 +19,7 @@ - + From f6a9654253ff8fe66b1fb2d038d9d5283586e53b Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 2 Feb 2022 14:18:51 +0300 Subject: [PATCH 16/17] Upgrades to System.Commandline beta2 --- .../Microsoft.OpenApi.Hidi.csproj | 3 +- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 7 +-- src/Microsoft.OpenApi.Hidi/Program.cs | 45 +++++++++---------- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index c832225fd..ea617ae94 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -3,6 +3,7 @@ Exe netcoreapp3.1 + 9.0 true hidi ./../../artifacts @@ -14,7 +15,7 @@ - + diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index d1dea081a..3c9fdb7d5 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -30,11 +30,12 @@ public static async void ProcessOpenApiDocument( OpenApiSpecVersion? version, OpenApiFormat? format, LogLevel loglevel, + bool inline, + bool resolveexternal, string filterbyoperationids, string filterbytags, - string filterbycollection, - bool inline, - bool resolveexternal) + string filterbycollection + ) { var logger = ConfigureLoggerInstance(loglevel); diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index 2f6f8f272..841c710e5 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. using System.CommandLine; -using System.CommandLine.Invocation; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; @@ -15,45 +14,45 @@ static async Task Main(string[] args) { var rootCommand = new RootCommand() { }; - + // command option parameters and aliases - var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL", typeof(string)); + var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL"); descriptionOption.AddAlias("-d"); - var outputOption = new Option("--output", "The output directory path for the generated file.", typeof(FileInfo), () => "./output", arity: ArgumentArity.ZeroOrOne); + var outputOption = new Option("--output", () => new FileInfo("./output"), "The output directory path for the generated file.") { Arity = ArgumentArity.ZeroOrOne }; outputOption.AddAlias("-o"); - var versionOption = new Option("--version", "OpenAPI specification version", typeof(OpenApiSpecVersion)); + var versionOption = new Option("--version", "OpenAPI specification version"); versionOption.AddAlias("-v"); - var formatOption = new Option("--format", "File format", typeof(OpenApiFormat)); + var formatOption = new Option("--format", "File format"); formatOption.AddAlias("-f"); - var logLevelOption = new Option("--loglevel", "The log level to use when logging messages to the main output.", typeof(LogLevel), () => LogLevel.Warning); + var logLevelOption = new Option("--loglevel", () => LogLevel.Warning, "The log level to use when logging messages to the main output."); logLevelOption.AddAlias("-ll"); - var inlineOption = new Option("--inline", "Inline $ref instances", typeof(bool)); - inlineOption.AddAlias("-i"); - - var resolveExternalOption = new Option("--resolve-external", "Resolve external $refs", typeof(bool)); - resolveExternalOption.AddAlias("-ex"); - - var filterByOperationIdsOption = new Option("--filter-by-operationids", "Filters OpenApiDocument by OperationId(s) provided", typeof(string)); + var filterByOperationIdsOption = new Option("--filter-by-operationids", "Filters OpenApiDocument by OperationId(s) provided"); filterByOperationIdsOption.AddAlias("-op"); - var filterByTagsOption = new Option("--filter-by-tags", "Filters OpenApiDocument by Tag(s) provided", typeof(string)); + var filterByTagsOption = new Option("--filter-by-tags", "Filters OpenApiDocument by Tag(s) provided"); filterByTagsOption.AddAlias("-t"); - var filterByCollectionOption = new Option("--filter-by-collection", "Filters OpenApiDocument by Postman collection provided", typeof(string)); + var filterByCollectionOption = new Option("--filter-by-collection", "Filters OpenApiDocument by Postman collection provided"); filterByCollectionOption.AddAlias("-c"); + var inlineOption = new Option("--inline", "Inline $ref instances"); + inlineOption.AddAlias("-i"); + + var resolveExternalOption = new Option("--resolve-external", "Resolve external $refs"); + resolveExternalOption.AddAlias("-ex"); + var validateCommand = new Command("validate") { descriptionOption, logLevelOption }; - validateCommand.Handler = CommandHandler.Create(OpenApiService.ValidateOpenApiDocument); + validateCommand.SetHandler(OpenApiService.ValidateOpenApiDocument, descriptionOption, logLevelOption); var transformCommand = new Command("transform") { @@ -61,16 +60,16 @@ static async Task Main(string[] args) outputOption, versionOption, formatOption, - logLevelOption, - inlineOption, - resolveExternalOption, + logLevelOption, filterByOperationIdsOption, filterByTagsOption, - filterByCollectionOption + filterByCollectionOption, + inlineOption, + resolveExternalOption, }; - transformCommand.Handler = CommandHandler.Create( - OpenApiService.ProcessOpenApiDocument); + transformCommand.SetHandler ( + OpenApiService.ProcessOpenApiDocument, descriptionOption, outputOption, versionOption, formatOption, logLevelOption, inlineOption, resolveExternalOption, filterByOperationIdsOption, filterByTagsOption, filterByCollectionOption); rootCommand.Add(transformCommand); rootCommand.Add(validateCommand); From 126e1d722c0ceae35367b91aa5325217c94aaed3 Mon Sep 17 00:00:00 2001 From: Darrel Miller Date: Wed, 2 Feb 2022 08:16:12 -0500 Subject: [PATCH 17/17] Updated versions to preview3 --- src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj | 2 +- src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj | 2 +- src/Microsoft.OpenApi/Microsoft.OpenApi.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index ea617ae94..9fe37bbc2 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -7,7 +7,7 @@ true hidi ./../../artifacts - 0.5.0-preview2 + 0.5.0-preview3 diff --git a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj index a594df10d..2f6bc75b9 100644 --- a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj +++ b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj @@ -10,7 +10,7 @@ Microsoft Microsoft.OpenApi.Readers Microsoft.OpenApi.Readers - 1.3.1-preview2 + 1.3.1-preview3 OpenAPI.NET Readers for JSON and YAML documents © Microsoft Corporation. All rights reserved. OpenAPI .NET diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj index d2839edc7..388cf45e2 100644 --- a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj +++ b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj @@ -11,7 +11,7 @@ Microsoft Microsoft.OpenApi Microsoft.OpenApi - 1.3.1-preview2 + 1.3.1-preview3 .NET models with JSON and YAML writers for OpenAPI specification © Microsoft Corporation. All rights reserved. OpenAPI .NET