From 487194f3c3435b876982921a38f194d49c04c582 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 17 Oct 2022 15:26:38 +0300 Subject: [PATCH 1/4] Add summary field to info object --- .../V3/OpenApiInfoDeserializer.cs | 6 ++++++ src/Microsoft.OpenApi/Models/OpenApiInfo.cs | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs index d5de92852..76419ce10 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs +++ b/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs @@ -29,6 +29,12 @@ internal static partial class OpenApiV3Deserializer o.Version = n.GetScalarValue(); } }, + { + "summary", (o, n) => + { + o.Summary = n.GetScalarValue(); + } + }, { "description", (o, n) => { diff --git a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs index df0aa0a49..910d097e3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; @@ -19,11 +18,16 @@ public class OpenApiInfo : IOpenApiSerializable, IOpenApiExtensible /// public string Title { get; set; } + /// + /// A short summary of the API. + /// + public string Summary { get; set; } + /// /// A short description of the application. /// public string Description { get; set; } - + /// /// REQUIRED. The version of the OpenAPI document. /// @@ -60,6 +64,7 @@ public OpenApiInfo() {} public OpenApiInfo(OpenApiInfo info) { Title = info?.Title ?? Title; + Summary = info?.Summary ?? Summary; Description = info?.Description ?? Description; Version = info?.Version ?? Version; TermsOfService = info?.TermsOfService ?? TermsOfService; @@ -83,6 +88,9 @@ public void SerializeAsV3(IOpenApiWriter writer) // title writer.WriteProperty(OpenApiConstants.Title, Title); + // summary + writer.WriteProperty(OpenApiConstants.Summary, Summary); + // description writer.WriteProperty(OpenApiConstants.Description, Description); From 8fc9e2af5d0f7e15796666e7e369a2495d421a7f Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 17 Oct 2022 16:14:46 +0300 Subject: [PATCH 2/4] Add summary field to input file and verify tests still pass --- .../Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs | 2 ++ .../V3Tests/Samples/OpenApiInfo/advancedInfo.yaml | 1 + .../V3Tests/Samples/OpenApiInfo/basicInfo.yaml | 1 + 3 files changed, 4 insertions(+) diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs index 29b23cb31..cb860338c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -41,6 +41,7 @@ public void ParseAdvancedInfoShouldSucceed() new OpenApiInfo { Title = "Advanced Info", + Summary = "Sample Summary", Description = "Sample Description", Version = "1.0.0", TermsOfService = new Uri("http://example.org/termsOfService"), @@ -101,6 +102,7 @@ public void ParseBasicInfoShouldSucceed() new OpenApiInfo { Title = "Basic Info", + Summary = "Sample Summary", Description = "Sample Description", Version = "1.0.1", TermsOfService = new Uri("http://swagger.io/terms/"), diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/advancedInfo.yaml b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/advancedInfo.yaml index 51288c257..1af4a41dd 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/advancedInfo.yaml +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/advancedInfo.yaml @@ -1,5 +1,6 @@ title: Advanced Info version: 1.0.0 +summary: Sample Summary description: Sample Description termsOfService: http://example.org/termsOfService contact: diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/basicInfo.yaml b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/basicInfo.yaml index d48905424..12eabe650 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/basicInfo.yaml +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiInfo/basicInfo.yaml @@ -1,5 +1,6 @@ { "title": "Basic Info", + "summary": "Sample Summary", "description": "Sample Description", "termsOfService": "http://swagger.io/terms/", "contact": { From 5bc9cb90cfa0056838c8f9cca3b9830f133b344a Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 17 Oct 2022 16:15:13 +0300 Subject: [PATCH 3/4] Add serialization tests --- .../Models/OpenApiInfoTests.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs index b2395a9ed..4f00525e9 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs @@ -8,6 +8,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using SharpYaml; using Xunit; namespace Microsoft.OpenApi.Tests.Models @@ -29,6 +30,14 @@ public class OpenApiInfoTests } }; + public static OpenApiInfo InfoWithSummary = new() + { + Title = "Sample Pet Store App", + Summary = "This is a sample server for a pet store.", + Description = "This is a sample server for a pet store.", + Version = "1.1.1", + }; + public static OpenApiInfo BasicInfo = new OpenApiInfo { Title = "Sample Pet Store App", @@ -101,6 +110,7 @@ public static IEnumerable AdvanceInfoJsonExpect() specVersion, @"{ ""title"": ""Sample Pet Store App"", + ""summary"": ""This is a sample server for a pet store."", ""description"": ""This is a sample server for a pet store."", ""termsOfService"": ""http://example.com/terms/"", ""contact"": { @@ -195,5 +205,43 @@ public void InfoVersionShouldAcceptDateStyledAsVersions() expected = expected.MakeLineBreaksEnvironmentNeutral(); actual.Should().Be(expected); } + + [Fact] + public void SerializeInfoObjectWithSummaryAsV3YamlWorks() + { + // Arrange + var expected = @"title: Sample Pet Store App +summary: This is a sample server for a pet store. +description: This is a sample server for a pet store. +version: '1.1.1'"; + + // Act + var actual = InfoWithSummary.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + + // Assert + actual = actual.MakeLineBreaksEnvironmentNeutral(); + expected = expected.MakeLineBreaksEnvironmentNeutral(); + Assert.Equal(expected, actual); + } + + [Fact] + public void SerializeInfoObjectWithSummaryAsV3JsonWorks() + { + // Arrange + var expected = @"{ + ""title"": ""Sample Pet Store App"", + ""summary"": ""This is a sample server for a pet store."", + ""description"": ""This is a sample server for a pet store."", + ""version"": ""1.1.1"" +}"; + + // Act + var actual = InfoWithSummary.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + + // Assert + actual = actual.MakeLineBreaksEnvironmentNeutral(); + expected = expected.MakeLineBreaksEnvironmentNeutral(); + Assert.Equal(expected, actual); + } } } From ca924a949578d7d48918eecbf053014d9ab76e8a Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Mon, 17 Oct 2022 17:00:42 +0300 Subject: [PATCH 4/4] Remove unnecessary value assignments --- src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs | 2 -- src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs | 3 --- .../V3/OpenApiResponseDeserializer.cs | 1 - src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs | 4 +--- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs b/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs index 4bb15a8d9..f16aa4091 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs +++ b/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs @@ -113,8 +113,6 @@ private static void ProcessAnyMapFields( { try { - var newProperty = new List(); - mapNode.Context.StartObject(anyMapFieldName); foreach (var propertyMapElement in anyMapFieldMap[anyMapFieldName].PropertyMapGetter(domainObject)) diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs index 76419ce10..073c3d95f 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs +++ b/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs @@ -69,10 +69,7 @@ internal static partial class OpenApiV3Deserializer public static OpenApiInfo LoadInfo(ParseNode node) { var mapNode = node.CheckMapNode("Info"); - var info = new OpenApiInfo(); - var required = new List { "title", "version" }; - ParseMap(mapNode, info, InfoFixedFields, InfoPatternFields); return info; diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs index 70ea0c9bf..9034a407b 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs +++ b/src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs @@ -58,7 +58,6 @@ public static OpenApiResponse LoadResponse(ParseNode node) return mapNode.GetReferencedObject(ReferenceType.Response, pointer); } - var requiredFields = new List { "description" }; var response = new OpenApiResponse(); ParseMap(mapNode, response, _responseFixedFields, _responsePatternFields); diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs b/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs index 9689c8fe1..e73f94ea9 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs +++ b/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs @@ -108,9 +108,7 @@ private static void ProcessAnyMapFields( foreach (var anyMapFieldName in anyMapFieldMap.Keys.ToList()) { try - { - var newProperty = new List(); - + { mapNode.Context.StartObject(anyMapFieldName); foreach (var propertyMapElement in anyMapFieldMap[anyMapFieldName].PropertyMapGetter(domainObject))