From fdbee8ffda661bec742bac157aac6dc4e0eb4384 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 19 Jan 2022 07:11:00 +0300 Subject: [PATCH 01/20] Update input parameter description --- src/Microsoft.OpenApi.Hidi/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index 533878a0d..812b7d58b 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -23,7 +23,7 @@ static async Task Main(string[] args) var transformCommand = new Command("transform") { - new Option("--input", "Input OpenAPI description file path or URL", typeof(string) ), + new Option("--input", "Input OpenAPI description, JSON or CSDL file path or URL", typeof(string) ), new Option("--output","Output OpenAPI description file", typeof(FileInfo), arity: ArgumentArity.ZeroOrOne), new Option("--version", "OpenAPI specification version", typeof(OpenApiSpecVersion)), new Option("--format", "File format",typeof(OpenApiFormat) ), From 7f88a35b4db1cf4d75a3cfc7f93c3eec99293d06 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 19 Jan 2022 07:12:54 +0300 Subject: [PATCH 02/20] Add OData conversion libraries --- src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index b13c9dc18..ea9ee08d1 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -10,6 +10,8 @@ + + From e0f0ed66f9299abfee8e1f7269b4af4c517ff7b4 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 19 Jan 2022 07:13:06 +0300 Subject: [PATCH 03/20] Add necessary usings --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 486666568..5e02e8fc4 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -7,8 +7,12 @@ using System.Net; using System.Net.Http; using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.OData.Edm.Csdl; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.OData; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Validations; From c2ae2dd0ab7b3f858ec9b8e11413027b61937f00 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 19 Jan 2022 07:13:58 +0300 Subject: [PATCH 04/20] Add method for CSDL to OpenAPI conversion --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 5e02e8fc4..e4b7c90cc 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -106,6 +106,49 @@ public static void ProcessOpenApiDocument( textWriter.Flush(); } + /// + /// Converts CSDL to OpenAPI + /// + /// The CSDL stream. + /// An OpenAPI document. + public static OpenApiDocument ConvertCsdlToOpenApi(Stream csdl) + { + using var reader = new StreamReader(csdl); + var csdlText = reader.ReadToEndAsync().GetAwaiter().GetResult(); + var edmModel = CsdlReader.Parse(XElement.Parse(csdlText).CreateReader()); + + var settings = new OpenApiConvertSettings() + { + EnableKeyAsSegment = true, + EnableOperationId = true, + PrefixEntityTypeNameBeforeKey = true, + TagDepth = 2, + EnablePagination = true, + EnableDiscriminatorValue = false, + EnableDerivedTypesReferencesForRequestBody = false, + EnableDerivedTypesReferencesForResponses = false, + ShowRootPath = true, + ShowLinks = true + }; + OpenApiDocument document = edmModel.ConvertToOpenApi(settings); + + document = FixReferences(document); + + return document; + } + + public static OpenApiDocument FixReferences(OpenApiDocument document) + { + // This method is only needed because the output of ConvertToOpenApi isn't quite a valid OpenApiDocument instance. + // So we write it out, and read it back in again to fix it up. + + var sb = new StringBuilder(); + document.SerializeAsV3(new OpenApiYamlWriter(new StringWriter(sb))); + var doc = new OpenApiStringReader().Read(sb.ToString(), out _); + + return doc; + } + private static Stream GetStream(string input) { Stream stream; From 07169a4dac80ed7f6bc0f78a7089bcba38d552c2 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 20 Jan 2022 18:45:57 +0300 Subject: [PATCH 05/20] Check input file for .xml extension --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index e4b7c90cc..bb66f4158 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -46,6 +46,13 @@ public static void ProcessOpenApiDocument( } var stream = GetStream(input); + OpenApiDocument document; + + if (input.Contains("xml")) + { + document = ConvertCsdlToOpenApi(stream); + } + var result = new OpenApiStreamReader(new OpenApiReaderSettings { ReferenceResolution = resolveExternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences, @@ -53,9 +60,8 @@ public static void ProcessOpenApiDocument( } ).ReadAsync(stream).GetAwaiter().GetResult(); - OpenApiDocument document; document = result.OpenApiDocument; - + // Check if filter options are provided, then execute if (!string.IsNullOrEmpty(filterByOperationIds) && !string.IsNullOrEmpty(filterByTags)) { From 581023c6d991ee12ffffe93f31cb9a16e623eeca Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 25 Jan 2022 09:57:38 +0300 Subject: [PATCH 06/20] Clean up code --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 23 ++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 17920ea6d..3fbcde7fa 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -9,7 +9,6 @@ using System.Net.Http; using System.Text; using System.Text.Json; -using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.OData.Edm.Csdl; using Microsoft.OpenApi.Extensions; @@ -49,21 +48,27 @@ public static void ProcessOpenApiDocument( } var stream = GetStream(input); + + ReadResult result = null; + OpenApiDocument document; - if (input.Contains("xml")) + if (input.Contains(".xml")) { document = ConvertCsdlToOpenApi(stream); } - - var result = new OpenApiStreamReader(new OpenApiReaderSettings + else { - ReferenceResolution = resolveExternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences, - RuleSet = ValidationRuleSet.GetDefaultRuleSet() - } - ).ReadAsync(stream).GetAwaiter().GetResult(); + result = new OpenApiStreamReader(new OpenApiReaderSettings + { + ReferenceResolution = resolveExternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences, + RuleSet = ValidationRuleSet.GetDefaultRuleSet() + } + ).ReadAsync(stream).GetAwaiter().GetResult(); - document = result.OpenApiDocument; + document = result.OpenApiDocument; + } + Func predicate; // Check if filter options are provided, then execute From 7606916c19f1b1a9ca52d6e9b9834fcf53186c7a Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 25 Jan 2022 16:25:05 +0300 Subject: [PATCH 07/20] Refactor 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 3fbcde7fa..25faa1b28 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -67,6 +67,20 @@ public static void ProcessOpenApiDocument( ).ReadAsync(stream).GetAwaiter().GetResult(); document = result.OpenApiDocument; + + var context = result.OpenApiDiagnostic; + + if (context.Errors.Count > 0) + { + var errorReport = new StringBuilder(); + + foreach (var error in context.Errors) + { + errorReport.AppendLine(error.ToString()); + } + + throw new ArgumentException(string.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray())); + } } Func predicate; @@ -94,21 +108,7 @@ public static void ProcessOpenApiDocument( predicate = OpenApiFilterService.CreatePredicate(requestUrls: requestUrls, source:document); document = OpenApiFilterService.CreateFilteredDocument(document, predicate); } - - var context = result.OpenApiDiagnostic; - - if (context.Errors.Count > 0) - { - var errorReport = new StringBuilder(); - - foreach (var error in context.Errors) - { - errorReport.AppendLine(error.ToString()); - } - - throw new ArgumentException(string.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray())); - } - + using var outputStream = output?.Create(); var textWriter = outputStream != null ? new StreamWriter(outputStream) : Console.Out; From cb8ef3a530dd1516f2fd15e3c6ca4251dd3b8fe2 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 26 Jan 2022 10:37:03 +0300 Subject: [PATCH 08/20] Add check for .csdl files --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 25faa1b28..782f16e88 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -53,7 +53,7 @@ public static void ProcessOpenApiDocument( OpenApiDocument document; - if (input.Contains(".xml")) + if (input.Contains(".xml") || input.Contains(".csdl")) { document = ConvertCsdlToOpenApi(stream); } From 73339e10f04af0794ccf3f6728acc1e0aa09e1f0 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 26 Jan 2022 10:37:54 +0300 Subject: [PATCH 09/20] Add a sample csdl file for testing and copy to output directory --- .../Microsoft.OpenApi.Tests.csproj | 3 +++ .../UtilityFiles/Todo.xml | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/Microsoft.OpenApi.Tests/UtilityFiles/Todo.xml diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 56bdd0983..3e8295902 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -43,5 +43,8 @@ Always + + Always + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/UtilityFiles/Todo.xml b/test/Microsoft.OpenApi.Tests/UtilityFiles/Todo.xml new file mode 100644 index 000000000..b3b07debf --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/UtilityFiles/Todo.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + From 7ec682b656eda14f99a56d499f78e981ce9a218a Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 26 Jan 2022 10:38:17 +0300 Subject: [PATCH 10/20] Add csdl conversion tests --- .../Services/OpenApiCSDLConversionTests.cs | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 test/Microsoft.OpenApi.Tests/Services/OpenApiCSDLConversionTests.cs diff --git a/test/Microsoft.OpenApi.Tests/Services/OpenApiCSDLConversionTests.cs b/test/Microsoft.OpenApi.Tests/Services/OpenApiCSDLConversionTests.cs new file mode 100644 index 000000000..969fe325c --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Services/OpenApiCSDLConversionTests.cs @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.IO; +using Microsoft.OpenApi.Hidi; +using Microsoft.OpenApi.Services; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Services +{ + public class OpenApiCSDLConversionTests + { + [Fact] + public void ReturnConvertedCSDLFile() + { + // Arrange + var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UtilityFiles\\Todo.xml"); + var fileInput = new FileInfo(filePath); + var csdlStream = fileInput.OpenRead(); + + // Act + var openApiDoc = OpenApiService.ConvertCsdlToOpenApi(csdlStream); + var expectedPathCount = 5; + + // Assert + Assert.NotNull(openApiDoc); + Assert.NotEmpty(openApiDoc.Paths); + Assert.Equal(openApiDoc.Paths.Count, expectedPathCount); + } + + [Theory] + [InlineData("Todos.Todo.UpdateTodo",null, 1)] + [InlineData("Todos.Todo.ListTodo",null, 1)] + [InlineData(null, "Todos.Todo", 4)] + public void ReturnFilteredOpenApiDocumentBasedOnOperationIdsAndInputCsdlDocument(string operationIds, string tags, int expectedPathCount) + { + // Arrange + var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UtilityFiles\\Todo.xml"); + var fileInput = new FileInfo(filePath); + var csdlStream = fileInput.OpenRead(); + + // Act + var openApiDoc = OpenApiService.ConvertCsdlToOpenApi(csdlStream); + var predicate = OpenApiFilterService.CreatePredicate(operationIds, tags); + var subsetOpenApiDocument = OpenApiFilterService.CreateFilteredDocument(openApiDoc, predicate); + + // Assert + Assert.NotNull(subsetOpenApiDocument); + Assert.NotEmpty(subsetOpenApiDocument.Paths); + Assert.Equal(expectedPathCount, subsetOpenApiDocument.Paths.Count); + } + } +} From b13c3adbc6b4907cbc79313b1d7d3d329ce6c9fd Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 26 Jan 2022 10:51:27 +0300 Subject: [PATCH 11/20] Add xml documentation --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 782f16e88..8dcb0d22d 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -162,6 +162,11 @@ public static OpenApiDocument ConvertCsdlToOpenApi(Stream csdl) return document; } + /// + /// Fixes the references in the resulting OpenApiDocument. + /// + /// The converted OpenApiDocument. + /// A valid OpenApiDocument instance. public static OpenApiDocument FixReferences(OpenApiDocument document) { // This method is only needed because the output of ConvertToOpenApi isn't quite a valid OpenApiDocument instance. From 66c06b6d4c4061629eb06751a4b5b184e9d7e9b9 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 27 Jan 2022 19:14:09 +0300 Subject: [PATCH 12/20] Add --csdl input param for converting csdl files --- src/Microsoft.OpenApi.Hidi/Program.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index e5865d464..77781a33f 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -19,6 +19,9 @@ static async Task Main(string[] args) var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL", typeof(string)); descriptionOption.AddAlias("-d"); + var csdlOption = new Option("--csdl", "Input CSDL file path or URL", typeof(string)); + csdlOption.AddAlias("-cs"); + var outputOption = new Option("--output", "The output directory path for the generated file.", typeof(FileInfo), () => "./output", arity: ArgumentArity.ZeroOrOne); outputOption.AddAlias("-o"); @@ -52,6 +55,7 @@ static async Task Main(string[] args) var transformCommand = new Command("transform") { descriptionOption, + csdlOption, outputOption, versionOption, formatOption, @@ -61,7 +65,7 @@ static async Task Main(string[] args) filterByTagsOption, filterByCollectionOption }; - transformCommand.Handler = CommandHandler.Create( + transformCommand.Handler = CommandHandler.Create( OpenApiService.ProcessOpenApiDocument); rootCommand.Add(transformCommand); From 1b40298b5db0fb91e266a95afaf7e37d6cc21fbe Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 27 Jan 2022 19:14:29 +0300 Subject: [PATCH 13/20] Refactor code --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 39 +++++++++++--------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 22f02cf57..653be79e4 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -25,6 +25,7 @@ public static class OpenApiService { public static void ProcessOpenApiDocument( string openapi, + string csdl, FileInfo output, OpenApiSpecVersion? version, OpenApiFormat? format, @@ -34,9 +35,9 @@ public static void ProcessOpenApiDocument( bool inline, bool resolveexternal) { - if (string.IsNullOrEmpty(openapi)) + if (string.IsNullOrEmpty(openapi) && string.IsNullOrEmpty(csdl)) { - throw new ArgumentNullException(nameof(openapi)); + throw new ArgumentNullException("Please input a file path"); } if(output == null) { @@ -47,21 +48,25 @@ 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); - - ReadResult result = null; - + Stream stream; OpenApiDocument document; + OpenApiFormat openApiFormat; - if (input.Contains(".xml") || input.Contains(".csdl")) + if (!string.IsNullOrEmpty(csdl)) { - document = ConvertCsdlToOpenApi(stream); + // Default to yaml during csdl to OpenApi conversion + openApiFormat = format ?? GetOpenApiFormat(csdl); + + stream = GetStream(csdl); + document = ConvertCsdlToOpenApi(stream); } else { - result = new OpenApiStreamReader(new OpenApiReaderSettings + 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(); @@ -81,8 +86,11 @@ public static void ProcessOpenApiDocument( throw new ArgumentException(string.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray())); } + + openApiFormat = format ?? GetOpenApiFormat(openapi); + version ??= result.OpenApiDiagnostic.SpecificationVersion; } - + Func predicate; // Check if filter options are provided, then execute @@ -100,7 +108,6 @@ public static void ProcessOpenApiDocument( predicate = OpenApiFilterService.CreatePredicate(tags: filterbytags); document = OpenApiFilterService.CreateFilteredDocument(document, predicate); } - if (!string.IsNullOrEmpty(filterbycollection)) { var fileStream = GetStream(filterbycollection); @@ -118,15 +125,13 @@ public static void ProcessOpenApiDocument( ReferenceInline = inline ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences }; - var openApiFormat = format ?? GetOpenApiFormat(openapi); - var openApiVersion = version ?? result.OpenApiDiagnostic.SpecificationVersion; IOpenApiWriter writer = openApiFormat switch { OpenApiFormat.Json => new OpenApiJsonWriter(textWriter, settings), OpenApiFormat.Yaml => new OpenApiYamlWriter(textWriter, settings), _ => throw new ArgumentException("Unknown format"), }; - document.Serialize(writer, openApiVersion); + document.Serialize(writer, (OpenApiSpecVersion)version); textWriter.Flush(); } @@ -139,7 +144,7 @@ public static void ProcessOpenApiDocument( public static OpenApiDocument ConvertCsdlToOpenApi(Stream csdl) { using var reader = new StreamReader(csdl); - var csdlText = reader.ReadToEndAsync().GetAwaiter().GetResult(); + var csdlText = reader.ReadToEndAsync().GetAwaiter().GetResult(); var edmModel = CsdlReader.Parse(XElement.Parse(csdlText).CreateReader()); var settings = new OpenApiConvertSettings() @@ -179,7 +184,7 @@ public static OpenApiDocument FixReferences(OpenApiDocument document) return doc; } - private static Stream GetStream(string input) + private static Stream GetStream(string openapi) { Stream stream; if (openapi.StartsWith("http")) From ef7640ffc351fca80ddde7a77421412fec590ae7 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 27 Jan 2022 19:17:02 +0300 Subject: [PATCH 14/20] Rename test file --- .../{OpenApiCSDLConversionTests.cs => OpenApiServiceTests.cs} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename test/Microsoft.OpenApi.Tests/Services/{OpenApiCSDLConversionTests.cs => OpenApiServiceTests.cs} (90%) diff --git a/test/Microsoft.OpenApi.Tests/Services/OpenApiCSDLConversionTests.cs b/test/Microsoft.OpenApi.Tests/Services/OpenApiServiceTests.cs similarity index 90% rename from test/Microsoft.OpenApi.Tests/Services/OpenApiCSDLConversionTests.cs rename to test/Microsoft.OpenApi.Tests/Services/OpenApiServiceTests.cs index 969fe325c..1b94a3557 100644 --- a/test/Microsoft.OpenApi.Tests/Services/OpenApiCSDLConversionTests.cs +++ b/test/Microsoft.OpenApi.Tests/Services/OpenApiServiceTests.cs @@ -9,7 +9,7 @@ namespace Microsoft.OpenApi.Tests.Services { - public class OpenApiCSDLConversionTests + public class OpenApiServiceTests { [Fact] public void ReturnConvertedCSDLFile() @@ -33,7 +33,7 @@ public void ReturnConvertedCSDLFile() [InlineData("Todos.Todo.UpdateTodo",null, 1)] [InlineData("Todos.Todo.ListTodo",null, 1)] [InlineData(null, "Todos.Todo", 4)] - public void ReturnFilteredOpenApiDocumentBasedOnOperationIdsAndInputCsdlDocument(string operationIds, string tags, int expectedPathCount) + public void ReturnFilteredOpenApiDocBasedOnOperationIdsAndInputCsdlDocument(string operationIds, string tags, int expectedPathCount) { // Arrange var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UtilityFiles\\Todo.xml"); From 51e85a7a24c446659faf4221130f7eb403b6c898 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 27 Jan 2022 19:26:46 +0300 Subject: [PATCH 15/20] Refactor param to be more 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 653be79e4..3013da5e9 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -184,10 +184,10 @@ public static OpenApiDocument FixReferences(OpenApiDocument document) return doc; } - 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() { @@ -196,11 +196,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 5550f01d766013209f1ac8a68468a5ad3c9be224 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Thu, 3 Feb 2022 17:04:34 +0300 Subject: [PATCH 16/20] Clean up code --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 10 +++++----- src/Microsoft.OpenApi.Hidi/Program.cs | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 19a4f28c5..5b0e5d15b 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -83,21 +83,21 @@ string filterbycollection Stream stream; OpenApiDocument document; OpenApiFormat openApiFormat; + var stopwatch = new Stopwatch(); if (!string.IsNullOrEmpty(csdl)) { // Default to yaml during csdl to OpenApi conversion - openApiFormat = format ?? GetOpenApiFormat(csdl); + openApiFormat = format ?? GetOpenApiFormat(csdl, logger); - stream = GetStream(csdl); + stream = await GetStream(csdl, logger); document = ConvertCsdlToOpenApi(stream); } else { - stream = GetStream(openapi, logger); + stream = await GetStream(openapi, logger); // Parsing OpenAPI file - var stopwatch = new Stopwatch(); stopwatch.Start(); logger.LogTrace("Parsing OpenApi file"); var result = new OpenApiStreamReader(new OpenApiReaderSettings @@ -126,7 +126,7 @@ string filterbycollection logger.LogTrace("{timestamp}ms: Parsed OpenApi successfully. {count} paths found.", stopwatch.ElapsedMilliseconds, document.Paths.Count); } - openApiFormat = format ?? GetOpenApiFormat(openapi); + openApiFormat = format ?? GetOpenApiFormat(openapi, logger); version ??= result.OpenApiDiagnostic.SpecificationVersion; } diff --git a/src/Microsoft.OpenApi.Hidi/Program.cs b/src/Microsoft.OpenApi.Hidi/Program.cs index df8d26fa1..95e6f63f2 100644 --- a/src/Microsoft.OpenApi.Hidi/Program.cs +++ b/src/Microsoft.OpenApi.Hidi/Program.cs @@ -19,7 +19,7 @@ static async Task Main(string[] args) var descriptionOption = new Option("--openapi", "Input OpenAPI description file path or URL"); descriptionOption.AddAlias("-d"); - var csdlOption = new Option("--csdl", "Input CSDL file path or URL", typeof(string)); + var csdlOption = new Option("--csdl", "Input CSDL file path or URL"); csdlOption.AddAlias("-cs"); var outputOption = new Option("--output", () => new FileInfo("./output"), "The output directory path for the generated file.") { Arity = ArgumentArity.ZeroOrOne }; @@ -72,8 +72,8 @@ static async Task Main(string[] args) resolveExternalOption, }; - transformCommand.SetHandler ( - OpenApiService.ProcessOpenApiDocument, descriptionOption, outputOption, versionOption, formatOption, logLevelOption, inlineOption, resolveExternalOption, filterByOperationIdsOption, filterByTagsOption, filterByCollectionOption); + transformCommand.SetHandler ( + OpenApiService.ProcessOpenApiDocument, descriptionOption, csdlOption, outputOption, versionOption, formatOption, logLevelOption, inlineOption, resolveExternalOption, filterByOperationIdsOption, filterByTagsOption, filterByCollectionOption); rootCommand.Add(transformCommand); rootCommand.Add(validateCommand); From b8d0d2b42fc69b3e615c1166ea04eaf5191db0ab Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Fri, 4 Feb 2022 10:25:41 +0300 Subject: [PATCH 17/20] Default to V3 of OpenApi during document serialization --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 5b0e5d15b..f10a6f8ac 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -87,8 +87,9 @@ string filterbycollection if (!string.IsNullOrEmpty(csdl)) { - // Default to yaml during csdl to OpenApi conversion + // Default to yaml and OpenApiVersion 3 during csdl to OpenApi conversion openApiFormat = format ?? GetOpenApiFormat(csdl, logger); + version ??= OpenApiSpecVersion.OpenApi3_0; stream = await GetStream(csdl, logger); document = ConvertCsdlToOpenApi(stream); From 385e5af9872c70cab4dfb056b97572dc8c9b0fc6 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Fri, 4 Feb 2022 10:26:00 +0300 Subject: [PATCH 18/20] Clean up --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index f10a6f8ac..964329aaf 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -356,10 +356,10 @@ internal static async void ValidateOpenApiDocument(string openapi, LogLevel logl Console.WriteLine(statsVisitor.GetStatisticsReport()); } - private static OpenApiFormat GetOpenApiFormat(string openapi, ILogger logger) + private static OpenApiFormat GetOpenApiFormat(string input, ILogger logger) { logger.LogTrace("Getting the OpenApi format"); - return !openapi.StartsWith("http") && Path.GetExtension(openapi) == ".json" ? OpenApiFormat.Json : OpenApiFormat.Yaml; + return !input.StartsWith("http") && Path.GetExtension(input) == ".json" ? OpenApiFormat.Json : OpenApiFormat.Yaml; } private static ILogger ConfigureLoggerInstance(LogLevel loglevel) From 53c4e2c225de1b0d4fc3cb59e3025784ba147ea7 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 7 Feb 2022 10:00:35 +0300 Subject: [PATCH 19/20] Update package version --- src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index 3e2b209b4..4b3054786 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -17,7 +17,7 @@ - + From 36a11bb662d1f9ad4a2bfa66d40f98662551c817 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Tue, 8 Feb 2022 15:00:21 +0300 Subject: [PATCH 20/20] Add package icon and description --- src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index bd22e6361..70a39df3a 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -5,6 +5,7 @@ netcoreapp3.1 9.0 true + http://go.microsoft.com/fwlink/?LinkID=288890 https://github.com/Microsoft/OpenAPI.NET MIT true @@ -15,6 +16,7 @@ hidi ./../../artifacts 0.5.0-preview4 + OpenAPI.NET CLI tool for slicing OpenAPI documents © Microsoft Corporation. All rights reserved. OpenAPI .NET https://github.com/Microsoft/OpenAPI.NET