From 7405f3c0c2d48b9b124a28796c3a7e9bce909aa7 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 23 Jan 2025 08:56:00 -0500 Subject: [PATCH 1/3] feat: makes the reference interface covariant Signed-off-by: Vincent Biret --- .../Interfaces/IOpenApiReferenceableWithTarget.cs | 2 +- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs index fc4c1daed..85bc1987d 100644 --- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs @@ -7,7 +7,7 @@ namespace Microsoft.OpenApi.Interfaces /// A generic interface for OpenApiReferenceable objects that have a target. /// /// - public interface IOpenApiReferenceableWithTarget : IOpenApiReferenceable + public interface IOpenApiReferenceableWithTarget : IOpenApiReferenceable { /// /// Gets the resolved target object. diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 887fb3db8..4ffbcd4ff 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -223,7 +223,7 @@ namespace Microsoft.OpenApi.Interfaces Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } bool UnresolvedReference { get; set; } } - public interface IOpenApiReferenceableWithTarget : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public interface IOpenApiReferenceableWithTarget : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { T Target { get; } } From dc8a7572ec436c1ed35f5a6208c6aa868702dc0f Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 23 Jan 2025 09:56:54 -0500 Subject: [PATCH 2/3] fix: visibility of serialize internal methods Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Models/OpenApiExample.cs | 2 +- src/Microsoft.OpenApi/Models/OpenApiParameter.cs | 2 +- src/Microsoft.OpenApi/Models/OpenApiResponse.cs | 2 +- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 4 +--- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 2 -- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index 1fc7ca900..594813765 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -97,7 +97,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) /// /// /// - public void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version) + private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version) { Utils.CheckArgumentNull(writer); diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index bdaba739e..a7db89ef2 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -358,7 +358,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer) foreach (var example in Examples) { writer.WritePropertyName(example.Key); - example.Value.SerializeInternal(writer, OpenApiSpecVersion.OpenApi2_0); + example.Value.SerializeAsV2(writer); } writer.WriteEndObject(); } diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index 2fab33fd5..0aed7bb0d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -162,7 +162,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer) .SelectMany(mediaTypePair => mediaTypePair.Value.Examples)) { writer.WritePropertyName(example.Key); - example.Value.SerializeInternal(writer, OpenApiSpecVersion.OpenApi2_0); + example.Value.SerializeAsV2(writer); } writer.WriteEndObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index dcab7de86..5d1fb9ee2 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -411,9 +411,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } -/// - - public void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, + private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 4ffbcd4ff..396feddeb 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -614,7 +614,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeInternal(Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion version) { } } public abstract class OpenApiExtensibleDictionary : System.Collections.Generic.Dictionary, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable @@ -927,7 +926,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeInternal(Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion version, System.Action callback) { } } public class OpenApiSecurityRequirement : System.Collections.Generic.Dictionary>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { From cc28ff27446dae0fc0e9f9f44dafd6df6e8fc243 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 24 Jan 2025 13:17:42 -0500 Subject: [PATCH 3/3] fix: proxy design pattern implementation for OpenAPiExample Signed-off-by: Vincent Biret --- .../OpenApiReferencableExtensions.cs | 27 ++-- .../Interfaces/IOpenApiReadOnlyExtensible.cs | 15 +++ .../Interfaces/IOpenApiReferenceHolder.cs | 47 +++++++ .../Interfaces/IOpenApiReferenceable.cs | 11 -- .../IOpenApiReferenceableWithTarget.cs | 17 --- .../Interfaces/IOpenApiDescribedElement.cs | 20 +++ .../Models/Interfaces/IOpenApiExample.cs | 26 ++++ .../Models/OpenApiComponents.cs | 7 +- .../Models/OpenApiDocument.cs | 10 +- .../Models/OpenApiExample.cs | 83 +++--------- src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 5 +- .../Models/OpenApiMediaType.cs | 7 +- .../Models/OpenApiParameter.cs | 5 +- .../Models/OpenApiReference.cs | 2 +- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 4 +- src/Microsoft.OpenApi/Models/OpenApiTag.cs | 2 +- .../References/OpenApiCallbackReference.cs | 2 +- .../References/OpenApiExampleReference.cs | 98 +++++++++----- .../References/OpenApiHeaderReference.cs | 5 +- .../Models/References/OpenApiLinkReference.cs | 2 +- .../References/OpenApiParameterReference.cs | 5 +- .../References/OpenApiPathItemReference.cs | 2 +- .../References/OpenApiRequestBodyReference.cs | 2 +- .../References/OpenApiResponseReference.cs | 2 +- .../References/OpenApiSchemaReference.cs | 2 +- .../OpenApiSecuritySchemeReference.cs | 2 +- .../Models/References/OpenApiTagReference.cs | 2 +- .../Reader/ParseNodes/MapNode.cs | 2 +- .../OpenApiRemoteReferenceCollector.cs | 9 +- .../Reader/V2/OpenApiParameterDeserializer.cs | 3 +- .../Reader/V2/OpenApiResponseDeserializer.cs | 9 +- .../Reader/V3/OpenApiExampleDeserializer.cs | 3 +- .../Reader/V3/OpenApiMediaTypeDeserializer.cs | 5 +- .../Reader/V3/OpenApiParameterDeserializer.cs | 5 +- .../Reader/V31/OpenApiExampleDeserializer.cs | 3 +- .../V31/OpenApiMediaTypeDeserializer.cs | 9 +- .../V31/OpenApiParameterDeserializer.cs | 9 +- .../Services/CopyReferences.cs | 18 ++- .../Services/OpenApiVisitorBase.cs | 15 ++- .../Services/OpenApiWalker.cs | 72 +++++----- .../Services/ReferenceHostDocumentSetter.cs | 11 +- .../Validations/OpenApiValidator.cs | 11 +- .../Rules/OpenApiNonDefaultRules.cs | 3 +- .../Services/OpenApiFilterServiceTests.cs | 4 +- .../V3Tests/OpenApiDocumentTests.cs | 2 +- .../V3Tests/OpenApiMediaTypeTests.cs | 4 +- .../V3Tests/OpenApiParameterTests.cs | 4 +- .../Models/OpenApiMediaTypeTests.cs | 5 +- .../Models/OpenApiParameterTests.cs | 12 +- .../PublicApi/PublicApi.approved.txt | 123 +++++++++++------- .../OpenApiHeaderValidationTests.cs | 8 +- .../OpenApiMediaTypeValidationTests.cs | 8 +- .../OpenApiParameterValidationTests.cs | 8 +- .../Visitors/InheritanceTests.cs | 19 +-- .../Walkers/WalkerLocationTests.cs | 2 +- .../Workspaces/OpenApiReferencableTests.cs | 4 +- 56 files changed, 462 insertions(+), 340 deletions(-) create mode 100644 src/Microsoft.OpenApi/Interfaces/IOpenApiReadOnlyExtensible.cs create mode 100644 src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs delete mode 100644 src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs create mode 100644 src/Microsoft.OpenApi/Models/Interfaces/IOpenApiDescribedElement.cs create mode 100644 src/Microsoft.OpenApi/Models/Interfaces/IOpenApiExample.cs diff --git a/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs b/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs index aca76f979..3a160b135 100644 --- a/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs +++ b/src/Microsoft.OpenApi/Extensions/OpenApiReferencableExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using System.Linq; using Microsoft.OpenApi.Exceptions; @@ -13,7 +14,7 @@ namespace Microsoft.OpenApi.Extensions /// /// Extension methods for resolving references on elements. /// - public static class OpenApiReferencableExtensions + public static class OpenApiReferenceableExtensions { /// /// Resolves a JSON Pointer with respect to an element, returning the referenced element. @@ -57,13 +58,15 @@ private static IOpenApiReferenceable ResolveReferenceOnHeaderElement( string mapKey, JsonPointer pointer) { - switch (propertyName) + if (OpenApiConstants.Examples.Equals(propertyName, StringComparison.Ordinal) && + !string.IsNullOrEmpty(mapKey) && + headerElement?.Examples != null && + headerElement.Examples.TryGetValue(mapKey, out var exampleElement) && + exampleElement is IOpenApiReferenceable referenceable) { - case OpenApiConstants.Examples when mapKey != null: - return headerElement.Examples[mapKey]; - default: - throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer)); + return referenceable; } + throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer)); } private static IOpenApiReferenceable ResolveReferenceOnParameterElement( @@ -72,13 +75,15 @@ private static IOpenApiReferenceable ResolveReferenceOnParameterElement( string mapKey, JsonPointer pointer) { - switch (propertyName) + if (OpenApiConstants.Examples.Equals(propertyName, StringComparison.Ordinal) && + !string.IsNullOrEmpty(mapKey) && + parameterElement?.Examples != null && + parameterElement.Examples.TryGetValue(mapKey, out var exampleElement) && + exampleElement is IOpenApiReferenceable referenceable) { - case OpenApiConstants.Examples when mapKey != null: - return parameterElement.Examples[mapKey]; - default: - throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer)); + return referenceable; } + throw new OpenApiException(string.Format(SRResource.InvalidReferenceId, pointer)); } private static IOpenApiReferenceable ResolveReferenceOnResponseElement( diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReadOnlyExtensible.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReadOnlyExtensible.cs new file mode 100644 index 000000000..367c84a96 --- /dev/null +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReadOnlyExtensible.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace Microsoft.OpenApi.Interfaces; + +/// +/// Represents an Extensible Open API element elements can be rad from. +/// +public interface IOpenApiReadOnlyExtensible +{ + /// + /// Specification extensions. + /// + IDictionary Extensions { get; } + +} diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs new file mode 100644 index 000000000..99b5dde2d --- /dev/null +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.OpenApi.Models; + +namespace Microsoft.OpenApi.Interfaces +{ + /// + /// A generic interface for OpenApiReferenceable objects that have a target. + /// + /// Type of the target being referenced + public interface IOpenApiReferenceHolder : IOpenApiReferenceHolder where T : IOpenApiReferenceable + { + /// + /// Gets the resolved target object. + /// + T Target { get; } + } + /// + /// A generic interface for OpenApiReferenceable objects that have a target. + /// + /// The type of the target being referenced + /// The type of the interface implemented by both the target and the reference type + public interface IOpenApiReferenceHolder : IOpenApiReferenceHolder where T : IOpenApiReferenceable, V + { + //TODO merge this interface with the previous once all implementations are updated + /// + /// Copy the reference as a target element with overrides. + /// + V CopyReferenceAsTargetElementWithOverrides(V source); + } + /// + /// A generic interface for OpenApiReferenceable objects that have a target. + /// + public interface IOpenApiReferenceHolder : IOpenApiSerializable + { + /// + /// Indicates if object is populated with data or is just a reference to the data + /// + bool UnresolvedReference { get; set; } + + /// + /// Reference object. + /// + OpenApiReference Reference { get; set; } + } +} diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs index 43088bf6b..38e888dc8 100644 --- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using Microsoft.OpenApi.Models; - namespace Microsoft.OpenApi.Interfaces { /// @@ -10,14 +8,5 @@ namespace Microsoft.OpenApi.Interfaces /// public interface IOpenApiReferenceable : IOpenApiSerializable { - /// - /// Indicates if object is populated with data or is just a reference to the data - /// - bool UnresolvedReference { get; set; } - - /// - /// Reference object. - /// - OpenApiReference Reference { get; set; } } } diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs deleted file mode 100644 index 85bc1987d..000000000 --- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -namespace Microsoft.OpenApi.Interfaces -{ - /// - /// A generic interface for OpenApiReferenceable objects that have a target. - /// - /// - public interface IOpenApiReferenceableWithTarget : IOpenApiReferenceable - { - /// - /// Gets the resolved target object. - /// - T Target { get; } - } -} diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiDescribedElement.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiDescribedElement.cs new file mode 100644 index 000000000..76a945548 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiDescribedElement.cs @@ -0,0 +1,20 @@ +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.Interfaces; + +/// +/// Describes an element that has a summary and description. +/// +public interface IOpenApiDescribedElement : IOpenApiElement +{ + /// + /// Short description for the example. + /// + public string Summary { get; set; } + + /// + /// Long description for the example. + /// CommonMark syntax MAY be used for rich text representation. + /// + public string Description { get; set; } +} diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiExample.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiExample.cs new file mode 100644 index 000000000..3711df4b8 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiExample.cs @@ -0,0 +1,26 @@ +using System.Text.Json.Nodes; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.Interfaces; + +/// +/// Defines the base properties for the example object. +/// This interface is provided for type assertions but should not be implemented by package consumers beyond automatic mocking. +/// +public interface IOpenApiExample : IOpenApiDescribedElement, IOpenApiSerializable, IOpenApiReadOnlyExtensible +{ + /// + /// Embedded literal example. The value field and externalValue field are mutually + /// exclusive. To represent examples of media types that cannot naturally represented + /// in JSON or YAML, use a string value to contain the example, escaping where necessary. + /// + public JsonNode Value { get; } + + /// + /// A URL that points to the literal example. + /// This provides the capability to reference examples that cannot easily be + /// included in JSON or YAML documents. + /// The value field and externalValue field are mutually exclusive. + /// + public string ExternalValue { get; } +} diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index 5b43b5187..6ca0089b4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Writers; @@ -35,7 +36,7 @@ public class OpenApiComponents : IOpenApiSerializable, IOpenApiExtensible /// /// An object to hold reusable Objects. /// - public virtual IDictionary? Examples { get; set; } = new Dictionary(); + public virtual IDictionary? Examples { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. @@ -87,7 +88,7 @@ public OpenApiComponents(OpenApiComponents? components) Schemas = components?.Schemas != null ? new Dictionary(components.Schemas) : null; Responses = components?.Responses != null ? new Dictionary(components.Responses) : null; Parameters = components?.Parameters != null ? new Dictionary(components.Parameters) : null; - Examples = components?.Examples != null ? new Dictionary(components.Examples) : null; + Examples = components?.Examples != null ? new Dictionary(components.Examples) : null; RequestBodies = components?.RequestBodies != null ? new Dictionary(components.RequestBodies) : null; Headers = components?.Headers != null ? new Dictionary(components.Headers) : null; SecuritySchemes = components?.SecuritySchemes != null ? new Dictionary(components.SecuritySchemes) : null; @@ -160,7 +161,7 @@ public void SerializeAsV3(IOpenApiWriter writer) /// Serialize . /// private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, - Action callback, Action action) + Action callback, Action action) { // Serialize each referenceable object as full object without reference if the reference in the object points to itself. // If the reference exists but points to other objects, the object is serialized to just that reference. diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 047062874..9b7099f56 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -11,6 +11,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Services; @@ -615,7 +616,7 @@ public bool AddComponent(string id, T componentToRegister) Components.PathItems.Add(id, openApiPathItem); break; case OpenApiExample openApiExample: - Components.Examples ??= new Dictionary(); + Components.Examples ??= new Dictionary(); Components.Examples.Add(id, openApiExample); break; case OpenApiHeader openApiHeader: @@ -645,9 +646,10 @@ public static void ResolveSchemas(OpenApiComponents? components, Dictionary + public override void Visit(IOpenApiReferenceHolder referenceHolder) { - switch (referenceable) + switch (referenceHolder) { case OpenApiSchema schema: if (!Schemas.ContainsKey(schema.Reference.Id)) @@ -659,7 +661,7 @@ public override void Visit(IOpenApiReferenceable referenceable) default: break; } - base.Visit(referenceable); + base.Visit(referenceHolder); } public override void Visit(OpenApiSchema schema) diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index 594813765..c35480fc2 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -5,6 +5,7 @@ using System.Text.Json.Nodes; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -12,48 +13,22 @@ namespace Microsoft.OpenApi.Models /// /// Example Object. /// - public class OpenApiExample : IOpenApiReferenceable, IOpenApiExtensible + public class OpenApiExample : IOpenApiReferenceable, IOpenApiExtensible, IOpenApiExample { - /// - /// Short description for the example. - /// - public virtual string Summary { get; set; } - - /// - /// Long description for the example. - /// CommonMark syntax MAY be used for rich text representation. - /// - public virtual string Description { get; set; } - - /// - /// Embedded literal example. The value field and externalValue field are mutually - /// exclusive. To represent examples of media types that cannot naturally represented - /// in JSON or YAML, use a string value to contain the example, escaping where necessary. - /// - public virtual JsonNode Value { get; set; } + /// + public string Summary { get; set; } - /// - /// A URL that points to the literal example. - /// This provides the capability to reference examples that cannot easily be - /// included in JSON or YAML documents. - /// The value field and externalValue field are mutually exclusive. - /// - public virtual string ExternalValue { get; set; } + /// + public string Description { get; set; } - /// - /// This object MAY be extended with Specification Extensions. - /// - public virtual IDictionary Extensions { get; set; } = new Dictionary(); + /// + public string ExternalValue { get; set; } - /// - /// Reference object. - /// - public virtual OpenApiReference Reference { get; set; } + /// + public JsonNode Value { get; set; } - /// - /// Indicates object is a placeholder reference to an actual object and does not contain valid data. - /// - public virtual bool UnresolvedReference { get; set; } = false; + /// + public IDictionary Extensions { get; set; } = new Dictionary(); /// /// Parameter-less constructor @@ -63,40 +38,28 @@ public OpenApiExample() { } /// /// Initializes a copy of object /// - public OpenApiExample(OpenApiExample example) + /// The object + public OpenApiExample(IOpenApiExample example) { Summary = example?.Summary ?? Summary; Description = example?.Description ?? Description; Value = example?.Value != null ? JsonNodeCloneHelper.Clone(example.Value) : null; ExternalValue = example?.ExternalValue ?? ExternalValue; Extensions = example?.Extensions != null ? new Dictionary(example.Extensions) : null; - Reference = example?.Reference != null ? new(example.Reference) : null; - UnresolvedReference = example?.UnresolvedReference ?? UnresolvedReference; } - /// - /// Serialize to Open Api v3.1 - /// - /// - public virtual void SerializeAsV31(IOpenApiWriter writer) + /// + public void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1); } - /// - /// Serialize to Open Api v3.0 - /// - /// - public virtual void SerializeAsV3(IOpenApiWriter writer) + /// + public void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0); } - /// - /// Writes out existing examples in a mediatype object - /// - /// - /// private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version) { Utils.CheckArgumentNull(writer); @@ -121,14 +84,10 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version writer.WriteEndObject(); } - /// - /// Serialize to Open Api v2.0 - /// - public virtual void SerializeAsV2(IOpenApiWriter writer) + /// + public void SerializeAsV2(IOpenApiWriter writer) { - // Example object of this form does not exist in V2. - // V2 Example object requires knowledge of media type and exists only - // in Response object, so it will be serialized as a part of the Response object. + SerializeInternal(writer, OpenApiSpecVersion.OpenApi2_0); } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index 268878b1b..c27d18f8d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -7,6 +7,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -82,7 +83,7 @@ public virtual OpenApiSchema Schema /// /// Examples of the media type. /// - public virtual IDictionary Examples { get; set; } = new Dictionary(); + public virtual IDictionary Examples { get; set; } = new Dictionary(); /// /// A map containing the representations for the header. @@ -115,7 +116,7 @@ public OpenApiHeader(OpenApiHeader header) AllowReserved = header?.AllowReserved ?? AllowReserved; _schema = header?.Schema != null ? new(header.Schema) : null; Example = header?.Example != null ? JsonNodeCloneHelper.Clone(header.Example) : null; - Examples = header?.Examples != null ? new Dictionary(header.Examples) : null; + Examples = header?.Examples != null ? new Dictionary(header.Examples) : null; Content = header?.Content != null ? new Dictionary(header.Content) : null; Extensions = header?.Extensions != null ? new Dictionary(header.Extensions) : null; } diff --git a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs index 671a0dcfc..23acd0de9 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs @@ -7,6 +7,7 @@ using System.Text.Json.Nodes; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; #nullable enable @@ -39,7 +40,7 @@ public virtual OpenApiSchema? Schema /// Examples of the media type. /// Each example object SHOULD match the media type and specified schema if present. /// - public IDictionary? Examples { get; set; } = new Dictionary(); + public IDictionary? Examples { get; set; } = new Dictionary(); /// /// A map between a property name and its encoding information. @@ -66,7 +67,7 @@ public OpenApiMediaType(OpenApiMediaType? mediaType) { _schema = mediaType?.Schema != null ? new(mediaType.Schema) : null; Example = mediaType?.Example != null ? JsonNodeCloneHelper.Clone(mediaType.Example) : null; - Examples = mediaType?.Examples != null ? new Dictionary(mediaType.Examples) : null; + Examples = mediaType?.Examples != null ? new Dictionary(mediaType.Examples) : null; Encoding = mediaType?.Encoding != null ? new Dictionary(mediaType.Encoding) : null; Extensions = mediaType?.Extensions != null ? new Dictionary(mediaType.Extensions) : null; } @@ -126,7 +127,7 @@ public void SerializeAsV2(IOpenApiWriter writer) // Media type does not exist in V2. } - private static void SerializeExamples(IOpenApiWriter writer, IDictionary examples) + private static void SerializeExamples(IOpenApiWriter writer, IDictionary examples) { /* Special case for writing out empty arrays as valid response examples * Check if there is any example with an empty array as its value and set the flag `hasEmptyArray` to true diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index a7db89ef2..66d03746e 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -8,6 +8,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -120,7 +121,7 @@ public virtual OpenApiSchema Schema /// Furthermore, if referencing a schema which contains an example, /// the examples value SHALL override the example provided by the schema. /// - public virtual IDictionary Examples { get; set; } = new Dictionary(); + public virtual IDictionary Examples { get; set; } = new Dictionary(); /// /// Example of the media type. The example SHOULD match the specified schema and encoding properties @@ -168,7 +169,7 @@ public OpenApiParameter(OpenApiParameter parameter) Explode = parameter?.Explode ?? Explode; AllowReserved = parameter?.AllowReserved ?? AllowReserved; _schema = parameter?.Schema != null ? new(parameter.Schema) : null; - Examples = parameter?.Examples != null ? new Dictionary(parameter.Examples) : null; + Examples = parameter?.Examples != null ? new Dictionary(parameter.Examples) : null; Example = parameter?.Example != null ? JsonNodeCloneHelper.Clone(parameter.Example) : null; Content = parameter?.Content != null ? new Dictionary(parameter.Content) : null; Extensions = parameter?.Extensions != null ? new Dictionary(parameter.Extensions) : null; diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs index 8a1ae4a43..9c65bf9e2 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs @@ -200,7 +200,7 @@ private void SerializeInternal(IOpenApiWriter writer) /// public void SerializeAsV2(IOpenApiWriter writer) { - Utils.CheckArgumentNull(writer);; + Utils.CheckArgumentNull(writer); if (Type == ReferenceType.Tag) { diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index 5d1fb9ee2..ff5a8eb48 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -15,8 +15,8 @@ namespace Microsoft.OpenApi.Models /// /// The Schema Object allows the definition of input and output data types. /// - public class OpenApiSchema : IOpenApiAnnotatable, IOpenApiExtensible, IOpenApiReferenceable - { + public class OpenApiSchema : IOpenApiAnnotatable, IOpenApiExtensible, IOpenApiReferenceable, IOpenApiReferenceHolder + {//TODO remove the implementation of IOpenAPiReferenceHolder when we have removed the inheritance from the inheritance type to this type /// /// Follow JSON Schema definition. Short text providing information about the data. /// diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs index 58fa99694..057cf6d49 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs @@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models /// /// Tag Object. /// - public class OpenApiTag : IOpenApiSerializable, IOpenApiExtensible + public class OpenApiTag : IOpenApiReferenceable, IOpenApiExtensible { /// /// The name of the tag. diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index 81985cb12..13cea041a 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Callback Object Reference: A reference to a map of possible out-of band callbacks related to the parent operation. /// - public class OpenApiCallbackReference : OpenApiCallback, IOpenApiReferenceableWithTarget + public class OpenApiCallbackReference : OpenApiCallback, IOpenApiReferenceHolder { #nullable enable internal OpenApiCallback _target; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index c36c43d9a..0f8638c3e 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -12,12 +13,14 @@ namespace Microsoft.OpenApi.Models.References /// /// Example Object Reference. /// - public class OpenApiExampleReference : OpenApiExample, IOpenApiReferenceableWithTarget + public class OpenApiExampleReference : IOpenApiReferenceHolder, IOpenApiExample { + /// + public OpenApiReference Reference { get; set; } + + /// + public bool UnresolvedReference { get; set; } = false; internal OpenApiExample _target; - private readonly OpenApiReference _reference; - private string _summary; - private string _description; /// /// Gets the target example. @@ -29,11 +32,8 @@ public OpenApiExample Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiExample resolved = new OpenApiExample(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - if (!string.IsNullOrEmpty(_summary)) resolved.Summary = _summary; - return resolved; + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + return _target; } } @@ -51,22 +51,33 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, { Utils.CheckArgumentNullOrEmpty(referenceId); - _reference = new OpenApiReference() + Reference = new OpenApiReference() { Id = referenceId, HostDocument = hostDocument, Type = ReferenceType.Example, ExternalResource = externalResource }; + } - Reference = _reference; + /// + /// Copy constructor + /// + /// The reference to copy. + public OpenApiExampleReference(OpenApiExampleReference example) + { + Utils.CheckArgumentNull(example); + Reference = example?.Reference != null ? new(example.Reference) : null; + UnresolvedReference = example?.UnresolvedReference ?? UnresolvedReference; + //no need to copy summary and description as if they are not overridden, they will be fetched from the target + //if they are, the reference copy will handle it } internal OpenApiExampleReference(OpenApiExample target, string referenceId) { _target = target; - _reference = new OpenApiReference() + Reference = new OpenApiReference() { Id = referenceId, Type = ReferenceType.Example, @@ -74,59 +85,82 @@ internal OpenApiExampleReference(OpenApiExample target, string referenceId) } /// - public override string Description + public string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; - set => _description = value; + get => string.IsNullOrEmpty(Reference?.Description) ? Target?.Description : Reference.Description; + set + { + if (Reference is not null) + { + Reference.Description = value; + } + } } /// - public override string Summary + public string Summary { - get => string.IsNullOrEmpty(_summary) ? Target.Summary : _summary; - set => _summary = value; + get => string.IsNullOrEmpty(Reference?.Summary) ? Target?.Summary : Reference.Summary; + set + { + if (Reference is not null) + { + Reference.Summary = value; + } + } } /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + public IDictionary Extensions { get => Target?.Extensions; } /// - public override string ExternalValue { get => Target.ExternalValue; set => Target.ExternalValue = value; } + public string ExternalValue { get => Target?.ExternalValue; } /// - public override JsonNode Value { get => Target.Value; set => Target.Value = value; } + public JsonNode Value { get => Target?.Value; } /// - public override void SerializeAsV3(IOpenApiWriter writer) + public void SerializeAsV3(IOpenApiWriter writer) { - if (!writer.GetSettings().ShouldInlineReference(_reference)) + if (!writer.GetSettings().ShouldInlineReference(Reference)) { - _reference.SerializeAsV3(writer); - return; + Reference.SerializeAsV3(writer); } else { - SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV3(writer)); + SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV3(writer)); } } /// - public override void SerializeAsV31(IOpenApiWriter writer) + public void SerializeAsV31(IOpenApiWriter writer) { - if (!writer.GetSettings().ShouldInlineReference(_reference)) + if (!writer.GetSettings().ShouldInlineReference(Reference)) { - _reference.SerializeAsV31(writer); - return; + Reference.SerializeAsV31(writer); } else { - SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV31(writer)); + SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV31(writer)); } } + + /// + public IOpenApiExample CopyReferenceAsTargetElementWithOverrides(IOpenApiExample openApiExample) + { + return openApiExample is OpenApiExample ? new OpenApiExample(this) : openApiExample; + } + + /// + public void SerializeAsV2(IOpenApiWriter writer) + { + // examples components are not supported in OAS 2.0 + Reference.SerializeAsV2(writer); + } /// private void SerializeInternal(IOpenApiWriter writer, - Action action) + Action action) { Utils.CheckArgumentNull(writer); action(writer, Target); diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index e8275c23c..d9f451c0a 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -12,7 +13,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Header Object Reference. /// - public class OpenApiHeaderReference : OpenApiHeader, IOpenApiReferenceableWithTarget + public class OpenApiHeaderReference : OpenApiHeader, IOpenApiReferenceHolder { internal OpenApiHeader _target; private readonly OpenApiReference _reference; @@ -103,7 +104,7 @@ public override string Description public override JsonNode Example { get => Target.Example; set => Target.Example = value; } /// - public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } + public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } /// public override IDictionary Content { get => Target.Content; set => Target.Content = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 05817ddc9..614ab1446 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Link Object Reference. /// - public class OpenApiLinkReference : OpenApiLink, IOpenApiReferenceableWithTarget + public class OpenApiLinkReference : OpenApiLink, IOpenApiReferenceHolder { internal OpenApiLink _target; private readonly OpenApiReference _reference; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index 9df1e7be2..93d1163db 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -12,7 +13,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Parameter Object Reference. /// - public class OpenApiParameterReference : OpenApiParameter, IOpenApiReferenceableWithTarget + public class OpenApiParameterReference : OpenApiParameter, IOpenApiReferenceHolder { internal OpenApiParameter _target; private readonly OpenApiReference _reference; @@ -99,7 +100,7 @@ public override string Description public override OpenApiSchema Schema { get => Target.Schema; set => Target.Schema = value; } /// - public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } + public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } /// public override JsonNode Example { get => Target.Example; set => Target.Example = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index fad8922ae..bc7e8904e 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Path Item Object Reference: to describe the operations available on a single path. /// - public class OpenApiPathItemReference : OpenApiPathItem, IOpenApiReferenceableWithTarget + public class OpenApiPathItemReference : OpenApiPathItem, IOpenApiReferenceHolder { internal OpenApiPathItem _target; private readonly OpenApiReference _reference; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 59fb27724..7025ec373 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Request Body Object Reference. /// - public class OpenApiRequestBodyReference : OpenApiRequestBody, IOpenApiReferenceableWithTarget + public class OpenApiRequestBodyReference : OpenApiRequestBody, IOpenApiReferenceHolder { internal OpenApiRequestBody _target; private readonly OpenApiReference _reference; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index 2ac8aee27..0983bd3b6 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Response Object Reference. /// - public class OpenApiResponseReference : OpenApiResponse, IOpenApiReferenceableWithTarget + public class OpenApiResponseReference : OpenApiResponse, IOpenApiReferenceHolder { internal OpenApiResponse _target; private readonly OpenApiReference _reference; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs index da2f9b745..731f9c1af 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs @@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Schema reference object /// - public class OpenApiSchemaReference : OpenApiSchema, IOpenApiReferenceableWithTarget + public class OpenApiSchemaReference : OpenApiSchema, IOpenApiReferenceHolder { #nullable enable private OpenApiSchema? _target; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index dcd5009b1..c1dafa80f 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Security Scheme Object Reference. /// - public class OpenApiSecuritySchemeReference : OpenApiSecurityScheme, IOpenApiReferenceableWithTarget + public class OpenApiSecuritySchemeReference : OpenApiSecurityScheme, IOpenApiReferenceHolder { internal OpenApiSecurityScheme _target; private readonly OpenApiReference _reference; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index ae15b4085..09afa3655 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Models.References /// /// Tag Object Reference /// - public class OpenApiTagReference : OpenApiTag, IOpenApiReferenceableWithTarget + public class OpenApiTagReference : OpenApiTag, IOpenApiReferenceHolder { internal OpenApiTag _target; diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs index f39d9c345..d8740857b 100644 --- a/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs @@ -120,7 +120,7 @@ public override string GetRaw() } public T GetReferencedObject(ReferenceType referenceType, string referenceId, string summary = null, string description = null) - where T : IOpenApiReferenceable, new() + where T : IOpenApiReferenceHolder, new() { return new() { diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs index bb66cf9b2..8690735b8 100644 --- a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs +++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs @@ -26,13 +26,10 @@ public IEnumerable References } } - /// - /// Collect reference for each reference - /// - /// - public override void Visit(IOpenApiReferenceable referenceable) + /// + public override void Visit(IOpenApiReferenceHolder referenceHolder) { - AddExternalReferences(referenceable.Reference); + AddExternalReferences(referenceHolder.Reference); } /// diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs index 6a5411070..247d68679 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs @@ -6,6 +6,7 @@ using System.Globalization; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -215,7 +216,7 @@ public static OpenApiParameter LoadParameter(ParseNode node, bool loadRequestBod } // load examples from storage and add them to the parameter - var examples = node.Context.GetFromTempStorage>(TempStorageKeys.Examples, parameter); + var examples = node.Context.GetFromTempStorage>(TempStorageKeys.Examples, parameter); if (examples != null) { parameter.Examples = examples; diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs index 11b12e8f8..2716c499b 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -74,8 +75,8 @@ private static void ProcessProduces(MapNode mapNode, OpenApiResponse response, P ?? context.DefaultContentType ?? new List { "application/octet-stream" }; var schema = context.GetFromTempStorage(TempStorageKeys.ResponseSchema, response); - var examples = context.GetFromTempStorage>(TempStorageKeys.Examples, response) - ?? new Dictionary(); + var examples = context.GetFromTempStorage>(TempStorageKeys.Examples, response) + ?? new Dictionary(); foreach (var produce in produces) { @@ -110,10 +111,10 @@ private static void LoadResponseExamplesExtension(OpenApiResponse response, Pars node.Context.SetTempStorage(TempStorageKeys.Examples, examples, response); } - private static Dictionary LoadExamplesExtension(ParseNode node) + private static Dictionary LoadExamplesExtension(ParseNode node) { var mapNode = node.CheckMapNode(OpenApiConstants.ExamplesExtension); - var examples = new Dictionary(); + var examples = new Dictionary(); foreach (var examplesNode in mapNode) { diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs index 06d1d284a..344565884 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs @@ -3,6 +3,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -40,7 +41,7 @@ internal static partial class OpenApiV3Deserializer {s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))} }; - public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument) + public static IOpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument) { var mapNode = node.CheckMapNode("example"); diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs index 69fc53179..b30dc88e0 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs @@ -3,6 +3,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Reader.ParseNodes; namespace Microsoft.OpenApi.Reader.V3 @@ -51,7 +52,7 @@ internal static partial class OpenApiV3Deserializer } }; - private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields = + private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields = new() { { @@ -59,7 +60,7 @@ internal static partial class OpenApiV3Deserializer new( m => m.Examples, e => e.Value, - (e, v) => e.Value = v, + (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}}, m => m.Schema) } }; diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs index a71f633e5..915314d35 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs @@ -3,6 +3,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -101,7 +102,7 @@ internal static partial class OpenApiV3Deserializer } }; - private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields = + private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields = new() { { @@ -109,7 +110,7 @@ internal static partial class OpenApiV3Deserializer new( m => m.Examples, e => e.Value, - (e, v) => e.Value = v, + (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}}, m => m.Schema) } }; diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs index 820c58985..f6511d8b9 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs @@ -1,5 +1,6 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -46,7 +47,7 @@ internal static partial class OpenApiV31Deserializer {s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))} }; - public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument) + public static IOpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument) { var mapNode = node.CheckMapNode("example"); diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs index 36f90383c..a9024f9ed 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs @@ -1,5 +1,6 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Reader.ParseNodes; namespace Microsoft.OpenApi.Reader.V31 @@ -57,15 +58,15 @@ internal static partial class OpenApiV31Deserializer }; - private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields = - new AnyMapFieldMap + private static readonly AnyMapFieldMap _mediaTypeAnyMapOpenApiExampleFields = + new AnyMapFieldMap { { OpenApiConstants.Examples, - new AnyMapFieldMapParameter( + new AnyMapFieldMapParameter( m => m.Examples, e => e.Value, - (e, v) => e.Value = v, + (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}}, m => m.Schema) } }; diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs index 7a2c3d90e..fecaf58c2 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs @@ -1,5 +1,6 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -119,15 +120,15 @@ internal static partial class OpenApiV31Deserializer } }; - private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields = - new AnyMapFieldMap + private static readonly AnyMapFieldMap _parameterAnyMapOpenApiExampleFields = + new AnyMapFieldMap { { OpenApiConstants.Examples, - new AnyMapFieldMapParameter( + new AnyMapFieldMapParameter( m => m.Examples, e => e.Value, - (e, v) => e.Value = v, + (e, v) => {if (e is OpenApiExample ex) {ex.Value = v;}}, m => m.Schema) } }; diff --git a/src/Microsoft.OpenApi/Services/CopyReferences.cs b/src/Microsoft.OpenApi/Services/CopyReferences.cs index 22f1c5ad3..086961a94 100644 --- a/src/Microsoft.OpenApi/Services/CopyReferences.cs +++ b/src/Microsoft.OpenApi/Services/CopyReferences.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; namespace Microsoft.OpenApi.Services; @@ -12,13 +13,10 @@ internal class CopyReferences(OpenApiDocument target) : OpenApiVisitorBase private readonly OpenApiDocument _target = target; public OpenApiComponents Components = new(); - /// - /// Visits IOpenApiReferenceable instances that are references and not in components. - /// - /// An IOpenApiReferenceable object. - public override void Visit(IOpenApiReferenceable referenceable) + /// + public override void Visit(IOpenApiReferenceHolder referenceHolder) { - switch (referenceable) + switch (referenceHolder) { case OpenApiSchemaReference openApiSchemaReference: AddSchemaToComponents(openApiSchemaReference.Target, openApiSchemaReference.Reference.Id); @@ -84,7 +82,7 @@ public override void Visit(IOpenApiReferenceable referenceable) break; } - base.Visit(referenceable); + base.Visit(referenceHolder); } private void AddSchemaToComponents(OpenApiSchema schema, string referenceId = null) @@ -156,9 +154,9 @@ private void AddExampleToComponents(OpenApiExample example, string referenceId = { EnsureComponentsExist(); EnsureExamplesExist(); - if (!Components.Examples.ContainsKey(referenceId ?? example.Reference.Id)) + if (!Components.Examples.ContainsKey(referenceId)) { - Components.Examples.Add(referenceId ?? example.Reference.Id, example); + Components.Examples.Add(referenceId, example); } } private void AddPathItemToComponents(OpenApiPathItem pathItem, string referenceId = null) @@ -222,7 +220,7 @@ private void EnsureRequestBodiesExist() private void EnsureExamplesExist() { - _target.Components.Examples ??= new Dictionary(); + _target.Components.Examples ??= new Dictionary(); } private void EnsureHeadersExist() diff --git a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs index a889628b3..8f0c24de5 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs @@ -7,6 +7,7 @@ using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; namespace Microsoft.OpenApi.Services @@ -210,7 +211,7 @@ public virtual void Visit(OpenApiEncoding encoding) /// /// Visits the examples. /// - public virtual void Visit(IDictionary examples) + public virtual void Visit(IDictionary examples) { } @@ -299,9 +300,9 @@ public virtual void Visit(OpenApiSecurityScheme securityScheme) } /// - /// Visits + /// Visits /// - public virtual void Visit(OpenApiExample example) + public virtual void Visit(IOpenApiExample example) { } @@ -341,9 +342,9 @@ public virtual void Visit(IOpenApiExtension openApiExtension) } /// - /// Visits list of + /// Visits list of /// - public virtual void Visit(IList example) + public virtual void Visit(IList example) { } @@ -365,8 +366,8 @@ public virtual void Visit(IDictionary encodings) /// /// Visits IOpenApiReferenceable instances that are references and not in components /// - /// referenced object - public virtual void Visit(IOpenApiReferenceable referenceable) + /// Referencing object + public virtual void Visit(IOpenApiReferenceHolder referenceHolder) { } } diff --git a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs index 9321b3b17..94a263bd0 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs @@ -8,6 +8,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; namespace Microsoft.OpenApi.Services @@ -17,7 +18,6 @@ namespace Microsoft.OpenApi.Services /// public class OpenApiWalker { - private OpenApiDocument _hostDocument; private readonly OpenApiVisitorBase _visitor; private readonly Stack _schemaLoop = new(); private readonly Stack _pathItemLoop = new(); @@ -41,7 +41,6 @@ public void Walk(OpenApiDocument doc) return; } - _hostDocument = doc; _schemaLoop.Clear(); _pathItemLoop.Clear(); @@ -416,9 +415,9 @@ internal void Walk(OpenApiCallback callback, bool isComponent = false) return; } - if (callback is OpenApiCallbackReference) + if (callback is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(callback as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -461,7 +460,10 @@ internal void Walk(OpenApiTagReference tag) return; } - Walk(tag as IOpenApiReferenceable); + if (tag is IOpenApiReferenceHolder openApiReferenceHolder) + { + Walk(openApiReferenceHolder); + } } /// @@ -526,9 +528,9 @@ internal void Walk(OpenApiPathItem pathItem, bool isComponent = false) return; } - if (pathItem is OpenApiPathItemReference) + if (pathItem is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(pathItem as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -649,9 +651,9 @@ internal void Walk(OpenApiParameter parameter, bool isComponent = false) return; } - if (parameter is OpenApiParameterReference) + if (parameter is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(parameter as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -697,9 +699,9 @@ internal void Walk(OpenApiResponse response, bool isComponent = false) return; } - if (response is OpenApiResponseReference) + if (response is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(response as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -720,9 +722,9 @@ internal void Walk(OpenApiRequestBody requestBody, bool isComponent = false) return; } - if (requestBody is OpenApiRequestBodyReference) + if (requestBody is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(requestBody as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -932,9 +934,9 @@ internal void Walk(OpenApiSchema schema, bool isComponent = false) /// - /// Visits dictionary of + /// Visits dictionary of /// - internal void Walk(IDictionary examples) + internal void Walk(IDictionary examples) { if (examples == null) { @@ -968,18 +970,18 @@ internal void Walk(JsonNode example) } /// - /// Visits and child objects + /// Visits and child objects /// - internal void Walk(OpenApiExample example, bool isComponent = false) + internal void Walk(IOpenApiExample example, bool isComponent = false) { if (example == null) { return; } - if (example is OpenApiExampleReference) + if (example is OpenApiExampleReference reference) { - Walk(example as IOpenApiReferenceable); + Walk(reference); return; } @@ -988,9 +990,9 @@ internal void Walk(OpenApiExample example, bool isComponent = false) } /// - /// Visits the list of and child objects + /// Visits the list of and child objects /// - internal void Walk(IList examples) + internal void Walk(IList examples) { if (examples == null) { @@ -1089,9 +1091,9 @@ internal void Walk(OpenApiLink link, bool isComponent = false) return; } - if (link is OpenApiLinkReference) + if (link is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(link as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -1110,9 +1112,9 @@ internal void Walk(OpenApiHeader header, bool isComponent = false) return; } - if (header is OpenApiHeaderReference) + if (header is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(header as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -1153,9 +1155,9 @@ internal void Walk(OpenApiSecurityScheme securityScheme, bool isComponent = fals return; } - if (securityScheme is OpenApiSecuritySchemeReference) + if (securityScheme is IOpenApiReferenceHolder openApiReferenceHolder) { - Walk(securityScheme as IOpenApiReferenceable); + Walk(openApiReferenceHolder); return; } @@ -1166,9 +1168,9 @@ internal void Walk(OpenApiSecurityScheme securityScheme, bool isComponent = fals /// /// Visits and child objects /// - internal void Walk(IOpenApiReferenceable referenceable) + internal void Walk(IOpenApiReferenceHolder referenceableHolder) { - _visitor.Visit(referenceable); + _visitor.Visit(referenceableHolder); } /// @@ -1191,8 +1193,8 @@ internal void Walk(IOpenApiElement element) case OpenApiContact e: Walk(e); break; case OpenApiCallback e: Walk(e); break; case OpenApiEncoding e: Walk(e); break; - case OpenApiExample e: Walk(e); break; - case IDictionary e: Walk(e); break; + case IOpenApiExample e: Walk(e); break; + case IDictionary e: Walk(e); break; case OpenApiExternalDocs e: Walk(e); break; case OpenApiHeader e: Walk(e); break; case OpenApiLink e: Walk(e); break; @@ -1232,13 +1234,13 @@ private void Walk(string context, Action walk) /// /// Identify if an element is just a reference to a component, or an actual component /// - private bool ProcessAsReference(IOpenApiReferenceable referenceable, bool isComponent = false) + private bool ProcessAsReference(IOpenApiReferenceHolder referenceableHolder, bool isComponent = false) { - var isReference = referenceable.Reference != null && - (!isComponent || referenceable.UnresolvedReference); + var isReference = referenceableHolder.Reference != null && + (!isComponent || referenceableHolder.UnresolvedReference); if (isReference) { - Walk(referenceable); + Walk(referenceableHolder); } return isReference; } diff --git a/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs b/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs index 1d9bb8e8e..146c8941d 100644 --- a/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs +++ b/src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs @@ -18,15 +18,12 @@ public ReferenceHostDocumentSetter(OpenApiDocument currentDocument) _currentDocument = currentDocument; } - /// - /// Visits the referenceable element in the host document - /// - /// The referenceable element in the doc. - public override void Visit(IOpenApiReferenceable referenceable) + /// + public override void Visit(IOpenApiReferenceHolder referenceHolder) { - if (referenceable.Reference != null) + if (referenceHolder.Reference != null) { - referenceable.Reference.HostDocument = _currentDocument; + referenceHolder.Reference.HostDocument = _currentDocument; } } } diff --git a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs index 7281ef258..0cc7ade2b 100644 --- a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs +++ b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Services; namespace Microsoft.OpenApi.Validations @@ -125,7 +126,7 @@ public void AddWarning(OpenApiValidatorWarning warning) public override void Visit(IOpenApiExtension openApiExtension) => Validate(openApiExtension, openApiExtension.GetType()); /// - public override void Visit(IList example) => Validate(example, example.GetType()); + public override void Visit(IList example) => Validate(example, example.GetType()); /// public override void Visit(OpenApiPathItem pathItem) => Validate(pathItem); @@ -149,7 +150,7 @@ public void AddWarning(OpenApiValidatorWarning warning) public override void Visit(OpenApiLink link) => Validate(link); /// - public override void Visit(OpenApiExample example) => Validate(example); + public override void Visit(IOpenApiExample example) => Validate(example); /// public override void Visit(OpenApiOperation operation) => Validate(operation); @@ -162,7 +163,7 @@ public void AddWarning(OpenApiValidatorWarning warning) /// public override void Visit(IDictionary content) => Validate(content, content.GetType()); /// - public override void Visit(IDictionary examples) => Validate(examples, examples.GetType()); + public override void Visit(IDictionary examples) => Validate(examples, examples.GetType()); /// public override void Visit(IDictionary links) => Validate(links, links.GetType()); /// @@ -189,9 +190,9 @@ private void Validate(object item, Type type) } // Validate unresolved references as references - if (item is IOpenApiReferenceable { UnresolvedReference: true }) + if (item is IOpenApiReferenceHolder { UnresolvedReference: true }) { - type = typeof(IOpenApiReferenceable); + type = typeof(IOpenApiReferenceHolder); } var rules = _ruleSet.FindRules(type); diff --git a/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs b/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs index f02be33ee..759aafe47 100644 --- a/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs +++ b/src/Microsoft.OpenApi/Validations/Rules/OpenApiNonDefaultRules.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text.Json.Nodes; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; namespace Microsoft.OpenApi.Validations.Rules { @@ -89,7 +90,7 @@ public static class OpenApiNonDefaultRules private static void ValidateMismatchedDataType(IValidationContext context, string ruleName, JsonNode example, - IDictionary examples, + IDictionary examples, OpenApiSchema schema) { // example diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs index 77f2c9ae9..e8c49bbc8 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs +++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Tests.UtilityFiles; using Moq; @@ -243,7 +244,8 @@ public async Task CopiesOverAllReferencedComponentsToTheSubsetDocumentCorrectly( // Assert Assert.Same(doc.Servers, subsetOpenApiDocument.Servers); Assert.False(responseHeader?.UnresolvedReference); - Assert.False(mediaTypeExample?.UnresolvedReference); + var exampleReference = Assert.IsType(mediaTypeExample); + Assert.False(exampleReference?.UnresolvedReference); Assert.NotNull(targetHeaders); Assert.Single(targetHeaders); Assert.NotNull(targetExamples); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index a46b32f09..41f2c6a1e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -1147,7 +1147,7 @@ public async Task HeaderParameterShouldAllowExample() AllowReserved = true, Style = ParameterStyle.Simple, Explode = true, - Examples = new Dictionary() + Examples = { { "uuid1", new OpenApiExample() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index e3c1435fd..e10c78a25 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -57,11 +57,11 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed() { Examples = { - ["example1"] = new() + ["example1"] = new OpenApiExample() { Value = 5 }, - ["example2"] = new() + ["example2"] = new OpenApiExample() { Value = 7.5 } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index 8a30fc9ba..4b19c2e66 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -277,11 +277,11 @@ public async Task ParseParameterWithExamplesShouldSucceed() Required = true, Examples = { - ["example1"] = new() + ["example1"] = new OpenApiExample() { Value = 5.0 }, - ["example2"] = new() + ["example2"] = new OpenApiExample() { Value = (float) 7.5 } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs index b1f6ca474..ef1ebb420 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs @@ -7,6 +7,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Xunit; using Xunit.Abstractions; @@ -79,7 +80,7 @@ public class OpenApiMediaTypeTests public static OpenApiMediaType MediaTypeWithObjectExamples = new() { Examples = { - ["object1"] = new() + ["object1"] = new OpenApiExample() { Value = new JsonObject { @@ -433,7 +434,7 @@ public void MediaTypeCopyConstructorWorks() var clone = new OpenApiMediaType(MediaTypeWithObjectExamples) { Example = 42, - Examples = new Dictionary(), + Examples = new Dictionary(), Encoding = new Dictionary(), Extensions = new Dictionary() }; diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs index 1c2e3329f..b76dcf342 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs @@ -50,9 +50,9 @@ public class OpenApiParameterTests new() { Type = JsonSchemaType.String } } }, - Examples = new Dictionary + Examples = { - ["test"] = new() + ["test"] = new OpenApiExample() { Summary = "summary3", Description = "description3" @@ -135,9 +135,9 @@ public class OpenApiParameterTests }, UnresolvedReference = true }, - Examples = new Dictionary + Examples = { - ["test"] = new() + ["test"] = new OpenApiExample() { Summary = "summary3", Description = "description3" @@ -159,9 +159,9 @@ public class OpenApiParameterTests { Type = JsonSchemaType.Object }, - Examples = new Dictionary + Examples = { - ["test"] = new() + ["test"] = new OpenApiExample() { Summary = "summary3", Description = "description3" diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 396feddeb..9ad9336d3 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -159,7 +159,7 @@ namespace Microsoft.OpenApi.Extensions public static void AddExtension(this T element, string name, Microsoft.OpenApi.Interfaces.IOpenApiExtension any) where T : Microsoft.OpenApi.Interfaces.IOpenApiExtensible { } } - public static class OpenApiReferencableExtensions + public static class OpenApiReferenceableExtensions { public static Microsoft.OpenApi.Interfaces.IOpenApiReferenceable ResolveReference(this Microsoft.OpenApi.Interfaces.IOpenApiReferenceable element, Microsoft.OpenApi.JsonPointer pointer) { } } @@ -211,6 +211,10 @@ namespace Microsoft.OpenApi.Interfaces { void Write(Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion specVersion); } + public interface IOpenApiReadOnlyExtensible + { + System.Collections.Generic.IDictionary Extensions { get; } + } public interface IOpenApiReader { Microsoft.OpenApi.Reader.ReadResult Read(System.IO.MemoryStream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings); @@ -218,15 +222,22 @@ namespace Microsoft.OpenApi.Interfaces T ReadFragment(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; } - public interface IOpenApiReferenceable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public interface IOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } bool UnresolvedReference { get; set; } } - public interface IOpenApiReferenceableWithTarget : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public interface IOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + where out T : Microsoft.OpenApi.Interfaces.IOpenApiReferenceable { T Target { get; } } + public interface IOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + where out T : Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, V + { + V CopyReferenceAsTargetElementWithOverrides(V source); + } + public interface IOpenApiReferenceable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } public interface IOpenApiSerializable : Microsoft.OpenApi.Interfaces.IOpenApiElement { void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer); @@ -324,6 +335,19 @@ namespace Microsoft.OpenApi.MicrosoftExtensions public static Microsoft.OpenApi.MicrosoftExtensions.OpenApiReservedParameterExtension Parse(System.Text.Json.Nodes.JsonNode source) { } } } +namespace Microsoft.OpenApi.Models.Interfaces +{ + public interface IOpenApiDescribedElement : Microsoft.OpenApi.Interfaces.IOpenApiElement + { + string Description { get; set; } + string Summary { get; set; } + } + public interface IOpenApiExample : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement + { + string ExternalValue { get; } + System.Text.Json.Nodes.JsonNode Value { get; } + } +} namespace Microsoft.OpenApi.Models { [System.Flags] @@ -356,7 +380,7 @@ namespace Microsoft.OpenApi.Models public OpenApiComponents(Microsoft.OpenApi.Models.OpenApiComponents? components) { } public System.Collections.Generic.IDictionary? Schemas { get; set; } public virtual System.Collections.Generic.IDictionary? Callbacks { get; set; } - public virtual System.Collections.Generic.IDictionary? Examples { get; set; } + public virtual System.Collections.Generic.IDictionary? Examples { get; set; } public virtual System.Collections.Generic.IDictionary? Extensions { get; set; } public virtual System.Collections.Generic.IDictionary? Headers { get; set; } public virtual System.Collections.Generic.IDictionary? Links { get; set; } @@ -600,20 +624,18 @@ namespace Microsoft.OpenApi.Models public string Pointer { get; set; } public override string ToString() { } } - public class OpenApiExample : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiExample : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample { public OpenApiExample() { } - public OpenApiExample(Microsoft.OpenApi.Models.OpenApiExample example) { } - public virtual string Description { get; set; } - public virtual System.Collections.Generic.IDictionary Extensions { get; set; } - public virtual string ExternalValue { get; set; } - public virtual Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public virtual string Summary { get; set; } - public virtual bool UnresolvedReference { get; set; } - public virtual System.Text.Json.Nodes.JsonNode Value { get; set; } - public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public OpenApiExample(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample example) { } + public string Description { get; set; } + public System.Collections.Generic.IDictionary Extensions { get; set; } + public string ExternalValue { get; set; } + public string Summary { get; set; } + public System.Text.Json.Nodes.JsonNode Value { get; set; } + public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public abstract class OpenApiExtensibleDictionary : System.Collections.Generic.Dictionary, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable @@ -647,7 +669,7 @@ namespace Microsoft.OpenApi.Models public virtual bool Deprecated { get; set; } public virtual string Description { get; set; } public virtual System.Text.Json.Nodes.JsonNode Example { get; set; } - public virtual System.Collections.Generic.IDictionary Examples { get; set; } + public virtual System.Collections.Generic.IDictionary Examples { get; set; } public virtual bool Explode { get; set; } public virtual System.Collections.Generic.IDictionary Extensions { get; set; } public virtual bool Required { get; set; } @@ -709,7 +731,7 @@ namespace Microsoft.OpenApi.Models public OpenApiMediaType(Microsoft.OpenApi.Models.OpenApiMediaType? mediaType) { } public System.Collections.Generic.IDictionary? Encoding { get; set; } public System.Text.Json.Nodes.JsonNode? Example { get; set; } - public System.Collections.Generic.IDictionary? Examples { get; set; } + public System.Collections.Generic.IDictionary? Examples { get; set; } public System.Collections.Generic.IDictionary? Extensions { get; set; } public virtual Microsoft.OpenApi.Models.OpenApiSchema? Schema { get; set; } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } @@ -776,7 +798,7 @@ namespace Microsoft.OpenApi.Models public virtual bool Deprecated { get; set; } public virtual string Description { get; set; } public virtual System.Text.Json.Nodes.JsonNode Example { get; set; } - public virtual System.Collections.Generic.IDictionary Examples { get; set; } + public virtual System.Collections.Generic.IDictionary Examples { get; set; } public virtual bool Explode { get; set; } public virtual System.Collections.Generic.IDictionary Extensions { get; set; } public virtual Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } @@ -864,7 +886,7 @@ namespace Microsoft.OpenApi.Models public OpenApiResponses() { } public OpenApiResponses(Microsoft.OpenApi.Models.OpenApiResponses openApiResponses) { } } - public class OpenApiSchema : Microsoft.OpenApi.Interfaces.IOpenApiAnnotatable, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiSchema : Microsoft.OpenApi.Interfaces.IOpenApiAnnotatable, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiSchema() { } public OpenApiSchema(Microsoft.OpenApi.Models.OpenApiSchema schema) { } @@ -977,7 +999,7 @@ namespace Microsoft.OpenApi.Models public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiTag() { } public OpenApiTag(Microsoft.OpenApi.Models.OpenApiTag tag) { } @@ -1098,7 +1120,7 @@ namespace Microsoft.OpenApi.Models } namespace Microsoft.OpenApi.Models.References { - public class OpenApiCallbackReference : Microsoft.OpenApi.Models.OpenApiCallback, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiCallbackReference : Microsoft.OpenApi.Models.OpenApiCallback, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiCallbackReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiCallback Target { get; } @@ -1107,19 +1129,24 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiExampleReference : Microsoft.OpenApi.Models.OpenApiExample, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiExampleReference : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample { + public OpenApiExampleReference(Microsoft.OpenApi.Models.References.OpenApiExampleReference example) { } public OpenApiExampleReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public string Description { get; set; } + public System.Collections.Generic.IDictionary Extensions { get; } + public string ExternalValue { get; } + public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } + public string Summary { get; set; } public Microsoft.OpenApi.Models.OpenApiExample Target { get; } - public override string Description { get; set; } - public override System.Collections.Generic.IDictionary Extensions { get; set; } - public override string ExternalValue { get; set; } - public override string Summary { get; set; } - public override System.Text.Json.Nodes.JsonNode Value { get; set; } - public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public bool UnresolvedReference { get; set; } + public System.Text.Json.Nodes.JsonNode Value { get; } + public Microsoft.OpenApi.Models.Interfaces.IOpenApiExample CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample openApiExample) { } + public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiHeaderReference : Microsoft.OpenApi.Models.OpenApiHeader, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiHeaderReference : Microsoft.OpenApi.Models.OpenApiHeader, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiHeaderReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiHeader Target { get; } @@ -1129,7 +1156,7 @@ namespace Microsoft.OpenApi.Models.References public override bool Deprecated { get; set; } public override string Description { get; set; } public override System.Text.Json.Nodes.JsonNode Example { get; set; } - public override System.Collections.Generic.IDictionary Examples { get; set; } + public override System.Collections.Generic.IDictionary Examples { get; set; } public override bool Explode { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override bool Required { get; set; } @@ -1139,7 +1166,7 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiLinkReference : Microsoft.OpenApi.Models.OpenApiLink, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiLinkReference : Microsoft.OpenApi.Models.OpenApiLink, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiLinkReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiLink Target { get; } @@ -1153,7 +1180,7 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiParameterReference : Microsoft.OpenApi.Models.OpenApiParameter, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiParameterReference : Microsoft.OpenApi.Models.OpenApiParameter, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiParameterReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiParameter Target { get; } @@ -1163,7 +1190,7 @@ namespace Microsoft.OpenApi.Models.References public override bool Deprecated { get; set; } public override string Description { get; set; } public override System.Text.Json.Nodes.JsonNode Example { get; set; } - public override System.Collections.Generic.IDictionary Examples { get; set; } + public override System.Collections.Generic.IDictionary Examples { get; set; } public override bool Explode { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } @@ -1175,7 +1202,7 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiPathItemReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiPathItem Target { get; } @@ -1187,7 +1214,7 @@ namespace Microsoft.OpenApi.Models.References public override string Summary { get; set; } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiRequestBodyReference : Microsoft.OpenApi.Models.OpenApiRequestBody, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiRequestBodyReference : Microsoft.OpenApi.Models.OpenApiRequestBody, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiRequestBodyReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiRequestBody Target { get; } @@ -1198,7 +1225,7 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiResponseReference : Microsoft.OpenApi.Models.OpenApiResponse, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiResponseReference : Microsoft.OpenApi.Models.OpenApiResponse, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiResponseReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiResponse Target { get; } @@ -1211,7 +1238,7 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiSchemaReference : Microsoft.OpenApi.Models.OpenApiSchema, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiSchemaReference : Microsoft.OpenApi.Models.OpenApiSchema, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiSchemaReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiSchema? Target { get; } @@ -1270,7 +1297,7 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.OpenApiSecurityScheme, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.OpenApiSecurityScheme, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiSecuritySchemeReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public Microsoft.OpenApi.Models.OpenApiSecurityScheme Target { get; } @@ -1287,7 +1314,7 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiTagReference : Microsoft.OpenApi.Models.OpenApiTag, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiTagReference : Microsoft.OpenApi.Models.OpenApiTag, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiTagReference(Microsoft.OpenApi.Models.References.OpenApiTagReference source) { } public OpenApiTagReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument) { } @@ -1478,13 +1505,13 @@ namespace Microsoft.OpenApi.Services public virtual void Exit() { } public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtensible openApiExtensible) { } public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtension openApiExtension) { } - public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiReferenceable referenceable) { } + public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder referenceHolder) { } + public virtual void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample example) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiCallback callback) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiContact contact) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiEncoding encoding) { } - public virtual void Visit(Microsoft.OpenApi.Models.OpenApiExample example) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiExternalDocs externalDocs) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiHeader header) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiInfo info) { } @@ -1507,15 +1534,15 @@ namespace Microsoft.OpenApi.Services public virtual void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { } public virtual void Visit(Microsoft.OpenApi.Models.References.OpenApiTagReference tag) { } public virtual void Visit(System.Collections.Generic.IDictionary operations) { } + public virtual void Visit(System.Collections.Generic.IDictionary examples) { } public virtual void Visit(System.Collections.Generic.IDictionary callbacks) { } public virtual void Visit(System.Collections.Generic.IDictionary encodings) { } - public virtual void Visit(System.Collections.Generic.IDictionary examples) { } public virtual void Visit(System.Collections.Generic.IDictionary headers) { } public virtual void Visit(System.Collections.Generic.IDictionary links) { } public virtual void Visit(System.Collections.Generic.IDictionary content) { } public virtual void Visit(System.Collections.Generic.IDictionary webhooks) { } public virtual void Visit(System.Collections.Generic.IDictionary serverVariables) { } - public virtual void Visit(System.Collections.Generic.IList example) { } + public virtual void Visit(System.Collections.Generic.IList example) { } public virtual void Visit(System.Collections.Generic.IList parameters) { } public virtual void Visit(System.Collections.Generic.IList openApiSecurityRequirements) { } public virtual void Visit(System.Collections.Generic.IList servers) { } @@ -1578,12 +1605,12 @@ namespace Microsoft.OpenApi.Validations public void AddWarning(Microsoft.OpenApi.Validations.OpenApiValidatorWarning warning) { } public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtensible openApiExtensible) { } public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtension openApiExtension) { } + public override void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample example) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiCallback callback) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiContact contact) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiEncoding encoding) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiExample example) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiExternalDocs externalDocs) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiHeader header) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiInfo info) { } @@ -1605,14 +1632,14 @@ namespace Microsoft.OpenApi.Validations public override void Visit(Microsoft.OpenApi.Models.OpenApiServerVariable serverVariable) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { } public override void Visit(System.Collections.Generic.IDictionary operations) { } + public override void Visit(System.Collections.Generic.IDictionary examples) { } public override void Visit(System.Collections.Generic.IDictionary callbacks) { } public override void Visit(System.Collections.Generic.IDictionary encodings) { } - public override void Visit(System.Collections.Generic.IDictionary examples) { } public override void Visit(System.Collections.Generic.IDictionary headers) { } public override void Visit(System.Collections.Generic.IDictionary links) { } public override void Visit(System.Collections.Generic.IDictionary content) { } public override void Visit(System.Collections.Generic.IDictionary serverVariables) { } - public override void Visit(System.Collections.Generic.IList example) { } + public override void Visit(System.Collections.Generic.IList example) { } } public class OpenApiValidatorError : Microsoft.OpenApi.Models.OpenApiError { diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs index 3a685f3a8..485f8587c 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs @@ -63,11 +63,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() }, Examples = { - ["example0"] = new() + ["example0"] = new OpenApiExample() { Value = "1", }, - ["example1"] = new() + ["example1"] = new OpenApiExample() { Value = new JsonObject() { @@ -76,11 +76,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() ["z"] = "200" } }, - ["example2"] = new() + ["example2"] = new OpenApiExample() { Value = new JsonArray(){3} }, - ["example3"] = new() + ["example3"] = new OpenApiExample() { Value = new JsonObject() { diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs index 834443135..96afcb301 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs @@ -57,11 +57,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() }, Examples = { - ["example0"] = new() + ["example0"] = new OpenApiExample() { Value = "1", }, - ["example1"] = new() + ["example1"] = new OpenApiExample() { Value = new JsonObject() { @@ -70,11 +70,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() ["z"] = "200" } }, - ["example2"] = new() + ["example2"] = new OpenApiExample() { Value = new JsonArray(){3} }, - ["example3"] = new() + ["example3"] = new OpenApiExample() { Value = new JsonObject() { diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs index cacf3d7fa..c08c88471 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs @@ -110,11 +110,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() }, Examples = { - ["example0"] = new() + ["example0"] = new OpenApiExample() { Value = "1", }, - ["example1"] = new() + ["example1"] = new OpenApiExample() { Value = new JsonObject() { @@ -123,11 +123,11 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() ["z"] = "200" } }, - ["example2"] = new() + ["example2"] = new OpenApiExample() { Value = new JsonArray(){3} }, - ["example3"] = new() + ["example3"] = new OpenApiExample() { Value = new JsonObject() { diff --git a/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs b/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs index e805d4673..342fb317a 100644 --- a/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Services; using Xunit; @@ -39,7 +40,7 @@ public void ExpectedVirtualsInvolved() visitor.Visit(default(IDictionary)); visitor.Visit(default(OpenApiMediaType)); visitor.Visit(default(OpenApiEncoding)); - visitor.Visit(default(IDictionary)); + visitor.Visit(default(IDictionary)); visitor.Visit(default(OpenApiComponents)); visitor.Visit(default(OpenApiExternalDocs)); visitor.Visit(default(OpenApiSchema)); @@ -51,17 +52,17 @@ public void ExpectedVirtualsInvolved() visitor.Visit(default(OpenApiOAuthFlow)); visitor.Visit(default(OpenApiSecurityRequirement)); visitor.Visit(default(OpenApiSecurityScheme)); - visitor.Visit(default(OpenApiExample)); + visitor.Visit(default(IOpenApiExample)); visitor.Visit(default(IList)); visitor.Visit(default(IList)); visitor.Visit(default(IOpenApiExtensible)); visitor.Visit(default(IOpenApiExtension)); - visitor.Visit(default(IList)); + visitor.Visit(default(IList)); visitor.Visit(default(IDictionary)); visitor.Visit(default(IDictionary)); - visitor.Visit(default(IOpenApiReferenceable)); + visitor.Visit(default(IOpenApiReferenceHolder)); visitor.Exit(); - Assert.True(42 < ((TestVisitor)visitor).CallStack.Count()); + Assert.True(42 < ((TestVisitor)visitor).CallStack.Count); } internal protected class TestVisitor : OpenApiVisitorBase @@ -213,7 +214,7 @@ public override void Visit(OpenApiEncoding encoding) base.Visit(encoding); } - public override void Visit(IDictionary examples) + public override void Visit(IDictionary examples) { EncodeCall(); base.Visit(examples); @@ -285,7 +286,7 @@ public override void Visit(OpenApiSecurityScheme securityScheme) base.Visit(securityScheme); } - public override void Visit(OpenApiExample example) + public override void Visit(IOpenApiExample example) { EncodeCall(); base.Visit(example); @@ -315,7 +316,7 @@ public override void Visit(IOpenApiExtension openApiExtension) base.Visit(openApiExtension); } - public override void Visit(IList example) + public override void Visit(IList example) { EncodeCall(); base.Visit(example); @@ -333,7 +334,7 @@ public override void Visit(IDictionary encodings) base.Visit(encodings); } - public override void Visit(IOpenApiReferenceable referenceable) + public override void Visit(IOpenApiReferenceHolder referenceable) { EncodeCall(); base.Visit(referenceable); diff --git a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs index f90d058b2..c307229cf 100644 --- a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs @@ -293,7 +293,7 @@ public override void Visit(OpenApiResponse response) Locations.Add(this.PathString); } - public override void Visit(IOpenApiReferenceable referenceable) + public override void Visit(IOpenApiReferenceHolder referenceable) { Locations.Add("referenceAt: " + this.PathString); } diff --git a/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs b/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs index f93b10375..cb554d4f6 100644 --- a/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs +++ b/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs @@ -20,7 +20,7 @@ public class OpenApiReferencableTests private static readonly OpenApiHeader _headerFragment = new() { Schema = new OpenApiSchema(), - Examples = new Dictionary + Examples = { { "example1", new OpenApiExample() } } @@ -28,7 +28,7 @@ public class OpenApiReferencableTests private static readonly OpenApiParameter _parameterFragment = new() { Schema = new OpenApiSchema(), - Examples = new Dictionary + Examples = { { "example1", new OpenApiExample() } }