From 90dc7fc5587cee40f5964919387baa3bafd8b9d8 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 18:30:00 +0300 Subject: [PATCH 01/47] Move loading code to core lib and adjust namespaces --- .../Microsoft.OpenApi.Readers.csproj | 6 ++ src/Microsoft.OpenApi.Readers/YamlHelper.cs | 34 ---------- .../Exceptions/OpenApiReaderException.cs | 6 +- .../OpenApiUnsupportedSpecVersionException.cs | 2 +- .../Interfaces}/IDiagnostic.cs | 2 +- .../Interfaces}/IOpenApiVersionService.cs | 7 +- .../Interfaces}/IStreamLoader.cs | 2 +- .../Reader/JsonNodeHelper.cs | 21 ++++++ .../Reader}/OpenApiDiagnostic.cs | 8 +-- .../Reader}/OpenApiReaderSettings.cs | 5 +- .../Reader}/OpenApiVersionExtensionMethods.cs | 2 +- .../Reader}/ParseNodes/AnyFieldMap.cs | 2 +- .../ParseNodes/AnyFieldMapParameter.cs | 2 +- .../Reader}/ParseNodes/AnyListFieldMap.cs | 2 +- .../ParseNodes/AnyListFieldMapParameter.cs | 2 +- .../Reader}/ParseNodes/AnyMapFieldMap.cs | 2 +- .../ParseNodes/AnyMapFieldMapParameter.cs | 2 +- .../Reader}/ParseNodes/FixedFieldMap.cs | 2 +- .../ParseNodes/JsonPointerExtensions.cs | 2 +- .../Reader}/ParseNodes/ListNode.cs | 4 +- .../Reader}/ParseNodes/MapNode.cs | 8 +-- .../Reader}/ParseNodes/ParseNode.cs | 4 +- .../Reader}/ParseNodes/ParserHelper.cs | 0 .../Reader}/ParseNodes/PatternFieldMap.cs | 2 +- .../Reader}/ParseNodes/PropertyNode.cs | 6 +- .../Reader}/ParseNodes/RootNode.cs | 2 +- .../Reader}/ParseNodes/ValueNode.cs | 4 +- .../Reader}/ParsingContext.cs | 49 ++++++++------ .../Reader}/ReadResult.cs | 2 +- .../Reader}/SchemaTypeConverter.cs | 4 +- .../Reader}/Services/DefaultStreamLoader.cs | 23 ++++++- .../OpenApiRemoteReferenceCollector.cs | 50 ++++++++++++++ .../Reader/Services/OpenApiWorkspaceLoader.cs | 65 +++++++++++++++++++ .../Reader}/V2/JsonSchemaDeserializer.cs | 4 +- .../Reader}/V2/OpenApiContactDeserializer.cs | 4 +- .../Reader}/V2/OpenApiDocumentDeserializer.cs | 4 +- .../V2/OpenApiExternalDocsDeserializer.cs | 4 +- .../Reader}/V2/OpenApiHeaderDeserializer.cs | 6 +- .../Reader}/V2/OpenApiInfoDeserializer.cs | 4 +- .../Reader}/V2/OpenApiLicenseDeserializer.cs | 4 +- .../V2/OpenApiOperationDeserializer.cs | 6 +- .../V2/OpenApiParameterDeserializer.cs | 4 +- .../Reader}/V2/OpenApiPathItemDeserializer.cs | 4 +- .../Reader}/V2/OpenApiPathsDeserializer.cs | 4 +- .../Reader}/V2/OpenApiResponseDeserializer.cs | 4 +- .../OpenApiSecurityRequirementDeserializer.cs | 4 +- .../V2/OpenApiSecuritySchemeDeserializer.cs | 4 +- .../Reader}/V2/OpenApiTagDeserializer.cs | 4 +- .../Reader}/V2/OpenApiV2Deserializer.cs | 4 +- .../Reader}/V2/OpenApiV2VersionService.cs | 11 ++-- .../Reader}/V2/OpenApiXmlDeserializer.cs | 6 +- .../Reader}/V2/TempStorageKeys.cs | 2 +- .../Reader}/V3/JsonSchemaDeserializer.cs | 4 +- .../Reader}/V3/OpenApiCallbackDeserializer.cs | 4 +- .../V3/OpenApiComponentsDeserializer.cs | 4 +- .../Reader}/V3/OpenApiContactDeserializer.cs | 4 +- .../V3/OpenApiDiscriminatorDeserializer.cs | 4 +- .../Reader}/V3/OpenApiDocumentDeserializer.cs | 4 +- .../Reader}/V3/OpenApiEncodingDeserializer.cs | 4 +- .../Reader}/V3/OpenApiExampleDeserializer.cs | 4 +- .../V3/OpenApiExternalDocsDeserializer.cs | 4 +- .../Reader}/V3/OpenApiHeaderDeserializer.cs | 4 +- .../Reader}/V3/OpenApiInfoDeserializer.cs | 4 +- .../Reader}/V3/OpenApiLicenseDeserializer.cs | 4 +- .../Reader}/V3/OpenApiLinkDeserializer.cs | 4 +- .../V3/OpenApiMediaTypeDeserializer.cs | 4 +- .../V3/OpenApiOAuthFlowDeserializer.cs | 4 +- .../V3/OpenApiOAuthFlowsDeserializer.cs | 4 +- .../V3/OpenApiOperationDeserializer.cs | 4 +- .../V3/OpenApiParameterDeserializer.cs | 4 +- .../Reader}/V3/OpenApiPathItemDeserializer.cs | 4 +- .../Reader}/V3/OpenApiPathsDeserializer.cs | 4 +- .../V3/OpenApiRequestBodyDeserializer.cs | 4 +- .../Reader}/V3/OpenApiResponseDeserializer.cs | 4 +- .../V3/OpenApiResponsesDeserializer.cs | 4 +- .../OpenApiSecurityRequirementDeserializer.cs | 4 +- .../V3/OpenApiSecuritySchemeDeserializer.cs | 4 +- .../Reader}/V3/OpenApiServerDeserializer.cs | 4 +- .../V3/OpenApiServerVariableDeserializer.cs | 4 +- .../Reader}/V3/OpenApiTagDeserializer.cs | 4 +- .../Reader}/V3/OpenApiV3Deserializer.cs | 4 +- .../Reader}/V3/OpenApiV3VersionService.cs | 7 +- .../Reader}/V3/OpenApiXmlDeserializer.cs | 4 +- .../Reader}/V31/JsonSchemaDeserializer.cs | 4 +- .../V31/OpenApiCallbackDeserializer.cs | 4 +- .../V31/OpenApiComponentsDeserializer.cs | 4 +- .../Reader}/V31/OpenApiContactDeserializer.cs | 4 +- .../V31/OpenApiDiscriminatorDeserializer.cs | 4 +- .../V31/OpenApiDocumentDeserializer.cs | 4 +- .../V31/OpenApiEncodingDeserializer.cs | 4 +- .../Reader}/V31/OpenApiExampleDeserializer.cs | 4 +- .../V31/OpenApiExternalDocsDeserializer.cs | 4 +- .../Reader}/V31/OpenApiHeaderDeserializer.cs | 4 +- .../Reader}/V31/OpenApiInfoDeserializer.cs | 4 +- .../Reader}/V31/OpenApiLicenseDeserializer.cs | 4 +- .../Reader}/V31/OpenApiLinkDeserializer.cs | 4 +- .../V31/OpenApiMediaTypeDeserializer.cs | 4 +- .../V31/OpenApiOAuthFlowDeserializer.cs | 4 +- .../V31/OpenApiOAuthFlowsDeserializer.cs | 4 +- .../V31/OpenApiOperationDeserializer.cs | 4 +- .../V31/OpenApiParameterDeserializer.cs | 4 +- .../V31/OpenApiPathItemDeserializer.cs | 4 +- .../Reader}/V31/OpenApiPathsDeserializer.cs | 4 +- .../V31/OpenApiRequestBodyDeserializer.cs | 4 +- .../V31/OpenApiResponseDeserializer.cs | 4 +- .../V31/OpenApiResponsesDeserializer.cs | 4 +- .../OpenApiSecurityRequirementDeserializer.cs | 4 +- .../V31/OpenApiSecuritySchemeDeserializer.cs | 4 +- .../Reader}/V31/OpenApiServerDeserializer.cs | 4 +- .../V31/OpenApiServerVariableDeserializer.cs | 4 +- .../Reader}/V31/OpenApiTagDeserializer.cs | 4 +- .../Reader}/V31/OpenApiV31Deserializer.cs | 4 +- .../Reader}/V31/OpenApiV31VersionService.cs | 7 +- .../Reader}/V31/OpenApiXmlDeserializer.cs | 4 +- 114 files changed, 401 insertions(+), 274 deletions(-) delete mode 100644 src/Microsoft.OpenApi.Readers/YamlHelper.cs rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi}/Exceptions/OpenApiReaderException.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi}/Exceptions/OpenApiUnsupportedSpecVersionException.cs (97%) rename src/{Microsoft.OpenApi.Readers/Interface => Microsoft.OpenApi/Interfaces}/IDiagnostic.cs (85%) rename src/{Microsoft.OpenApi.Readers/Interface => Microsoft.OpenApi/Interfaces}/IOpenApiVersionService.cs (91%) rename src/{Microsoft.OpenApi.Readers/Interface => Microsoft.OpenApi/Interfaces}/IStreamLoader.cs (95%) create mode 100644 src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/OpenApiDiagnostic.cs (92%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/OpenApiReaderSettings.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/OpenApiVersionExtensionMethods.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/AnyFieldMap.cs (83%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/AnyFieldMapParameter.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/AnyListFieldMap.cs (83%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/AnyListFieldMapParameter.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/AnyMapFieldMap.cs (83%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/AnyMapFieldMapParameter.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/FixedFieldMap.cs (83%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/JsonPointerExtensions.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/ListNode.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/MapNode.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/ParseNode.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/ParserHelper.cs (100%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/PatternFieldMap.cs (84%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/PropertyNode.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/RootNode.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParseNodes/ValueNode.cs (91%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ParsingContext.cs (89%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/ReadResult.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/SchemaTypeConverter.cs (88%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/Services/DefaultStreamLoader.cs (62%) create mode 100644 src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs create mode 100644 src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/JsonSchemaDeserializer.cs (99%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiContactDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiDocumentDeserializer.cs (99%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiExternalDocsDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiHeaderDeserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiInfoDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiLicenseDeserializer.cs (93%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiOperationDeserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiParameterDeserializer.cs (99%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiPathItemDeserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiPathsDeserializer.cs (92%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiResponseDeserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiSecurityRequirementDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiSecuritySchemeDeserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiTagDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiV2Deserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiV2VersionService.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/OpenApiXmlDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V2/TempStorageKeys.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/JsonSchemaDeserializer.cs (99%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiCallbackDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiComponentsDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiContactDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiDiscriminatorDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiDocumentDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiEncodingDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiExampleDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiExternalDocsDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiHeaderDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiInfoDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiLicenseDeserializer.cs (93%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiLinkDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiMediaTypeDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiOAuthFlowDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiOAuthFlowsDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiOperationDeserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiParameterDeserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiPathItemDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiPathsDeserializer.cs (92%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiRequestBodyDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiResponseDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiResponsesDeserializer.cs (92%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiSecurityRequirementDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiSecuritySchemeDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiServerDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiServerVariableDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiTagDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiV3Deserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiV3VersionService.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V3/OpenApiXmlDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/JsonSchemaDeserializer.cs (99%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiCallbackDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiComponentsDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiContactDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiDiscriminatorDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiDocumentDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiEncodingDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiExampleDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiExternalDocsDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiHeaderDeserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiInfoDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiLicenseDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiLinkDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiMediaTypeDeserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiOAuthFlowDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiOAuthFlowsDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiOperationDeserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiParameterDeserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiPathItemDeserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiPathsDeserializer.cs (92%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiRequestBodyDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiResponseDeserializer.cs (96%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiResponsesDeserializer.cs (92%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiSecurityRequirementDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiSecuritySchemeDeserializer.cs (97%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiServerDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiServerVariableDeserializer.cs (95%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiTagDeserializer.cs (94%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiV31Deserializer.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiV31VersionService.cs (98%) rename src/{Microsoft.OpenApi.Readers => Microsoft.OpenApi/Reader}/V31/OpenApiXmlDeserializer.cs (95%) diff --git a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj index a18222a87..0569a7c06 100644 --- a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj +++ b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj @@ -17,6 +17,12 @@ ..\Microsoft.OpenApi.snk + + + + + + diff --git a/src/Microsoft.OpenApi.Readers/YamlHelper.cs b/src/Microsoft.OpenApi.Readers/YamlHelper.cs deleted file mode 100644 index 471252a31..000000000 --- a/src/Microsoft.OpenApi.Readers/YamlHelper.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text.Json.Nodes; -using Microsoft.OpenApi.Exceptions; -using SharpYaml.Serialization; - -namespace Microsoft.OpenApi.Readers -{ - internal static class YamlHelper - { - public static string GetScalarValue(this JsonNode node) - { - - var scalarNode = node is JsonValue value ? value : throw new OpenApiException($"Expected scalar value."); - - return Convert.ToString(scalarNode?.GetValue(), CultureInfo.InvariantCulture); - } - - public static JsonNode ParseJsonString(string yamlString) - { - var reader = new StringReader(yamlString); - var yamlStream = new YamlStream(); - yamlStream.Load(reader); - - var yamlDocument = yamlStream.Documents.First(); - return yamlDocument.RootNode.ToJsonNode(); - } - } -} diff --git a/src/Microsoft.OpenApi.Readers/Exceptions/OpenApiReaderException.cs b/src/Microsoft.OpenApi/Exceptions/OpenApiReaderException.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/Exceptions/OpenApiReaderException.cs rename to src/Microsoft.OpenApi/Exceptions/OpenApiReaderException.cs index 5eaec31d4..257b0e9a4 100644 --- a/src/Microsoft.OpenApi.Readers/Exceptions/OpenApiReaderException.cs +++ b/src/Microsoft.OpenApi/Exceptions/OpenApiReaderException.cs @@ -1,11 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Text.Json.Nodes; -using Microsoft.OpenApi.Exceptions; +using Microsoft.OpenApi.Reader; -namespace Microsoft.OpenApi.Readers.Exceptions +namespace Microsoft.OpenApi.Exceptions { /// /// Defines an exception indicating OpenAPI Reader encountered an issue while reading. diff --git a/src/Microsoft.OpenApi.Readers/Exceptions/OpenApiUnsupportedSpecVersionException.cs b/src/Microsoft.OpenApi/Exceptions/OpenApiUnsupportedSpecVersionException.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/Exceptions/OpenApiUnsupportedSpecVersionException.cs rename to src/Microsoft.OpenApi/Exceptions/OpenApiUnsupportedSpecVersionException.cs index 2d125c259..f9be8bd63 100644 --- a/src/Microsoft.OpenApi.Readers/Exceptions/OpenApiUnsupportedSpecVersionException.cs +++ b/src/Microsoft.OpenApi/Exceptions/OpenApiUnsupportedSpecVersionException.cs @@ -4,7 +4,7 @@ using System; using System.Globalization; -namespace Microsoft.OpenApi.Readers.Exceptions +namespace Microsoft.OpenApi.Exceptions { /// /// Defines an exception indicating OpenAPI Reader encountered an unsupported specification version while reading. diff --git a/src/Microsoft.OpenApi.Readers/Interface/IDiagnostic.cs b/src/Microsoft.OpenApi/Interfaces/IDiagnostic.cs similarity index 85% rename from src/Microsoft.OpenApi.Readers/Interface/IDiagnostic.cs rename to src/Microsoft.OpenApi/Interfaces/IDiagnostic.cs index 65511ce11..74376de02 100644 --- a/src/Microsoft.OpenApi.Readers/Interface/IDiagnostic.cs +++ b/src/Microsoft.OpenApi/Interfaces/IDiagnostic.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -namespace Microsoft.OpenApi.Readers.Interface +namespace Microsoft.OpenApi.Interfaces { /// /// Interface for the entity containing diagnostic information from the reading process. diff --git a/src/Microsoft.OpenApi.Readers/Interface/IOpenApiVersionService.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiVersionService.cs similarity index 91% rename from src/Microsoft.OpenApi.Readers/Interface/IOpenApiVersionService.cs rename to src/Microsoft.OpenApi/Interfaces/IOpenApiVersionService.cs index 2392815f4..c3df35972 100644 --- a/src/Microsoft.OpenApi.Readers/Interface/IOpenApiVersionService.cs +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiVersionService.cs @@ -1,11 +1,10 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.Interface +namespace Microsoft.OpenApi.Interfaces { /// /// Interface to a version specific parsing implementations. diff --git a/src/Microsoft.OpenApi.Readers/Interface/IStreamLoader.cs b/src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/Interface/IStreamLoader.cs rename to src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs index f69ae474a..cdf7eaaf8 100644 --- a/src/Microsoft.OpenApi.Readers/Interface/IStreamLoader.cs +++ b/src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; -namespace Microsoft.OpenApi.Readers.Interface +namespace Microsoft.OpenApi.Interfaces { /// /// Interface for service that translates a URI into a stream that can be loaded by a Reader diff --git a/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs b/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs new file mode 100644 index 000000000..e8dee12d1 --- /dev/null +++ b/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.Globalization; +using System.Text.Json.Nodes; +using Microsoft.OpenApi.Exceptions; + +namespace Microsoft.OpenApi.Reader +{ + internal static class JsonNodeHelper + { + public static string GetScalarValue(this JsonNode node) + { + + var scalarNode = node is JsonValue value ? value : throw new OpenApiException($"Expected scalar value."); + + return Convert.ToString(scalarNode?.GetValue(), CultureInfo.InvariantCulture); + } + } +} diff --git a/src/Microsoft.OpenApi.Readers/OpenApiDiagnostic.cs b/src/Microsoft.OpenApi/Reader/OpenApiDiagnostic.cs similarity index 92% rename from src/Microsoft.OpenApi.Readers/OpenApiDiagnostic.cs rename to src/Microsoft.OpenApi/Reader/OpenApiDiagnostic.cs index 509358174..9f09bb457 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiDiagnostic.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiDiagnostic.cs @@ -2,10 +2,10 @@ // Licensed under the MIT license. using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; -namespace Microsoft.OpenApi.Readers +namespace Microsoft.OpenApi.Reader { /// /// Object containing all diagnostic information related to Open API parsing. @@ -53,7 +53,7 @@ public void AppendDiagnostic(OpenApiDiagnostic diagnosticToAdd, string fileNameT /// /// Extension class for IList to add the Method "AddRange" used above /// -internal static class IDiagnosticExtensions +public static class IDiagnosticExtensions { /// /// Extension method for IList so that another list can be added to the current list. @@ -61,7 +61,7 @@ internal static class IDiagnosticExtensions /// /// /// - internal static void AddRange(this ICollection collection, IEnumerable enumerable) + public static void AddRange(this ICollection collection, IEnumerable enumerable) { if (collection is null || enumerable is null) return; diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs rename to src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index 50bbf3c0b..f821bb784 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -7,10 +7,9 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.MicrosoftExtensions; -using Microsoft.OpenApi.Readers.Interface; using Microsoft.OpenApi.Validations; -namespace Microsoft.OpenApi.Readers +namespace Microsoft.OpenApi.Reader { /// /// Indicates if and when the reader should convert unresolved references into resolved objects @@ -77,7 +76,7 @@ public class OpenApiReaderSettings /// /// Whether to leave the object open after reading - /// from an object. + /// from an OpenApiStreamReader object. /// public bool LeaveStreamOpen { get; set; } diff --git a/src/Microsoft.OpenApi.Readers/OpenApiVersionExtensionMethods.cs b/src/Microsoft.OpenApi/Reader/OpenApiVersionExtensionMethods.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/OpenApiVersionExtensionMethods.cs rename to src/Microsoft.OpenApi/Reader/OpenApiVersionExtensionMethods.cs index ce35b9900..24f32ef5f 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiVersionExtensionMethods.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiVersionExtensionMethods.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.OpenApi.Readers +namespace Microsoft.OpenApi.Reader { /// /// Generates custom extension methods for the version string type diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyFieldMap.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMap.cs similarity index 83% rename from src/Microsoft.OpenApi.Readers/ParseNodes/AnyFieldMap.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMap.cs index 479417bdb..f1c76d315 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyFieldMap.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMap.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class AnyFieldMap : Dictionary> { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyFieldMapParameter.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMapParameter.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/ParseNodes/AnyFieldMapParameter.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMapParameter.cs index 1ff8702b8..9b674c408 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyFieldMapParameter.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMapParameter.cs @@ -5,7 +5,7 @@ using Json.Schema; using Microsoft.OpenApi.Any; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class AnyFieldMapParameter { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMap.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyListFieldMap.cs similarity index 83% rename from src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMap.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/AnyListFieldMap.cs index ffd73f893..578d6b68e 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMap.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyListFieldMap.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class AnyListFieldMap : Dictionary> { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMapParameter.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyListFieldMapParameter.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMapParameter.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/AnyListFieldMapParameter.cs index 97b448600..32342d594 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMapParameter.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyListFieldMapParameter.cs @@ -6,7 +6,7 @@ using System.Text.Json.Nodes; using Json.Schema; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class AnyListFieldMapParameter { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyMapFieldMap.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMap.cs similarity index 83% rename from src/Microsoft.OpenApi.Readers/ParseNodes/AnyMapFieldMap.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMap.cs index 55dd3b96a..cc4128740 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyMapFieldMap.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMap.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class AnyMapFieldMap : Dictionary> { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyMapFieldMapParameter.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMapParameter.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/ParseNodes/AnyMapFieldMapParameter.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMapParameter.cs index 24d0819eb..43468acfc 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyMapFieldMapParameter.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMapParameter.cs @@ -6,7 +6,7 @@ using Json.Schema; using Microsoft.OpenApi.Any; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class AnyMapFieldMapParameter { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/FixedFieldMap.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/FixedFieldMap.cs similarity index 83% rename from src/Microsoft.OpenApi.Readers/ParseNodes/FixedFieldMap.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/FixedFieldMap.cs index 4364cf1df..f972a2c29 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/FixedFieldMap.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/FixedFieldMap.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class FixedFieldMap : Dictionary> { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/JsonPointerExtensions.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/JsonPointerExtensions.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/ParseNodes/JsonPointerExtensions.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/JsonPointerExtensions.cs index f361348e0..b349f2d5d 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/JsonPointerExtensions.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/JsonPointerExtensions.cs @@ -4,7 +4,7 @@ using System; using System.Text.Json.Nodes; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { /// /// Extensions for JSON pointers. diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/ListNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/ListNode.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/ParseNodes/ListNode.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/ListNode.cs index 64c2da57f..ae98b851a 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/ListNode.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/ListNode.cs @@ -7,9 +7,9 @@ using System.Linq; using System.Text.Json.Nodes; using Microsoft.OpenApi.Any; -using Microsoft.OpenApi.Readers.Exceptions; +using Microsoft.OpenApi.Exceptions; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class ListNode : ParseNode, IEnumerable { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs index a26b35140..1420e756b 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs @@ -10,11 +10,11 @@ using System.Text.Json.Nodes; using Json.Schema; using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Exceptions; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { /// /// Abstraction of a Map to isolate semantic parsing from details of JSON DOM @@ -24,10 +24,6 @@ internal class MapNode : ParseNode, IEnumerable private readonly JsonObject _node; private readonly List _nodes; - public MapNode(ParsingContext context, string jsonString) : - this(context, YamlHelper.ParseJsonString(jsonString)) - { - } public MapNode(ParsingContext context, JsonNode node) : base( context, node) { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/ParseNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/ParseNode.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/ParseNodes/ParseNode.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/ParseNode.cs index bfdc7f3f0..48073b5e1 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/ParseNode.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/ParseNode.cs @@ -6,11 +6,11 @@ using System.Text.Json.Nodes; using Json.Schema; using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Exceptions; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal abstract class ParseNode { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/ParserHelper.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/ParserHelper.cs similarity index 100% rename from src/Microsoft.OpenApi.Readers/ParseNodes/ParserHelper.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/ParserHelper.cs diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/PatternFieldMap.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/PatternFieldMap.cs similarity index 84% rename from src/Microsoft.OpenApi.Readers/ParseNodes/PatternFieldMap.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/PatternFieldMap.cs index 8fb28bc5e..fce08dac5 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/PatternFieldMap.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/PatternFieldMap.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class PatternFieldMap : Dictionary, Action> { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/PropertyNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/PropertyNode.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/ParseNodes/PropertyNode.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/PropertyNode.cs index 12c6f6ea0..a9a6d3b46 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/PropertyNode.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/PropertyNode.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -7,9 +7,9 @@ using System.Text.Json.Nodes; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Exceptions; -using Microsoft.OpenApi.Readers.Exceptions; +using Microsoft.OpenApi.Models; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class PropertyNode : ParseNode { diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/RootNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/RootNode.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/ParseNodes/RootNode.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/RootNode.cs index d423b8ff4..b9e49b47d 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/RootNode.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/RootNode.cs @@ -3,7 +3,7 @@ using System.Text.Json.Nodes; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { /// /// Wrapper class around JsonDocument to isolate semantic parsing from details of Json DOM. diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/ValueNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/ValueNode.cs similarity index 91% rename from src/Microsoft.OpenApi.Readers/ParseNodes/ValueNode.cs rename to src/Microsoft.OpenApi/Reader/ParseNodes/ValueNode.cs index 04b2cd6b2..1d74ff874 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/ValueNode.cs +++ b/src/Microsoft.OpenApi/Reader/ParseNodes/ValueNode.cs @@ -5,9 +5,9 @@ using System.Globalization; using System.Text.Json.Nodes; using Microsoft.OpenApi.Any; -using Microsoft.OpenApi.Readers.Exceptions; +using Microsoft.OpenApi.Exceptions; -namespace Microsoft.OpenApi.Readers.ParseNodes +namespace Microsoft.OpenApi.Reader.ParseNodes { internal class ValueNode : ParseNode { diff --git a/src/Microsoft.OpenApi.Readers/ParsingContext.cs b/src/Microsoft.OpenApi/Reader/ParsingContext.cs similarity index 89% rename from src/Microsoft.OpenApi.Readers/ParsingContext.cs rename to src/Microsoft.OpenApi/Reader/ParsingContext.cs index 48b126e64..58b7151ed 100644 --- a/src/Microsoft.OpenApi.Readers/ParsingContext.cs +++ b/src/Microsoft.OpenApi/Reader/ParsingContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -6,33 +6,44 @@ using System.Linq; using System.Text.Json.Nodes; using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Exceptions; -using Microsoft.OpenApi.Readers.Interface; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V2; -using Microsoft.OpenApi.Readers.V3; -using Microsoft.OpenApi.Readers.V31; - -namespace Microsoft.OpenApi.Readers +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V2; +using Microsoft.OpenApi.Reader.V3; +using Microsoft.OpenApi.Reader.V31; + +namespace Microsoft.OpenApi.Reader { /// /// The Parsing Context holds temporary state needed whilst parsing an OpenAPI Document /// public class ParsingContext { - private readonly Stack _currentLocation = new Stack(); - private readonly Dictionary _tempStorage = new Dictionary(); - private readonly Dictionary> _scopedTempStorage = new Dictionary>(); - private readonly Dictionary> _loopStacks = new Dictionary>(); - internal Dictionary> ExtensionParsers { get; set; } = - new Dictionary>(); + private readonly Stack _currentLocation = new(); + private readonly Dictionary _tempStorage = new(); + private readonly Dictionary> _scopedTempStorage = new(); + private readonly Dictionary> _loopStacks = new(); + + /// + /// Extension parsers + /// + public Dictionary> ExtensionParsers { get; set; } = + new(); internal RootNode RootNode { get; set; } internal List Tags { get; private set; } = new(); - internal Uri BaseUrl { get; set; } - internal List DefaultContentType { get; set; } + + /// + /// The base url for the document + /// + public Uri BaseUrl { get; set; } + + /// + /// Default content type for a response object + /// + public List DefaultContentType { get; set; } /// /// Diagnostic object that returns metadata about the parsing process. @@ -53,7 +64,7 @@ public ParsingContext(OpenApiDiagnostic diagnostic) /// /// Set of Json nodes to parse. /// An OpenApiDocument populated based on the passed yamlDocument - internal OpenApiDocument Parse(JsonNode jsonNode) + public OpenApiDocument Parse(JsonNode jsonNode) { RootNode = new RootNode(this, jsonNode); @@ -95,7 +106,7 @@ internal OpenApiDocument Parse(JsonNode jsonNode) /// /// OpenAPI version of the fragment /// An OpenApiDocument populated based on the passed yamlDocument - internal T ParseFragment(JsonNode jsonNode, OpenApiSpecVersion version) where T : IOpenApiElement + public T ParseFragment(JsonNode jsonNode, OpenApiSpecVersion version) where T : IOpenApiElement { var node = ParseNode.Create(this, jsonNode); diff --git a/src/Microsoft.OpenApi.Readers/ReadResult.cs b/src/Microsoft.OpenApi/Reader/ReadResult.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/ReadResult.cs rename to src/Microsoft.OpenApi/Reader/ReadResult.cs index 382c22d64..77a18ff78 100644 --- a/src/Microsoft.OpenApi.Readers/ReadResult.cs +++ b/src/Microsoft.OpenApi/Reader/ReadResult.cs @@ -3,7 +3,7 @@ using Microsoft.OpenApi.Models; -namespace Microsoft.OpenApi.Readers +namespace Microsoft.OpenApi.Reader { /// /// Container object used for returning the result of reading an OpenAPI description. diff --git a/src/Microsoft.OpenApi.Readers/SchemaTypeConverter.cs b/src/Microsoft.OpenApi/Reader/SchemaTypeConverter.cs similarity index 88% rename from src/Microsoft.OpenApi.Readers/SchemaTypeConverter.cs rename to src/Microsoft.OpenApi/Reader/SchemaTypeConverter.cs index cb61a183e..f446fa78b 100644 --- a/src/Microsoft.OpenApi.Readers/SchemaTypeConverter.cs +++ b/src/Microsoft.OpenApi/Reader/SchemaTypeConverter.cs @@ -1,10 +1,10 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using Json.Schema; -namespace Microsoft.OpenApi.Readers +namespace Microsoft.OpenApi.Reader { internal static class SchemaTypeConverter { diff --git a/src/Microsoft.OpenApi.Readers/Services/DefaultStreamLoader.cs b/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs similarity index 62% rename from src/Microsoft.OpenApi.Readers/Services/DefaultStreamLoader.cs rename to src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs index 5ef282156..dba3c6811 100644 --- a/src/Microsoft.OpenApi.Readers/Services/DefaultStreamLoader.cs +++ b/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs @@ -5,23 +5,34 @@ using System.IO; using System.Net.Http; using System.Threading.Tasks; -using Microsoft.OpenApi.Readers.Interface; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; -namespace Microsoft.OpenApi.Readers.Services +namespace Microsoft.OpenApi.Reader.Services { /// /// Implementation of IInputLoader that loads streams from URIs /// - internal class DefaultStreamLoader : IStreamLoader + public class DefaultStreamLoader : IStreamLoader { private readonly Uri baseUrl; private HttpClient _httpClient = new(); + /// + /// The default stream loader + /// + /// public DefaultStreamLoader(Uri baseUrl) { this.baseUrl = baseUrl; } + /// + /// Loads a document stream from the input URL + /// + /// + /// + /// public Stream Load(Uri uri) { var absoluteUri = new Uri(baseUrl, uri); @@ -37,6 +48,12 @@ public Stream Load(Uri uri) } } + /// + /// Use Uri to locate data and convert into an input object. + /// + /// Identifier of some source of an OpenAPI Description + /// A data object that can be processed by a reader to generate an + /// public async Task LoadAsync(Uri uri) { var absoluteUri = new Uri(baseUrl, uri); diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs new file mode 100644 index 000000000..1f7781def --- /dev/null +++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Services; + +namespace Microsoft.OpenApi.Reader.Services +{ + /// + /// Builds a list of all remote references used in an OpenApi document + /// + internal class OpenApiRemoteReferenceCollector : OpenApiVisitorBase + { + private Dictionary _references = new(); + + /// + /// List of external references collected from OpenApiDocument + /// + public IEnumerable References + { + get + { + return _references.Values; + } + } + + /// + /// Collect reference for each reference + /// + /// + public override void Visit(IOpenApiReferenceable referenceable) + { + AddReference(referenceable.Reference); + } + + /// + /// Collect external reference + /// + private void AddReference(OpenApiReference reference) + { + if (reference is {IsExternal: true} && + !_references.ContainsKey(reference.ExternalResource)) + { + _references.Add(reference.ExternalResource, reference); + } + } + } +} diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs new file mode 100644 index 000000000..eb0ad15db --- /dev/null +++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs @@ -0,0 +1,65 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Services; + +namespace Microsoft.OpenApi.Reader.Services +{ + internal class OpenApiWorkspaceLoader + { + private OpenApiWorkspace _workspace; + private IStreamLoader _loader; + private readonly OpenApiReaderSettings _readerSettings; + + public OpenApiWorkspaceLoader(OpenApiWorkspace workspace, IStreamLoader loader, OpenApiReaderSettings readerSettings) + { + _workspace = workspace; + _loader = loader; + _readerSettings = readerSettings; + } + + internal async Task LoadAsync(OpenApiReference reference, + OpenApiDocument document, + string format = null, + OpenApiDiagnostic diagnostic = null, + CancellationToken cancellationToken = default) + { + _workspace.AddDocument(reference.ExternalResource, document); + document.Workspace = _workspace; + + // Collect remote references by walking document + var referenceCollector = new OpenApiRemoteReferenceCollector(); + var collectorWalker = new OpenApiWalker(referenceCollector); + collectorWalker.Walk(document); + + var reader = OpenApiReaderRegistry.GetReader(format); + + diagnostic ??= new(); + + // Walk references + foreach (var item in referenceCollector.References) + { + // If not already in workspace, load it and process references + if (!_workspace.Contains(item.ExternalResource)) + { + var input = await _loader.LoadAsync(new(item.ExternalResource, UriKind.RelativeOrAbsolute)); + var result = await reader.ReadAsync(input, _readerSettings, cancellationToken); + // Merge diagnostics + if (result.OpenApiDiagnostic != null) + { + diagnostic.AppendDiagnostic(result.OpenApiDiagnostic, item.ExternalResource); + } + if (result.OpenApiDocument != null) + { + var loadDiagnostic = await LoadAsync(item, result.OpenApiDocument, format, diagnostic, cancellationToken); + diagnostic = loadDiagnostic; + } + } + } + + return diagnostic; + } + } +} diff --git a/src/Microsoft.OpenApi.Readers/V2/JsonSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/JsonSchemaDeserializer.cs similarity index 99% rename from src/Microsoft.OpenApi.Readers/V2/JsonSchemaDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/JsonSchemaDeserializer.cs index e2fea6cc4..359f7673a 100644 --- a/src/Microsoft.OpenApi.Readers/V2/JsonSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/JsonSchemaDeserializer.cs @@ -9,9 +9,9 @@ using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Extensions; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiContactDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiContactDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiContactDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiContactDeserializer.cs index 2e349a971..a42a5bbda 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiContactDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiContactDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiDocumentDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs similarity index 99% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiDocumentDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs index 97c194098..fd91d0a8b 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiDocumentDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs @@ -8,10 +8,10 @@ using Json.Schema; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; using Microsoft.OpenApi.Services; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiExternalDocsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiExternalDocsDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiExternalDocsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiExternalDocsDeserializer.cs index 5297a3a72..82f04650e 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiExternalDocsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiExternalDocsDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs index 4d73cf4ef..3a804905d 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs @@ -6,10 +6,10 @@ using Json.Schema; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Exceptions; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Exceptions; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiInfoDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiInfoDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiInfoDeserializer.cs index 813fb9fc4..2622f862b 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiInfoDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiInfoDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiLicenseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiLicenseDeserializer.cs similarity index 93% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiLicenseDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiLicenseDeserializer.cs index fa7b9d918..f646da522 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiLicenseDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiLicenseDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiOperationDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiOperationDeserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiOperationDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiOperationDeserializer.cs index b8b606a83..9940888bb 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiOperationDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiOperationDeserializer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Collections.Generic; @@ -7,9 +7,9 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs similarity index 99% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiParameterDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs index 6aa59652d..26a95c373 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiParameterDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs @@ -9,9 +9,9 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiPathItemDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathItemDeserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiPathItemDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiPathItemDeserializer.cs index bbc5ef240..c597e9eee 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiPathItemDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathItemDeserializer.cs @@ -5,9 +5,9 @@ using System.Linq; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiPathsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathsDeserializer.cs similarity index 92% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiPathsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiPathsDeserializer.cs index 2fa5bd25f..d97052129 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiPathsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathsDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiResponseDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs index f771a9974..59e719756 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiResponseDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs @@ -5,9 +5,9 @@ using Json.Schema; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiSecurityRequirementDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs index b4e578aa1..0938fe6fd 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiSecurityRequirementDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs @@ -2,9 +2,9 @@ // Licensed under the MIT license. using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiSecuritySchemeDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs index 87086690f..c1da81fd2 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiSecuritySchemeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiTagDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiTagDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiTagDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiTagDeserializer.cs index 388b4fdb5..d1857eef6 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiTagDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiTagDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2Deserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiV2Deserializer.cs index 3865653e4..39a4a87cb 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2Deserializer.cs @@ -8,9 +8,9 @@ using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V2 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2VersionService.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2VersionService.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiV2VersionService.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiV2VersionService.cs index 8cc0d010c..41049738f 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2VersionService.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2VersionService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -8,12 +8,11 @@ using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Exceptions; -using Microsoft.OpenApi.Readers.Interface; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.Properties; +using Microsoft.OpenApi.Properties; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 + +namespace Microsoft.OpenApi.Reader.V2 { /// /// The version specific implementations for OpenAPI V2.0. diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiXmlDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiXmlDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V2/OpenApiXmlDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V2/OpenApiXmlDeserializer.cs index d11a51d65..72375b74b 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiXmlDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiXmlDeserializer.cs @@ -2,12 +2,12 @@ // Licensed under the MIT license. using System; +using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Exceptions; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V2/TempStorageKeys.cs b/src/Microsoft.OpenApi/Reader/V2/TempStorageKeys.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V2/TempStorageKeys.cs rename to src/Microsoft.OpenApi/Reader/V2/TempStorageKeys.cs index c7b96f6ce..62b6d6663 100644 --- a/src/Microsoft.OpenApi.Readers/V2/TempStorageKeys.cs +++ b/src/Microsoft.OpenApi/Reader/V2/TempStorageKeys.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -namespace Microsoft.OpenApi.Readers.V2 +namespace Microsoft.OpenApi.Reader.V2 { /// /// Strings to be used as keys for the temporary storage. diff --git a/src/Microsoft.OpenApi.Readers/V3/JsonSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/JsonSchemaDeserializer.cs similarity index 99% rename from src/Microsoft.OpenApi.Readers/V3/JsonSchemaDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/JsonSchemaDeserializer.cs index 2621d3729..5d4c5b67f 100644 --- a/src/Microsoft.OpenApi.Readers/V3/JsonSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/JsonSchemaDeserializer.cs @@ -9,10 +9,10 @@ using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Extensions; -using Microsoft.OpenApi.Readers.ParseNodes; using JsonSchema = Json.Schema.JsonSchema; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiCallbackDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiCallbackDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiCallbackDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiCallbackDeserializer.cs index fc41e7daa..2c5905d67 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiCallbackDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiCallbackDeserializer.cs @@ -4,9 +4,9 @@ using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiComponentsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiComponentsDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiComponentsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiComponentsDeserializer.cs index 53790ac5f..1b6590adc 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiComponentsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiComponentsDeserializer.cs @@ -8,9 +8,9 @@ using Json.Schema; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiContactDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiContactDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiContactDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiContactDeserializer.cs index 712169bb7..42cb64877 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiContactDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiContactDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiDiscriminatorDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs index 0c3df1536..8bc56f7dc 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiDiscriminatorDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs @@ -2,9 +2,9 @@ // Licensed under the MIT license. using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiDocumentDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiDocumentDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs index 195576bc1..232dbdaf9 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiDocumentDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiEncodingDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiEncodingDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiEncodingDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiEncodingDeserializer.cs index c627ea8f5..4228e339c 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiEncodingDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiEncodingDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiExampleDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs index 0399ad84d..6a7b0305f 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiExampleDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiExternalDocsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiExternalDocsDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiExternalDocsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiExternalDocsDeserializer.cs index 99c8a821c..fc5b83e18 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiExternalDocsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiExternalDocsDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiHeaderDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiHeaderDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiHeaderDeserializer.cs index cd74df4b4..809226b4a 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiHeaderDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiHeaderDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiInfoDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiInfoDeserializer.cs index 03b0bc2be..9573d69c0 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiInfoDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiInfoDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiLicenseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiLicenseDeserializer.cs similarity index 93% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiLicenseDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiLicenseDeserializer.cs index 3d546ceb1..380c8b8fa 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiLicenseDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiLicenseDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiLinkDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiLinkDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiLinkDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiLinkDeserializer.cs index 462bb875e..3f3694339 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiLinkDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiLinkDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiMediaTypeDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs index 0d8a8fe04..bd0f8ac56 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiMediaTypeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiOAuthFlowDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiOAuthFlowDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowDeserializer.cs index 77e19ccbc..9d0c115f3 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiOAuthFlowDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiOAuthFlowsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiOAuthFlowsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs index 5423323f8..92e49b770 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiOAuthFlowsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiOperationDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiOperationDeserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiOperationDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiOperationDeserializer.cs index 471b3a207..dd1626df7 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiOperationDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiOperationDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiParameterDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs index b61804853..fd4638273 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiParameterDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs @@ -5,9 +5,9 @@ using System.Linq; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiPathItemDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathItemDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiPathItemDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiPathItemDeserializer.cs index 0d62bd9c6..115aedd9b 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiPathItemDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathItemDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiPathsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathsDeserializer.cs similarity index 92% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiPathsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiPathsDeserializer.cs index fb3d6888e..7238c3711 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiPathsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathsDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiRequestBodyDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiRequestBodyDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiRequestBodyDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiRequestBodyDeserializer.cs index 751fd1ac5..2bf5f6963 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiRequestBodyDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiRequestBodyDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponseDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiResponseDeserializer.cs index 9e86b94c2..8362504d9 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiResponseDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponseDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiResponsesDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponsesDeserializer.cs similarity index 92% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiResponsesDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiResponsesDeserializer.cs index e9b1b2db6..b317f4d4a 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiResponsesDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponsesDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiSecurityRequirementDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs index 6ff85666c..837f98f8d 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiSecurityRequirementDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs @@ -2,9 +2,9 @@ // Licensed under the MIT license. using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiSecuritySchemeDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs index c219d586f..a40f25680 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiSecuritySchemeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiServerDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiServerDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiServerDeserializer.cs index cfdb5d3ae..c58815f3a 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiServerDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiServerVariableDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerVariableDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiServerVariableDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiServerVariableDeserializer.cs index e65222dde..b5de9dd49 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiServerVariableDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerVariableDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiTagDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiTagDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiTagDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiTagDeserializer.cs index 441ab330e..ff848ae27 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiTagDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiTagDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs index b7bfe5bb9..6d32eaedb 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs @@ -9,9 +9,9 @@ using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3VersionService.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiV3VersionService.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs index 201c5862d..8f883e48a 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3VersionService.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs @@ -10,11 +10,10 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.Properties; +using Microsoft.OpenApi.Properties; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// The version service for the Open API V3.0. diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiXmlDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiXmlDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V3/OpenApiXmlDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V3/OpenApiXmlDeserializer.cs index b88aaade9..91f172707 100644 --- a/src/Microsoft.OpenApi.Readers/V3/OpenApiXmlDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiXmlDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V3 +namespace Microsoft.OpenApi.Reader.V3 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/JsonSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/JsonSchemaDeserializer.cs similarity index 99% rename from src/Microsoft.OpenApi.Readers/V31/JsonSchemaDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/JsonSchemaDeserializer.cs index 2b1972824..91a34fe73 100644 --- a/src/Microsoft.OpenApi.Readers/V31/JsonSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/JsonSchemaDeserializer.cs @@ -9,10 +9,10 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; using JsonSchema = Json.Schema.JsonSchema; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiCallbackDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiCallbackDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiCallbackDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiCallbackDeserializer.cs index 4f926e35b..faf89af69 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiCallbackDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiCallbackDeserializer.cs @@ -2,9 +2,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiComponentsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiComponentsDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiComponentsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiComponentsDeserializer.cs index d5532af41..904a494aa 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiComponentsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiComponentsDeserializer.cs @@ -5,9 +5,9 @@ using Json.Schema; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiContactDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiContactDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiContactDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiContactDeserializer.cs index e5d4c5ddc..2c1771d5a 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiContactDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiContactDeserializer.cs @@ -1,9 +1,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiDiscriminatorDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs index 5aae0dc7c..7c04dcdc8 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiDiscriminatorDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiDocumentDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiDocumentDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs index f788755cb..9075b81d0 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiDocumentDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiEncodingDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiEncodingDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiEncodingDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiEncodingDeserializer.cs index 645a1551c..3007be502 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiEncodingDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiEncodingDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiExampleDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs index 4746bdca1..7d6b89730 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiExampleDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiExternalDocsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiExternalDocsDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiExternalDocsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiExternalDocsDeserializer.cs index 55470cc05..1bed64623 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiExternalDocsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiExternalDocsDeserializer.cs @@ -1,9 +1,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiHeaderDeserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiHeaderDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiHeaderDeserializer.cs index 78e90edf9..64c5419ce 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiHeaderDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiHeaderDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiInfoDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiInfoDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiInfoDeserializer.cs index 09bb4cd1c..31237b40e 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiInfoDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiInfoDeserializer.cs @@ -1,9 +1,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiLicenseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiLicenseDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiLicenseDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiLicenseDeserializer.cs index 1a25da3e5..e2b50a5bd 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiLicenseDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiLicenseDeserializer.cs @@ -1,9 +1,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiLinkDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiLinkDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiLinkDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiLinkDeserializer.cs index 13a6fe4a4..155e62725 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiLinkDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiLinkDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiMediaTypeDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs index 58a1f3018..8725a1a0a 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiMediaTypeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiOAuthFlowDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiOAuthFlowDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowDeserializer.cs index 3c6998d5f..f88654020 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiOAuthFlowDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowDeserializer.cs @@ -1,9 +1,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiOAuthFlowsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiOAuthFlowsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs index 17ff7d622..6cb78a9d1 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiOAuthFlowsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiOperationDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiOperationDeserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiOperationDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiOperationDeserializer.cs index b72c277d7..0130b2c4d 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiOperationDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiOperationDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiParameterDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs index 6d9b5bae7..b32d2f9a3 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiParameterDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs @@ -2,9 +2,9 @@ using System.Linq; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiPathItemDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathItemDeserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiPathItemDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiPathItemDeserializer.cs index 282dff248..d6c25ee52 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiPathItemDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathItemDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiPathsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathsDeserializer.cs similarity index 92% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiPathsDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiPathsDeserializer.cs index a32c78902..8412e894f 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiPathsDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathsDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiRequestBodyDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiRequestBodyDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiRequestBodyDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiRequestBodyDeserializer.cs index 537677350..de9e01c2b 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiRequestBodyDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiRequestBodyDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponseDeserializer.cs similarity index 96% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiResponseDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiResponseDeserializer.cs index 01bc68d03..e446ff89e 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiResponseDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponseDeserializer.cs @@ -1,8 +1,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V3 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiResponsesDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponsesDeserializer.cs similarity index 92% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiResponsesDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiResponsesDeserializer.cs index a22ce7771..9afc51455 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiResponsesDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponsesDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiSecurityRequirementDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs index 6f64fa076..8a03f880d 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiSecurityRequirementDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs @@ -2,9 +2,9 @@ // Licensed under the MIT license. using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs similarity index 97% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiSecuritySchemeDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs index 9d9f7aa7e..9966e085a 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiSecuritySchemeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiServerDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiServerDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiServerDeserializer.cs index 329b4a0b5..0ace93c4d 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiServerDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiServerVariableDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerVariableDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiServerVariableDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiServerVariableDeserializer.cs index 796328bed..4ce7dc188 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiServerVariableDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerVariableDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiTagDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiTagDeserializer.cs similarity index 94% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiTagDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiTagDeserializer.cs index eb3f9fc56..f96ba7d48 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiTagDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiTagDeserializer.cs @@ -3,9 +3,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiV31Deserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiV31Deserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs index abdeac81c..256829cea 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiV31Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs @@ -9,9 +9,9 @@ using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiV31VersionService.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs similarity index 98% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiV31VersionService.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs index 18a0018d6..58f3d4a85 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiV31VersionService.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs @@ -10,11 +10,10 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.Properties; +using Microsoft.OpenApi.Properties; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// The version service for the Open API V3.1. diff --git a/src/Microsoft.OpenApi.Readers/V31/OpenApiXmlDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiXmlDeserializer.cs similarity index 95% rename from src/Microsoft.OpenApi.Readers/V31/OpenApiXmlDeserializer.cs rename to src/Microsoft.OpenApi/Reader/V31/OpenApiXmlDeserializer.cs index b73af6347..6bbf97f6f 100644 --- a/src/Microsoft.OpenApi.Readers/V31/OpenApiXmlDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiXmlDeserializer.cs @@ -4,9 +4,9 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader.ParseNodes; -namespace Microsoft.OpenApi.Readers.V31 +namespace Microsoft.OpenApi.Reader.V31 { /// /// Class containing logic to deserialize Open API V31 document into From ed1e02fa90f853842c05bffe7276e57002f618a1 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 18:32:01 +0300 Subject: [PATCH 02/47] Create a static factory for loading/parsing an OpenAPI model object --- .../Models/OpenApiModelFactory.cs | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs new file mode 100644 index 000000000..c259e4fa1 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.OpenApi.Reader; + +namespace Microsoft.OpenApi.Models +{ + internal static class OpenApiModelFactory + { + private static readonly HttpClient _httpClient = new(); + + static OpenApiModelFactory() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Json, new OpenApiJsonReader()); + } + + public static OpenApiDocument Load(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + var format = GetFormat(url); + return OpenApiReaderRegistry.GetReader(format).Read(url, out diagnostic, settings); + } + + public static OpenApiDocument Load(Stream stream, + string format, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + var reader = OpenApiReaderRegistry.GetReader(format); + return reader.Read(stream, out diagnostic, settings); + } + + public static OpenApiDocument Load(TextReader input, + string format, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + var reader = OpenApiReaderRegistry.GetReader(format); + return reader.Read(input, out diagnostic, settings); + } + + public static async Task LoadAsync(Stream stream, string format, OpenApiReaderSettings settings = null) + { + var reader = OpenApiReaderRegistry.GetReader(format); + return await reader.ReadAsync(stream, settings); + } + + public static async Task LoadAsync(TextReader input, string format, OpenApiReaderSettings settings = null) + { + var reader = OpenApiReaderRegistry.GetReader(format); + return await reader.ReadAsync(input, settings); + } + + public static async Task LoadAsync(string url, OpenApiReaderSettings settings = null) + { + var format = GetFormat(url); + var reader = OpenApiReaderRegistry.GetReader(format); + return await reader.ReadAsync(url, settings); + } + + public static OpenApiDocument Parse(string input, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + format ??= OpenApiConstants.Json; + return OpenApiReaderRegistry.GetReader(format).Parse(input, out diagnostic, settings); + } + + private static string GetContentType(string url) + { + var response = _httpClient.GetAsync(url).GetAwaiter().GetResult(); + var contentType = response.Content.Headers.ContentType.MediaType; + if (contentType.EndsWith(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase)) + { + return OpenApiConstants.Json; + } + else if (contentType.EndsWith(OpenApiConstants.Yaml, StringComparison.OrdinalIgnoreCase)) + { + return OpenApiConstants.Yaml; + } + return null; + } + + private static string GetFormat(string url) + { + if (!string.IsNullOrEmpty(url)) + { + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + if (url.EndsWith(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase) + || GetContentType(url).Equals(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase)) + { + return OpenApiConstants.Json; + } + else if (url.EndsWith(OpenApiConstants.Yaml, StringComparison.OrdinalIgnoreCase) + || url.EndsWith(OpenApiConstants.Yml, StringComparison.OrdinalIgnoreCase) + || GetContentType(url).Equals(OpenApiConstants.Yml, StringComparison.OrdinalIgnoreCase)) + { + return OpenApiConstants.Yaml; + } + } + else + { + if (url.EndsWith(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase)) + { + return OpenApiConstants.Json; + } + else if (url.EndsWith(OpenApiConstants.Yaml, StringComparison.OrdinalIgnoreCase) + || url.EndsWith(OpenApiConstants.Yml, StringComparison.OrdinalIgnoreCase)) + { + return OpenApiConstants.Yaml; + } + else + { + throw new ArgumentException("Unsupported file format"); + } + } + } + return null; + } + } +} From dee116c49fadb35d2d9d2e22ffdcaa211ba8cc38 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 18:32:25 +0300 Subject: [PATCH 03/47] Use static methods to call the factory and load up a document --- .../Models/OpenApiDocument.cs | 106 +++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index f0c341f48..9709f19e5 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -7,9 +7,12 @@ using System.Linq; using System.Security.Cryptography; using System.Text; +using System.Text.Json.Nodes; +using System.Threading.Tasks; using Json.Schema; using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Writers; @@ -613,7 +616,108 @@ internal IOpenApiReferenceable ResolveReference(OpenApiReference reference, bool } } - /// + /// + /// Parses a local file path or Url into an Open API document. + /// + /// The path to the OpenAPI file. + /// + /// + /// + public static OpenApiDocument Load(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + public static OpenApiDocument Load(Stream stream, + string format, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, format, out diagnostic, settings); + } + + /// + /// Reads the text reader content and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + public static OpenApiDocument Load(TextReader input, + string format, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, format, out diagnostic, settings); + } + + /// + /// Parses a local file path or Url into an Open API document. + /// + /// The path to the OpenAPI file. + /// + /// + public static async Task LoadAAsync(string url, OpenApiReaderSettings settings = null) + { + return await OpenApiModelFactory.LoadAsync(url, settings); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + public static async Task LoadAsync(Stream stream, string format, OpenApiReaderSettings settings = null) + { + return await OpenApiModelFactory.LoadAsync(stream, format, settings); + } + + /// + /// Reads the text reader content and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + public static async Task LoadAsync(TextReader input, string format, OpenApiReaderSettings settings = null) + { + return await OpenApiModelFactory.LoadAsync(input, format, settings); + } + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + public static OpenApiDocument Parse(string input, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, out diagnostic, format, settings); + } + + /// + /// + /// + /// + /// + /// + /// public JsonSchema FindSubschema(Json.Pointer.JsonPointer pointer, EvaluationOptions options) { throw new NotImplementedException(); From 27755ece64c74a80aab7dc57311b81ba46e047f3 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 18:34:59 +0300 Subject: [PATCH 04/47] Create a reader interface and the implementation for different Open API format providers --- .../OpenApiYamlReader.cs | 124 ++++++ .../Interfaces/IOpenApiReader.cs | 80 ++++ .../Reader/OpenApiJsonReader.cs | 376 ++++++++++++++++++ 3 files changed, 580 insertions(+) create mode 100644 src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs create mode 100644 src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs create mode 100644 src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs new file mode 100644 index 000000000..d2961a71d --- /dev/null +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -0,0 +1,124 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.IO; +using System.Net.Http; +using System.Security; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; + +namespace Microsoft.OpenApi.Readers +{ + internal class OpenApiYamlReader : IOpenApiReader + { + private static readonly HttpClient _httpClient = new(); + + public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + using var reader = new StringReader(input); + return Read(reader, out diagnostic, settings); + } + + public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + Stream stream; + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + try + { + stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); + } + catch (HttpRequestException ex) + { + throw new InvalidOperationException($"Could not download the file at {url}", ex); + } + } + else + { + try + { + var fileInput = new FileInfo(url); + stream = fileInput.OpenRead(); + } + catch (Exception ex) when ( + ex is + FileNotFoundException or + PathTooLongException or + DirectoryNotFoundException or + IOException or + UnauthorizedAccessException or + SecurityException or + NotSupportedException) + { + throw new InvalidOperationException($"Could not open the file at {url}", ex); + } + } + + return Read(stream, out diagnostic, settings); + } + + public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return new OpenApiStreamReader(settings).Read(stream, out diagnostic); + } + + public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return new OpenApiTextReaderReader(settings).Read(input, out diagnostic); + } + + public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) + { + Stream stream; + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + try + { + stream = await _httpClient.GetStreamAsync(new Uri(url)); + } + catch (HttpRequestException ex) + { + throw new InvalidOperationException($"Could not download the file at {url}", ex); + } + } + else + { + try + { + var fileInput = new FileInfo(url); + stream = fileInput.OpenRead(); + } + catch (Exception ex) when ( + ex is + FileNotFoundException or + PathTooLongException or + DirectoryNotFoundException or + IOException or + UnauthorizedAccessException or + SecurityException or + NotSupportedException) + { + throw new InvalidOperationException($"Could not open the file at {url}", ex); + } + } + + return await ReadAsync(stream, settings, cancellationToken); + } + + public async Task ReadAsync(Stream stream, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) + { + return await new OpenApiStreamReader(settings).ReadAsync(stream, cancellationToken); + } + + public async Task ReadAsync(TextReader input, + OpenApiReaderSettings settings = null, + CancellationToken cancellationToken = default) + { + return await new OpenApiTextReaderReader(settings).ReadAsync(input, cancellationToken); + } + } +} diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs new file mode 100644 index 000000000..e9496d938 --- /dev/null +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs @@ -0,0 +1,80 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; + +namespace Microsoft.OpenApi.Interfaces +{ + /// + /// Interface for Open API readers. + /// + public interface IOpenApiReader + { + /// + /// Reads the input URL and parses it into an Open API document. + /// + /// The input to read from. + /// The diagnostic entity containing information from the reading process. + /// The OpenApi reader settings. + /// + OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); + + /// + /// Reads the input stream and parses it into an Open API document. + /// + /// The input stream. + /// The diagnostic entity containing information from the reading process. + /// The OpenApi reader settings. + /// + OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); + + /// + /// Reads the TextReader input and parses it into an Open API document. + /// + /// The TextReader input. + /// The diagnostic entity containing information from the reading process. + /// The OpenApi reader settings. + /// + OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); + + /// + /// Reads the input URL and parses it into an Open API document. + /// + /// The input URL. + /// The OpenApi reader settings. + /// Propagates notification that an operation should be cancelled. + /// + Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default); + + /// + /// Reads the input stream and parses it into an Open API document. + /// + /// The input stream. + /// The OpenApi reader settings. + /// Propagates notification that an operation should be cancelled. + /// + Task ReadAsync(Stream stream, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default); + + /// + /// Reads the TextReader input and parses it into an Open API document. + /// + /// The TextReader input. + /// The OpenApi reader settings. + /// Propagates notification that an operation should be cancelled. + /// + Task ReadAsync(TextReader input, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default); + + /// + /// Reads the input string and parses it into an Open API document. + /// + /// The input string. + /// The diagnostic entity containing information from the reading process. + /// The OpenApi reader settings. + /// + OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); + } +} diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs new file mode 100644 index 000000000..cebf32f69 --- /dev/null +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -0,0 +1,376 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.IO; +using System.Text.Json.Nodes; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Exceptions; +using Microsoft.OpenApi.Extensions; +using Microsoft.OpenApi.Validations; +using System.Linq; +using System.Net.Http; +using System.Collections.Generic; +using Microsoft.OpenApi.Services; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader.Services; +using System.Net; +using System.Security; + +namespace Microsoft.OpenApi.Reader +{ + /// + /// + /// + public class OpenApiJsonReader : IOpenApiReader + { + private static readonly HttpClient _httpClient = new HttpClient(); + + /// + /// Takes in an input URL and parses it into an Open API document + /// + /// The path to the Open API file + /// Returns diagnostic object containing errors detected during parsing. + /// The Reader settings to be used during parsing. + /// + /// + public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + Stream stream; + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + try + { + stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); + } + catch (HttpRequestException ex) + { + throw new InvalidOperationException($"Could not download the file at {url}", ex); + } + } + else + { + try + { + var fileInput = new FileInfo(url); + stream = fileInput.OpenRead(); + } + catch (Exception ex) when ( + ex is + FileNotFoundException or + PathTooLongException or + DirectoryNotFoundException or + IOException or + UnauthorizedAccessException or + SecurityException or + NotSupportedException) + { + throw new InvalidOperationException($"Could not open the file at {url}", ex); + } + } + + return Read(stream, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// The input stream. + /// Returns diagnostic object containing errors detected during parsing. + /// The Reader settings to be used during parsing. + /// + public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + var reader = new StreamReader(stream); + var result = Read(reader, out diagnostic, settings); + if (!settings.LeaveStreamOpen) + { + reader.Dispose(); + } + + return result; + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// Returns diagnostic object containing errors detected during parsing. + /// The Reader settings to be used during parsing. + /// + public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + JsonNode jsonNode; + + // Parse the YAML/JSON text in the TextReader into Json Nodes + try + { + jsonNode = LoadJsonNodesFromJsonDocument(input); + } + catch (JsonException ex) + { + diagnostic = new OpenApiDiagnostic(); + diagnostic.Errors.Add(new OpenApiError($"#line={ex.LineNumber}", ex.Message)); + return new OpenApiDocument(); + } + + return Read(jsonNode, out diagnostic, settings); + } + + /// + /// Takes in an input URL and parses it into an Open API document. + /// + /// The path to the Open API file + /// The Reader settings to be used during parsing. + /// + /// + /// + public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) + { + Stream stream; + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + try + { + stream = await _httpClient.GetStreamAsync(new Uri(url)); + } + catch (HttpRequestException ex) + { + throw new InvalidOperationException($"Could not download the file at {url}", ex); + } + } + else + { + try + { + var fileInput = new FileInfo(url); + stream = fileInput.OpenRead(); + } + catch (Exception ex) when ( + ex is + FileNotFoundException or + PathTooLongException or + DirectoryNotFoundException or + IOException or + UnauthorizedAccessException or + SecurityException or + NotSupportedException) + { + throw new InvalidOperationException($"Could not open the file at {url}", ex); + } + } + + return await ReadAsync(stream, settings, cancellationToken); + } + + /// + /// Reads the input stream and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The Reader settings to be used during parsing. + /// + /// + public async Task ReadAsync(Stream input, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) + { + MemoryStream bufferedStream; + if (input is MemoryStream stream) + { + bufferedStream = stream; + } + else + { + // Buffer stream so that OpenApiTextReaderReader can process it synchronously + // YamlDocument doesn't support async reading. + bufferedStream = new MemoryStream(); + await input.CopyToAsync(bufferedStream, 81920, cancellationToken); + bufferedStream.Position = 0; + } + + using var reader = new StreamReader(bufferedStream); + return await ReadAsync(reader, settings, cancellationToken); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The Reader settings to be used during parsing. + /// + /// + public async Task ReadAsync(TextReader input, + OpenApiReaderSettings settings = null, + CancellationToken cancellationToken = default) + { + JsonNode jsonNode; + var diagnostic = new OpenApiDiagnostic(); + + // Parse the YAML/JSON text in the TextReader into the YamlDocument + try + { + jsonNode = LoadJsonNodesFromJsonDocument(input); + } + catch (JsonException ex) + { + diagnostic.Errors.Add(new OpenApiError($"#line={ex.LineNumber}", ex.Message)); + return new ReadResult + { + OpenApiDocument = null, + OpenApiDiagnostic = diagnostic + }; + } + + return await ReadAsync(jsonNode, settings, cancellationToken); + } + + /// + /// Parses an input string into an Open API document. + /// + /// + /// + /// + /// + public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + using var reader = new StringReader(input); + return Read(reader, out diagnostic, settings); + } + + private JsonNode LoadJsonNodesFromJsonDocument(TextReader input) + { + var nodes = JsonNode.Parse(input.ReadToEnd()); + var jsonDoc = JsonDocument.Parse(input.ReadToEnd()); + + return nodes; + } + + private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + diagnostic = new OpenApiDiagnostic(); + var context = new ParsingContext(diagnostic) + { + ExtensionParsers = settings.ExtensionParsers, + BaseUrl = settings.BaseUrl + }; + + OpenApiDocument document = null; + try + { + // Parse the OpenAPI Document + document = context.Parse(input); + + if (settings.LoadExternalRefs) + { + throw new InvalidOperationException("Cannot load external refs using the synchronous Read, use ReadAsync instead."); + } + + ResolveReferences(diagnostic, document); + } + catch (OpenApiException ex) + { + diagnostic.Errors.Add(new OpenApiError(ex)); + } + + // Validate the document + if (settings.RuleSet != null && settings.RuleSet.Rules.Count() > 0) + { + var openApiErrors = document.Validate(settings.RuleSet); + foreach (var item in openApiErrors.OfType()) + { + diagnostic.Errors.Add(item); + } + foreach (var item in openApiErrors.OfType()) + { + diagnostic.Warnings.Add(item); + } + } + + return document; + } + + private async Task ReadAsync(JsonNode jsonNode, + OpenApiReaderSettings settings = null, + CancellationToken cancellationToken = default) + { + var diagnostic = new OpenApiDiagnostic(); + var context = new ParsingContext(diagnostic) + { + ExtensionParsers = settings.ExtensionParsers, + BaseUrl = settings.BaseUrl + }; + + OpenApiDocument document = null; + try + { + // Parse the OpenAPI Document + document = context.Parse(jsonNode); + + if (settings.LoadExternalRefs) + { + await LoadExternalRefs(document, cancellationToken, settings); + } + + ResolveReferences(diagnostic, document, settings); + } + catch (OpenApiException ex) + { + diagnostic.Errors.Add(new OpenApiError(ex)); + } + + // Validate the document + if (settings.RuleSet != null && settings.RuleSet.Rules.Any()) + { + var openApiErrors = document.Validate(settings.RuleSet); + foreach (var item in openApiErrors.OfType()) + { + diagnostic.Errors.Add(item); + } + foreach (var item in openApiErrors.OfType()) + { + diagnostic.Warnings.Add(item); + } + } + + return new ReadResult() + { + OpenApiDocument = document, + OpenApiDiagnostic = diagnostic + }; + } + + private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument document, OpenApiReaderSettings settings = null) + { + List errors = new(); + + // Resolve References if requested + switch (settings.ReferenceResolution) + { + case ReferenceResolutionSetting.ResolveAllReferences: + throw new ArgumentException("Resolving external references is not supported"); + case ReferenceResolutionSetting.ResolveLocalReferences: + errors.AddRange(document.ResolveReferences()); + break; + case ReferenceResolutionSetting.DoNotResolveReferences: + break; + } + + foreach (var item in errors) + { + diagnostic.Errors.Add(item); + } + } + + private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken, OpenApiReaderSettings settings = null) + { + // Create workspace for all documents to live in. + var openApiWorkSpace = new OpenApiWorkspace(); + + // Load this root document into the workspace + var streamLoader = new DefaultStreamLoader(settings.BaseUrl); + var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); + await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); + } + } +} From 9103bb8d5941f0cc5c5e1ad7416f48127915964b Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 18:39:42 +0300 Subject: [PATCH 05/47] Adjust namespaces and usings --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 3 ++- src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs | 3 ++- src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs | 3 ++- src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs | 3 ++- src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs | 3 ++- src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs | 5 +++-- .../Properties/SRResource.Designer.cs | 4 ++-- .../Services/OpenApiRemoteReferenceCollector.cs | 2 +- .../Services/OpenApiWorkspaceLoader.cs | 6 ++++-- src/Microsoft.OpenApi.Readers/YamlConverter.cs | 2 +- src/Microsoft.OpenApi.Workbench/MainModel.cs | 3 ++- 11 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index cb63e0ceb..93a8645e8 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -29,6 +29,7 @@ using Microsoft.OpenApi.Hidi.Utilities; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.OData; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs b/src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs index 8991c9b59..1457df313 100644 --- a/src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs +++ b/src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs @@ -1,9 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -namespace Microsoft.OpenApi.Readers.Interface +namespace Microsoft.OpenApi.Reader.Interface { /// /// Interface for Open API readers. diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs index 6ce11d2ca..90e059dcf 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs @@ -7,7 +7,8 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.Interface; namespace Microsoft.OpenApi.Readers { diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs index 1a694f255..d7c41efe4 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs @@ -4,7 +4,8 @@ using System.IO; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.Interface; namespace Microsoft.OpenApi.Readers { diff --git a/src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs index 489bfdf7f..f5420dfe3 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs @@ -9,7 +9,8 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.Interface; using SharpYaml; using SharpYaml.Serialization; diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs index eb8896f66..8cbe331f3 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs @@ -11,8 +11,9 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; -using Microsoft.OpenApi.Readers.Services; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.Interface; +using Microsoft.OpenApi.Reader.Services; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Validations; diff --git a/src/Microsoft.OpenApi.Readers/Properties/SRResource.Designer.cs b/src/Microsoft.OpenApi.Readers/Properties/SRResource.Designer.cs index e8bbc567e..a35dab766 100644 --- a/src/Microsoft.OpenApi.Readers/Properties/SRResource.Designer.cs +++ b/src/Microsoft.OpenApi.Readers/Properties/SRResource.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace Microsoft.OpenApi.Readers.Properties { +namespace Microsoft.OpenApi.Reader.Properties { using System; @@ -19,7 +19,7 @@ namespace Microsoft.OpenApi.Readers.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class SRResource { diff --git a/src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs b/src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs index 02cfd4afc..1f7781def 100644 --- a/src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs +++ b/src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs @@ -6,7 +6,7 @@ using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Services; -namespace Microsoft.OpenApi.Readers.Services +namespace Microsoft.OpenApi.Reader.Services { /// /// Builds a list of all remote references used in an OpenApi document diff --git a/src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs b/src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs index c2d1cfe3c..0c0e4251b 100644 --- a/src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs +++ b/src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs @@ -1,11 +1,13 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Services; -namespace Microsoft.OpenApi.Readers.Services +namespace Microsoft.OpenApi.Reader.Services { internal class OpenApiWorkspaceLoader { diff --git a/src/Microsoft.OpenApi.Readers/YamlConverter.cs b/src/Microsoft.OpenApi.Readers/YamlConverter.cs index cc1776d2b..7d338ffa1 100644 --- a/src/Microsoft.OpenApi.Readers/YamlConverter.cs +++ b/src/Microsoft.OpenApi.Readers/YamlConverter.cs @@ -6,7 +6,7 @@ using SharpYaml; using SharpYaml.Serialization; -namespace Microsoft.OpenApi.Readers +namespace Microsoft.OpenApi.Reader { /// /// Provides extensions to convert YAML models to JSON models. diff --git a/src/Microsoft.OpenApi.Workbench/MainModel.cs b/src/Microsoft.OpenApi.Workbench/MainModel.cs index 5788c214e..c5abf3b5c 100644 --- a/src/Microsoft.OpenApi.Workbench/MainModel.cs +++ b/src/Microsoft.OpenApi.Workbench/MainModel.cs @@ -10,7 +10,8 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Validations; From ce1c28dfc405525a48f9d5fc419f02147fec0e8a Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 18:40:12 +0300 Subject: [PATCH 06/47] Create a static registry class to register different format providers --- .../Reader/OpenApiReaderRegistry.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs new file mode 100644 index 000000000..71c3fbfdd --- /dev/null +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Reader +{ + /// + /// Registry for managing different OpenAPI format providers. + /// + public static class OpenApiReaderRegistry + { + private static readonly Dictionary _readers = new(StringComparer.OrdinalIgnoreCase); + + /// + /// Registers an IOpenApiReader for a given OpenAPI format. + /// + /// The OpenApi file format. + /// The reader instance. + public static void RegisterReader(string format, IOpenApiReader reader) + { + if (!_readers.ContainsKey(format)) + { + _readers[format] = reader; + } + } + + /// + /// Retrieves an IOpenApiReader for a given OpenAPI format. + /// + /// + /// + /// + public static IOpenApiReader GetReader(string format) + { + if (_readers.TryGetValue(format, out var reader)) + { + return reader; + } + + throw new NotSupportedException($"Format '{format}' is not supported."); + } + } +} From 2e12d5de6ff280ab459aaeea71b299db2e163309 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 18:40:23 +0300 Subject: [PATCH 07/47] Update constants --- src/Microsoft.OpenApi/Models/OpenApiConstants.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Microsoft.OpenApi/Models/OpenApiConstants.cs b/src/Microsoft.OpenApi/Models/OpenApiConstants.cs index dca7d3fe8..8dcad57c5 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiConstants.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiConstants.cs @@ -15,6 +15,21 @@ public static class OpenApiConstants /// public const string OpenApi = "openapi"; + /// + /// Field: Json + /// + public const string Json = "json"; + + /// + /// Field: Yaml + /// + public const string Yaml = "yaml"; + + /// + /// Field: Yml + /// + public const string Yml = "yml"; + /// /// Field: Info /// From 5d892708ee3dd9040462f77c137953adc23973cc Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 5 Feb 2024 19:09:37 +0300 Subject: [PATCH 08/47] Clean up usings and namespaces --- .../OpenApiDiagnosticTests.cs | 3 +- .../OpenApiStreamReaderTests.cs | 2 +- .../UnsupportedSpecVersionTests.cs | 2 +- .../OpenApiWorkspaceStreamTests.cs | 16 +- .../ParseNodeTests.cs | 4 +- .../ConvertToOpenApiReferenceV2Tests.cs | 3 +- .../ConvertToOpenApiReferenceV3Tests.cs | 3 +- .../TestCustomExtension.cs | 3 +- .../TestHelper.cs | 5 +- .../V2Tests/JsonSchemaTests.cs | 4 +- .../V2Tests/OpenApiContactTests.cs | 2 +- .../V2Tests/OpenApiDocumentTests.cs | 7 +- .../V2Tests/OpenApiHeaderTests.cs | 6 +- .../V2Tests/OpenApiOperationTests.cs | 4 +- .../V2Tests/OpenApiParameterTests.cs | 6 +- .../V2Tests/OpenApiPathItemTests.cs | 6 +- .../V2Tests/OpenApiSecuritySchemeTests.cs | 5 +- .../V2Tests/OpenApiServerTests.cs | 4 +- .../V31Tests/JsonSchemaTests.cs | 6 +- .../V31Tests/OpenApiDocumentTests.cs | 1 + .../V31Tests/OpenApiInfoTests.cs | 6 +- .../V31Tests/OpenApiLicenseTests.cs | 5 +- .../V3Tests/JsonSchemaTests.cs | 42 +-- .../V3Tests/OpenApiCallbackTests.cs | 5 +- .../V3Tests/OpenApiContactTests.cs | 2 +- .../V3Tests/OpenApiDiscriminatorTests.cs | 7 +- .../V3Tests/OpenApiDocumentTests.cs | 307 ++++++++---------- .../V3Tests/OpenApiEncodingTests.cs | 7 +- .../V3Tests/OpenApiExampleTests.cs | 5 +- .../V3Tests/OpenApiInfoTests.cs | 5 +- .../V3Tests/OpenApiMediaTypeTests.cs | 6 +- .../V3Tests/OpenApiOperationTests.cs | 6 +- .../V3Tests/OpenApiParameterTests.cs | 6 +- .../V3Tests/OpenApiSecuritySchemeTests.cs | 5 +- .../V3Tests/OpenApiXmlTests.cs | 5 +- test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs | 2 +- .../GraphTests.cs | 3 + .../Models/OpenApiDocumentTests.cs | 5 +- .../OpenApiResponseReferenceTest.cs | 3 +- 39 files changed, 260 insertions(+), 264 deletions(-) diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs index be476652e..db681f038 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs @@ -8,8 +8,9 @@ using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Models; using Xunit; -using Microsoft.OpenApi.Readers.Interface; using System.IO; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests { diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs index 3cf5826e0..91e271549 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs index 6c906ec5b..6bce59be5 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using FluentAssertions; -using Microsoft.OpenApi.Readers.Exceptions; +using Microsoft.OpenApi.Exceptions; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs index 912dc8a5c..c66cdc86e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs @@ -1,10 +1,11 @@ -using System; +using System; using System.IO; using System.Linq; using System.Threading.Tasks; using Json.Schema; +using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.Interface; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.OpenApiWorkspaceTests @@ -19,12 +20,12 @@ public class OpenApiWorkspaceStreamTests public async Task LoadingDocumentWithResolveAllReferencesShouldLoadDocumentIntoWorkspace() { // Create a reader that will resolve all references - var reader = new OpenApiStreamReader(new() + var settings = new OpenApiReaderSettings { LoadExternalRefs = true, CustomExternalLoader = new MockLoader(), BaseUrl = new("file://c:\\") - }); + }; // Todo: this should be ReadAsync var stream = new MemoryStream(); @@ -40,7 +41,7 @@ public async Task LoadingDocumentWithResolveAllReferencesShouldLoadDocumentIntoW wr.Flush(); stream.Position = 0; - var result = await reader.ReadAsync(stream); + var result = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml, settings: settings); Assert.NotNull(result.OpenApiDocument.Workspace); } @@ -58,8 +59,7 @@ public async Task LoadDocumentWithExternalReferenceShouldLoadBothDocumentsIntoWo ReadResult result; using var stream = Resources.GetStream("V3Tests/Samples/OpenApiWorkspace/TodoMain.yaml"); - result = await reader.ReadAsync(stream); - + result = await reader.ReadAsync(stream); Assert.NotNull(result.OpenApiDocument.Workspace); Assert.True(result.OpenApiDocument.Workspace.Contains("TodoComponents.yaml")); @@ -82,7 +82,6 @@ public async Task LoadDocumentWithExternalReferenceShouldLoadBothDocumentsIntoWo .FirstOrDefault(p => p.Name == "filter"); Assert.Equal(SchemaValueType.String, referencedParameter.Schema.GetJsonType()); - } } @@ -99,7 +98,6 @@ public Task LoadAsync(Uri uri) } } - public class ResourceLoader : IStreamLoader { public Stream Load(Uri uri) diff --git a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs index 57b30a608..546be2c8b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs @@ -1,11 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Collections.Generic; using FluentAssertions; +using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Readers; -using Microsoft.OpenApi.Readers.Exceptions; using Xunit; namespace Microsoft.OpenApi.Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs index 6bd91fe61..abdbfcb9c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs @@ -3,7 +3,8 @@ using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.V2; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.V2; using Xunit; namespace Microsoft.OpenApi.Readers.Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs index 2f00de3c2..6f4d53acb 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs @@ -3,7 +3,8 @@ using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.V3; using Xunit; namespace Microsoft.OpenApi.Readers.Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs index 5ea0b7af8..67bd6b968 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs @@ -1,9 +1,10 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Text.Json.Nodes; using FluentAssertions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/TestHelper.cs b/test/Microsoft.OpenApi.Readers.Tests/TestHelper.cs index f0d33518e..f8b222c36 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/TestHelper.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/TestHelper.cs @@ -1,9 +1,10 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; using System.Linq; -using Microsoft.OpenApi.Readers.ParseNodes; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; using SharpYaml.Serialization; namespace Microsoft.OpenApi.Readers.Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/JsonSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/JsonSchemaTests.cs index 204f1d7bd..050e9ed65 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/JsonSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/JsonSchemaTests.cs @@ -5,9 +5,9 @@ using FluentAssertions; using Json.Schema; using Json.Schema.OpenApi; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V2; +using Microsoft.OpenApi.Reader.V2; using Xunit; +using Microsoft.OpenApi.Reader.ParseNodes; namespace Microsoft.OpenApi.Readers.Tests.V2Tests { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs index f105aaa1d..6c015f7a4 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using FluentAssertions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index 692cd31fa..38a694829 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -1,12 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System.Collections.Generic; using System.IO; using FluentAssertions; using Json.Schema; -using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests @@ -18,9 +17,7 @@ public class OpenApiDocumentTests [Fact] public void ShouldParseProducesInAnyOrder() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "twoResponses.json")); - var reader = new OpenApiStreamReader(); - var doc = reader.Read(stream, out var diagnostic); + var doc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "twoResponses.json"), out var diagnostic); var okSchema = new JsonSchemaBuilder() .Ref("#/definitions/Item") diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs index a8164178c..220087401 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs @@ -1,12 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V2; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V2; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs index 384d103fb..f77ab0cb0 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs @@ -10,8 +10,8 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V2; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V2; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs index 88a793712..1d9b1e22a 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs @@ -1,12 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V2; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V2; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs index 0ee37a4eb..08a82885e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -8,8 +8,8 @@ using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V2; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V2; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs index fbb5c382d..82565facd 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs @@ -6,8 +6,9 @@ using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V2; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V2; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs index 9a40f7e51..8f2d49658 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs @@ -1,7 +1,7 @@ -using System; -using System.Linq; +using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs index 23cb8c2d7..90f7c446d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs @@ -3,8 +3,10 @@ using System.Text.Json; using FluentAssertions; using Json.Schema; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V31; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.Tests; +using Microsoft.OpenApi.Reader.V31; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index c257a558e..465957e69 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -5,6 +5,7 @@ using Json.Schema; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs index 6ca93a780..84a2270d8 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs @@ -3,8 +3,10 @@ using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V31; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.Tests; +using Microsoft.OpenApi.Reader.V31; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs index 4b1cbdbf1..cb617064e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs @@ -5,8 +5,9 @@ using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V31; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V31; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs index b37067e09..c778eae2e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs @@ -11,10 +11,12 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Extensions; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; using SharpYaml.Serialization; using Xunit; +using Microsoft.OpenApi.Reader.Tests; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; namespace Microsoft.OpenApi.Readers.Tests.V3Tests { @@ -26,30 +28,28 @@ public class JsonSchemaTests [Fact] public void ParsePrimitiveSchemaShouldSucceed() { - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "primitiveSchema.yaml"))) - { - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "primitiveSchema.yaml")); + var yamlStream = new YamlStream(); + yamlStream.Load(new StreamReader(stream)); + var yamlNode = yamlStream.Documents.First().RootNode; - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); + var diagnostic = new OpenApiDiagnostic(); + var context = new ParsingContext(diagnostic); - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); + var asJsonNode = yamlNode.ToJsonNode(); + var node = new MapNode(context, asJsonNode); - // Act - var schema = OpenApiV3Deserializer.LoadSchema(node); + // Act + var schema = OpenApiV3Deserializer.LoadSchema(node); - // Assert - diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); + // Assert + diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); - schema.Should().BeEquivalentTo( - new JsonSchemaBuilder() - .Type(SchemaValueType.String) - .Format("email") - .Build()); - } + schema.Should().BeEquivalentTo( + new JsonSchemaBuilder() + .Type(SchemaValueType.String) + .Format("email") + .Build()); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs index 540f620a3..be1b37e3d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs @@ -7,8 +7,9 @@ using Json.Schema; using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs index 9629e4541..62992f6b9 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using FluentAssertions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs index 580dad1ce..68588f092 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs @@ -1,12 +1,13 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 46ac9f815..646152165 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -11,11 +11,11 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Validations; using Microsoft.OpenApi.Validations.Rules; using Microsoft.OpenApi.Writers; using Xunit; -using Xunit.Abstractions; namespace Microsoft.OpenApi.Readers.Tests.V3Tests { @@ -24,7 +24,10 @@ public class OpenApiDocumentTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiDocument/"; - private readonly ITestOutputHelper _output; + public OpenApiDocumentTests() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } public T Clone(T element) where T : IOpenApiSerializable { @@ -70,23 +73,17 @@ public OpenApiSecurityScheme CloneSecurityScheme(OpenApiSecurityScheme element) } } - - public OpenApiDocumentTests(ITestOutputHelper output) - { - _output = output; - } - [Fact] public void ParseDocumentFromInlineStringShouldSucceed() { - var openApiDoc = new OpenApiStringReader().Read( + var openApiDoc = OpenApiDocument.Parse( @" openapi : 3.0.0 info: title: Simple Document version: 0.9.1 paths: {}", - out var context); + out var context, OpenApiConstants.Yaml); openApiDoc.Should().BeEquivalentTo( new OpenApiDocument @@ -101,7 +98,7 @@ public void ParseDocumentFromInlineStringShouldSucceed() context.Should().BeEquivalentTo( new OpenApiDiagnostic() - { + { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, Errors = new List() { @@ -113,51 +110,47 @@ public void ParseDocumentFromInlineStringShouldSucceed() [Fact] public void ParseBasicDocumentWithMultipleServersShouldSucceed() { - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicDocumentWithMultipleServers.yaml"))) - { - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var path = Path.Combine(SampleFolderPath, "basicDocumentWithMultipleServers.yaml"); + var openApiDoc = OpenApiDocument.Load(path, out var diagnostic); - diagnostic.Should().BeEquivalentTo( - new OpenApiDiagnostic() + diagnostic.Should().BeEquivalentTo( + new OpenApiDiagnostic() + { + SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, + Errors = new List() { - SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, - Errors = new List() - { - new OpenApiError("", "Paths is a REQUIRED field at #/") - } - }); + new OpenApiError("", "Paths is a REQUIRED field at #/") + } + }); - openApiDoc.Should().BeEquivalentTo( - new OpenApiDocument + openApiDoc.Should().BeEquivalentTo( + new OpenApiDocument + { + Info = new OpenApiInfo { - Info = new OpenApiInfo + Title = "The API", + Version = "0.9.1", + }, + Servers = + { + new OpenApiServer { - Title = "The API", - Version = "0.9.1", + Url = new Uri("http://www.example.org/api").ToString(), + Description = "The http endpoint" }, - Servers = + new OpenApiServer { - new OpenApiServer - { - Url = new Uri("http://www.example.org/api").ToString(), - Description = "The http endpoint" - }, - new OpenApiServer - { - Url = new Uri("https://www.example.org/api").ToString(), - Description = "The https endpoint" - } - }, - Paths = new OpenApiPaths() - }); - } + Url = new Uri("https://www.example.org/api").ToString(), + Description = "The https endpoint" + } + }, + Paths = new OpenApiPaths() + }); } - [Fact] public void ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "brokenMinimalDocument.yaml")); - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "brokenMinimalDocument.yaml"), out var diagnostic); openApiDoc.Should().BeEquivalentTo( new OpenApiDocument @@ -184,31 +177,28 @@ public void ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() [Fact] public void ParseMinimalDocumentShouldSucceed() { - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "minimalDocument.yaml"))) - { - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "minimalDocument.yaml"), out var diagnostic); - openApiDoc.Should().BeEquivalentTo( - new OpenApiDocument + openApiDoc.Should().BeEquivalentTo( + new OpenApiDocument + { + Info = new OpenApiInfo { - Info = new OpenApiInfo - { - Title = "Simple Document", - Version = "0.9.1" - }, - Paths = new OpenApiPaths() - }); + Title = "Simple Document", + Version = "0.9.1" + }, + Paths = new OpenApiPaths() + }); - diagnostic.Should().BeEquivalentTo( - new OpenApiDiagnostic() + diagnostic.Should().BeEquivalentTo( + new OpenApiDiagnostic() + { + SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, + Errors = new List() { - SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, - Errors = new List() - { new OpenApiError("", "Paths is a REQUIRED field at #/") - } - }); - } + } + }); } [Fact] @@ -655,12 +645,12 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() } }, Servers = new List - { - new OpenApiServer { - Url = "http://petstore.swagger.io/api" - } - }, + new OpenApiServer + { + Url = "http://petstore.swagger.io/api" + } + }, Paths = new OpenApiPaths { ["/pets"] = new OpenApiPathItem @@ -670,35 +660,35 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() [OperationType.Get] = new OpenApiOperation { Tags = new List - { - tag1, - tag2 - }, + { + tag1, + tag2 + }, Description = "Returns all pets from the system that the user has access to", OperationId = "findPets", Parameters = new List - { - new OpenApiParameter { - Name = "tags", - In = ParameterLocation.Query, - Description = "tags to filter by", - Required = false, - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Array) - .Items(new JsonSchemaBuilder().Type(SchemaValueType.String)) + new OpenApiParameter + { + Name = "tags", + In = ParameterLocation.Query, + Description = "tags to filter by", + Required = false, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Array) + .Items(new JsonSchemaBuilder().Type(SchemaValueType.String)) + }, + new OpenApiParameter + { + Name = "limit", + In = ParameterLocation.Query, + Description = "maximum number of results to return", + Required = false, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Integer) + .Format("int32") + } }, - new OpenApiParameter - { - Name = "limit", - In = ParameterLocation.Query, - Description = "maximum number of results to return", - Required = false, - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Integer) - .Format("int32") - } - }, Responses = new OpenApiResponses { ["200"] = new OpenApiResponse @@ -747,10 +737,10 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() [OperationType.Post] = new OpenApiOperation { Tags = new List - { - tag1, - tag2 - }, + { + tag1, + tag2 + }, Description = "Creates a new pet in the store. Duplicates are allowed", OperationId = "addPet", RequestBody = new OpenApiRequestBody @@ -802,17 +792,17 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() } }, Security = new List - { - new OpenApiSecurityRequirement { - [securityScheme1] = new List(), - [securityScheme2] = new List + new OpenApiSecurityRequirement { - "scope1", - "scope2" + [securityScheme1] = new List(), + [securityScheme2] = new List + { + "scope1", + "scope2" + } } } - } } } }, @@ -826,18 +816,18 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() "Returns a user based on a single ID, if the user does not have access to the pet", OperationId = "findPetById", Parameters = new List - { - new OpenApiParameter { - Name = "id", - In = ParameterLocation.Path, - Description = "ID of pet to fetch", - Required = true, - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Integer) - .Format("int64") - } - }, + new OpenApiParameter + { + Name = "id", + In = ParameterLocation.Path, + Description = "ID of pet to fetch", + Required = true, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Integer) + .Format("int64") + } + }, Responses = new OpenApiResponses { ["200"] = new OpenApiResponse @@ -884,18 +874,18 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() Description = "deletes a single pet based on the ID supplied", OperationId = "deletePet", Parameters = new List - { - new OpenApiParameter { - Name = "id", - In = ParameterLocation.Path, - Description = "ID of pet to delete", - Required = true, - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Integer) - .Format("int64") - } - }, + new OpenApiParameter + { + Name = "id", + In = ParameterLocation.Path, + Description = "ID of pet to delete", + Required = true, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Integer) + .Format("int64") + } + }, Responses = new OpenApiResponses { ["204"] = new OpenApiResponse @@ -931,31 +921,31 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() }, Components = components, Tags = new List - { - new OpenApiTag { - Name = "tagName1", - Description = "tagDescription1", - Reference = new OpenApiReference() + new OpenApiTag { - Id = "tagName1", - Type = ReferenceType.Tag + Name = "tagName1", + Description = "tagDescription1", + Reference = new OpenApiReference() + { + Id = "tagName1", + Type = ReferenceType.Tag + } } - } - }, + }, SecurityRequirements = new List - { - new OpenApiSecurityRequirement { - [securityScheme1] = new List(), - [securityScheme2] = new List + new OpenApiSecurityRequirement { - "scope1", - "scope2", - "scope3" + [securityScheme1] = new List(), + [securityScheme2] = new List + { + "scope1", + "scope2", + "scope3" + } } } - } }; actual.Should().BeEquivalentTo(expected, options => options.Excluding(m => m.Name == "HostDocument")); @@ -968,14 +958,9 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() [Fact] public void ParsePetStoreExpandedShouldSucceed() { - OpenApiDiagnostic context; - - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStoreExpanded.yaml"))) - { - var actual = new OpenApiStreamReader().Read(stream, out context); + var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "petStoreExpanded.yaml"), out var context); - // TODO: Create the object in memory and compare with the one read from YAML file. - } + // TODO: Create the object in memory and compare with the one read from YAML file. context.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); @@ -984,21 +969,17 @@ public void ParsePetStoreExpandedShouldSucceed() [Fact] public void GlobalSecurityRequirementShouldReferenceSecurityScheme() { - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "securedApi.yaml"))) - { - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "securedApi.yaml"), out var diagnostic); - var securityRequirement = openApiDoc.SecurityRequirements.First(); + var securityRequirement = openApiDoc.SecurityRequirements.First(); - Assert.Same(securityRequirement.Keys.First(), openApiDoc.Components.SecuritySchemes.First().Value); - } + Assert.Same(securityRequirement.Keys.First(), openApiDoc.Components.SecuritySchemes.First().Value); } [Fact] public void HeaderParameterShouldAllowExample() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml")); - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml"), out var diagnostic); var exampleHeader = openApiDoc.Components?.Headers?["example-header"]; Assert.NotNull(exampleHeader); @@ -1065,15 +1046,13 @@ public void HeaderParameterShouldAllowExample() [Fact] public void ParseDocumentWithReferencedSecuritySchemeWorks() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml")); - // Act - var doc = new OpenApiStreamReader(new OpenApiReaderSettings + var settings = new OpenApiReaderSettings { ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences - }).Read(stream, out var diagnostic); + }; + var doc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml"), out var context, settings); var securityScheme = doc.Components.SecuritySchemes["OAuth2"]; // Assert diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs index 75108668f..e8297c59a 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; @@ -6,8 +6,9 @@ using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs index b87cf4f58..983af4868 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -7,8 +7,9 @@ using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; +using Microsoft.OpenApi.Reader; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs index 729c7dd33..c9f46007f 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -8,8 +8,9 @@ using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index 3d7dcf35f..31a0cb341 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; @@ -6,8 +6,8 @@ using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index fd46ef8b3..97ec533a9 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; @@ -6,8 +6,8 @@ using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index c7ef1022e..93dac5aa6 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.IO; @@ -6,8 +6,8 @@ using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs index 15ab1ebb5..bc1aa40fb 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs @@ -6,8 +6,9 @@ using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs index 758f56d7d..6ad389029 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs @@ -6,8 +6,9 @@ using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers.ParseNodes; -using Microsoft.OpenApi.Readers.V3; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs index b2cd1143b..90738c80a 100644 --- a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs +++ b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs @@ -7,7 +7,7 @@ using System.Net; using System.Net.Http; using System.Threading.Tasks; -using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Reader; using Newtonsoft.Json.Linq; using Xunit; using Xunit.Abstractions; diff --git a/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs b/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs index 3f743dd6c..eb4e4439d 100644 --- a/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs +++ b/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs @@ -1,3 +1,6 @@ +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Services; using System; using System.Net; using System.Net.Http; diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index af61e646d..fc74f29a1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -12,7 +12,8 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Writers; using Microsoft.VisualBasic; using VerifyXunit; diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index 681d29e83..3ee277209 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -1,11 +1,10 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Globalization; using System.IO; using System.Linq; using System.Threading.Tasks; -using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; From 96e914abbe854f0b678ba295dd1c3625d0bd8af5 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 6 Feb 2024 17:31:01 +0300 Subject: [PATCH 09/47] Remove unnecessary usings --- src/Microsoft.OpenApi.Workbench/MainModel.cs | 4 ++-- .../V31Tests/JsonSchemaTests.cs | 1 - .../V31Tests/OpenApiInfoTests.cs | 1 - .../V3Tests/JsonSchemaTests.cs | 1 - test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs | 2 +- test/Microsoft.OpenApi.SmokeTests/GraphTests.cs | 5 +---- test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs | 5 ++--- 7 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.OpenApi.Workbench/MainModel.cs b/src/Microsoft.OpenApi.Workbench/MainModel.cs index c5abf3b5c..34f419c4b 100644 --- a/src/Microsoft.OpenApi.Workbench/MainModel.cs +++ b/src/Microsoft.OpenApi.Workbench/MainModel.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -11,7 +11,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Validations; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs index 90f7c446d..48b5282d4 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/JsonSchemaTests.cs @@ -5,7 +5,6 @@ using Json.Schema; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.Tests; using Microsoft.OpenApi.Reader.V31; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs index 84a2270d8..8ecfcf7d5 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs @@ -5,7 +5,6 @@ using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.Tests; using Microsoft.OpenApi.Reader.V31; using SharpYaml.Serialization; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs index c778eae2e..daa71c020 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs @@ -13,7 +13,6 @@ using Microsoft.OpenApi.Extensions; using SharpYaml.Serialization; using Xunit; -using Microsoft.OpenApi.Reader.Tests; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.ParseNodes; using Microsoft.OpenApi.Reader.V3; diff --git a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs index 90738c80a..b2cd1143b 100644 --- a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs +++ b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs @@ -7,7 +7,7 @@ using System.Net; using System.Net.Http; using System.Threading.Tasks; -using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Readers; using Newtonsoft.Json.Linq; using Xunit; using Xunit.Abstractions; diff --git a/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs b/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs index eb4e4439d..2e5cf9d4b 100644 --- a/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs +++ b/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs @@ -1,12 +1,9 @@ -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Services; using System; using System.Net; using System.Net.Http; -using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Readers; -using Microsoft.OpenApi.Services; using Xunit; using Xunit.Abstractions; diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index fc74f29a1..af61e646d 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -12,8 +12,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Services; +using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using Microsoft.VisualBasic; using VerifyXunit; From a507c95952f1f29ff15ebda55ac845cf2ba940c8 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 6 Feb 2024 17:31:23 +0300 Subject: [PATCH 10/47] copy output to directory --- .../Microsoft.OpenApi.Readers.Tests.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj index 38a37821a..888274f84 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj +++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj @@ -7,10 +7,10 @@ - Never + Always - Never + Always From 7ecb9f2de04cd700dd995f97c7fc5bb6709a3186 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 7 Feb 2024 10:31:11 +0300 Subject: [PATCH 11/47] Register reader --- .../OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs index c66cdc86e..e85f97e7b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs @@ -13,6 +13,11 @@ namespace Microsoft.OpenApi.Readers.Tests.OpenApiWorkspaceTests public class OpenApiWorkspaceStreamTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiWorkspace/"; + + public OpenApiWorkspaceStreamTests() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } // Use OpenApiWorkspace to load a document and a referenced document From 4382dbbe41857226d14063ea2d4a8922d64d0b74 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 7 Feb 2024 16:10:21 +0300 Subject: [PATCH 12/47] Address CodeQL concerns --- src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs | 12 +++++------- .../Services/OpenApiRemoteReferenceCollector.cs | 2 +- .../Reader/Services/OpenApiWorkspaceLoader.cs | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index cebf32f69..ad316a51a 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -86,7 +86,7 @@ public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, Ope { var reader = new StreamReader(stream); var result = Read(reader, out diagnostic, settings); - if (!settings.LeaveStreamOpen) + if ((bool)!settings?.LeaveStreamOpen) { reader.Dispose(); } @@ -241,8 +241,6 @@ public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, Ope private JsonNode LoadJsonNodesFromJsonDocument(TextReader input) { var nodes = JsonNode.Parse(input.ReadToEnd()); - var jsonDoc = JsonDocument.Parse(input.ReadToEnd()); - return nodes; } @@ -252,7 +250,7 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O var context = new ParsingContext(diagnostic) { ExtensionParsers = settings.ExtensionParsers, - BaseUrl = settings.BaseUrl + BaseUrl = settings?.BaseUrl }; OpenApiDocument document = null; @@ -298,7 +296,7 @@ private async Task ReadAsync(JsonNode jsonNode, var context = new ParsingContext(diagnostic) { ExtensionParsers = settings.ExtensionParsers, - BaseUrl = settings.BaseUrl + BaseUrl = settings?.BaseUrl }; OpenApiDocument document = null; @@ -345,7 +343,7 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc List errors = new(); // Resolve References if requested - switch (settings.ReferenceResolution) + switch (settings?.ReferenceResolution) { case ReferenceResolutionSetting.ResolveAllReferences: throw new ArgumentException("Resolving external references is not supported"); @@ -368,7 +366,7 @@ private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken var openApiWorkSpace = new OpenApiWorkspace(); // Load this root document into the workspace - var streamLoader = new DefaultStreamLoader(settings.BaseUrl); + var streamLoader = new DefaultStreamLoader(settings?.BaseUrl); var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); } diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs index 1f7781def..7aafd0d6d 100644 --- a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs +++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs @@ -13,7 +13,7 @@ namespace Microsoft.OpenApi.Reader.Services /// internal class OpenApiRemoteReferenceCollector : OpenApiVisitorBase { - private Dictionary _references = new(); + private static readonly Dictionary _references = new(); /// /// List of external references collected from OpenApiDocument diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs index eb0ad15db..82d3774c3 100644 --- a/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs +++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs @@ -9,8 +9,8 @@ namespace Microsoft.OpenApi.Reader.Services { internal class OpenApiWorkspaceLoader { - private OpenApiWorkspace _workspace; - private IStreamLoader _loader; + private readonly OpenApiWorkspace _workspace; + private readonly IStreamLoader _loader; private readonly OpenApiReaderSettings _readerSettings; public OpenApiWorkspaceLoader(OpenApiWorkspace workspace, IStreamLoader loader, OpenApiReaderSettings readerSettings) From 67c3501b8a37605e9b33e07022cf19cf89486b0c Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 7 Feb 2024 16:24:56 +0300 Subject: [PATCH 13/47] Create a static Http client instance for reuse --- .../OpenApiYamlReader.cs | 2 +- .../Models/OpenApiModelFactory.cs | 2 +- .../Reader/HttpClientFactory.cs | 29 +++++++++++++++++++ .../Reader/OpenApiJsonReader.cs | 2 +- 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 src/Microsoft.OpenApi/Reader/HttpClientFactory.cs diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index d2961a71d..c287dab70 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -15,7 +15,7 @@ namespace Microsoft.OpenApi.Readers { internal class OpenApiYamlReader : IOpenApiReader { - private static readonly HttpClient _httpClient = new(); + private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs index c259e4fa1..1d7f8500b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs @@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models { internal static class OpenApiModelFactory { - private static readonly HttpClient _httpClient = new(); + private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); static OpenApiModelFactory() { diff --git a/src/Microsoft.OpenApi/Reader/HttpClientFactory.cs b/src/Microsoft.OpenApi/Reader/HttpClientFactory.cs new file mode 100644 index 000000000..b9141f695 --- /dev/null +++ b/src/Microsoft.OpenApi/Reader/HttpClientFactory.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Net.Http; + +namespace Microsoft.OpenApi.Reader +{ + /// + /// Creates a single instance of HttpClient for reuse + /// + public static class HttpClientFactory + { + private static readonly HttpClient _httpClient; + + static HttpClientFactory() + { + _httpClient = new HttpClient(); + } + + /// + /// Returns a static http client instance + /// + /// A http client. + public static HttpClient GetHttpClient() + { + return _httpClient; + } + } +} diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index ad316a51a..4dfa464e6 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -27,7 +27,7 @@ namespace Microsoft.OpenApi.Reader /// public class OpenApiJsonReader : IOpenApiReader { - private static readonly HttpClient _httpClient = new HttpClient(); + private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); /// /// Takes in an input URL and parses it into an Open API document From 3f8238ca70e1fd4c063cbca80e900e4eea1da08a Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 7 Feb 2024 16:57:46 +0300 Subject: [PATCH 14/47] More CodeQL fixes --- .../Reader/OpenApiJsonReader.cs | 18 +++++++++--------- .../OpenApiRemoteReferenceCollector.cs | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index 4dfa464e6..f26d3678f 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -249,7 +249,7 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O diagnostic = new OpenApiDiagnostic(); var context = new ParsingContext(diagnostic) { - ExtensionParsers = settings.ExtensionParsers, + ExtensionParsers = settings?.ExtensionParsers, BaseUrl = settings?.BaseUrl }; @@ -259,7 +259,7 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O // Parse the OpenAPI Document document = context.Parse(input); - if (settings.LoadExternalRefs) + if ((bool)(settings?.LoadExternalRefs)) { throw new InvalidOperationException("Cannot load external refs using the synchronous Read, use ReadAsync instead."); } @@ -272,9 +272,9 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O } // Validate the document - if (settings.RuleSet != null && settings.RuleSet.Rules.Count() > 0) + if (settings?.RuleSet != null && settings?.RuleSet.Rules.Count() > 0) { - var openApiErrors = document.Validate(settings.RuleSet); + var openApiErrors = document.Validate(settings?.RuleSet); foreach (var item in openApiErrors.OfType()) { diagnostic.Errors.Add(item); @@ -295,7 +295,7 @@ private async Task ReadAsync(JsonNode jsonNode, var diagnostic = new OpenApiDiagnostic(); var context = new ParsingContext(diagnostic) { - ExtensionParsers = settings.ExtensionParsers, + ExtensionParsers = settings?.ExtensionParsers, BaseUrl = settings?.BaseUrl }; @@ -305,7 +305,7 @@ private async Task ReadAsync(JsonNode jsonNode, // Parse the OpenAPI Document document = context.Parse(jsonNode); - if (settings.LoadExternalRefs) + if ((bool)(settings?.LoadExternalRefs)) { await LoadExternalRefs(document, cancellationToken, settings); } @@ -318,9 +318,9 @@ private async Task ReadAsync(JsonNode jsonNode, } // Validate the document - if (settings.RuleSet != null && settings.RuleSet.Rules.Any()) + if (settings?.RuleSet != null && settings?.RuleSet.Rules.Count() > 0) { - var openApiErrors = document.Validate(settings.RuleSet); + var openApiErrors = document.Validate(settings?.RuleSet); foreach (var item in openApiErrors.OfType()) { diagnostic.Errors.Add(item); @@ -367,7 +367,7 @@ private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken // Load this root document into the workspace var streamLoader = new DefaultStreamLoader(settings?.BaseUrl); - var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); + var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings?.CustomExternalLoader ?? streamLoader, settings); await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); } } diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs index 7aafd0d6d..135e69eee 100644 --- a/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs +++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs @@ -13,7 +13,7 @@ namespace Microsoft.OpenApi.Reader.Services /// internal class OpenApiRemoteReferenceCollector : OpenApiVisitorBase { - private static readonly Dictionary _references = new(); + private readonly Dictionary _references = new(); /// /// List of external references collected from OpenApiDocument From b3b458b7e2eb5ed928875565d650b2bbfccd1716 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 7 Feb 2024 17:00:35 +0300 Subject: [PATCH 15/47] Refactor access modifier --- src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index c287dab70..0ee48170e 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -13,7 +13,7 @@ namespace Microsoft.OpenApi.Readers { - internal class OpenApiYamlReader : IOpenApiReader + public class OpenApiYamlReader : IOpenApiReader { private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); From d3a1f2b26c195d5d39691a3abf648b98460045f5 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 7 Feb 2024 17:07:58 +0300 Subject: [PATCH 16/47] Add documentation --- src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs | 10 ++++++++++ src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs | 3 +-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index 0ee48170e..9e99eefb1 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -13,16 +13,21 @@ namespace Microsoft.OpenApi.Readers { + /// + /// Reader for parsing YAML files into an OpenAPI document. + /// public class OpenApiYamlReader : IOpenApiReader { private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); + /// public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { using var reader = new StringReader(input); return Read(reader, out diagnostic, settings); } + /// public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { Stream stream; @@ -61,16 +66,19 @@ SecurityException or return Read(stream, out diagnostic, settings); } + /// public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { return new OpenApiStreamReader(settings).Read(stream, out diagnostic); } + /// public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { return new OpenApiTextReaderReader(settings).Read(input, out diagnostic); } + /// public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { Stream stream; @@ -109,11 +117,13 @@ SecurityException or return await ReadAsync(stream, settings, cancellationToken); } + /// public async Task ReadAsync(Stream stream, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { return await new OpenApiStreamReader(settings).ReadAsync(stream, cancellationToken); } + /// public async Task ReadAsync(TextReader input, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index f26d3678f..26e8ee8fa 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -17,13 +17,12 @@ using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Reader.Services; -using System.Net; using System.Security; namespace Microsoft.OpenApi.Reader { /// - /// + /// A reader class for parsing JSON files into Open API documents. /// public class OpenApiJsonReader : IOpenApiReader { From 2eb98528c7e2bbc122ed156d8ec971413b6bb1d4 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 12:54:35 +0300 Subject: [PATCH 17/47] Use default settings if none are passed --- src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index 26e8ee8fa..f73e859d1 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -38,6 +38,7 @@ public class OpenApiJsonReader : IOpenApiReader /// public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { + settings ??= new OpenApiReaderSettings(); Stream stream; if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { @@ -83,6 +84,7 @@ SecurityException or /// public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { + settings ??= new OpenApiReaderSettings(); var reader = new StreamReader(stream); var result = Read(reader, out diagnostic, settings); if ((bool)!settings?.LeaveStreamOpen) @@ -103,6 +105,7 @@ public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, Ope public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { JsonNode jsonNode; + settings ??= new OpenApiReaderSettings(); // Parse the YAML/JSON text in the TextReader into Json Nodes try @@ -129,6 +132,7 @@ public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, /// public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { + settings ??= new OpenApiReaderSettings(); Stream stream; if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { @@ -174,6 +178,8 @@ SecurityException or /// public async Task ReadAsync(Stream input, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { + settings ??= new OpenApiReaderSettings(); + MemoryStream bufferedStream; if (input is MemoryStream stream) { @@ -205,6 +211,7 @@ public async Task ReadAsync(TextReader input, { JsonNode jsonNode; var diagnostic = new OpenApiDiagnostic(); + settings ??= new OpenApiReaderSettings(); // Parse the YAML/JSON text in the TextReader into the YamlDocument try @@ -233,6 +240,8 @@ public async Task ReadAsync(TextReader input, /// public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { + settings ??= new OpenApiReaderSettings(); + using var reader = new StringReader(input); return Read(reader, out diagnostic, settings); } @@ -263,7 +272,7 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O throw new InvalidOperationException("Cannot load external refs using the synchronous Read, use ReadAsync instead."); } - ResolveReferences(diagnostic, document); + ResolveReferences(diagnostic, document, settings); } catch (OpenApiException ex) { From 36de7b8ae521a3fca9ad9091743de1b50995b372 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 12:54:48 +0300 Subject: [PATCH 18/47] Update API interface --- .../PublicApi/PublicApi.approved.txt | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index b05748032..d1dc09596 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -2,6 +2,10 @@ [assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"Microsoft.OpenApi.Readers.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100957cb48387b2a5f54f5ce39255f18f26d32a39990db27cf48737afc6bc62759ba996b8a2bfb675d4e39f3d06ecb55a178b1b4031dcb2a767e29977d88cce864a0d16bfc1b3bebb0edf9fe285f10fffc0a85f93d664fa05af07faa3aad2e545182dbf787e3fd32b56aca95df1a3c4e75dec164a3f1a4c653d971b01ffc39eb3c4")] [assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"Microsoft.OpenApi.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100957cb48387b2a5f54f5ce39255f18f26d32a39990db27cf48737afc6bc62759ba996b8a2bfb675d4e39f3d06ecb55a178b1b4031dcb2a767e29977d88cce864a0d16bfc1b3bebb0edf9fe285f10fffc0a85f93d664fa05af07faa3aad2e545182dbf787e3fd32b56aca95df1a3c4e75dec164a3f1a4c653d971b01ffc39eb3c4")] [assembly: System.Runtime.Versioning.TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName=".NET Standard 2.0")] +public static class IDiagnosticExtensions +{ + public static void AddRange(this System.Collections.Generic.ICollection collection, System.Collections.Generic.IEnumerable enumerable) { } +} namespace Microsoft.OpenApi.Any { public class OpenApiAny : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtension @@ -29,6 +33,22 @@ namespace Microsoft.OpenApi.Exceptions public OpenApiException(string message, System.Exception innerException) { } public string Pointer { get; set; } } + [System.Serializable] + public class OpenApiReaderException : Microsoft.OpenApi.Exceptions.OpenApiException + { + public OpenApiReaderException() { } + public OpenApiReaderException(string message) { } + public OpenApiReaderException(string message, Microsoft.OpenApi.Reader.ParsingContext context) { } + public OpenApiReaderException(string message, System.Exception innerException) { } + public OpenApiReaderException(string message, System.Text.Json.Nodes.JsonNode node) { } + } + [System.Serializable] + public class OpenApiUnsupportedSpecVersionException : System.Exception + { + public OpenApiUnsupportedSpecVersionException(string specificationVersion) { } + public OpenApiUnsupportedSpecVersionException(string specificationVersion, System.Exception innerException) { } + public string SpecificationVersion { get; } + } public class OpenApiWriterException : Microsoft.OpenApi.Exceptions.OpenApiException { public OpenApiWriterException() { } @@ -255,6 +275,7 @@ namespace Microsoft.OpenApi.Extensions } namespace Microsoft.OpenApi.Interfaces { + public interface IDiagnostic { } public interface IEffective where T : class, Microsoft.OpenApi.Interfaces.IOpenApiElement { @@ -269,6 +290,16 @@ namespace Microsoft.OpenApi.Interfaces { void Write(Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion specVersion); } + public interface IOpenApiReader + { + Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); + Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.Stream stream, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); + Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.TextReader input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); + Microsoft.OpenApi.Models.OpenApiDocument Read(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); + System.Threading.Tasks.Task ReadAsync(System.IO.Stream stream, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); + System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); + System.Threading.Tasks.Task ReadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); + } public interface IOpenApiReferenceable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } @@ -283,6 +314,11 @@ namespace Microsoft.OpenApi.Interfaces void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer); void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer); } + public interface IStreamLoader + { + System.IO.Stream Load(System.Uri uri); + System.Threading.Tasks.Task LoadAsync(System.Uri uri); + } } namespace Microsoft.OpenApi { @@ -466,6 +502,7 @@ namespace Microsoft.OpenApi.Models public const string In = "in"; public const string Info = "info"; public const string Items = "items"; + public const string Json = "json"; public const string JsonSchemaDialect = "jsonSchemaDialect"; public const string Jwt = "JWT"; public const string License = "license"; @@ -538,6 +575,8 @@ namespace Microsoft.OpenApi.Models public const string Wrapped = "wrapped"; public const string WriteOnly = "writeOnly"; public const string Xml = "xml"; + public const string Yaml = "yaml"; + public const string Yml = "yml"; public static readonly System.Uri defaultUrl; public static readonly System.Version version2_0; public static readonly System.Version version3_0_0; @@ -589,6 +628,13 @@ namespace Microsoft.OpenApi.Models public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public static string GenerateHashValue(Microsoft.OpenApi.Models.OpenApiDocument doc) { } + public static Microsoft.OpenApi.Models.OpenApiDocument Load(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiDocument Load(System.IO.Stream stream, string format, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiDocument Load(System.IO.TextReader input, string format, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static System.Threading.Tasks.Task LoadAAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream stream, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static System.Threading.Tasks.Task LoadAsync(System.IO.TextReader input, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiEncoding : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1093,6 +1139,102 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } } +namespace Microsoft.OpenApi.Reader +{ + public static class HttpClientFactory + { + public static System.Net.Http.HttpClient GetHttpClient() { } + } + public class OpenApiDiagnostic : Microsoft.OpenApi.Interfaces.IDiagnostic + { + public OpenApiDiagnostic() { } + public System.Collections.Generic.IList Errors { get; set; } + public Microsoft.OpenApi.OpenApiSpecVersion SpecificationVersion { get; set; } + public System.Collections.Generic.IList Warnings { get; set; } + public void AppendDiagnostic(Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnosticToAdd, string fileNameToAdd = null) { } + } + public class OpenApiJsonReader : Microsoft.OpenApi.Interfaces.IOpenApiReader + { + public OpenApiJsonReader() { } + public Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.Stream stream, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.TextReader input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public Microsoft.OpenApi.Models.OpenApiDocument Read(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public System.Threading.Tasks.Task ReadAsync(System.IO.Stream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } + public System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } + public System.Threading.Tasks.Task ReadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } + } + public static class OpenApiReaderRegistry + { + public static Microsoft.OpenApi.Interfaces.IOpenApiReader GetReader(string format) { } + public static void RegisterReader(string format, Microsoft.OpenApi.Interfaces.IOpenApiReader reader) { } + } + public class OpenApiReaderSettings + { + public OpenApiReaderSettings() { } + public System.Uri BaseUrl { get; set; } + public Microsoft.OpenApi.Interfaces.IStreamLoader CustomExternalLoader { get; set; } + public System.Collections.Generic.List DefaultContentType { get; set; } + public System.Collections.Generic.Dictionary> ExtensionParsers { get; set; } + public bool LeaveStreamOpen { get; set; } + public bool LoadExternalRefs { get; set; } + public Microsoft.OpenApi.Reader.ReferenceResolutionSetting ReferenceResolution { get; set; } + public Microsoft.OpenApi.Validations.ValidationRuleSet RuleSet { get; set; } + public void AddMicrosoftExtensionParsers() { } + } + public static class OpenApiVersionExtensionMethods + { + public static bool is2_0(this string version) { } + public static bool is3_0(this string version) { } + public static bool is3_1(this string version) { } + } + public class ParsingContext + { + public ParsingContext(Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic) { } + public System.Uri BaseUrl { get; set; } + public System.Collections.Generic.List DefaultContentType { get; set; } + public Microsoft.OpenApi.Reader.OpenApiDiagnostic Diagnostic { get; } + public System.Collections.Generic.Dictionary> ExtensionParsers { get; set; } + public void EndObject() { } + public T GetFromTempStorage(string key, object scope = null) { } + public string GetLocation() { } + public Microsoft.OpenApi.Models.OpenApiDocument Parse(System.Text.Json.Nodes.JsonNode jsonNode) { } + public T ParseFragment(System.Text.Json.Nodes.JsonNode jsonNode, Microsoft.OpenApi.OpenApiSpecVersion version) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } + public void PopLoop(string loopid) { } + public bool PushLoop(string loopId, string key) { } + public void SetTempStorage(string key, object value, object scope = null) { } + public void StartObject(string objectName) { } + } + public class ReadResult + { + public ReadResult() { } + public Microsoft.OpenApi.Reader.OpenApiDiagnostic OpenApiDiagnostic { get; set; } + public Microsoft.OpenApi.Models.OpenApiDocument OpenApiDocument { get; set; } + } + public enum ReferenceResolutionSetting + { + DoNotResolveReferences = 0, + ResolveLocalReferences = 1, + ResolveAllReferences = 2, + } +} +namespace Microsoft.OpenApi.Reader.ParseNodes +{ + public static class JsonPointerExtensions + { + public static System.Text.Json.Nodes.JsonNode Find(this Microsoft.OpenApi.JsonPointer currentPointer, System.Text.Json.Nodes.JsonNode baseJsonNode) { } + } +} +namespace Microsoft.OpenApi.Reader.Services +{ + public class DefaultStreamLoader : Microsoft.OpenApi.Interfaces.IStreamLoader + { + public DefaultStreamLoader(System.Uri baseUrl) { } + public System.IO.Stream Load(System.Uri uri) { } + public System.Threading.Tasks.Task LoadAsync(System.Uri uri) { } + } +} namespace Microsoft.OpenApi.Services { public class CurrentKeys From bcafdec811b3860b4a7f75f8d67a60cf126a4de4 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 13:00:12 +0300 Subject: [PATCH 19/47] Update error message --- src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs index 71c3fbfdd..adacf4dbe 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs @@ -40,7 +40,7 @@ public static IOpenApiReader GetReader(string format) return reader; } - throw new NotSupportedException($"Format '{format}' is not supported."); + throw new NotSupportedException($"Format '{format}' is not supported. Register your reader with the OpenApiReaderRegistry class."); } } } From 2f3b42c3bf110960158f4c7c8628c9b6f718a657 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 14:14:05 +0300 Subject: [PATCH 20/47] Make format a required param when dealing with streams --- src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs index 1d7f8500b..99eac1112 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs @@ -29,6 +29,7 @@ public static OpenApiDocument Load(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { + Utils.CheckArgumentNull(format, nameof(format)); var reader = OpenApiReaderRegistry.GetReader(format); return reader.Read(stream, out diagnostic, settings); } @@ -38,18 +39,21 @@ public static OpenApiDocument Load(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { + Utils.CheckArgumentNull(format, nameof(format)); var reader = OpenApiReaderRegistry.GetReader(format); return reader.Read(input, out diagnostic, settings); } public static async Task LoadAsync(Stream stream, string format, OpenApiReaderSettings settings = null) { + Utils.CheckArgumentNull(format, nameof(format)); var reader = OpenApiReaderRegistry.GetReader(format); return await reader.ReadAsync(stream, settings); } public static async Task LoadAsync(TextReader input, string format, OpenApiReaderSettings settings = null) { + Utils.CheckArgumentNull(format, nameof(format)); var reader = OpenApiReaderRegistry.GetReader(format); return await reader.ReadAsync(input, settings); } From ba3e76715e1c663ca57690fc638270cdb722c127 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 15:59:03 +0300 Subject: [PATCH 21/47] Add documentation and explicit error message --- .../Models/OpenApiModelFactory.cs | 51 +++++++++++++++++++ .../Reader/OpenApiJsonReader.cs | 8 +-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs index 99eac1112..b55627db3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs @@ -18,12 +18,27 @@ static OpenApiModelFactory() OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Json, new OpenApiJsonReader()); } + /// + /// Loads the input URL and parses it into an Open API document. + /// + /// The input to read from. + /// The diagnostic entity containing information from the reading process. + /// The OpenApi reader settings. + /// An OpenAPI document instance. public static OpenApiDocument Load(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { var format = GetFormat(url); return OpenApiReaderRegistry.GetReader(format).Read(url, out diagnostic, settings); } + /// + /// Loads the input stream and parses it into an Open API document. + /// + /// The input stream. + /// The diagnostic entity containing information from the reading process. + /// The OpenApi reader settings. + /// The OpenAPI format. + /// An OpenAPI document instance. public static OpenApiDocument Load(Stream stream, string format, out OpenApiDiagnostic diagnostic, @@ -34,6 +49,14 @@ public static OpenApiDocument Load(Stream stream, return reader.Read(stream, out diagnostic, settings); } + /// + /// Loads the TextReader input and parses it into an Open API document. + /// + /// The TextReader input. + /// The diagnostic entity containing information from the reading process. + /// The OpenApi reader settings. + /// The Open API format + /// An OpenAPI document instance. public static OpenApiDocument Load(TextReader input, string format, out OpenApiDiagnostic diagnostic, @@ -44,6 +67,13 @@ public static OpenApiDocument Load(TextReader input, return reader.Read(input, out diagnostic, settings); } + /// + /// Loads the input stream and parses it into an Open API document. + /// + /// The input stream. + /// The OpenApi reader settings. + /// The Open API format + /// public static async Task LoadAsync(Stream stream, string format, OpenApiReaderSettings settings = null) { Utils.CheckArgumentNull(format, nameof(format)); @@ -51,6 +81,13 @@ public static async Task LoadAsync(Stream stream, string format, Ope return await reader.ReadAsync(stream, settings); } + /// + /// Loads the TextReader input and parses it into an Open API document. + /// + /// The TextReader input. + /// The Open API format + /// The OpenApi reader settings. + /// public static async Task LoadAsync(TextReader input, string format, OpenApiReaderSettings settings = null) { Utils.CheckArgumentNull(format, nameof(format)); @@ -58,6 +95,12 @@ public static async Task LoadAsync(TextReader input, string format, return await reader.ReadAsync(input, settings); } + /// + /// Loads the input URL and parses it into an Open API document. + /// + /// The input URL. + /// The OpenApi reader settings. + /// public static async Task LoadAsync(string url, OpenApiReaderSettings settings = null) { var format = GetFormat(url); @@ -65,6 +108,14 @@ public static async Task LoadAsync(string url, OpenApiReaderSettings return await reader.ReadAsync(url, settings); } + /// + /// Reads the input string and parses it into an Open API document. + /// + /// The input string. + /// The diagnostic entity containing information from the reading process. + /// The Open API format + /// The OpenApi reader settings. + /// An OpenAPI document instance. public static OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, string format = null, diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index f73e859d1..bdefd7c6f 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -107,7 +107,7 @@ public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, JsonNode jsonNode; settings ??= new OpenApiReaderSettings(); - // Parse the YAML/JSON text in the TextReader into Json Nodes + // Parse the JSON text in the TextReader into Json Nodes try { jsonNode = LoadJsonNodesFromJsonDocument(input); @@ -115,7 +115,7 @@ public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, catch (JsonException ex) { diagnostic = new OpenApiDiagnostic(); - diagnostic.Errors.Add(new OpenApiError($"#line={ex.LineNumber}", ex.Message)); + diagnostic.Errors.Add(new OpenApiError($"#line={ex.LineNumber}", $"Please provide the correct format, {ex.Message}")); return new OpenApiDocument(); } @@ -220,7 +220,7 @@ public async Task ReadAsync(TextReader input, } catch (JsonException ex) { - diagnostic.Errors.Add(new OpenApiError($"#line={ex.LineNumber}", ex.Message)); + diagnostic.Errors.Add(new OpenApiError($"#line={ex.LineNumber}", $"Please provide the correct format, {ex.Message}")); return new ReadResult { OpenApiDocument = null, From 12aec9ae1d229698414f0398d5019e518dd31d36 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 16:35:08 +0300 Subject: [PATCH 22/47] More cleanup --- .../Reader/OpenApiJsonReader.cs | 34 +- .../V2Tests/OpenApiDocumentTests.cs | 7 +- .../V3Tests/OpenApiDocumentTests.cs | 1097 ++++++++--------- 3 files changed, 565 insertions(+), 573 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index bdefd7c6f..7632cefa5 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -87,7 +87,7 @@ public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, Ope settings ??= new OpenApiReaderSettings(); var reader = new StreamReader(stream); var result = Read(reader, out diagnostic, settings); - if ((bool)!settings?.LeaveStreamOpen) + if (!settings.LeaveStreamOpen) { reader.Dispose(); } @@ -252,13 +252,13 @@ private JsonNode LoadJsonNodesFromJsonDocument(TextReader input) return nodes; } - private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings) { diagnostic = new OpenApiDiagnostic(); var context = new ParsingContext(diagnostic) { - ExtensionParsers = settings?.ExtensionParsers, - BaseUrl = settings?.BaseUrl + ExtensionParsers = settings.ExtensionParsers, + BaseUrl = settings.BaseUrl }; OpenApiDocument document = null; @@ -267,7 +267,7 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O // Parse the OpenAPI Document document = context.Parse(input); - if ((bool)(settings?.LoadExternalRefs)) + if ((bool)(settings.LoadExternalRefs)) { throw new InvalidOperationException("Cannot load external refs using the synchronous Read, use ReadAsync instead."); } @@ -280,9 +280,9 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O } // Validate the document - if (settings?.RuleSet != null && settings?.RuleSet.Rules.Count() > 0) + if (settings.RuleSet != null && settings.RuleSet.Rules.Count() > 0) { - var openApiErrors = document.Validate(settings?.RuleSet); + var openApiErrors = document.Validate(settings.RuleSet); foreach (var item in openApiErrors.OfType()) { diagnostic.Errors.Add(item); @@ -297,14 +297,14 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O } private async Task ReadAsync(JsonNode jsonNode, - OpenApiReaderSettings settings = null, + OpenApiReaderSettings settings, CancellationToken cancellationToken = default) { var diagnostic = new OpenApiDiagnostic(); var context = new ParsingContext(diagnostic) { - ExtensionParsers = settings?.ExtensionParsers, - BaseUrl = settings?.BaseUrl + ExtensionParsers = settings.ExtensionParsers, + BaseUrl = settings.BaseUrl }; OpenApiDocument document = null; @@ -313,7 +313,7 @@ private async Task ReadAsync(JsonNode jsonNode, // Parse the OpenAPI Document document = context.Parse(jsonNode); - if ((bool)(settings?.LoadExternalRefs)) + if (settings.LoadExternalRefs) { await LoadExternalRefs(document, cancellationToken, settings); } @@ -326,9 +326,9 @@ private async Task ReadAsync(JsonNode jsonNode, } // Validate the document - if (settings?.RuleSet != null && settings?.RuleSet.Rules.Count() > 0) + if (settings.RuleSet != null && settings.RuleSet.Rules.Count() > 0) { - var openApiErrors = document.Validate(settings?.RuleSet); + var openApiErrors = document.Validate(settings.RuleSet); foreach (var item in openApiErrors.OfType()) { diagnostic.Errors.Add(item); @@ -351,7 +351,7 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc List errors = new(); // Resolve References if requested - switch (settings?.ReferenceResolution) + switch (settings.ReferenceResolution) { case ReferenceResolutionSetting.ResolveAllReferences: throw new ArgumentException("Resolving external references is not supported"); @@ -374,8 +374,8 @@ private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken var openApiWorkSpace = new OpenApiWorkspace(); // Load this root document into the workspace - var streamLoader = new DefaultStreamLoader(settings?.BaseUrl); - var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings?.CustomExternalLoader ?? streamLoader, settings); + var streamLoader = new DefaultStreamLoader(settings.BaseUrl); + var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index 38a694829..9ca153263 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -148,11 +148,8 @@ public void ShouldParseProducesInAnyOrder() public void ShouldAssignSchemaToAllResponses() { OpenApiDocument document; - OpenApiDiagnostic diagnostic; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleProduces.json"))) - { - document = new OpenApiStreamReader().Read(stream, out diagnostic); - } + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleProduces.json")); + document = OpenApiDocument.Load(stream, OpenApiConstants.Json, out var diagnostic); Assert.Equal(OpenApiSpecVersion.OpenApi2_0, diagnostic.SpecificationVersion); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 646152165..748572ba5 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -150,7 +150,8 @@ public void ParseBasicDocumentWithMultipleServersShouldSucceed() [Fact] public void ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() { - var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "brokenMinimalDocument.yaml"), out var diagnostic); + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "brokenMinimalDocument.yaml")); + var openApiDoc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var diagnostic); openApiDoc.Should().BeEquivalentTo( new OpenApiDocument @@ -204,316 +205,312 @@ public void ParseMinimalDocumentShouldSucceed() [Fact] public void ParseStandardPetStoreDocumentShouldSucceed() { - OpenApiDiagnostic context; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml"))) - { - var doc = new OpenApiStreamReader().Read(stream, out context); + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); + var doc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var context); - var components = new OpenApiComponents + var components = new OpenApiComponents + { + Schemas = new Dictionary { - Schemas = new Dictionary - { - ["pet1"] = new JsonSchemaBuilder() - .Ref("#/components/schemas/pet1") + ["pet1"] = new JsonSchemaBuilder() + .Ref("#/components/schemas/pet1") + .Type(SchemaValueType.Object) + .Required("id", "name") + .Properties( + ("id", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64")), + ("name", new JsonSchemaBuilder().Type(SchemaValueType.String)), + ("tag", new JsonSchemaBuilder().Type(SchemaValueType.String))), + ["newPet"] = new JsonSchemaBuilder() + .Ref("#/components/schemas/newPet") .Type(SchemaValueType.Object) - .Required("id", "name") + .Required("name") .Properties( ("id", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64")), ("name", new JsonSchemaBuilder().Type(SchemaValueType.String)), ("tag", new JsonSchemaBuilder().Type(SchemaValueType.String))), - ["newPet"] = new JsonSchemaBuilder() - .Ref("#/components/schemas/newPet") - .Type(SchemaValueType.Object) - .Required("name") - .Properties( - ("id", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64")), - ("name", new JsonSchemaBuilder().Type(SchemaValueType.String)), - ("tag", new JsonSchemaBuilder().Type(SchemaValueType.String))), - ["errorModel"] = new JsonSchemaBuilder() - .Ref("#/components/schemas/errorModel") - .Type(SchemaValueType.Object) - .Required("code", "message") - .Properties( - ("code", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int32")), - ("message", new JsonSchemaBuilder().Type(SchemaValueType.String))) - } - }; - - var petSchema = components.Schemas["pet1"]; + ["errorModel"] = new JsonSchemaBuilder() + .Ref("#/components/schemas/errorModel") + .Type(SchemaValueType.Object) + .Required("code", "message") + .Properties( + ("code", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int32")), + ("message", new JsonSchemaBuilder().Type(SchemaValueType.String))) + } + }; + var petSchema = components.Schemas["pet1"]; - var newPetSchema = components.Schemas["newPet"]; + var newPetSchema = components.Schemas["newPet"]; - var errorModelSchema = components.Schemas["errorModel"]; + var errorModelSchema = components.Schemas["errorModel"]; - var expectedDoc = new OpenApiDocument + var expectedDoc = new OpenApiDocument + { + Info = new OpenApiInfo { - Info = new OpenApiInfo + Version = "1.0.0", + Title = "Swagger Petstore (Simple)", + Description = + "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", + TermsOfService = new Uri("http://helloreverb.com/terms/"), + Contact = new OpenApiContact { - Version = "1.0.0", - Title = "Swagger Petstore (Simple)", - Description = - "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", - TermsOfService = new Uri("http://helloreverb.com/terms/"), - Contact = new OpenApiContact - { - Name = "Swagger API team", - Email = "foo@example.com", - Url = new Uri("http://swagger.io") - }, - License = new OpenApiLicense - { - Name = "MIT", - Url = new Uri("http://opensource.org/licenses/MIT") - } + Name = "Swagger API team", + Email = "foo@example.com", + Url = new Uri("http://swagger.io") }, - Servers = new List + License = new OpenApiLicense { - new OpenApiServer - { - Url = "http://petstore.swagger.io/api" - } - }, - Paths = new OpenApiPaths + Name = "MIT", + Url = new Uri("http://opensource.org/licenses/MIT") + } + }, + Servers = new List + { + new OpenApiServer { - ["/pets"] = new OpenApiPathItem + Url = "http://petstore.swagger.io/api" + } + }, + Paths = new OpenApiPaths + { + ["/pets"] = new OpenApiPathItem + { + Operations = new Dictionary { - Operations = new Dictionary + [OperationType.Get] = new OpenApiOperation { - [OperationType.Get] = new OpenApiOperation + Description = "Returns all pets from the system that the user has access to", + OperationId = "findPets", + Parameters = new List { - Description = "Returns all pets from the system that the user has access to", - OperationId = "findPets", - Parameters = new List + new OpenApiParameter { - new OpenApiParameter - { - Name = "tags", - In = ParameterLocation.Query, - Description = "tags to filter by", - Required = false, - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Array) - .Items(new JsonSchemaBuilder().Type(SchemaValueType.String)) - }, - new OpenApiParameter - { - Name = "limit", - In = ParameterLocation.Query, - Description = "maximum number of results to return", - Required = false, - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int32").Build() - } + Name = "tags", + In = ParameterLocation.Query, + Description = "tags to filter by", + Required = false, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Array) + .Items(new JsonSchemaBuilder().Type(SchemaValueType.String)) }, - Responses = new OpenApiResponses + new OpenApiParameter + { + Name = "limit", + In = ParameterLocation.Query, + Description = "maximum number of results to return", + Required = false, + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int32").Build() + } + }, + Responses = new OpenApiResponses + { + ["200"] = new OpenApiResponse { - ["200"] = new OpenApiResponse + Description = "pet response", + Content = new Dictionary { - Description = "pet response", - Content = new Dictionary + ["application/json"] = new OpenApiMediaType { - ["application/json"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Array).Items(petSchema) - }, - ["application/xml"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Array).Items(petSchema) - } + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Array).Items(petSchema) + }, + ["application/xml"] = new OpenApiMediaType + { + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Array).Items(petSchema) } - }, - ["4XX"] = new OpenApiResponse + } + }, + ["4XX"] = new OpenApiResponse + { + Description = "unexpected client error", + Content = new Dictionary { - Description = "unexpected client error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } - }, - ["5XX"] = new OpenApiResponse + } + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - Description = "unexpected server error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } } } + } + }, + [OperationType.Post] = new OpenApiOperation + { + Description = "Creates a new pet in the store. Duplicates are allowed", + OperationId = "addPet", + RequestBody = new OpenApiRequestBody + { + Description = "Pet to add to the store", + Required = true, + Content = new Dictionary + { + ["application/json"] = new OpenApiMediaType + { + Schema = newPetSchema + } + } }, - [OperationType.Post] = new OpenApiOperation + Responses = new OpenApiResponses { - Description = "Creates a new pet in the store. Duplicates are allowed", - OperationId = "addPet", - RequestBody = new OpenApiRequestBody + ["200"] = new OpenApiResponse { - Description = "Pet to add to the store", - Required = true, + Description = "pet response", Content = new Dictionary { ["application/json"] = new OpenApiMediaType { - Schema = newPetSchema - } + Schema = petSchema + }, } }, - Responses = new OpenApiResponses + ["4XX"] = new OpenApiResponse { - ["200"] = new OpenApiResponse - { - Description = "pet response", - Content = new Dictionary - { - ["application/json"] = new OpenApiMediaType - { - Schema = petSchema - }, - } - }, - ["4XX"] = new OpenApiResponse + Description = "unexpected client error", + Content = new Dictionary { - Description = "unexpected client error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } - }, - ["5XX"] = new OpenApiResponse + } + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - Description = "unexpected server error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } } } } } - }, - ["/pets/{id}"] = new OpenApiPathItem + } + }, + ["/pets/{id}"] = new OpenApiPathItem + { + Operations = new Dictionary { - Operations = new Dictionary + [OperationType.Get] = new OpenApiOperation { - [OperationType.Get] = new OpenApiOperation + Description = + "Returns a user based on a single ID, if the user does not have access to the pet", + OperationId = "findPetById", + Parameters = new List { - Description = - "Returns a user based on a single ID, if the user does not have access to the pet", - OperationId = "findPetById", - Parameters = new List + new OpenApiParameter { - new OpenApiParameter - { - Name = "id", - In = ParameterLocation.Path, - Description = "ID of pet to fetch", - Required = true, - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64") - } - }, - Responses = new OpenApiResponses + Name = "id", + In = ParameterLocation.Path, + Description = "ID of pet to fetch", + Required = true, + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64") + } + }, + Responses = new OpenApiResponses + { + ["200"] = new OpenApiResponse { - ["200"] = new OpenApiResponse + Description = "pet response", + Content = new Dictionary { - Description = "pet response", - Content = new Dictionary + ["application/json"] = new OpenApiMediaType + { + Schema = petSchema + }, + ["application/xml"] = new OpenApiMediaType { - ["application/json"] = new OpenApiMediaType - { - Schema = petSchema - }, - ["application/xml"] = new OpenApiMediaType - { - Schema = petSchema - } + Schema = petSchema } - }, - ["4XX"] = new OpenApiResponse + } + }, + ["4XX"] = new OpenApiResponse + { + Description = "unexpected client error", + Content = new Dictionary { - Description = "unexpected client error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } - }, - ["5XX"] = new OpenApiResponse + } + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - Description = "unexpected server error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } } } + } + }, + [OperationType.Delete] = new OpenApiOperation + { + Description = "deletes a single pet based on the ID supplied", + OperationId = "deletePet", + Parameters = new List + { + new OpenApiParameter + { + Name = "id", + In = ParameterLocation.Path, + Description = "ID of pet to delete", + Required = true, + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64").Build() + } }, - [OperationType.Delete] = new OpenApiOperation + Responses = new OpenApiResponses { - Description = "deletes a single pet based on the ID supplied", - OperationId = "deletePet", - Parameters = new List + ["204"] = new OpenApiResponse { - new OpenApiParameter - { - Name = "id", - In = ParameterLocation.Path, - Description = "ID of pet to delete", - Required = true, - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64").Build() - } + Description = "pet deleted" }, - Responses = new OpenApiResponses + ["4XX"] = new OpenApiResponse { - ["204"] = new OpenApiResponse - { - Description = "pet deleted" - }, - ["4XX"] = new OpenApiResponse + Description = "unexpected client error", + Content = new Dictionary { - Description = "unexpected client error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } - }, - ["5XX"] = new OpenApiResponse + } + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - Description = "unexpected server error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } } } } } } - }, - Components = components - }; + } + }, + Components = components + }; - doc.Should().BeEquivalentTo(expectedDoc); - } + doc.Should().BeEquivalentTo(expectedDoc); context.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); @@ -522,434 +519,431 @@ public void ParseStandardPetStoreDocumentShouldSucceed() [Fact] public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() { - OpenApiDiagnostic context; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStoreWithTagAndSecurity.yaml"))) - { - var actual = new OpenApiStreamReader().Read(stream, out context); + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStoreWithTagAndSecurity.yaml")); + var actual = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var context); - var components = new OpenApiComponents + var components = new OpenApiComponents + { + Schemas = new Dictionary { - Schemas = new Dictionary - { - ["pet1"] = new JsonSchemaBuilder() - .Ref("#/components/schemas/pet1") - .Type(SchemaValueType.Object) - .Required("id", "name") - .Properties( - ("id", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64")), - ("name", new JsonSchemaBuilder().Type(SchemaValueType.String)), - ("tag", new JsonSchemaBuilder().Type(SchemaValueType.String))), - ["newPet"] = new JsonSchemaBuilder() - .Ref("#/components/schemas/newPet") - .Type(SchemaValueType.Object) - .Required("name") - .Properties( - ("id", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64")), - ("name", new JsonSchemaBuilder().Type(SchemaValueType.String)), - ("tag", new JsonSchemaBuilder().Type(SchemaValueType.String))), - ["errorModel"] = new JsonSchemaBuilder() - .Ref("#/components/schemas/errorModel") - .Type(SchemaValueType.Object) - .Required("code", "message") - .Properties( - ("code", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int32")), - ("message", new JsonSchemaBuilder().Type(SchemaValueType.String))) - }, - SecuritySchemes = new Dictionary + ["pet1"] = new JsonSchemaBuilder() + .Ref("#/components/schemas/pet1") + .Type(SchemaValueType.Object) + .Required("id", "name") + .Properties( + ("id", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64")), + ("name", new JsonSchemaBuilder().Type(SchemaValueType.String)), + ("tag", new JsonSchemaBuilder().Type(SchemaValueType.String))), + ["newPet"] = new JsonSchemaBuilder() + .Ref("#/components/schemas/newPet") + .Type(SchemaValueType.Object) + .Required("name") + .Properties( + ("id", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int64")), + ("name", new JsonSchemaBuilder().Type(SchemaValueType.String)), + ("tag", new JsonSchemaBuilder().Type(SchemaValueType.String))), + ["errorModel"] = new JsonSchemaBuilder() + .Ref("#/components/schemas/errorModel") + .Type(SchemaValueType.Object) + .Required("code", "message") + .Properties( + ("code", new JsonSchemaBuilder().Type(SchemaValueType.Integer).Format("int32")), + ("message", new JsonSchemaBuilder().Type(SchemaValueType.String))) + }, + SecuritySchemes = new Dictionary + { + ["securitySchemeName1"] = new OpenApiSecurityScheme { - ["securitySchemeName1"] = new OpenApiSecurityScheme + Type = SecuritySchemeType.ApiKey, + Name = "apiKeyName1", + In = ParameterLocation.Header, + Reference = new OpenApiReference { - Type = SecuritySchemeType.ApiKey, - Name = "apiKeyName1", - In = ParameterLocation.Header, - Reference = new OpenApiReference - { - Id = "securitySchemeName1", - Type = ReferenceType.SecurityScheme, - HostDocument = actual - } + Id = "securitySchemeName1", + Type = ReferenceType.SecurityScheme, + HostDocument = actual + } - }, - ["securitySchemeName2"] = new OpenApiSecurityScheme + }, + ["securitySchemeName2"] = new OpenApiSecurityScheme + { + Type = SecuritySchemeType.OpenIdConnect, + OpenIdConnectUrl = new Uri("http://example.com"), + Reference = new OpenApiReference { - Type = SecuritySchemeType.OpenIdConnect, - OpenIdConnectUrl = new Uri("http://example.com"), - Reference = new OpenApiReference - { - Id = "securitySchemeName2", - Type = ReferenceType.SecurityScheme, - HostDocument = actual - } + Id = "securitySchemeName2", + Type = ReferenceType.SecurityScheme, + HostDocument = actual } } - }; + } + }; - var petSchema = components.Schemas["pet1"]; + var petSchema = components.Schemas["pet1"]; - var newPetSchema = components.Schemas["newPet"]; + var newPetSchema = components.Schemas["newPet"]; - var errorModelSchema = components.Schemas["errorModel"]; + var errorModelSchema = components.Schemas["errorModel"]; - var tag1 = new OpenApiTag + var tag1 = new OpenApiTag + { + Name = "tagName1", + Description = "tagDescription1", + Reference = new OpenApiReference { - Name = "tagName1", - Description = "tagDescription1", - Reference = new OpenApiReference - { - Id = "tagName1", - Type = ReferenceType.Tag - } - }; + Id = "tagName1", + Type = ReferenceType.Tag + } + }; - var tag2 = new OpenApiTag - { - Name = "tagName2" - }; + var tag2 = new OpenApiTag + { + Name = "tagName2" + }; - var securityScheme1 = CloneSecurityScheme(components.SecuritySchemes["securitySchemeName1"]); + var securityScheme1 = CloneSecurityScheme(components.SecuritySchemes["securitySchemeName1"]); - securityScheme1.Reference = new OpenApiReference - { - Id = "securitySchemeName1", - Type = ReferenceType.SecurityScheme - }; + securityScheme1.Reference = new OpenApiReference + { + Id = "securitySchemeName1", + Type = ReferenceType.SecurityScheme + }; - var securityScheme2 = CloneSecurityScheme(components.SecuritySchemes["securitySchemeName2"]); + var securityScheme2 = CloneSecurityScheme(components.SecuritySchemes["securitySchemeName2"]); - securityScheme2.Reference = new OpenApiReference - { - Id = "securitySchemeName2", - Type = ReferenceType.SecurityScheme - }; + securityScheme2.Reference = new OpenApiReference + { + Id = "securitySchemeName2", + Type = ReferenceType.SecurityScheme + }; - var expected = new OpenApiDocument + var expected = new OpenApiDocument + { + Info = new OpenApiInfo { - Info = new OpenApiInfo + Version = "1.0.0", + Title = "Swagger Petstore (Simple)", + Description = + "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", + TermsOfService = new Uri("http://helloreverb.com/terms/"), + Contact = new OpenApiContact { - Version = "1.0.0", - Title = "Swagger Petstore (Simple)", - Description = - "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", - TermsOfService = new Uri("http://helloreverb.com/terms/"), - Contact = new OpenApiContact - { - Name = "Swagger API team", - Email = "foo@example.com", - Url = new Uri("http://swagger.io") - }, - License = new OpenApiLicense + Name = "Swagger API team", + Email = "foo@example.com", + Url = new Uri("http://swagger.io") + }, + License = new OpenApiLicense + { + Name = "MIT", + Url = new Uri("http://opensource.org/licenses/MIT") + } + }, + Servers = new List + { + new OpenApiServer { - Name = "MIT", - Url = new Uri("http://opensource.org/licenses/MIT") + Url = "http://petstore.swagger.io/api" } }, - Servers = new List - { - new OpenApiServer - { - Url = "http://petstore.swagger.io/api" - } - }, - Paths = new OpenApiPaths + Paths = new OpenApiPaths + { + ["/pets"] = new OpenApiPathItem { - ["/pets"] = new OpenApiPathItem + Operations = new Dictionary { - Operations = new Dictionary + [OperationType.Get] = new OpenApiOperation { - [OperationType.Get] = new OpenApiOperation - { - Tags = new List + Tags = new List + { + tag1, + tag2 + }, + Description = "Returns all pets from the system that the user has access to", + OperationId = "findPets", + Parameters = new List + { + new OpenApiParameter { - tag1, - tag2 + Name = "tags", + In = ParameterLocation.Query, + Description = "tags to filter by", + Required = false, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Array) + .Items(new JsonSchemaBuilder().Type(SchemaValueType.String)) }, - Description = "Returns all pets from the system that the user has access to", - OperationId = "findPets", - Parameters = new List + new OpenApiParameter + { + Name = "limit", + In = ParameterLocation.Query, + Description = "maximum number of results to return", + Required = false, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Integer) + .Format("int32") + } + }, + Responses = new OpenApiResponses + { + ["200"] = new OpenApiResponse + { + Description = "pet response", + Content = new Dictionary { - new OpenApiParameter + ["application/json"] = new OpenApiMediaType { - Name = "tags", - In = ParameterLocation.Query, - Description = "tags to filter by", - Required = false, Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Array) - .Items(new JsonSchemaBuilder().Type(SchemaValueType.String)) + .Type(SchemaValueType.Array) + .Items(petSchema) }, - new OpenApiParameter + ["application/xml"] = new OpenApiMediaType { - Name = "limit", - In = ParameterLocation.Query, - Description = "maximum number of results to return", - Required = false, Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Integer) - .Format("int32") + .Type(SchemaValueType.Array) + .Items(petSchema) } - }, - Responses = new OpenApiResponses + } + }, + ["4XX"] = new OpenApiResponse { - ["200"] = new OpenApiResponse + Description = "unexpected client error", + Content = new Dictionary { - Description = "pet response", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["application/json"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Array) - .Items(petSchema) - }, - ["application/xml"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Array) - .Items(petSchema) - } + Schema = errorModelSchema } - }, - ["4XX"] = new OpenApiResponse + } + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - Description = "unexpected client error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } - }, - ["5XX"] = new OpenApiResponse + } + } + } + }, + [OperationType.Post] = new OpenApiOperation + { + Tags = new List + { + tag1, + tag2 + }, + Description = "Creates a new pet in the store. Duplicates are allowed", + OperationId = "addPet", + RequestBody = new OpenApiRequestBody + { + Description = "Pet to add to the store", + Required = true, + Content = new Dictionary + { + ["application/json"] = new OpenApiMediaType { - Description = "unexpected server error", - Content = new Dictionary - { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } - } + Schema = newPetSchema } } }, - [OperationType.Post] = new OpenApiOperation + Responses = new OpenApiResponses { - Tags = new List - { - tag1, - tag2 - }, - Description = "Creates a new pet in the store. Duplicates are allowed", - OperationId = "addPet", - RequestBody = new OpenApiRequestBody + ["200"] = new OpenApiResponse { - Description = "Pet to add to the store", - Required = true, + Description = "pet response", Content = new Dictionary { ["application/json"] = new OpenApiMediaType { - Schema = newPetSchema - } + Schema = petSchema + }, } }, - Responses = new OpenApiResponses + ["4XX"] = new OpenApiResponse { - ["200"] = new OpenApiResponse - { - Description = "pet response", - Content = new Dictionary - { - ["application/json"] = new OpenApiMediaType - { - Schema = petSchema - }, - } - }, - ["4XX"] = new OpenApiResponse + Description = "unexpected client error", + Content = new Dictionary { - Description = "unexpected client error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } - }, - ["5XX"] = new OpenApiResponse + } + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - Description = "unexpected server error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } } - }, - Security = new List + } + }, + Security = new List + { + new OpenApiSecurityRequirement { - new OpenApiSecurityRequirement + [securityScheme1] = new List(), + [securityScheme2] = new List { - [securityScheme1] = new List(), - [securityScheme2] = new List - { - "scope1", - "scope2" - } + "scope1", + "scope2" } } - } + } } - }, - ["/pets/{id}"] = new OpenApiPathItem + } + }, + ["/pets/{id}"] = new OpenApiPathItem + { + Operations = new Dictionary { - Operations = new Dictionary + [OperationType.Get] = new OpenApiOperation { - [OperationType.Get] = new OpenApiOperation - { - Description = - "Returns a user based on a single ID, if the user does not have access to the pet", - OperationId = "findPetById", - Parameters = new List + Description = + "Returns a user based on a single ID, if the user does not have access to the pet", + OperationId = "findPetById", + Parameters = new List + { + new OpenApiParameter { - new OpenApiParameter - { - Name = "id", - In = ParameterLocation.Path, - Description = "ID of pet to fetch", - Required = true, - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Integer) - .Format("int64") - } - }, - Responses = new OpenApiResponses + Name = "id", + In = ParameterLocation.Path, + Description = "ID of pet to fetch", + Required = true, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Integer) + .Format("int64") + } + }, + Responses = new OpenApiResponses + { + ["200"] = new OpenApiResponse { - ["200"] = new OpenApiResponse + Description = "pet response", + Content = new Dictionary { - Description = "pet response", - Content = new Dictionary + ["application/json"] = new OpenApiMediaType { - ["application/json"] = new OpenApiMediaType - { - Schema = petSchema - }, - ["application/xml"] = new OpenApiMediaType - { - Schema = petSchema - } - } - }, - ["4XX"] = new OpenApiResponse - { - Description = "unexpected client error", - Content = new Dictionary + Schema = petSchema + }, + ["application/xml"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = petSchema } - }, - ["5XX"] = new OpenApiResponse + } + }, + ["4XX"] = new OpenApiResponse + { + Description = "unexpected client error", + Content = new Dictionary { - Description = "unexpected server error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } } - } - }, - [OperationType.Delete] = new OpenApiOperation - { - Description = "deletes a single pet based on the ID supplied", - OperationId = "deletePet", - Parameters = new List + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - new OpenApiParameter + ["text/html"] = new OpenApiMediaType { - Name = "id", - In = ParameterLocation.Path, - Description = "ID of pet to delete", - Required = true, - Schema = new JsonSchemaBuilder() - .Type(SchemaValueType.Integer) - .Format("int64") + Schema = errorModelSchema } - }, - Responses = new OpenApiResponses + } + } + } + }, + [OperationType.Delete] = new OpenApiOperation + { + Description = "deletes a single pet based on the ID supplied", + OperationId = "deletePet", + Parameters = new List { - ["204"] = new OpenApiResponse + new OpenApiParameter { - Description = "pet deleted" - }, - ["4XX"] = new OpenApiResponse + Name = "id", + In = ParameterLocation.Path, + Description = "ID of pet to delete", + Required = true, + Schema = new JsonSchemaBuilder() + .Type(SchemaValueType.Integer) + .Format("int64") + } + }, + Responses = new OpenApiResponses + { + ["204"] = new OpenApiResponse + { + Description = "pet deleted" + }, + ["4XX"] = new OpenApiResponse + { + Description = "unexpected client error", + Content = new Dictionary { - Description = "unexpected client error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } - }, - ["5XX"] = new OpenApiResponse + } + }, + ["5XX"] = new OpenApiResponse + { + Description = "unexpected server error", + Content = new Dictionary { - Description = "unexpected server error", - Content = new Dictionary + ["text/html"] = new OpenApiMediaType { - ["text/html"] = new OpenApiMediaType - { - Schema = errorModelSchema - } + Schema = errorModelSchema } } } } } } - }, - Components = components, - Tags = new List + } + }, + Components = components, + Tags = new List + { + new OpenApiTag { - new OpenApiTag + Name = "tagName1", + Description = "tagDescription1", + Reference = new OpenApiReference() { - Name = "tagName1", - Description = "tagDescription1", - Reference = new OpenApiReference() - { - Id = "tagName1", - Type = ReferenceType.Tag - } + Id = "tagName1", + Type = ReferenceType.Tag } - }, - SecurityRequirements = new List + } + }, + SecurityRequirements = new List + { + new OpenApiSecurityRequirement { - new OpenApiSecurityRequirement + [securityScheme1] = new List(), + [securityScheme2] = new List { - [securityScheme1] = new List(), - [securityScheme2] = new List - { - "scope1", - "scope2", - "scope3" - } + "scope1", + "scope2", + "scope3" } } - }; + } + }; - actual.Should().BeEquivalentTo(expected, options => options.Excluding(m => m.Name == "HostDocument")); - } + actual.Should().BeEquivalentTo(expected, options => options.Excluding(m => m.Name == "HostDocument")); context.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); @@ -1067,10 +1061,11 @@ public void ParseDocumentWithJsonSchemaReferencesWorks() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithJsonSchema.yaml")); // Act - var doc = new OpenApiStreamReader(new OpenApiReaderSettings + var settings = new OpenApiReaderSettings { ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences - }).Read(stream, out var diagnostic); + }; + var doc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var diagnostic, settings); var actualSchema = doc.Paths["/users/{userId}"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; From 7151d664b909825dead3e461470a238b47a5b754 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 16:41:44 +0300 Subject: [PATCH 23/47] Clean up --- src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index 7632cefa5..d1242bc98 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -267,7 +267,7 @@ private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, O // Parse the OpenAPI Document document = context.Parse(input); - if ((bool)(settings.LoadExternalRefs)) + if (settings.LoadExternalRefs) { throw new InvalidOperationException("Cannot load external refs using the synchronous Read, use ReadAsync instead."); } @@ -368,7 +368,7 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc } } - private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken, OpenApiReaderSettings settings = null) + private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken, OpenApiReaderSettings settings) { // Create workspace for all documents to live in. var openApiWorkSpace = new OpenApiWorkspace(); From 5b17f3762cc4fcf5acbdc535f755eb5baa9b4c5e Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 8 Feb 2024 16:42:42 +0300 Subject: [PATCH 24/47] Clean up --- src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index d1242bc98..06d04d9e9 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -346,7 +346,7 @@ private async Task ReadAsync(JsonNode jsonNode, }; } - private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument document, OpenApiReaderSettings settings = null) + private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument document, OpenApiReaderSettings settings) { List errors = new(); From ab906e339ba8c5df80336f0342284fcc429cfc7b Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 12 Feb 2024 12:48:45 +0300 Subject: [PATCH 25/47] Add support to enable direct loading of model objects --- .../OpenApiStreamReader.cs | 2 +- .../OpenApiYamlReader.cs | 122 +++++++++--- .../Interfaces/IOpenApiReader.cs | 42 ++++ .../Models/OpenApiCallback.cs | 70 +++++++ .../Models/OpenApiComponents.cs | 70 +++++++ .../Models/OpenApiContact.cs | 70 +++++++ .../Models/OpenApiDiscriminator.cs | 70 +++++++ .../Models/OpenApiEncoding.cs | 70 +++++++ .../Models/OpenApiExample.cs | 70 +++++++ .../Models/OpenApiExternalDocs.cs | 70 +++++++ src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 71 ++++++- src/Microsoft.OpenApi/Models/OpenApiInfo.cs | 72 ++++++- .../Models/OpenApiLicense.cs | 72 ++++++- src/Microsoft.OpenApi/Models/OpenApiLink.cs | 70 +++++++ .../Models/OpenApiMediaType.cs | 71 ++++++- .../Models/OpenApiModelFactory.cs | 40 ++++ .../Models/OpenApiOAuthFlow.cs | 72 ++++++- .../Models/OpenApiOAuthFlows.cs | 72 ++++++- .../Models/OpenApiOperation.cs | 72 ++++++- .../Models/OpenApiParameter.cs | 70 +++++++ .../Models/OpenApiPathItem.cs | 72 ++++++- .../Models/OpenApiRequestBody.cs | 70 +++++++ .../Models/OpenApiResponse.cs | 70 +++++++ .../Models/OpenApiSecurityRequirement.cs | 72 ++++++- .../Models/OpenApiSecurityScheme.cs | 72 ++++++- src/Microsoft.OpenApi/Models/OpenApiServer.cs | 72 ++++++- .../Models/OpenApiServerVariable.cs | 72 ++++++- src/Microsoft.OpenApi/Models/OpenApiTag.cs | 72 ++++++- src/Microsoft.OpenApi/Models/OpenApiXml.cs | 75 +++++++- .../Reader/OpenApiJsonReader.cs | 180 ++++++++++++++---- .../Reader/V2/OpenApiV2VersionService.cs | 2 +- .../PublicApi/PublicApi.approved.txt | 118 ++++++++++++ 32 files changed, 2210 insertions(+), 75 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs index 90e059dcf..9aabd9138 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs @@ -85,7 +85,7 @@ public async Task ReadAsync(Stream input, CancellationToken cancella /// Version of the OpenAPI specification that the fragment conforms to. /// Returns diagnostic object containing errors detected during parsing /// Instance of newly created OpenApiDocument - public T ReadFragment(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiReferenceable + public T ReadFragment(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiElement { using var reader = new StreamReader(input); return new OpenApiTextReaderReader(_settings).ReadFragment(reader, version, out diagnostic); diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index 9e99eefb1..05243470f 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -5,6 +5,7 @@ using System.IO; using System.Net.Http; using System.Security; +using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; using Microsoft.OpenApi.Interfaces; @@ -29,13 +30,32 @@ public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, Ope /// public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + var stream = GetStream(url); + return Read(stream, out diagnostic, settings); + } + + /// + public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return new OpenApiStreamReader(settings).Read(stream, out diagnostic); + } + + /// + public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return new OpenApiTextReaderReader(settings).Read(input, out diagnostic); + } + + /// + public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { Stream stream; if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { try { - stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); + stream = await _httpClient.GetStreamAsync(new Uri(url)); } catch (HttpRequestException ex) { @@ -63,30 +83,96 @@ SecurityException or } } - return Read(stream, out diagnostic, settings); + return await ReadAsync(stream, settings, cancellationToken); } - /// - public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + /// + public async Task ReadAsync(Stream stream, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { - return new OpenApiStreamReader(settings).Read(stream, out diagnostic); + return await new OpenApiStreamReader(settings).ReadAsync(stream, cancellationToken); } /// - public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + public async Task ReadAsync(TextReader input, + OpenApiReaderSettings settings = null, + CancellationToken cancellationToken = default) { - return new OpenApiTextReaderReader(settings).Read(input, out diagnostic); + return await new OpenApiTextReaderReader(settings).ReadAsync(input, cancellationToken); + } + + + /// + /// Takes in an input URL and parses it into an Open API document + /// + /// The path to the Open API file + /// The OpenAPI specification version. + /// Returns diagnostic object containing errors detected during parsing. + /// The Reader settings to be used during parsing. + /// + /// + public T Read(string url, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + settings ??= new OpenApiReaderSettings(); + var stream = GetStream(url); + return Read(stream, version, out diagnostic, settings); } /// - public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) + public T Read(Stream input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + return new OpenApiStreamReader(settings).ReadFragment(input, version, out diagnostic); + } + + /// + public T Read(TextReader input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + return new OpenApiTextReaderReader(settings).ReadFragment(input, version, out diagnostic); + } + + /// + public T Read(JsonNode input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + return new OpenApiYamlDocumentReader(settings).ReadFragment(input, version, out diagnostic); + } + + /// + /// Parses an input string into an Open API document. + /// + /// + /// + /// + /// + /// + public T Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + settings ??= new OpenApiReaderSettings(); + using var reader = new StringReader(input); + return Read(reader, version, out diagnostic, settings); + } + + private Stream GetStream(string url) { Stream stream; if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { try { - stream = await _httpClient.GetStreamAsync(new Uri(url)); + stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); } catch (HttpRequestException ex) { @@ -114,21 +200,7 @@ SecurityException or } } - return await ReadAsync(stream, settings, cancellationToken); - } - - /// - public async Task ReadAsync(Stream stream, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) - { - return await new OpenApiStreamReader(settings).ReadAsync(stream, cancellationToken); - } - - /// - public async Task ReadAsync(TextReader input, - OpenApiReaderSettings settings = null, - CancellationToken cancellationToken = default) - { - return await new OpenApiTextReaderReader(settings).ReadAsync(input, cancellationToken); - } + return stream; + } } } diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs index e9496d938..2288e5e0f 100644 --- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using System.IO; +using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; using Microsoft.OpenApi.Models; @@ -76,5 +77,46 @@ public interface IOpenApiReader /// The OpenApi reader settings. /// OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); + + /// + /// Reads the input string and parses it into an Open API document. + /// + /// + /// + /// + /// + /// + /// + T Parse(string input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; + + /// + /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. + /// + /// Stream containing OpenAPI description to parse. + /// Version of the OpenAPI specification that the fragment conforms to. + /// Returns diagnostic object containing errors detected during parsing + /// The OpenApiReader settings. + /// Instance of newly created OpenApiDocument + T Read(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; + + /// + /// Reads the TextReader input and parses the fragment of an OpenAPI description into an Open API Element. + /// + /// TextReader containing OpenAPI description to parse. + /// Version of the OpenAPI specification that the fragment conforms to. + /// Returns diagnostic object containing errors detected during parsing + /// The OpenApiReader settings. + /// Instance of newly created OpenApiDocument + T Read(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; + + /// + /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. + /// + /// Url pointing to the document. + /// Version of the OpenAPI specification that the fragment conforms to. + /// Returns diagnostic object containing errors detected during parsing + /// The OpenApiReader settings. + /// Instance of newly created OpenApiDocument + T Read(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index 23910545b..04e9ab2a5 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -3,8 +3,10 @@ using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -187,5 +189,73 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) { // Callback object does not exist in V2. } + + /// + /// Parses a local file path or Url into an Open API document. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiCallback Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiCallback Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiCallback Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiCallback Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index 4af4248ab..9e3c1b2a7 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -3,9 +3,11 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using Json.Schema; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; @@ -356,5 +358,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Components object does not exist in V2. } + + /// + /// Parses a local file path or Url into an Open API document. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiComponents Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiComponents Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiComponents Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiComponents Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiContact.cs b/src/Microsoft.OpenApi/Models/OpenApiContact.cs index 15d67cc76..6f71f16ad 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiContact.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiContact.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -95,5 +97,73 @@ private void WriteInternal(IOpenApiWriter writer, OpenApiSpecVersion specVersion writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an Open API document. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiContact Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiContact Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiContact Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiContact Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs index 342025f9f..c71b51211 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs @@ -2,7 +2,9 @@ // Licensed under the MIT license. using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -90,5 +92,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Discriminator object does not exist in V2. } + + /// + /// Parses a local file path or Url into an Open API document. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiDiscriminator Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an Open API document. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiDiscriminator Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an Open API document. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiDiscriminator Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiDiscriminator Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs index 9ab0e7468..e2f2c6dec 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs @@ -3,8 +3,10 @@ using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -127,5 +129,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // nothing here } + + /// + /// Parses a local file path or Url into an OpenApiEncoding object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiEncoding Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiEncoding object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiEncoding Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiEncoding object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiEncoding Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiEncoding Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index 8d101b129..f1b4f62dc 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -3,9 +3,11 @@ using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -191,5 +193,73 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) // 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. } + + /// + /// Parses a local file path or Url into an OpenApiExample object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiExample Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiExample object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiExample Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiExample object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiExample Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiExample Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs index cceace01d..1859690cc 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -84,5 +86,73 @@ private void WriteInternal(IOpenApiWriter writer, OpenApiSpecVersion specVersion writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiExternalDocs object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiExternalDocs Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiExternalDocs object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiExternalDocs Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiExternalDocs object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiExternalDocs Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiExternalDocs Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index 0b5c8dd92..ca0cbb2e4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -3,12 +3,13 @@ using System; using System.Collections.Generic; -using System.Text.Json; +using System.IO; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -305,5 +306,73 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiHeader object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiHeader Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiHeader object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiHeader Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiHeader object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiHeader Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiHeader Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs index 2ecd47c0a..6b6e91478 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -157,5 +159,73 @@ public void SerializeAsV2(IOpenApiWriter writer) writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiInfo object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiInfo Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiInfo object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiInfo Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiInfo object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiInfo Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiInfo Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs index 98f66ac00..2b5807992 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -91,5 +93,73 @@ private void WriteInternal(IOpenApiWriter writer, OpenApiSpecVersion specVersion // specification extensions writer.WriteExtensions(Extensions, specVersion); } + + /// + /// Parses a local file path or Url into an OpenApiLicense object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiLicense Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiLicense object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiLicense Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiLicense object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiLicense Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiLicense Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiLink.cs b/src/Microsoft.OpenApi/Models/OpenApiLink.cs index 794d1c15a..eba68db9d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLink.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLink.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -198,5 +200,73 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) { // Link object does not exist in V2. } + + /// + /// Parses a local file path or Url into an OpenApiLink object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiLink Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiLink object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiLink Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiLink object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiLink Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiLink Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs index 5d195e264..daa52f473 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs @@ -3,11 +3,12 @@ using System; using System.Collections.Generic; -using System.Text.Json; +using System.IO; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -121,5 +122,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Media type does not exist in V2. } + + /// + /// Parses a local file path or Url into an OpenApiMediaType object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiMediaType Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiMediaType object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiMediaType Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiMediaType object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiMediaType Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiMediaType Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs index b55627db3..7c8fdfa31 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs @@ -4,7 +4,9 @@ using System; using System.IO; using System.Net.Http; +using System.Runtime; using System.Threading.Tasks; +using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Reader; namespace Microsoft.OpenApi.Models @@ -125,6 +127,44 @@ public static OpenApiDocument Parse(string input, return OpenApiReaderRegistry.GetReader(format).Parse(input, out diagnostic, settings); } + /// + /// Reads the input string and parses it into an Open API document. + /// + /// The input string. + /// + /// The diagnostic entity containing information from the reading process. + /// The Open API format + /// The OpenApi reader settings. + /// An OpenAPI document instance. + public static T Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + format ??= OpenApiConstants.Json; + return OpenApiReaderRegistry.GetReader(format).Parse(input, version, out diagnostic, settings); + } + + public static T Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + var format = GetFormat(url); + return OpenApiReaderRegistry.GetReader(format).Read(url, version, out diagnostic, settings); + } + + public static T Load(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, string format, OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + format ??= OpenApiConstants.Json; + return OpenApiReaderRegistry.GetReader(format).Read(input, version, out diagnostic, settings); + } + + public static T Load(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, string format, OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + format ??= OpenApiConstants.Json; + return OpenApiReaderRegistry.GetReader(format).Read(input, version, out diagnostic, settings); + } + + private static string GetContentType(string url) { var response = _httpClient.GetAsync(url).GetAwaiter().GetResult(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs index 250a1f04b..bafeb9e73 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -107,5 +109,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // OAuthFlow object does not exist in V2. } + + /// + /// Parses a local file path or Url into an OpenApiOAuthFlow object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiOAuthFlow Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiOAuthFlow object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiOAuthFlow Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiOAuthFlow object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiOAuthFlow Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiOAuthFlow Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs index 4afdbbf13..69549f9b8 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -113,5 +115,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // OAuthFlows object does not exist in V2. } + + /// + /// Parses a local file path or Url into an OpenApiOAuthFlows object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiOAuthFlows Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiOAuthFlows object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiOAuthFlows Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiOAuthFlows object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiOAuthFlows Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiOAuthFlows Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs index fb6fb479c..624c3ee11 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs @@ -1,10 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using System.Linq; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -346,5 +348,73 @@ public void SerializeAsV2(IOpenApiWriter writer) writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiOperation object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiOperation Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiOperation object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiOperation Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiOperation object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiOperation Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiOperation Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index 7e33d403d..81e0e004b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -3,12 +3,14 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -452,6 +454,74 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) return Style; } + + /// + /// Parses a local file path or Url into an OpenApiParameter object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiParameter Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiParameter object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiParameter Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiParameter object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiParameter Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiParameter Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } /// diff --git a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs index 3e2fb9cb8..fd24f291a 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs @@ -1,10 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -258,5 +260,73 @@ internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, O writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiPathItem object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiPathItem Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiPathItem object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiPathItem Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiPathItem object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiPathItem Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiPathItem Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs index 70abaf5ff..2c2f4a75f 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -3,10 +3,12 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -223,5 +225,73 @@ internal IEnumerable ConvertToFormDataParameters() }; } } + + /// + /// Parses a local file path or Url into an OpenApiRequestBody object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiRequestBody Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiRequestBody object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiRequestBody Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiRequestBody object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiRequestBody Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiRequestBody Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index 9aa136a77..88cab0b1c 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -3,8 +3,10 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -250,5 +252,73 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiResponse object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiResponse Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiResponse object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiResponse Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiResponse object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiResponse Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiResponse Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs index a74638e7d..1d01b4eb5 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -119,6 +121,74 @@ public void SerializeAsV2(IOpenApiWriter writer) writer.WriteEndObject(); } + /// + /// Parses a local file path or Url into an OpenApiSecurityRequirement object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiSecurityRequirement Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiSecurityRequirement object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiSecurityRequirement Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiSecurityRequirement object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiSecurityRequirement Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiSecurityRequirement Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } + /// /// Comparer for OpenApiSecurityScheme that only considers the Id in the Reference /// (i.e. the string that will actually be displayed in the written document) diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index d8944a7ad..52ac43678 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -1,10 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -307,5 +309,73 @@ private static void WriteOAuthFlowForV2(IOpenApiWriter writer, string flowValue, // scopes writer.WriteOptionalMap(OpenApiConstants.Scopes, flow.Scopes, (w, s) => w.WriteValue(s)); } + + /// + /// Parses a local file path or Url into an OpenApiSecurityScheme object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiDiscriminator Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiSecurityScheme object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiSecurityScheme Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiSecurityScheme object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiSecurityScheme Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiSecurityScheme Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiServer.cs b/src/Microsoft.OpenApi/Models/OpenApiServer.cs index e500ede7a..d7ed5a430 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServer.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServer.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -100,5 +102,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Server object does not exist in V2. } + + /// + /// Parses a local file path or Url into an OpenApiServer object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiServer Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiServer object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiServer Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiServer object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiServer Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiServer Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs index acdde3799..5fdc4260f 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs @@ -1,8 +1,10 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -96,5 +98,73 @@ public void SerializeAsV2(IOpenApiWriter writer) { // ServerVariable does not exist in V2. } + + /// + /// Parses a local file path or Url into an OpenApiServerVariable object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiServerVariable Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiServerVariable object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiServerVariable Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiServerVariable object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiServerVariable Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiServerVariable Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs index 147e19c43..7ee0af928 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -168,5 +170,73 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiTag object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiTag Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiTag object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiTag Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiTag object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiTag Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiTag Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiXml.cs b/src/Microsoft.OpenApi/Models/OpenApiXml.cs index c60bd2693..b84fd4ae4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiXml.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiXml.cs @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; +using System.IO; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -113,5 +115,76 @@ private void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion) writer.WriteEndObject(); } + + /// + /// Parses a local file path or Url into an OpenApiXml object. + /// + /// The path to the OpenAPI file. + /// The OpenAPI specification version. + /// + /// + /// + public static OpenApiXml Load(string url, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses it into an OpenApiXml object. + /// + /// Stream containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiXml Load(Stream stream, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); + } + + /// + /// Reads the text reader content and parses it into an OpenApiXml object. + /// + /// TextReader containing OpenAPI description to parse. + /// The OpenAPI format to use during parsing. + /// + /// + /// + /// + public static OpenApiXml Load(TextReader input, + string format, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); + } + + + /// + /// Parses a string into a object. + /// + /// The string input. + /// + /// + /// + /// + /// + public static OpenApiXml Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) + { + return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); + } } } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index 06d04d9e9..251af0c29 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -39,39 +39,7 @@ public class OpenApiJsonReader : IOpenApiReader public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { settings ??= new OpenApiReaderSettings(); - Stream stream; - if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - { - try - { - stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); - } - catch (HttpRequestException ex) - { - throw new InvalidOperationException($"Could not download the file at {url}", ex); - } - } - else - { - try - { - var fileInput = new FileInfo(url); - stream = fileInput.OpenRead(); - } - catch (Exception ex) when ( - ex is - FileNotFoundException or - PathTooLongException or - DirectoryNotFoundException or - IOException or - UnauthorizedAccessException or - SecurityException or - NotSupportedException) - { - throw new InvalidOperationException($"Could not open the file at {url}", ex); - } - } - + var stream = GetStream(url); return Read(stream, out diagnostic, settings); } @@ -241,11 +209,117 @@ public async Task ReadAsync(TextReader input, public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { settings ??= new OpenApiReaderSettings(); - using var reader = new StringReader(input); return Read(reader, out diagnostic, settings); } + /// + /// Parses an input string into an Open API document. + /// + /// + /// + /// + /// + /// + public T Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + settings ??= new OpenApiReaderSettings(); + using var reader = new StringReader(input); + return Read(reader, version, out diagnostic, settings); + } + + /// + /// Takes in an input URL and parses it into an Open API document + /// + /// The path to the Open API file + /// The OpenAPI specification version. + /// Returns diagnostic object containing errors detected during parsing. + /// The Reader settings to be used during parsing. + /// + /// + public T Read(string url, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + settings ??= new OpenApiReaderSettings(); + var stream = GetStream(url); + return Read(stream, version, out diagnostic, settings); + } + + /// + public T Read(Stream input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + using var reader = new StreamReader(input); + return Read(reader, version, out diagnostic); + } + + /// + public T Read(TextReader input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + JsonNode jsonNode; + + // Parse the JSON + try + { + jsonNode = LoadJsonNodesFromJsonDocument(input); + } + catch (JsonException ex) + { + diagnostic = new(); + diagnostic.Errors.Add(new($"#line={ex.LineNumber}", ex.Message)); + return default; + } + + return Read(jsonNode, version, out diagnostic); + } + + /// + public T Read(JsonNode input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + diagnostic = new(); + settings ??= new OpenApiReaderSettings(); + var context = new ParsingContext(diagnostic) + { + ExtensionParsers = settings.ExtensionParsers + }; + + IOpenApiElement element = null; + try + { + // Parse the OpenAPI element + element = context.ParseFragment(input, version); + } + catch (OpenApiException ex) + { + diagnostic.Errors.Add(new(ex)); + } + + // Validate the element + if (settings.RuleSet != null && settings.RuleSet.Rules.Any()) + { + var errors = element.Validate(settings.RuleSet); + foreach (var item in errors) + { + diagnostic.Errors.Add(item); + } + } + + return (T)element; + } + private JsonNode LoadJsonNodesFromJsonDocument(TextReader input) { var nodes = JsonNode.Parse(input.ReadToEnd()); @@ -378,5 +452,43 @@ private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); } + + private Stream GetStream(string url) + { + Stream stream; + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + try + { + stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); + } + catch (HttpRequestException ex) + { + throw new InvalidOperationException($"Could not download the file at {url}", ex); + } + } + else + { + try + { + var fileInput = new FileInfo(url); + stream = fileInput.OpenRead(); + } + catch (Exception ex) when ( + ex is + FileNotFoundException or + PathTooLongException or + DirectoryNotFoundException or + IOException or + UnauthorizedAccessException or + SecurityException or + NotSupportedException) + { + throw new InvalidOperationException($"Could not open the file at {url}", ex); + } + } + + return stream; + } } } diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiV2VersionService.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2VersionService.cs index 41049738f..1be363b21 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiV2VersionService.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2VersionService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index d1dc09596..049f1a70c 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -293,9 +293,17 @@ namespace Microsoft.OpenApi.Interfaces public interface IOpenApiReader { Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); + T Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.Stream stream, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.TextReader input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); Microsoft.OpenApi.Models.OpenApiDocument Read(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); + T Read(System.IO.Stream input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; + T Read(System.IO.TextReader input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; + T Read(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; System.Threading.Tasks.Task ReadAsync(System.IO.Stream stream, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task ReadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); @@ -424,6 +432,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiCallback Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiCallback Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiCallback Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiCallback Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiComponents : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -443,6 +455,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiComponents Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiComponents Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiComponents Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiComponents Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public static class OpenApiConstants { @@ -592,6 +608,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiContact Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiContact Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiContact Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiContact Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiDiscriminator : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -603,6 +623,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiDiscriminator Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiDocument : Json.Schema.IBaseDocument, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -649,6 +673,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiEncoding Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiEncoding Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiEncoding Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiEncoding Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiError { @@ -677,6 +705,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiExample Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiExample Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiExample Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiExample Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } 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 @@ -698,6 +730,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiExternalDocs Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiExternalDocs Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiExternalDocs Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiExternalDocs Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiHeader : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -724,6 +760,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiHeader Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiHeader Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiHeader Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiHeader Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiInfo : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -740,6 +780,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiInfo Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiInfo Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiInfo Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiInfo Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiLicense : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -752,6 +796,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiLicense Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiLicense Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiLicense Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiLicense Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiLink : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -773,6 +821,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiLink Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiLink Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiLink Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiLink Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiMediaType : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -786,6 +838,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiMediaType Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiMediaType Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiMediaType Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiMediaType Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiOAuthFlow : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -799,6 +855,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiOAuthFlow Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOAuthFlow Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOAuthFlow Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOAuthFlow Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiOAuthFlows : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -812,6 +872,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiOAuthFlows Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOAuthFlows Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOAuthFlows Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOAuthFlows Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiOperation : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -834,6 +898,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiOperation Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOperation Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOperation Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiOperation Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiParameter : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -862,6 +930,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiParameter Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiParameter Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiParameter Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiParameter Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiPathItem : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -883,6 +955,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiPathItem Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiPathItem Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiPathItem Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiPathItem Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiPaths : Microsoft.OpenApi.Models.OpenApiExtensibleDictionary { @@ -925,6 +1001,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiRequestBody Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiRequestBody Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiRequestBody Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiRequestBody Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiResponse : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -944,6 +1024,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiResponse Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiResponse Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiResponse Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiResponse Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiResponses : Microsoft.OpenApi.Models.OpenApiExtensibleDictionary { @@ -956,6 +1040,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiSecurityScheme : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -978,6 +1066,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiServer : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -990,6 +1082,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiServer Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiServer Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiServer Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiServer Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiServerVariable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1002,6 +1098,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiServerVariable Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiServerVariable Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiServerVariable Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiServerVariable Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1019,6 +1119,10 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public static Microsoft.OpenApi.Models.OpenApiTag Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiTag Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiTag Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiTag Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiXml : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1033,6 +1137,10 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiXml Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiXml Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiXml Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiXml Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public enum OperationType { @@ -1157,9 +1265,19 @@ namespace Microsoft.OpenApi.Reader { public OpenApiJsonReader() { } public Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public T Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } public Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.Stream stream, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } public Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.TextReader input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } public Microsoft.OpenApi.Models.OpenApiDocument Read(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public T Read(System.IO.Stream input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } + public T Read(System.IO.TextReader input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } + public T Read(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } + public T Read(System.Text.Json.Nodes.JsonNode input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } public System.Threading.Tasks.Task ReadAsync(System.IO.Stream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } public System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } public System.Threading.Tasks.Task ReadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } From c5533ff70ea32ce552f0656c32bfc2dae26b3c91 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 12 Feb 2024 14:43:12 +0300 Subject: [PATCH 26/47] Code cleanup and update public API interface --- src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs | 4 ++-- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index 52ac43678..85e3aa587 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -318,9 +318,9 @@ private static void WriteOAuthFlowForV2(IOpenApiWriter writer, string flowValue, /// /// /// - public static OpenApiDiscriminator Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + public static OpenApiSecurityScheme Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); + return OpenApiModelFactory.Load(url, version, out diagnostic, settings); } /// diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 049f1a70c..2d34a2ccb 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1066,7 +1066,7 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } From 25556cdfa7971348f4a83e1f8ea4e44243c28794 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 12 Feb 2024 14:46:53 +0300 Subject: [PATCH 27/47] Adds a loader for the discriminator object --- src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs | 1 + src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs index 8f883e48a..80f0e71e4 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs @@ -39,6 +39,7 @@ public OpenApiV3VersionService(OpenApiDiagnostic diagnostic) [typeof(OpenApiCallback)] = OpenApiV3Deserializer.LoadCallback, [typeof(OpenApiComponents)] = OpenApiV3Deserializer.LoadComponents, [typeof(OpenApiContact)] = OpenApiV3Deserializer.LoadContact, + [typeof(OpenApiDiscriminator)] = OpenApiV3Deserializer.LoadDiscriminator, [typeof(OpenApiEncoding)] = OpenApiV3Deserializer.LoadEncoding, [typeof(OpenApiExample)] = OpenApiV3Deserializer.LoadExample, [typeof(OpenApiExternalDocs)] = OpenApiV3Deserializer.LoadExternalDocs, diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs index 58f3d4a85..1b977528a 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs @@ -12,6 +12,7 @@ using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Reader.ParseNodes; +using Microsoft.OpenApi.Reader.V3; namespace Microsoft.OpenApi.Reader.V31 { @@ -37,6 +38,7 @@ public OpenApiV31VersionService(OpenApiDiagnostic diagnostic) [typeof(OpenApiCallback)] = OpenApiV31Deserializer.LoadCallback, [typeof(OpenApiComponents)] = OpenApiV31Deserializer.LoadComponents, [typeof(OpenApiContact)] = OpenApiV31Deserializer.LoadContact, + [typeof(OpenApiDiscriminator)] = OpenApiV3Deserializer.LoadDiscriminator, [typeof(OpenApiEncoding)] = OpenApiV31Deserializer.LoadEncoding, [typeof(OpenApiExample)] = OpenApiV31Deserializer.LoadExample, [typeof(OpenApiExternalDocs)] = OpenApiV31Deserializer.LoadExternalDocs, From 70768e1fdc39584566a673c43b7c395de9694a66 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 12 Feb 2024 14:47:35 +0300 Subject: [PATCH 28/47] Update tests to validate the load pattern --- .../V3Tests/OpenApiCallbackTests.cs | 271 ++++++++---------- .../V3Tests/OpenApiContactTests.cs | 3 +- .../V3Tests/OpenApiDiscriminatorTests.cs | 20 +- .../V3Tests/OpenApiEncodingTests.cs | 29 +- .../V3Tests/OpenApiExampleTests.cs | 25 +- .../V3Tests/OpenApiInfoTests.cs | 47 +-- .../V3Tests/OpenApiMediaTypeTests.cs | 26 +- .../V3Tests/OpenApiOperationTests.cs | 20 +- .../V3Tests/OpenApiParameterTests.cs | 94 ++---- .../V3Tests/OpenApiResponseTests.cs | 10 +- .../V3Tests/OpenApiSecuritySchemeTests.cs | 78 +---- .../V3Tests/OpenApiXmlTests.cs | 23 +- 12 files changed, 215 insertions(+), 431 deletions(-) diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs index be1b37e3d..06380a42d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs @@ -8,9 +8,6 @@ using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; -using SharpYaml.Serialization; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -19,26 +16,16 @@ namespace Microsoft.OpenApi.Readers.Tests.V3Tests public class OpenApiCallbackTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiCallback/"; + public OpenApiCallbackTests() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } [Fact] public void ParseBasicCallbackShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicCallback.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - // convert yamlNode to Json node - var asJsonNode = yamlNode.ToJsonNode(); - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var node = new MapNode(context, asJsonNode); - // Act - var callback = OpenApiV3Deserializer.LoadCallback(node); + var callback = OpenApiCallback.Load(Path.Combine(SampleFolderPath, "basicCallback.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); @@ -80,186 +67,182 @@ public void ParseBasicCallbackShouldSucceed() [Fact] public void ParseCallbackWithReferenceShouldSucceed() { - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "callbackWithReference.yaml"))) - { - // Act - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "callbackWithReference.yaml")); - // Assert - var path = openApiDoc.Paths.First().Value; - var subscribeOperation = path.Operations[OperationType.Post]; + // Act + var openApiDoc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var diagnostic); - var callback = subscribeOperation.Callbacks["simpleHook"]; + // Assert + var path = openApiDoc.Paths.First().Value; + var subscribeOperation = path.Operations[OperationType.Post]; - diagnostic.Should().BeEquivalentTo( - new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); + var callback = subscribeOperation.Callbacks["simpleHook"]; - callback.Should().BeEquivalentTo( - new OpenApiCallback + diagnostic.Should().BeEquivalentTo( + new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); + + callback.Should().BeEquivalentTo( + new OpenApiCallback + { + PathItems = { - PathItems = - { - [RuntimeExpression.Build("$request.body#/url")]= new OpenApiPathItem { - Operations = { - [OperationType.Post] = new OpenApiOperation() + [RuntimeExpression.Build("$request.body#/url")]= new OpenApiPathItem { + Operations = { + [OperationType.Post] = new OpenApiOperation() + { + RequestBody = new OpenApiRequestBody { - RequestBody = new OpenApiRequestBody + Content = { - Content = - { - ["application/json"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Object) - } - } - }, - Responses = { - ["200"]= new OpenApiResponse + ["application/json"] = new OpenApiMediaType { - Description = "Success" + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Object) } } + }, + Responses = { + ["200"]= new OpenApiResponse + { + Description = "Success" + } } } } - }, - Reference = new OpenApiReference - { - Type = ReferenceType.Callback, - Id = "simpleHook", - HostDocument = openApiDoc } - }); - } + }, + Reference = new OpenApiReference + { + Type = ReferenceType.Callback, + Id = "simpleHook", + HostDocument = openApiDoc + } + }); } [Fact] public void ParseMultipleCallbacksWithReferenceShouldSucceed() { - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleCallbacksWithReference.yaml"))) - { - // Act - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + // Act + var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "multipleCallbacksWithReference.yaml"), out var diagnostic); - // Assert - var path = openApiDoc.Paths.First().Value; - var subscribeOperation = path.Operations[OperationType.Post]; + // Assert + var path = openApiDoc.Paths.First().Value; + var subscribeOperation = path.Operations[OperationType.Post]; - diagnostic.Should().BeEquivalentTo( - new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); + diagnostic.Should().BeEquivalentTo( + new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); - var callback1 = subscribeOperation.Callbacks["simpleHook"]; + var callback1 = subscribeOperation.Callbacks["simpleHook"]; - callback1.Should().BeEquivalentTo( - new OpenApiCallback + callback1.Should().BeEquivalentTo( + new OpenApiCallback + { + PathItems = { - PathItems = - { - [RuntimeExpression.Build("$request.body#/url")]= new OpenApiPathItem { - Operations = { - [OperationType.Post] = new OpenApiOperation() + [RuntimeExpression.Build("$request.body#/url")]= new OpenApiPathItem { + Operations = { + [OperationType.Post] = new OpenApiOperation() + { + RequestBody = new OpenApiRequestBody { - RequestBody = new OpenApiRequestBody + Content = { - Content = + ["application/json"] = new OpenApiMediaType { - ["application/json"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Object) - } - } - }, - Responses = { - ["200"]= new OpenApiResponse - { - Description = "Success" + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Object) } } + }, + Responses = { + ["200"]= new OpenApiResponse + { + Description = "Success" + } } } } - }, - Reference = new OpenApiReference - { - Type = ReferenceType.Callback, - Id = "simpleHook", - HostDocument = openApiDoc } - }); + }, + Reference = new OpenApiReference + { + Type = ReferenceType.Callback, + Id = "simpleHook", + HostDocument = openApiDoc + } + }); - var callback2 = subscribeOperation.Callbacks["callback2"]; - callback2.Should().BeEquivalentTo( - new OpenApiCallback + var callback2 = subscribeOperation.Callbacks["callback2"]; + callback2.Should().BeEquivalentTo( + new OpenApiCallback + { + PathItems = { - PathItems = - { - [RuntimeExpression.Build("/simplePath")]= new OpenApiPathItem { - Operations = { - [OperationType.Post] = new OpenApiOperation() + [RuntimeExpression.Build("/simplePath")]= new OpenApiPathItem { + Operations = { + [OperationType.Post] = new OpenApiOperation() + { + RequestBody = new OpenApiRequestBody { - RequestBody = new OpenApiRequestBody + Description = "Callback 2", + Content = { - Description = "Callback 2", - Content = + ["application/json"] = new OpenApiMediaType { - ["application/json"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder().Type(SchemaValueType.String) - } - } - }, - Responses = { - ["400"]= new OpenApiResponse - { - Description = "Callback Response" + Schema = new JsonSchemaBuilder().Type(SchemaValueType.String) } } + }, + Responses = { + ["400"]= new OpenApiResponse + { + Description = "Callback Response" + } } - }, - } + } + }, } - }); + } + }); - var callback3 = subscribeOperation.Callbacks["callback3"]; - callback3.Should().BeEquivalentTo( - new OpenApiCallback + var callback3 = subscribeOperation.Callbacks["callback3"]; + callback3.Should().BeEquivalentTo( + new OpenApiCallback + { + PathItems = { - PathItems = - { - [RuntimeExpression.Build(@"http://example.com?transactionId={$request.body#/id}&email={$request.body#/email}")] = new OpenApiPathItem { - Operations = { - [OperationType.Post] = new OpenApiOperation() + [RuntimeExpression.Build(@"http://example.com?transactionId={$request.body#/id}&email={$request.body#/email}")] = new OpenApiPathItem { + Operations = { + [OperationType.Post] = new OpenApiOperation() + { + RequestBody = new OpenApiRequestBody { - RequestBody = new OpenApiRequestBody + Content = { - Content = + ["application/xml"] = new OpenApiMediaType { - ["application/xml"] = new OpenApiMediaType - { - Schema = new JsonSchemaBuilder().Type(SchemaValueType.Object) - } + Schema = new JsonSchemaBuilder().Type(SchemaValueType.Object) } + } + }, + Responses = { + ["200"]= new OpenApiResponse + { + Description = "Success" }, - Responses = { - ["200"]= new OpenApiResponse - { - Description = "Success" - }, - ["401"]= new OpenApiResponse - { - Description = "Unauthorized" - }, - ["404"]= new OpenApiResponse - { - Description = "Not Found" - } + ["401"]= new OpenApiResponse + { + Description = "Unauthorized" + }, + ["404"]= new OpenApiResponse + { + Description = "Not Found" } } } } } - }); - } + } + }); } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs index 62992f6b9..140ca77f3 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs @@ -21,10 +21,9 @@ public void ParseStringContactFragmentShouldSucceed() "email": "support@swagger.io" } """; - var reader = new OpenApiStringReader(); // Act - var contact = reader.ReadFragment(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var contact = OpenApiContact.Parse(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic, OpenApiConstants.Json); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs index 68588f092..9e0e2e867 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs @@ -2,13 +2,9 @@ // Licensed under the MIT license. using System.IO; -using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; -using SharpYaml.Serialization; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -18,23 +14,19 @@ public class OpenApiDiscriminatorTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiDiscriminator/"; + public OpenApiDiscriminatorTests() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } + [Fact] public void ParseBasicDiscriminatorShouldSucceed() { // Arrange using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicDiscriminator.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); // Act - var discriminator = OpenApiV3Deserializer.LoadDiscriminator(node); + var discriminator = OpenApiDiscriminator.Load(stream, OpenApiConstants.Yaml, OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert discriminator.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs index e8297c59a..4bca76452 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs @@ -19,22 +19,16 @@ public class OpenApiEncodingTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiEncoding/"; + public OpenApiEncodingTests() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } + [Fact] public void ParseBasicEncodingShouldSucceed() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicEncoding.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var encoding = OpenApiV3Deserializer.LoadEncoding(node); + var encoding = OpenApiEncoding.Load(Path.Combine(SampleFolderPath, "basicEncoding.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert encoding.Should().BeEquivalentTo( @@ -48,18 +42,9 @@ public void ParseBasicEncodingShouldSucceed() public void ParseAdvancedEncodingShouldSucceed() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "advancedEncoding.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); // Act - var encoding = OpenApiV3Deserializer.LoadEncoding(node); + var encoding = OpenApiEncoding.Load(stream, OpenApiConstants.Yaml, OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert encoding.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs index 983af4868..1a69b465e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -2,15 +2,11 @@ // Licensed under the MIT license. using System.IO; -using System.Linq; using System.Text.Json.Nodes; using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; using Microsoft.OpenApi.Reader; -using SharpYaml.Serialization; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -20,21 +16,15 @@ public class OpenApiExampleTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiExample/"; + public OpenApiExampleTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ParseAdvancedExampleShouldSucceed() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "advancedExample.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - - var example = OpenApiV3Deserializer.LoadExample(node); + var example = OpenApiExample.Load(Path.Combine(SampleFolderPath, "advancedExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); var expected = new OpenApiExample { Value = new OpenApiAny(new JsonObject @@ -91,8 +81,7 @@ public void ParseAdvancedExampleShouldSucceed() [Fact] public void ParseExampleForcedStringSucceed() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "explicitString.yaml")); - new OpenApiStreamReader().Read(stream, out var diagnostic); + _ = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "explicitString.yaml"), out var diagnostic); diagnostic.Errors.Should().BeEmpty(); } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs index c9f46007f..9fc6ed96c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -3,15 +3,11 @@ using System; using System.IO; -using System.Linq; using System.Text.Json.Nodes; using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; -using SharpYaml.Serialization; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -21,23 +17,16 @@ public class OpenApiInfoTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiInfo/"; + public OpenApiInfoTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ParseAdvancedInfoShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "advancedInfo.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var openApiInfo = OpenApiV3Deserializer.LoadInfo(node); + var openApiInfo = OpenApiInfo.Load(Path.Combine(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert openApiInfo.Should().BeEquivalentTo( @@ -93,19 +82,8 @@ public void ParseAdvancedInfoShouldSucceed() [Fact] public void ParseBasicInfoShouldSucceed() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicInfo.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var openApiInfo = OpenApiV3Deserializer.LoadInfo(node); + var openApiInfo = OpenApiInfo.Load(Path.Combine(SampleFolderPath, "basicInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert openApiInfo.Should().BeEquivalentTo( @@ -133,18 +111,9 @@ public void ParseBasicInfoShouldSucceed() public void ParseMinimalInfoShouldSucceed() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "minimalInfo.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); // Act - var openApiInfo = OpenApiV3Deserializer.LoadInfo(node); + var openApiInfo = OpenApiInfo.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); // Assert openApiInfo.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index 31a0cb341..09a49723c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -6,8 +6,7 @@ using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -17,18 +16,16 @@ public class OpenApiMediaTypeTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiMediaType/"; + public OpenApiMediaTypeTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ParseMediaTypeWithExampleShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var mediaType = OpenApiV3Deserializer.LoadMediaType(node); + var mediaType = OpenApiMediaType.Load(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert mediaType.Should().BeEquivalentTo( @@ -44,15 +41,8 @@ public void ParseMediaTypeWithExampleShouldSucceed() [Fact] public void ParseMediaTypeWithExamplesShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var mediaType = OpenApiV3Deserializer.LoadMediaType(node); + var mediaType = OpenApiMediaType.Load(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert mediaType.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index 97ec533a9..42d81c714 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -6,8 +6,7 @@ using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -16,11 +15,15 @@ public class OpenApiOperationTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiOperation/"; + public OpenApiOperationTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void OperationWithSecurityRequirementShouldReferenceSecurityScheme() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "securedOperation.yaml")); - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "securedOperation.yaml"), out var diagnostic); var securityRequirement = openApiDoc.Paths["/"].Operations[OperationType.Get].Security.First(); @@ -30,15 +33,8 @@ public void OperationWithSecurityRequirementShouldReferenceSecurityScheme() [Fact] public void ParseOperationWithParameterWithNoLocationShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var operation = OpenApiV3Deserializer.LoadOperation(node); + var operation = OpenApiOperation.Load(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert operation.Should().BeEquivalentTo(new OpenApiOperation diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index 93dac5aa6..bcc14cdfb 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -6,8 +6,7 @@ using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -17,18 +16,19 @@ public class OpenApiParameterTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiParameter/"; + public OpenApiParameterTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ParsePathParameterShouldSucceed() { // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "pathParameter.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "pathParameter.yaml")); // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -45,15 +45,8 @@ public void ParsePathParameterShouldSucceed() [Fact] public void ParseQueryParameterShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "queryParameter.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "queryParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -72,15 +65,8 @@ public void ParseQueryParameterShouldSucceed() [Fact] public void ParseQueryParameterWithObjectTypeShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -99,14 +85,10 @@ public void ParseQueryParameterWithObjectTypeShouldSucceed() public void ParseQueryParameterWithObjectTypeAndContentShouldSucceed() { // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "queryParameterWithObjectTypeAndContent.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "queryParameterWithObjectTypeAndContent.yaml")); // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -137,15 +119,8 @@ public void ParseQueryParameterWithObjectTypeAndContentShouldSucceed() [Fact] public void ParseHeaderParameterShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "headerParameter.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "headerParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -168,15 +143,8 @@ public void ParseHeaderParameterShouldSucceed() [Fact] public void ParseParameterWithNullLocationShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -195,14 +163,10 @@ public void ParseParameterWithNullLocationShouldSucceed() public void ParseParameterWithNoLocationShouldSucceed() { // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoLocation.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoLocation.yaml")); // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -221,14 +185,10 @@ public void ParseParameterWithNoLocationShouldSucceed() public void ParseParameterWithUnknownLocationShouldSucceed() { // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml")); // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -246,15 +206,8 @@ public void ParseParameterWithUnknownLocationShouldSucceed() [Fact] public void ParseParameterWithExampleShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -274,15 +227,8 @@ public void ParseParameterWithExampleShouldSucceed() [Fact] public void ParseParameterWithExamplesShouldSucceed() { - // Arrange - MapNode node; - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"))) - { - node = TestHelper.CreateYamlMapNode(stream); - } - // Act - var parameter = OpenApiV3Deserializer.LoadParameter(node); + var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs index 90ec9047b..89261bff0 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs @@ -3,6 +3,8 @@ using System.IO; using System.Linq; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -12,11 +14,15 @@ public class OpenApiResponseTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiResponse/"; + public OpenApiResponseTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ResponseWithReferencedHeaderShouldReferenceComponent() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "responseWithHeaderReference.yaml")); - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "responseWithHeaderReference.yaml"), out var diagnostic); var response = openApiDoc.Components.Responses["Test"]; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs index bc1aa40fb..bc390f955 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs @@ -3,13 +3,9 @@ using System; using System.IO; -using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; -using SharpYaml.Serialization; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -18,24 +14,16 @@ namespace Microsoft.OpenApi.Readers.Tests.V3Tests public class OpenApiSecuritySchemeTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiSecurityScheme/"; + public OpenApiSecuritySchemeTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } [Fact] public void ParseHttpSecuritySchemeShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var securityScheme = OpenApiV3Deserializer.LoadSecurityScheme(node); + var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -49,20 +37,8 @@ public void ParseHttpSecuritySchemeShouldSucceed() [Fact] public void ParseApiKeySecuritySchemeShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var securityScheme = OpenApiV3Deserializer.LoadSecurityScheme(node); + var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -77,20 +53,8 @@ public void ParseApiKeySecuritySchemeShouldSucceed() [Fact] public void ParseBearerSecuritySchemeShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var securityScheme = OpenApiV3Deserializer.LoadSecurityScheme(node); + var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -105,20 +69,8 @@ public void ParseBearerSecuritySchemeShouldSucceed() [Fact] public void ParseOAuth2SecuritySchemeShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var securityScheme = OpenApiV3Deserializer.LoadSecurityScheme(node); + var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -143,20 +95,8 @@ public void ParseOAuth2SecuritySchemeShouldSucceed() [Fact] public void ParseOpenIdConnectSecuritySchemeShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var securityScheme = OpenApiV3Deserializer.LoadSecurityScheme(node); + var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs index 6ad389029..a9c703f81 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs @@ -3,13 +3,9 @@ using System; using System.IO; -using System.Linq; using FluentAssertions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; -using SharpYaml.Serialization; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -19,23 +15,16 @@ public class OpenApiXmlTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiXml/"; + public OpenApiXmlTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ParseBasicXmlShouldSucceed() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")); - var yamlStream = new YamlStream(); - yamlStream.Load(new StreamReader(stream)); - var yamlNode = yamlStream.Documents.First().RootNode; - - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic); - - var asJsonNode = yamlNode.ToJsonNode(); - var node = new MapNode(context, asJsonNode); - // Act - var xml = OpenApiV3Deserializer.LoadXml(node); + var xml = OpenApiXml.Load(Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")), "yaml", OpenApiSpecVersion.OpenApi3_0, out _); // Assert xml.Should().BeEquivalentTo( From 3724eeb2478324c270561951dea4b06d0d8b73cf Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 13 Feb 2024 15:44:25 +0300 Subject: [PATCH 29/47] Implement PR feedback --- .../OpenApiYamlReader.cs | 42 ++-------------- .../Interfaces/IOpenApiReader.cs | 11 ++--- .../Models/OpenApiModelFactory.cs | 48 ++++++------------- .../Reader/OpenApiJsonReader.cs | 44 ++--------------- .../Reader/OpenApiReaderRegistry.cs | 5 +- 5 files changed, 30 insertions(+), 120 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index 05243470f..0f02b41fa 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -31,7 +31,7 @@ public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, Ope /// public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { - var stream = GetStream(url); + var stream = GetStream(url).GetAwaiter().GetResult(); return Read(stream, out diagnostic, settings); } @@ -50,39 +50,7 @@ public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, /// public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { - Stream stream; - if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - { - try - { - stream = await _httpClient.GetStreamAsync(new Uri(url)); - } - catch (HttpRequestException ex) - { - throw new InvalidOperationException($"Could not download the file at {url}", ex); - } - } - else - { - try - { - var fileInput = new FileInfo(url); - stream = fileInput.OpenRead(); - } - catch (Exception ex) when ( - ex is - FileNotFoundException or - PathTooLongException or - DirectoryNotFoundException or - IOException or - UnauthorizedAccessException or - SecurityException or - NotSupportedException) - { - throw new InvalidOperationException($"Could not open the file at {url}", ex); - } - } - + var stream = GetStream(url).Result; return await ReadAsync(stream, settings, cancellationToken); } @@ -116,7 +84,7 @@ public T Read(string url, OpenApiReaderSettings settings = null) where T : IOpenApiElement { settings ??= new OpenApiReaderSettings(); - var stream = GetStream(url); + var stream = GetStream(url).GetAwaiter().GetResult(); return Read(stream, version, out diagnostic, settings); } @@ -165,14 +133,14 @@ public T Parse(string input, return Read(reader, version, out diagnostic, settings); } - private Stream GetStream(string url) + private async Task GetStream(string url) { Stream stream; if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { try { - stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); + stream = await _httpClient.GetStreamAsync(new Uri(url)); } catch (HttpRequestException ex) { diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs index 2288e5e0f..fc3ad7fe8 100644 --- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. using System.IO; -using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; using Microsoft.OpenApi.Models; @@ -82,10 +81,10 @@ public interface IOpenApiReader /// Reads the input string and parses it into an Open API document. /// /// - /// - /// - /// - /// + /// Stream containing OpenAPI description to parse. + /// Version of the OpenAPI specification that the fragment conforms to. + /// Returns diagnostic object containing errors detected during parsing + /// The OpenApiReader settings. /// T Parse(string input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; @@ -110,7 +109,7 @@ public interface IOpenApiReader T Read(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; /// - /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. + /// Reads the string input and parses the fragment of an OpenAPI description into an Open API Element. /// /// Url pointing to the document. /// Version of the OpenAPI specification that the fragment conforms to. diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs index 7c8fdfa31..1dc02995b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs @@ -3,8 +3,8 @@ using System; using System.IO; +using System.Linq; using System.Net.Http; -using System.Runtime; using System.Threading.Tasks; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Reader; @@ -167,16 +167,14 @@ public static T Load(TextReader input, OpenApiSpecVersion version, out OpenAp private static string GetContentType(string url) { - var response = _httpClient.GetAsync(url).GetAwaiter().GetResult(); - var contentType = response.Content.Headers.ContentType.MediaType; - if (contentType.EndsWith(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase)) - { - return OpenApiConstants.Json; - } - else if (contentType.EndsWith(OpenApiConstants.Yaml, StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrEmpty(url)) { - return OpenApiConstants.Yaml; + var response = _httpClient.GetAsync(url).GetAwaiter().GetResult(); + var mediaType = response.Content.Headers.ContentType.MediaType; + var contentType = mediaType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First(); + return contentType.Split('/').LastOrDefault(); } + return null; } @@ -185,34 +183,16 @@ private static string GetFormat(string url) if (!string.IsNullOrEmpty(url)) { if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - { - if (url.EndsWith(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase) - || GetContentType(url).Equals(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase)) - { - return OpenApiConstants.Json; - } - else if (url.EndsWith(OpenApiConstants.Yaml, StringComparison.OrdinalIgnoreCase) - || url.EndsWith(OpenApiConstants.Yml, StringComparison.OrdinalIgnoreCase) - || GetContentType(url).Equals(OpenApiConstants.Yml, StringComparison.OrdinalIgnoreCase)) - { - return OpenApiConstants.Yaml; - } + { + // URL examples ---> https://example.com/path/to/file.json, https://example.com/path/to/file.yaml + var path = new Uri(url); + var urlSuffix = path.Segments[path.Segments.Length - 1].Split('.').LastOrDefault(); + + return !string.IsNullOrEmpty(urlSuffix) ? urlSuffix : GetContentType(url); } else { - if (url.EndsWith(OpenApiConstants.Json, StringComparison.OrdinalIgnoreCase)) - { - return OpenApiConstants.Json; - } - else if (url.EndsWith(OpenApiConstants.Yaml, StringComparison.OrdinalIgnoreCase) - || url.EndsWith(OpenApiConstants.Yml, StringComparison.OrdinalIgnoreCase)) - { - return OpenApiConstants.Yaml; - } - else - { - throw new ArgumentException("Unsupported file format"); - } + return Path.GetExtension(url).Split('.').LastOrDefault(); } } return null; diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index 251af0c29..c578f5bc1 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -38,8 +38,7 @@ public class OpenApiJsonReader : IOpenApiReader /// public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { - settings ??= new OpenApiReaderSettings(); - var stream = GetStream(url); + var stream = GetStream(url).GetAwaiter().GetResult(); return Read(stream, out diagnostic, settings); } @@ -100,40 +99,7 @@ public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, /// public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { - settings ??= new OpenApiReaderSettings(); - Stream stream; - if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - { - try - { - stream = await _httpClient.GetStreamAsync(new Uri(url)); - } - catch (HttpRequestException ex) - { - throw new InvalidOperationException($"Could not download the file at {url}", ex); - } - } - else - { - try - { - var fileInput = new FileInfo(url); - stream = fileInput.OpenRead(); - } - catch (Exception ex) when ( - ex is - FileNotFoundException or - PathTooLongException or - DirectoryNotFoundException or - IOException or - UnauthorizedAccessException or - SecurityException or - NotSupportedException) - { - throw new InvalidOperationException($"Could not open the file at {url}", ex); - } - } - + var stream = await GetStream(url); return await ReadAsync(stream, settings, cancellationToken); } @@ -246,7 +212,7 @@ public T Read(string url, OpenApiReaderSettings settings = null) where T : IOpenApiElement { settings ??= new OpenApiReaderSettings(); - var stream = GetStream(url); + var stream = GetStream(url).GetAwaiter().GetResult(); return Read(stream, version, out diagnostic, settings); } @@ -453,14 +419,14 @@ private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); } - private Stream GetStream(string url) + private async Task GetStream(string url) { Stream stream; if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { try { - stream = _httpClient.GetStreamAsync(new Uri(url)).GetAwaiter().GetResult(); + stream = await _httpClient.GetStreamAsync(new Uri(url)); } catch (HttpRequestException ex) { diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs index adacf4dbe..af4554c55 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs @@ -21,10 +21,7 @@ public static class OpenApiReaderRegistry /// The reader instance. public static void RegisterReader(string format, IOpenApiReader reader) { - if (!_readers.ContainsKey(format)) - { - _readers[format] = reader; - } + _readers[format] = reader; } /// From 242428a0811e63a7fe18b23dfb3adf69bb7a3a50 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 13 Feb 2024 15:49:59 +0300 Subject: [PATCH 30/47] Return the media type without extracting the file format --- src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs index 1dc02995b..f8f6212d0 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs @@ -171,8 +171,7 @@ private static string GetContentType(string url) { var response = _httpClient.GetAsync(url).GetAwaiter().GetResult(); var mediaType = response.Content.Headers.ContentType.MediaType; - var contentType = mediaType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First(); - return contentType.Split('/').LastOrDefault(); + return mediaType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First(); } return null; @@ -188,7 +187,7 @@ private static string GetFormat(string url) var path = new Uri(url); var urlSuffix = path.Segments[path.Segments.Length - 1].Split('.').LastOrDefault(); - return !string.IsNullOrEmpty(urlSuffix) ? urlSuffix : GetContentType(url); + return !string.IsNullOrEmpty(urlSuffix) ? urlSuffix : GetContentType(url).Split('/').LastOrDefault(); } else { From 957ca8d1b1d39f52a9e03579fb653681af625e28 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 15 Feb 2024 16:53:17 +0300 Subject: [PATCH 31/47] Remove the static load methods from the models to prevent expanding the API surface; cleanup tests --- .../Models/OpenApiCallback.cs | 70 +----------------- .../Models/OpenApiComponents.cs | 68 ------------------ .../Models/OpenApiContact.cs | 68 ------------------ .../Models/OpenApiDiscriminator.cs | 68 ------------------ .../Models/OpenApiDocument.cs | 45 ++++++------ .../Models/OpenApiEncoding.cs | 68 ------------------ .../Models/OpenApiExample.cs | 68 ------------------ .../Models/OpenApiExternalDocs.cs | 68 ------------------ src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 68 ------------------ src/Microsoft.OpenApi/Models/OpenApiInfo.cs | 68 ------------------ .../Models/OpenApiLicense.cs | 68 ------------------ src/Microsoft.OpenApi/Models/OpenApiLink.cs | 68 ------------------ .../Models/OpenApiMediaType.cs | 68 ------------------ .../Models/OpenApiOAuthFlow.cs | 68 ------------------ .../Models/OpenApiOAuthFlows.cs | 68 ------------------ .../Models/OpenApiOperation.cs | 68 ------------------ .../Models/OpenApiParameter.cs | 68 ------------------ .../Models/OpenApiPathItem.cs | 68 ------------------ .../Models/OpenApiRequestBody.cs | 68 ------------------ .../Models/OpenApiResponse.cs | 68 ------------------ .../Models/OpenApiSecurityRequirement.cs | 68 ------------------ .../Models/OpenApiSecurityScheme.cs | 68 ------------------ src/Microsoft.OpenApi/Models/OpenApiServer.cs | 68 ------------------ .../Models/OpenApiServerVariable.cs | 68 ------------------ src/Microsoft.OpenApi/Models/OpenApiTag.cs | 68 ------------------ src/Microsoft.OpenApi/Models/OpenApiXml.cs | 71 ------------------- .../V3Tests/OpenApiCallbackTests.cs | 18 ++--- .../V3Tests/OpenApiContactTests.cs | 2 +- .../V3Tests/OpenApiDiscriminatorTests.cs | 2 +- .../V3Tests/OpenApiEncodingTests.cs | 8 +-- .../V3Tests/OpenApiExampleTests.cs | 6 +- .../V3Tests/OpenApiInfoTests.cs | 6 +- .../V3Tests/OpenApiMediaTypeTests.cs | 4 +- .../V3Tests/OpenApiOperationTests.cs | 8 +-- .../V3Tests/OpenApiParameterTests.cs | 20 +++--- .../V3Tests/OpenApiResponseTests.cs | 6 +- .../V3Tests/OpenApiSecuritySchemeTests.cs | 10 +-- .../V3Tests/OpenApiXmlTests.cs | 2 +- 38 files changed, 65 insertions(+), 1777 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index 04e9ab2a5..51167a81d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -188,74 +188,6 @@ public void SerializeAsV2(IOpenApiWriter writer) public void SerializeAsV2WithoutReference(IOpenApiWriter writer) { // Callback object does not exist in V2. - } - - /// - /// Parses a local file path or Url into an Open API document. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiCallback Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiCallback Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiCallback Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiCallback Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index 9e3c1b2a7..92131ff6b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -358,73 +358,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Components object does not exist in V2. } - - /// - /// Parses a local file path or Url into an Open API document. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiComponents Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiComponents Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiComponents Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiComponents Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiContact.cs b/src/Microsoft.OpenApi/Models/OpenApiContact.cs index 6f71f16ad..7fda17102 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiContact.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiContact.cs @@ -97,73 +97,5 @@ private void WriteInternal(IOpenApiWriter writer, OpenApiSpecVersion specVersion writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an Open API document. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiContact Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiContact Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiContact Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiContact Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs index c71b51211..3925491ac 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs @@ -92,73 +92,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Discriminator object does not exist in V2. } - - /// - /// Parses a local file path or Url into an Open API document. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiDiscriminator Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiDiscriminator Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiDiscriminator Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiDiscriminator Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 9709f19e5..fbdd652e9 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -8,6 +8,7 @@ using System.Security.Cryptography; using System.Text; using System.Text.Json.Nodes; +using System.Threading; using System.Threading.Tasks; using Json.Schema; using Microsoft.OpenApi.Exceptions; @@ -620,12 +621,11 @@ internal IOpenApiReferenceable ResolveReference(OpenApiReference reference, bool /// Parses a local file path or Url into an Open API document. /// /// The path to the OpenAPI file. - /// /// /// - public static OpenApiDocument Load(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + public static ReadResult Load(string url, OpenApiReaderSettings settings = null) { - return OpenApiModelFactory.Load(url, out diagnostic, settings); + return OpenApiModelFactory.Load(url, settings); } /// @@ -633,15 +633,13 @@ public static OpenApiDocument Load(string url, out OpenApiDiagnostic diagnostic, /// /// Stream containing OpenAPI description to parse. /// The OpenAPI format to use during parsing. - /// - /// + /// The OpenApi reader settings. /// - public static OpenApiDocument Load(Stream stream, + public static ReadResult Load(Stream stream, string format, - out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { - return OpenApiModelFactory.Load(stream, format, out diagnostic, settings); + return OpenApiModelFactory.Load(stream, format, settings); } /// @@ -649,24 +647,22 @@ public static OpenApiDocument Load(Stream stream, /// /// TextReader containing OpenAPI description to parse. /// The OpenAPI format to use during parsing. - /// - /// + /// The OpenApi reader settings. /// - public static OpenApiDocument Load(TextReader input, + public static ReadResult Load(TextReader input, string format, - out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) { - return OpenApiModelFactory.Load(input, format, out diagnostic, settings); + return OpenApiModelFactory.Load(input, format, settings); } /// /// Parses a local file path or Url into an Open API document. /// /// The path to the OpenAPI file. - /// + /// The OpenApi reader settings. /// - public static async Task LoadAAsync(string url, OpenApiReaderSettings settings = null) + public static async Task LoadAsync(string url, OpenApiReaderSettings settings = null) { return await OpenApiModelFactory.LoadAsync(url, settings); } @@ -676,11 +672,12 @@ public static async Task LoadAAsync(string url, OpenApiReaderSetting /// /// Stream containing OpenAPI description to parse. /// The OpenAPI format to use during parsing. - /// + /// The OpenApi reader settings. + /// Propagates information about operation cancelling. /// - public static async Task LoadAsync(Stream stream, string format, OpenApiReaderSettings settings = null) + public static async Task LoadAsync(Stream stream, string format, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) { - return await OpenApiModelFactory.LoadAsync(stream, format, settings); + return await OpenApiModelFactory.LoadAsync(stream, format, settings, cancellationToken); } /// @@ -688,7 +685,7 @@ public static async Task LoadAsync(Stream stream, string format, Ope /// /// TextReader containing OpenAPI description to parse. /// The OpenAPI format to use during parsing. - /// + /// The OpenApi reader settings. /// public static async Task LoadAsync(TextReader input, string format, OpenApiReaderSettings settings = null) { @@ -699,16 +696,14 @@ public static async Task LoadAsync(TextReader input, string format, /// Parses a string into a object. /// /// The string input. - /// /// /// /// - public static OpenApiDocument Parse(string input, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) + public static ReadResult Parse(string input, + string format = null, + OpenApiReaderSettings settings = null) { - return OpenApiModelFactory.Parse(input, out diagnostic, format, settings); + return OpenApiModelFactory.Parse(input, format, settings); } /// diff --git a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs index e2f2c6dec..79151f3f3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs @@ -129,73 +129,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // nothing here } - - /// - /// Parses a local file path or Url into an OpenApiEncoding object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiEncoding Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiEncoding object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiEncoding Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiEncoding object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiEncoding Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiEncoding Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index f1b4f62dc..c57ca3908 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -193,73 +193,5 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) // 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. } - - /// - /// Parses a local file path or Url into an OpenApiExample object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiExample Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiExample object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiExample Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiExample object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiExample Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiExample Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs index 1859690cc..e8d3b09ec 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs @@ -86,73 +86,5 @@ private void WriteInternal(IOpenApiWriter writer, OpenApiSpecVersion specVersion writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiExternalDocs object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiExternalDocs Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiExternalDocs object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiExternalDocs Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiExternalDocs object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiExternalDocs Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiExternalDocs Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index ca0cbb2e4..4c4429f69 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -306,73 +306,5 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiHeader object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiHeader Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiHeader object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiHeader Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiHeader object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiHeader Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiHeader Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs index 6b6e91478..9f9ac6fb1 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs @@ -159,73 +159,5 @@ public void SerializeAsV2(IOpenApiWriter writer) writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiInfo object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiInfo Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiInfo object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiInfo Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiInfo object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiInfo Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiInfo Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs index 2b5807992..da53b183d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs @@ -93,73 +93,5 @@ private void WriteInternal(IOpenApiWriter writer, OpenApiSpecVersion specVersion // specification extensions writer.WriteExtensions(Extensions, specVersion); } - - /// - /// Parses a local file path or Url into an OpenApiLicense object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiLicense Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiLicense object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiLicense Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiLicense object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiLicense Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiLicense Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiLink.cs b/src/Microsoft.OpenApi/Models/OpenApiLink.cs index eba68db9d..90894b709 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLink.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLink.cs @@ -200,73 +200,5 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) { // Link object does not exist in V2. } - - /// - /// Parses a local file path or Url into an OpenApiLink object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiLink Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiLink object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiLink Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiLink object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiLink Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiLink Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs index daa52f473..32df23c0c 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs @@ -122,73 +122,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Media type does not exist in V2. } - - /// - /// Parses a local file path or Url into an OpenApiMediaType object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiMediaType Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiMediaType object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiMediaType Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiMediaType object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiMediaType Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiMediaType Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs index bafeb9e73..ebf70ed2d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs @@ -109,73 +109,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // OAuthFlow object does not exist in V2. } - - /// - /// Parses a local file path or Url into an OpenApiOAuthFlow object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiOAuthFlow Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiOAuthFlow object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiOAuthFlow Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiOAuthFlow object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiOAuthFlow Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiOAuthFlow Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs index 69549f9b8..f650cd9a7 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs @@ -115,73 +115,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // OAuthFlows object does not exist in V2. } - - /// - /// Parses a local file path or Url into an OpenApiOAuthFlows object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiOAuthFlows Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiOAuthFlows object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiOAuthFlows Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiOAuthFlows object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiOAuthFlows Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiOAuthFlows Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs index 624c3ee11..9d5b181b8 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs @@ -348,73 +348,5 @@ public void SerializeAsV2(IOpenApiWriter writer) writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiOperation object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiOperation Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiOperation object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiOperation Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiOperation object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiOperation Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiOperation Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index 81e0e004b..dd78df33c 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -454,74 +454,6 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) return Style; } - - /// - /// Parses a local file path or Url into an OpenApiParameter object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiParameter Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiParameter object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiParameter Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiParameter object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiParameter Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiParameter Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } /// diff --git a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs index fd24f291a..a84b429ed 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs @@ -260,73 +260,5 @@ internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, O writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiPathItem object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiPathItem Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiPathItem object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiPathItem Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiPathItem object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiPathItem Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiPathItem Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs index 2c2f4a75f..8fb5960ee 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -225,73 +225,5 @@ internal IEnumerable ConvertToFormDataParameters() }; } } - - /// - /// Parses a local file path or Url into an OpenApiRequestBody object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiRequestBody Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiRequestBody object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiRequestBody Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiRequestBody object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiRequestBody Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiRequestBody Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index 88cab0b1c..fcb49c9e3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -252,73 +252,5 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiResponse object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiResponse Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiResponse object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiResponse Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiResponse object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiResponse Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiResponse Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs index 1d01b4eb5..675487ca4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs @@ -121,74 +121,6 @@ public void SerializeAsV2(IOpenApiWriter writer) writer.WriteEndObject(); } - /// - /// Parses a local file path or Url into an OpenApiSecurityRequirement object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiSecurityRequirement Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiSecurityRequirement object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiSecurityRequirement Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiSecurityRequirement object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiSecurityRequirement Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiSecurityRequirement Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } - /// /// Comparer for OpenApiSecurityScheme that only considers the Id in the Reference /// (i.e. the string that will actually be displayed in the written document) diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index 85e3aa587..dd7f84f4b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -309,73 +309,5 @@ private static void WriteOAuthFlowForV2(IOpenApiWriter writer, string flowValue, // scopes writer.WriteOptionalMap(OpenApiConstants.Scopes, flow.Scopes, (w, s) => w.WriteValue(s)); } - - /// - /// Parses a local file path or Url into an OpenApiSecurityScheme object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiSecurityScheme Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiSecurityScheme object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiSecurityScheme Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiSecurityScheme object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiSecurityScheme Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiSecurityScheme Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiServer.cs b/src/Microsoft.OpenApi/Models/OpenApiServer.cs index d7ed5a430..f932465e6 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServer.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServer.cs @@ -102,73 +102,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // Server object does not exist in V2. } - - /// - /// Parses a local file path or Url into an OpenApiServer object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiServer Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiServer object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiServer Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiServer object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiServer Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiServer Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs index 5fdc4260f..62b24f44e 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs @@ -98,73 +98,5 @@ public void SerializeAsV2(IOpenApiWriter writer) { // ServerVariable does not exist in V2. } - - /// - /// Parses a local file path or Url into an OpenApiServerVariable object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiServerVariable Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiServerVariable object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiServerVariable Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiServerVariable object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiServerVariable Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiServerVariable Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs index 7ee0af928..964070444 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs @@ -170,73 +170,5 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiTag object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiTag Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiTag object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiTag Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiTag object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiTag Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiTag Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiXml.cs b/src/Microsoft.OpenApi/Models/OpenApiXml.cs index b84fd4ae4..4edaf0916 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiXml.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiXml.cs @@ -115,76 +115,5 @@ private void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion) writer.WriteEndObject(); } - - /// - /// Parses a local file path or Url into an OpenApiXml object. - /// - /// The path to the OpenAPI file. - /// The OpenAPI specification version. - /// - /// - /// - public static OpenApiXml Load(string url, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(url, version, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an OpenApiXml object. - /// - /// Stream containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiXml Load(Stream stream, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(stream, version, out diagnostic, format, settings); - } - - /// - /// Reads the text reader content and parses it into an OpenApiXml object. - /// - /// TextReader containing OpenAPI description to parse. - /// The OpenAPI format to use during parsing. - /// - /// - /// - /// - public static OpenApiXml Load(TextReader input, - string format, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Load(input, version, out diagnostic, format, settings); - } - - - /// - /// Parses a string into a object. - /// - /// The string input. - /// - /// - /// - /// - /// - public static OpenApiXml Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - return OpenApiModelFactory.Parse(input, version, out diagnostic, format, settings); - } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs index 06380a42d..55c3eb64b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs @@ -25,7 +25,7 @@ public OpenApiCallbackTests() public void ParseBasicCallbackShouldSucceed() { // Act - var callback = OpenApiCallback.Load(Path.Combine(SampleFolderPath, "basicCallback.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var callback = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "basicCallback.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); @@ -70,15 +70,15 @@ public void ParseCallbackWithReferenceShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "callbackWithReference.yaml")); // Act - var openApiDoc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var diagnostic); + var result = OpenApiModelFactory.Load(stream, OpenApiConstants.Yaml); // Assert - var path = openApiDoc.Paths.First().Value; + var path = result.OpenApiDocument.Paths.First().Value; var subscribeOperation = path.Operations[OperationType.Post]; var callback = subscribeOperation.Callbacks["simpleHook"]; - diagnostic.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); callback.Should().BeEquivalentTo( @@ -114,7 +114,7 @@ public void ParseCallbackWithReferenceShouldSucceed() { Type = ReferenceType.Callback, Id = "simpleHook", - HostDocument = openApiDoc + HostDocument = result.OpenApiDocument } }); } @@ -123,13 +123,13 @@ public void ParseCallbackWithReferenceShouldSucceed() public void ParseMultipleCallbacksWithReferenceShouldSucceed() { // Act - var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "multipleCallbacksWithReference.yaml"), out var diagnostic); + var result = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "multipleCallbacksWithReference.yaml")); // Assert - var path = openApiDoc.Paths.First().Value; + var path = result.OpenApiDocument.Paths.First().Value; var subscribeOperation = path.Operations[OperationType.Post]; - diagnostic.Should().BeEquivalentTo( + result.OpenApiDocument.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); var callback1 = subscribeOperation.Callbacks["simpleHook"]; @@ -167,7 +167,7 @@ public void ParseMultipleCallbacksWithReferenceShouldSucceed() { Type = ReferenceType.Callback, Id = "simpleHook", - HostDocument = openApiDoc + HostDocument = result.OpenApiDocument } }); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs index 140ca77f3..d6d0422c4 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs @@ -23,7 +23,7 @@ public void ParseStringContactFragmentShouldSucceed() """; // Act - var contact = OpenApiContact.Parse(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic, OpenApiConstants.Json); + var contact = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic, OpenApiConstants.Json); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs index 9e0e2e867..6556ade48 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs @@ -26,7 +26,7 @@ public void ParseBasicDiscriminatorShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicDiscriminator.yaml")); // Act - var discriminator = OpenApiDiscriminator.Load(stream, OpenApiConstants.Yaml, OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var discriminator = OpenApiModelFactory.Load(stream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, out var diagnostic); // Assert discriminator.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs index 4bca76452..837b1d4f1 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs @@ -2,14 +2,10 @@ // Licensed under the MIT license. using System.IO; -using System.Linq; using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.ParseNodes; -using Microsoft.OpenApi.Reader.V3; -using SharpYaml.Serialization; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -28,7 +24,7 @@ public OpenApiEncodingTests() public void ParseBasicEncodingShouldSucceed() { // Act - var encoding = OpenApiEncoding.Load(Path.Combine(SampleFolderPath, "basicEncoding.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var encoding = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "basicEncoding.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert encoding.Should().BeEquivalentTo( @@ -44,7 +40,7 @@ public void ParseAdvancedEncodingShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "advancedEncoding.yaml")); // Act - var encoding = OpenApiEncoding.Load(stream, OpenApiConstants.Yaml, OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var encoding = OpenApiModelFactory.Load(stream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, out _); // Assert encoding.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs index 1a69b465e..d0a62062e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -24,7 +24,7 @@ public OpenApiExampleTests() [Fact] public void ParseAdvancedExampleShouldSucceed() { - var example = OpenApiExample.Load(Path.Combine(SampleFolderPath, "advancedExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var example = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "advancedExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); var expected = new OpenApiExample { Value = new OpenApiAny(new JsonObject @@ -81,8 +81,8 @@ public void ParseAdvancedExampleShouldSucceed() [Fact] public void ParseExampleForcedStringSucceed() { - _ = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "explicitString.yaml"), out var diagnostic); - diagnostic.Errors.Should().BeEmpty(); + var result= OpenApiDocument.Load(Path.Combine(SampleFolderPath, "explicitString.yaml")); + result.OpenApiDiagnostic.Errors.Should().BeEmpty(); } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs index 9fc6ed96c..2fa75cf60 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -26,7 +26,7 @@ public OpenApiInfoTests() public void ParseAdvancedInfoShouldSucceed() { // Act - var openApiInfo = OpenApiInfo.Load(Path.Combine(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var openApiInfo = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert openApiInfo.Should().BeEquivalentTo( @@ -83,7 +83,7 @@ public void ParseAdvancedInfoShouldSucceed() public void ParseBasicInfoShouldSucceed() { // Act - var openApiInfo = OpenApiInfo.Load(Path.Combine(SampleFolderPath, "basicInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var openApiInfo = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "basicInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert openApiInfo.Should().BeEquivalentTo( @@ -113,7 +113,7 @@ public void ParseMinimalInfoShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "minimalInfo.yaml")); // Act - var openApiInfo = OpenApiInfo.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); + var openApiInfo = OpenApiModelFactory.Load(stream, OpenApiSpecVersion.OpenApi3_0, "yaml", out _); // Assert openApiInfo.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index 09a49723c..37b055bb3 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -25,7 +25,7 @@ public OpenApiMediaTypeTests() public void ParseMediaTypeWithExampleShouldSucceed() { // Act - var mediaType = OpenApiMediaType.Load(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var mediaType = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert mediaType.Should().BeEquivalentTo( @@ -42,7 +42,7 @@ public void ParseMediaTypeWithExampleShouldSucceed() public void ParseMediaTypeWithExamplesShouldSucceed() { // Act - var mediaType = OpenApiMediaType.Load(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); + var mediaType = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, out var diagnostic); // Assert mediaType.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index 42d81c714..6d94ed88b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -23,18 +23,18 @@ public OpenApiOperationTests() [Fact] public void OperationWithSecurityRequirementShouldReferenceSecurityScheme() { - var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "securedOperation.yaml"), out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "securedOperation.yaml")); - var securityRequirement = openApiDoc.Paths["/"].Operations[OperationType.Get].Security.First(); + var securityRequirement = result.OpenApiDocument.Paths["/"].Operations[OperationType.Get].Security.First(); - Assert.Same(securityRequirement.Keys.First(), openApiDoc.Components.SecuritySchemes.First().Value); + Assert.Same(securityRequirement.Keys.First(), result.OpenApiDocument.Components.SecuritySchemes.First().Value); } [Fact] public void ParseOperationWithParameterWithNoLocationShouldSucceed() { // Act - var operation = OpenApiOperation.Load(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"), OpenApiSpecVersion.OpenApi3_0, out _); + var operation = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert operation.Should().BeEquivalentTo(new OpenApiOperation diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index bcc14cdfb..b87f68375 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -28,7 +28,7 @@ public void ParsePathParameterShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "pathParameter.yaml")); // Act - var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(stream, OpenApiSpecVersion.OpenApi3_0, "yaml", out _); // Assert parameter.Should().BeEquivalentTo( @@ -46,7 +46,7 @@ public void ParsePathParameterShouldSucceed() public void ParseQueryParameterShouldSucceed() { // Act - var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "queryParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "queryParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -66,7 +66,7 @@ public void ParseQueryParameterShouldSucceed() public void ParseQueryParameterWithObjectTypeShouldSucceed() { // Act - var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -88,7 +88,7 @@ public void ParseQueryParameterWithObjectTypeAndContentShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "queryParameterWithObjectTypeAndContent.yaml")); // Act - var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(stream, OpenApiSpecVersion.OpenApi3_0, "yaml", out _); // Assert parameter.Should().BeEquivalentTo( @@ -120,7 +120,7 @@ public void ParseQueryParameterWithObjectTypeAndContentShouldSucceed() public void ParseHeaderParameterShouldSucceed() { // Act - var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "headerParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "headerParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -144,7 +144,7 @@ public void ParseHeaderParameterShouldSucceed() public void ParseParameterWithNullLocationShouldSucceed() { // Act - var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -166,7 +166,7 @@ public void ParseParameterWithNoLocationShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoLocation.yaml")); // Act - var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(stream, OpenApiSpecVersion.OpenApi3_0, "yaml", out _); // Assert parameter.Should().BeEquivalentTo( @@ -188,7 +188,7 @@ public void ParseParameterWithUnknownLocationShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml")); // Act - var parameter = OpenApiParameter.Load(stream, "yaml", OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(stream, OpenApiSpecVersion.OpenApi3_0, "yaml", out _); // Assert parameter.Should().BeEquivalentTo( @@ -207,7 +207,7 @@ public void ParseParameterWithUnknownLocationShouldSucceed() public void ParseParameterWithExampleShouldSucceed() { // Act - var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( @@ -228,7 +228,7 @@ public void ParseParameterWithExampleShouldSucceed() public void ParseParameterWithExamplesShouldSucceed() { // Act - var parameter = OpenApiParameter.Load(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var parameter = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert parameter.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs index 89261bff0..c2a939ade 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs @@ -22,11 +22,11 @@ public OpenApiResponseTests() [Fact] public void ResponseWithReferencedHeaderShouldReferenceComponent() { - var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "responseWithHeaderReference.yaml"), out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "responseWithHeaderReference.yaml")); - var response = openApiDoc.Components.Responses["Test"]; + var response = result.OpenApiDocument.Components.Responses["Test"]; - Assert.Same(response.Headers.First().Value, openApiDoc.Components.Headers.First().Value); + Assert.Same(response.Headers.First().Value, result.OpenApiDocument.Components.Headers.First().Value); } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs index bc390f955..ef1aa0fdb 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs @@ -23,7 +23,7 @@ public OpenApiSecuritySchemeTests() public void ParseHttpSecuritySchemeShouldSucceed() { // Act - var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var securityScheme = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -38,7 +38,7 @@ public void ParseHttpSecuritySchemeShouldSucceed() public void ParseApiKeySecuritySchemeShouldSucceed() { // Act - var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var securityScheme = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -54,7 +54,7 @@ public void ParseApiKeySecuritySchemeShouldSucceed() public void ParseBearerSecuritySchemeShouldSucceed() { // Act - var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var securityScheme = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -70,7 +70,7 @@ public void ParseBearerSecuritySchemeShouldSucceed() public void ParseOAuth2SecuritySchemeShouldSucceed() { // Act - var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var securityScheme = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( @@ -96,7 +96,7 @@ public void ParseOAuth2SecuritySchemeShouldSucceed() public void ParseOpenIdConnectSecuritySchemeShouldSucceed() { // Act - var securityScheme = OpenApiSecurityScheme.Load(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); + var securityScheme = OpenApiModelFactory.Load(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, out _); // Assert securityScheme.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs index a9c703f81..c0d99793e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs @@ -24,7 +24,7 @@ public OpenApiXmlTests() public void ParseBasicXmlShouldSucceed() { // Act - var xml = OpenApiXml.Load(Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")), "yaml", OpenApiSpecVersion.OpenApi3_0, out _); + var xml = OpenApiModelFactory.Load(Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")), OpenApiSpecVersion.OpenApi3_0, "yaml", out _); // Assert xml.Should().BeEquivalentTo( From 575a48a0c2493393d70008b990682be114446568 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 15 Feb 2024 16:55:58 +0300 Subject: [PATCH 32/47] Update hidi to use the Load/Parse methods --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 33 ++++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 93a8645e8..95513328f 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -19,6 +19,7 @@ using System.Xml.Xsl; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Microsoft.OData.Edm.Csdl; using Microsoft.OpenApi.ApiManifest; using Microsoft.OpenApi.ApiManifest.OpenAI; @@ -86,7 +87,8 @@ public static async Task TransformOpenApiDocument(HidiOptions options, ILogger l } // Load OpenAPI document - var document = await GetOpenApi(options, logger, options.MetadataVersion, cancellationToken).ConfigureAwait(false); + var format = OpenApiModelFactory.GetFormat(options.OpenApi); + var document = await GetOpenApi(options, format, logger, options.MetadataVersion, cancellationToken).ConfigureAwait(false); if (options.FilterOptions != null) { @@ -213,7 +215,7 @@ private static void WriteOpenApi(HidiOptions options, OpenApiFormat openApiForma } // Get OpenAPI document either from OpenAPI or CSDL - private static async Task GetOpenApi(HidiOptions options, ILogger logger, string? metadataVersion = null, CancellationToken cancellationToken = default) + private static async Task GetOpenApi(HidiOptions options, string format, ILogger logger, string? metadataVersion = null, CancellationToken cancellationToken = default) { OpenApiDocument document; Stream stream; @@ -234,7 +236,7 @@ private static async Task GetOpenApi(HidiOptions options, ILogg await stream.DisposeAsync().ConfigureAwait(false); } - document = await ConvertCsdlToOpenApi(filteredStream ?? stream, metadataVersion, options.SettingsConfig, cancellationToken).ConfigureAwait(false); + document = await ConvertCsdlToOpenApi(filteredStream ?? stream, format, metadataVersion, options.SettingsConfig, cancellationToken).ConfigureAwait(false); stopwatch.Stop(); logger.LogTrace("{Timestamp}ms: Generated OpenAPI with {Paths} paths.", stopwatch.ElapsedMilliseconds, document.Paths.Count); } @@ -369,14 +371,16 @@ private static async Task ParseOpenApi(string openApiFile, bool inli { stopwatch.Start(); - result = await new OpenApiStreamReader(new() - { + var settings = new OpenApiReaderSettings + { LoadExternalRefs = inlineExternal, BaseUrl = openApiFile.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? new(openApiFile) : new Uri("file://" + new FileInfo(openApiFile).DirectoryName + Path.DirectorySeparatorChar) - } - ).ReadAsync(stream, cancellationToken).ConfigureAwait(false); + }; + + var format = OpenApiModelFactory.GetFormat(openApiFile); + result = await OpenApiDocument.LoadAsync(stream, format, settings, cancellationToken).ConfigureAwait(false); logger.LogTrace("{Timestamp}ms: Completed parsing.", stopwatch.ElapsedMilliseconds); @@ -392,7 +396,7 @@ private static async Task ParseOpenApi(string openApiFile, bool inli /// /// The CSDL stream. /// An OpenAPI document. - public static async Task ConvertCsdlToOpenApi(Stream csdl, string? metadataVersion = null, IConfiguration? settings = null, CancellationToken token = default) + public static async Task ConvertCsdlToOpenApi(Stream csdl, string format, string? metadataVersion = null, IConfiguration? settings = null, CancellationToken token = default) { using var reader = new StreamReader(csdl); var csdlText = await reader.ReadToEndAsync(token).ConfigureAwait(false); @@ -400,7 +404,7 @@ public static async Task ConvertCsdlToOpenApi(Stream csdl, stri settings ??= SettingsUtilities.GetConfiguration(); var document = edmModel.ConvertToOpenApi(SettingsUtilities.GetOpenApiConvertSettings(settings, metadataVersion)); - document = FixReferences(document); + document = FixReferences(document, format); return document; } @@ -410,14 +414,15 @@ public static async Task ConvertCsdlToOpenApi(Stream csdl, stri /// /// The converted OpenApiDocument. /// A valid OpenApiDocument instance. - public static OpenApiDocument FixReferences(OpenApiDocument document) + public static OpenApiDocument FixReferences(OpenApiDocument document, string format) { // This method is only needed because the output of ConvertToOpenApi isn't quite a valid OpenApiDocument instance. // So we write it out, and read it back in again to fix it up. var sb = new StringBuilder(); document.SerializeAsV3(new OpenApiYamlWriter(new StringWriter(sb))); - var doc = new OpenApiStringReader().Read(sb.ToString(), out _); + + var doc = OpenApiDocument.Parse(sb.ToString(), format).OpenApiDocument; return doc; } @@ -565,7 +570,8 @@ private static string GetInputPathExtension(string? openapi = null, string? csdl throw new ArgumentException("Please input a file path or URL"); } - var document = await GetOpenApi(options, logger, null, cancellationToken).ConfigureAwait(false); + var format = OpenApiModelFactory.GetFormat(options.OpenApi); + var document = await GetOpenApi(options, format, logger, null, cancellationToken).ConfigureAwait(false); using (logger.BeginScope("Creating diagram")) { @@ -726,7 +732,8 @@ internal static async Task PluginManifest(HidiOptions options, ILogger logger, C } // Load OpenAPI document - var document = await GetOpenApi(options, logger, options.MetadataVersion, cancellationToken).ConfigureAwait(false); + var format = OpenApiModelFactory.GetFormat(options.OpenApi); + var document = await GetOpenApi(options, format, logger, options.MetadataVersion, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); From 18a152ee4c9a34c70e4a0ad880b5a6ac64aa1cbd Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 15 Feb 2024 16:59:45 +0300 Subject: [PATCH 33/47] Simplifies code base by removing unnecessary code and delegating functionality that isn't reader-specific to the factory --- .../OpenApiYamlReader.cs | 185 +++------ .../Interfaces/IOpenApiReader.cs | 94 +---- .../Models/OpenApiModelFactory.cs | 200 ---------- .../Reader/OpenApiJsonReader.cs | 372 ++++-------------- .../Reader/OpenApiModelFactory.cs | 294 ++++++++++++++ 5 files changed, 428 insertions(+), 717 deletions(-) delete mode 100644 src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs create mode 100644 src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index 0f02b41fa..7cee092b4 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -1,16 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.IO; -using System.Net.Http; -using System.Security; using System.Text.Json.Nodes; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; +using SharpYaml.Serialization; +using System.Linq; namespace Microsoft.OpenApi.Readers { @@ -19,156 +18,78 @@ namespace Microsoft.OpenApi.Readers /// public class OpenApiYamlReader : IOpenApiReader { - private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); - /// - public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + public async Task ReadAsync(TextReader input, + OpenApiReaderSettings settings = null, + CancellationToken cancellationToken = default) { - using var reader = new StringReader(input); - return Read(reader, out diagnostic, settings); - } + JsonNode jsonNode; - /// - public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - var stream = GetStream(url).GetAwaiter().GetResult(); - return Read(stream, out diagnostic, settings); - } + // Parse the YAML text in the TextReader into a sequence of JsonNodes + try + { + jsonNode = LoadJsonNodesFromYamlDocument(input); + } + catch (JsonException ex) + { + var diagnostic = new OpenApiDiagnostic(); + diagnostic.Errors.Add(new($"#line={ex.LineNumber}", ex.Message)); + return new() + { + OpenApiDocument = null, + OpenApiDiagnostic = diagnostic + }; + } - /// - public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - return new OpenApiStreamReader(settings).Read(stream, out diagnostic); + return await ReadAsync(jsonNode, settings, cancellationToken); } /// - public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + public T ReadFragment(TextReader input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement { - return new OpenApiTextReaderReader(settings).Read(input, out diagnostic); - } + JsonNode jsonNode; - /// - public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) - { - var stream = GetStream(url).Result; - return await ReadAsync(stream, settings, cancellationToken); - } + // Parse the YAML + try + { + jsonNode = LoadJsonNodesFromYamlDocument(input); + } + catch (JsonException ex) + { + diagnostic = new(); + diagnostic.Errors.Add(new($"#line={ex.LineNumber}", ex.Message)); + return default; + } - /// - public async Task ReadAsync(Stream stream, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) - { - return await new OpenApiStreamReader(settings).ReadAsync(stream, cancellationToken); + return ReadFragment(jsonNode, version, out diagnostic); } - /// - public async Task ReadAsync(TextReader input, - OpenApiReaderSettings settings = null, - CancellationToken cancellationToken = default) - { - return await new OpenApiTextReaderReader(settings).ReadAsync(input, cancellationToken); - } - - /// - /// Takes in an input URL and parses it into an Open API document + /// Helper method to turn streams into a sequence of JsonNodes /// - /// The path to the Open API file - /// The OpenAPI specification version. - /// Returns diagnostic object containing errors detected during parsing. - /// The Reader settings to be used during parsing. - /// - /// - public T Read(string url, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - settings ??= new OpenApiReaderSettings(); - var stream = GetStream(url).GetAwaiter().GetResult(); - return Read(stream, version, out diagnostic, settings); - } - - /// - public T Read(Stream input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement + /// Stream containing YAML formatted text + /// Instance of a YamlDocument + static JsonNode LoadJsonNodesFromYamlDocument(TextReader input) { - return new OpenApiStreamReader(settings).ReadFragment(input, version, out diagnostic); + var yamlStream = new YamlStream(); + yamlStream.Load(input); + var yamlDocument = yamlStream.Documents.First(); + return yamlDocument.ToJsonNode(); } - /// - public T Read(TextReader input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement + /// + public async Task ReadAsync(JsonNode jsonNode, OpenApiReaderSettings settings, CancellationToken cancellationToken = default) { - return new OpenApiTextReaderReader(settings).ReadFragment(input, version, out diagnostic); + return await OpenApiReaderRegistry.DefaultReader.ReadAsync(jsonNode, settings, cancellationToken); } /// - public T Read(JsonNode input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement + public T ReadFragment(JsonNode input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement { - return new OpenApiYamlDocumentReader(settings).ReadFragment(input, version, out diagnostic); + return OpenApiReaderRegistry.DefaultReader.ReadFragment(input, version, out diagnostic); } - - /// - /// Parses an input string into an Open API document. - /// - /// - /// - /// - /// - /// - public T Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - settings ??= new OpenApiReaderSettings(); - using var reader = new StringReader(input); - return Read(reader, version, out diagnostic, settings); - } - - private async Task GetStream(string url) - { - Stream stream; - if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - { - try - { - stream = await _httpClient.GetStreamAsync(new Uri(url)); - } - catch (HttpRequestException ex) - { - throw new InvalidOperationException($"Could not download the file at {url}", ex); - } - } - else - { - try - { - var fileInput = new FileInfo(url); - stream = fileInput.OpenRead(); - } - catch (Exception ex) when ( - ex is - FileNotFoundException or - PathTooLongException or - DirectoryNotFoundException or - IOException or - UnauthorizedAccessException or - SecurityException or - NotSupportedException) - { - throw new InvalidOperationException($"Could not open the file at {url}", ex); - } - } - - return stream; - } } } diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs index fc3ad7fe8..956a00267 100644 --- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs @@ -2,9 +2,9 @@ // Licensed under the MIT license. using System.IO; +using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; -using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; namespace Microsoft.OpenApi.Interfaces @@ -14,51 +14,6 @@ namespace Microsoft.OpenApi.Interfaces /// public interface IOpenApiReader { - /// - /// Reads the input URL and parses it into an Open API document. - /// - /// The input to read from. - /// The diagnostic entity containing information from the reading process. - /// The OpenApi reader settings. - /// - OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); - - /// - /// Reads the input stream and parses it into an Open API document. - /// - /// The input stream. - /// The diagnostic entity containing information from the reading process. - /// The OpenApi reader settings. - /// - OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); - - /// - /// Reads the TextReader input and parses it into an Open API document. - /// - /// The TextReader input. - /// The diagnostic entity containing information from the reading process. - /// The OpenApi reader settings. - /// - OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); - - /// - /// Reads the input URL and parses it into an Open API document. - /// - /// The input URL. - /// The OpenApi reader settings. - /// Propagates notification that an operation should be cancelled. - /// - Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default); - - /// - /// Reads the input stream and parses it into an Open API document. - /// - /// The input stream. - /// The OpenApi reader settings. - /// Propagates notification that an operation should be cancelled. - /// - Task ReadAsync(Stream stream, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default); - /// /// Reads the TextReader input and parses it into an Open API document. /// @@ -69,53 +24,32 @@ public interface IOpenApiReader Task ReadAsync(TextReader input, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default); /// - /// Reads the input string and parses it into an Open API document. + /// Parses the JsonNode input into an Open API document. /// - /// The input string. - /// The diagnostic entity containing information from the reading process. - /// The OpenApi reader settings. + /// The JsonNode input. + /// The Reader settings to be used during parsing. + /// Propagates notifications that operations should be cancelled. /// - OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null); - - /// - /// Reads the input string and parses it into an Open API document. - /// - /// - /// Stream containing OpenAPI description to parse. - /// Version of the OpenAPI specification that the fragment conforms to. - /// Returns diagnostic object containing errors detected during parsing - /// The OpenApiReader settings. - /// - T Parse(string input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; - - /// - /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. - /// - /// Stream containing OpenAPI description to parse. - /// Version of the OpenAPI specification that the fragment conforms to. - /// Returns diagnostic object containing errors detected during parsing - /// The OpenApiReader settings. - /// Instance of newly created OpenApiDocument - T Read(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; + Task ReadAsync(JsonNode jsonNode, OpenApiReaderSettings settings, CancellationToken cancellationToken = default); /// /// Reads the TextReader input and parses the fragment of an OpenAPI description into an Open API Element. /// /// TextReader containing OpenAPI description to parse. /// Version of the OpenAPI specification that the fragment conforms to. - /// Returns diagnostic object containing errors detected during parsing + /// Returns diagnostic object containing errors detected during parsing. /// The OpenApiReader settings. - /// Instance of newly created OpenApiDocument - T Read(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; + /// Instance of newly created IOpenApiElement. + T ReadFragment(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; /// - /// Reads the string input and parses the fragment of an OpenAPI description into an Open API Element. + /// Reads the JsonNode input and parses the fragment of an OpenAPI description into an Open API Element. /// - /// Url pointing to the document. + /// TextReader containing OpenAPI description to parse. /// Version of the OpenAPI specification that the fragment conforms to. - /// Returns diagnostic object containing errors detected during parsing + /// Returns diagnostic object containing errors detected during parsing. /// The OpenApiReader settings. - /// Instance of newly created OpenApiDocument - T Read(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; + /// Instance of newly created IOpenApiElement. + T ReadFragment(JsonNode input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement; } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs deleted file mode 100644 index f8f6212d0..000000000 --- a/src/Microsoft.OpenApi/Models/OpenApiModelFactory.cs +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; - -namespace Microsoft.OpenApi.Models -{ - internal static class OpenApiModelFactory - { - private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); - - static OpenApiModelFactory() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Json, new OpenApiJsonReader()); - } - - /// - /// Loads the input URL and parses it into an Open API document. - /// - /// The input to read from. - /// The diagnostic entity containing information from the reading process. - /// The OpenApi reader settings. - /// An OpenAPI document instance. - public static OpenApiDocument Load(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - var format = GetFormat(url); - return OpenApiReaderRegistry.GetReader(format).Read(url, out diagnostic, settings); - } - - /// - /// Loads the input stream and parses it into an Open API document. - /// - /// The input stream. - /// The diagnostic entity containing information from the reading process. - /// The OpenApi reader settings. - /// The OpenAPI format. - /// An OpenAPI document instance. - public static OpenApiDocument Load(Stream stream, - string format, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - Utils.CheckArgumentNull(format, nameof(format)); - var reader = OpenApiReaderRegistry.GetReader(format); - return reader.Read(stream, out diagnostic, settings); - } - - /// - /// Loads the TextReader input and parses it into an Open API document. - /// - /// The TextReader input. - /// The diagnostic entity containing information from the reading process. - /// The OpenApi reader settings. - /// The Open API format - /// An OpenAPI document instance. - public static OpenApiDocument Load(TextReader input, - string format, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) - { - Utils.CheckArgumentNull(format, nameof(format)); - var reader = OpenApiReaderRegistry.GetReader(format); - return reader.Read(input, out diagnostic, settings); - } - - /// - /// Loads the input stream and parses it into an Open API document. - /// - /// The input stream. - /// The OpenApi reader settings. - /// The Open API format - /// - public static async Task LoadAsync(Stream stream, string format, OpenApiReaderSettings settings = null) - { - Utils.CheckArgumentNull(format, nameof(format)); - var reader = OpenApiReaderRegistry.GetReader(format); - return await reader.ReadAsync(stream, settings); - } - - /// - /// Loads the TextReader input and parses it into an Open API document. - /// - /// The TextReader input. - /// The Open API format - /// The OpenApi reader settings. - /// - public static async Task LoadAsync(TextReader input, string format, OpenApiReaderSettings settings = null) - { - Utils.CheckArgumentNull(format, nameof(format)); - var reader = OpenApiReaderRegistry.GetReader(format); - return await reader.ReadAsync(input, settings); - } - - /// - /// Loads the input URL and parses it into an Open API document. - /// - /// The input URL. - /// The OpenApi reader settings. - /// - public static async Task LoadAsync(string url, OpenApiReaderSettings settings = null) - { - var format = GetFormat(url); - var reader = OpenApiReaderRegistry.GetReader(format); - return await reader.ReadAsync(url, settings); - } - - /// - /// Reads the input string and parses it into an Open API document. - /// - /// The input string. - /// The diagnostic entity containing information from the reading process. - /// The Open API format - /// The OpenApi reader settings. - /// An OpenAPI document instance. - public static OpenApiDocument Parse(string input, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) - { - format ??= OpenApiConstants.Json; - return OpenApiReaderRegistry.GetReader(format).Parse(input, out diagnostic, settings); - } - - /// - /// Reads the input string and parses it into an Open API document. - /// - /// The input string. - /// - /// The diagnostic entity containing information from the reading process. - /// The Open API format - /// The OpenApi reader settings. - /// An OpenAPI document instance. - public static T Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - string format = null, - OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - format ??= OpenApiConstants.Json; - return OpenApiReaderRegistry.GetReader(format).Parse(input, version, out diagnostic, settings); - } - - public static T Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - var format = GetFormat(url); - return OpenApiReaderRegistry.GetReader(format).Read(url, version, out diagnostic, settings); - } - - public static T Load(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, string format, OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - format ??= OpenApiConstants.Json; - return OpenApiReaderRegistry.GetReader(format).Read(input, version, out diagnostic, settings); - } - - public static T Load(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, string format, OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - format ??= OpenApiConstants.Json; - return OpenApiReaderRegistry.GetReader(format).Read(input, version, out diagnostic, settings); - } - - - private static string GetContentType(string url) - { - if (!string.IsNullOrEmpty(url)) - { - var response = _httpClient.GetAsync(url).GetAwaiter().GetResult(); - var mediaType = response.Content.Headers.ContentType.MediaType; - return mediaType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First(); - } - - return null; - } - - private static string GetFormat(string url) - { - if (!string.IsNullOrEmpty(url)) - { - if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - { - // URL examples ---> https://example.com/path/to/file.json, https://example.com/path/to/file.yaml - var path = new Uri(url); - var urlSuffix = path.Segments[path.Segments.Length - 1].Split('.').LastOrDefault(); - - return !string.IsNullOrEmpty(urlSuffix) ? urlSuffix : GetContentType(url).Split('/').LastOrDefault(); - } - else - { - return Path.GetExtension(url).Split('.').LastOrDefault(); - } - } - return null; - } - } -} diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index c578f5bc1..06f21861c 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -12,12 +12,10 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Validations; using System.Linq; -using System.Net.Http; using System.Collections.Generic; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Reader.Services; -using System.Security; namespace Microsoft.OpenApi.Reader { @@ -26,118 +24,12 @@ namespace Microsoft.OpenApi.Reader /// public class OpenApiJsonReader : IOpenApiReader { - private static readonly HttpClient _httpClient = HttpClientFactory.GetHttpClient(); - - /// - /// Takes in an input URL and parses it into an Open API document - /// - /// The path to the Open API file - /// Returns diagnostic object containing errors detected during parsing. - /// The Reader settings to be used during parsing. - /// - /// - public OpenApiDocument Read(string url, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - var stream = GetStream(url).GetAwaiter().GetResult(); - return Read(stream, out diagnostic, settings); - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// The input stream. - /// Returns diagnostic object containing errors detected during parsing. - /// The Reader settings to be used during parsing. - /// - public OpenApiDocument Read(Stream stream, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - settings ??= new OpenApiReaderSettings(); - var reader = new StreamReader(stream); - var result = Read(reader, out diagnostic, settings); - if (!settings.LeaveStreamOpen) - { - reader.Dispose(); - } - - return result; - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// Returns diagnostic object containing errors detected during parsing. - /// The Reader settings to be used during parsing. - /// - public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) - { - JsonNode jsonNode; - settings ??= new OpenApiReaderSettings(); - - // Parse the JSON text in the TextReader into Json Nodes - try - { - jsonNode = LoadJsonNodesFromJsonDocument(input); - } - catch (JsonException ex) - { - diagnostic = new OpenApiDiagnostic(); - diagnostic.Errors.Add(new OpenApiError($"#line={ex.LineNumber}", $"Please provide the correct format, {ex.Message}")); - return new OpenApiDocument(); - } - - return Read(jsonNode, out diagnostic, settings); - } - - /// - /// Takes in an input URL and parses it into an Open API document. - /// - /// The path to the Open API file - /// The Reader settings to be used during parsing. - /// - /// - /// - public async Task ReadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) - { - var stream = await GetStream(url); - return await ReadAsync(stream, settings, cancellationToken); - } - - /// - /// Reads the input stream and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// The Reader settings to be used during parsing. - /// - /// - public async Task ReadAsync(Stream input, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) - { - settings ??= new OpenApiReaderSettings(); - - MemoryStream bufferedStream; - if (input is MemoryStream stream) - { - bufferedStream = stream; - } - else - { - // Buffer stream so that OpenApiTextReaderReader can process it synchronously - // YamlDocument doesn't support async reading. - bufferedStream = new MemoryStream(); - await input.CopyToAsync(bufferedStream, 81920, cancellationToken); - bufferedStream.Position = 0; - } - - using var reader = new StreamReader(bufferedStream); - return await ReadAsync(reader, settings, cancellationToken); - } - /// /// Reads the stream input and parses it into an Open API document. /// /// TextReader containing OpenAPI description to parse. /// The Reader settings to be used during parsing. - /// + /// Propagates notifications that operations should be cancelled. /// public async Task ReadAsync(TextReader input, OpenApiReaderSettings settings = null, @@ -147,10 +39,10 @@ public async Task ReadAsync(TextReader input, var diagnostic = new OpenApiDiagnostic(); settings ??= new OpenApiReaderSettings(); - // Parse the YAML/JSON text in the TextReader into the YamlDocument + // Parse the JSON text in the TextReader into JsonNodes try { - jsonNode = LoadJsonNodesFromJsonDocument(input); + jsonNode = LoadJsonNodes(input); } catch (JsonException ex) { @@ -166,78 +58,80 @@ public async Task ReadAsync(TextReader input, } /// - /// Parses an input string into an Open API document. + /// Parses the JsonNode input into an Open API document. /// - /// - /// - /// + /// The JsonNode input. + /// The Reader settings to be used during parsing. + /// Propagates notifications that operations should be cancelled. /// - public OpenApiDocument Parse(string input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) + public async Task ReadAsync(JsonNode jsonNode, + OpenApiReaderSettings settings, + CancellationToken cancellationToken = default) { - settings ??= new OpenApiReaderSettings(); - using var reader = new StringReader(input); - return Read(reader, out diagnostic, settings); - } + var diagnostic = new OpenApiDiagnostic(); + var context = new ParsingContext(diagnostic) + { + ExtensionParsers = settings.ExtensionParsers, + BaseUrl = settings.BaseUrl + }; - /// - /// Parses an input string into an Open API document. - /// - /// - /// - /// - /// - /// - public T Parse(string input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - settings ??= new OpenApiReaderSettings(); - using var reader = new StringReader(input); - return Read(reader, version, out diagnostic, settings); - } + OpenApiDocument document = null; + try + { + // Parse the OpenAPI Document + document = context.Parse(jsonNode); - /// - /// Takes in an input URL and parses it into an Open API document - /// - /// The path to the Open API file - /// The OpenAPI specification version. - /// Returns diagnostic object containing errors detected during parsing. - /// The Reader settings to be used during parsing. - /// - /// - public T Read(string url, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - settings ??= new OpenApiReaderSettings(); - var stream = GetStream(url).GetAwaiter().GetResult(); - return Read(stream, version, out diagnostic, settings); - } + if (settings.LoadExternalRefs) + { + var diagnosticExternalRefs = await LoadExternalRefs(document, cancellationToken, settings); + // Merge diagnostics of external reference + if (diagnosticExternalRefs != null) + { + diagnostic.Errors.AddRange(diagnosticExternalRefs.Errors); + diagnostic.Warnings.AddRange(diagnosticExternalRefs.Warnings); + } + } - /// - public T Read(Stream input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement - { - using var reader = new StreamReader(input); - return Read(reader, version, out diagnostic); + ResolveReferences(diagnostic, document, settings); + } + catch (OpenApiException ex) + { + diagnostic.Errors.Add(new(ex)); + } + + // Validate the document + if (settings.RuleSet != null && settings.RuleSet.Rules.Any()) + { + var openApiErrors = document.Validate(settings.RuleSet); + foreach (var item in openApiErrors.OfType()) + { + diagnostic.Errors.Add(item); + } + foreach (var item in openApiErrors.OfType()) + { + diagnostic.Warnings.Add(item); + } + } + + return new() + { + OpenApiDocument = document, + OpenApiDiagnostic = diagnostic + }; } /// - public T Read(TextReader input, - OpenApiSpecVersion version, - out OpenApiDiagnostic diagnostic, - OpenApiReaderSettings settings = null) where T : IOpenApiElement + public T ReadFragment(TextReader input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + OpenApiReaderSettings settings = null) where T : IOpenApiElement { JsonNode jsonNode; // Parse the JSON try { - jsonNode = LoadJsonNodesFromJsonDocument(input); + jsonNode = LoadJsonNodes(input); } catch (JsonException ex) { @@ -246,11 +140,11 @@ public T Read(TextReader input, return default; } - return Read(jsonNode, version, out diagnostic); + return ReadFragment(jsonNode, version, out diagnostic); } /// - public T Read(JsonNode input, + public T ReadFragment(JsonNode input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement @@ -286,106 +180,12 @@ public T Read(JsonNode input, return (T)element; } - private JsonNode LoadJsonNodesFromJsonDocument(TextReader input) + private JsonNode LoadJsonNodes(TextReader input) { var nodes = JsonNode.Parse(input.ReadToEnd()); return nodes; } - private OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings) - { - diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic) - { - ExtensionParsers = settings.ExtensionParsers, - BaseUrl = settings.BaseUrl - }; - - OpenApiDocument document = null; - try - { - // Parse the OpenAPI Document - document = context.Parse(input); - - if (settings.LoadExternalRefs) - { - throw new InvalidOperationException("Cannot load external refs using the synchronous Read, use ReadAsync instead."); - } - - ResolveReferences(diagnostic, document, settings); - } - catch (OpenApiException ex) - { - diagnostic.Errors.Add(new OpenApiError(ex)); - } - - // Validate the document - if (settings.RuleSet != null && settings.RuleSet.Rules.Count() > 0) - { - var openApiErrors = document.Validate(settings.RuleSet); - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Errors.Add(item); - } - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Warnings.Add(item); - } - } - - return document; - } - - private async Task ReadAsync(JsonNode jsonNode, - OpenApiReaderSettings settings, - CancellationToken cancellationToken = default) - { - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic) - { - ExtensionParsers = settings.ExtensionParsers, - BaseUrl = settings.BaseUrl - }; - - OpenApiDocument document = null; - try - { - // Parse the OpenAPI Document - document = context.Parse(jsonNode); - - if (settings.LoadExternalRefs) - { - await LoadExternalRefs(document, cancellationToken, settings); - } - - ResolveReferences(diagnostic, document, settings); - } - catch (OpenApiException ex) - { - diagnostic.Errors.Add(new OpenApiError(ex)); - } - - // Validate the document - if (settings.RuleSet != null && settings.RuleSet.Rules.Count() > 0) - { - var openApiErrors = document.Validate(settings.RuleSet); - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Errors.Add(item); - } - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Warnings.Add(item); - } - } - - return new ReadResult() - { - OpenApiDocument = document, - OpenApiDiagnostic = diagnostic - }; - } - private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument document, OpenApiReaderSettings settings) { List errors = new(); @@ -408,7 +208,7 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc } } - private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken, OpenApiReaderSettings settings) + private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken, OpenApiReaderSettings settings) { // Create workspace for all documents to live in. var openApiWorkSpace = new OpenApiWorkspace(); @@ -416,45 +216,7 @@ private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken // Load this root document into the workspace var streamLoader = new DefaultStreamLoader(settings.BaseUrl); var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); - await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); + return await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); } - - private async Task GetStream(string url) - { - Stream stream; - if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - { - try - { - stream = await _httpClient.GetStreamAsync(new Uri(url)); - } - catch (HttpRequestException ex) - { - throw new InvalidOperationException($"Could not download the file at {url}", ex); - } - } - else - { - try - { - var fileInput = new FileInfo(url); - stream = fileInput.OpenRead(); - } - catch (Exception ex) when ( - ex is - FileNotFoundException or - PathTooLongException or - DirectoryNotFoundException or - IOException or - UnauthorizedAccessException or - SecurityException or - NotSupportedException) - { - throw new InvalidOperationException($"Could not open the file at {url}", ex); - } - } - - return stream; - } } } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs new file mode 100644 index 000000000..a8d4ad34f --- /dev/null +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -0,0 +1,294 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Security; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; + +namespace Microsoft.OpenApi.Reader +{ + /// + /// A factory class for loading OpenAPI models from various sources. + /// + public static class OpenApiModelFactory + { + private static readonly HttpClient _httpClient = new(); + + static OpenApiModelFactory() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Json, new OpenApiJsonReader()); + } + + /// + /// Loads the input URL and parses it into an Open API document. + /// + /// The path to the OpenAPI file. + /// The OpenApi reader settings. + /// An OpenAPI document instance. + public static ReadResult Load(string url, OpenApiReaderSettings settings = null) + { + return LoadAsync(url, settings).GetAwaiter().GetResult(); + } + + /// + /// Loads the input stream and parses it into an Open API document. + /// + /// The input stream. + /// The OpenApi reader settings. + /// The OpenAPI format. + /// An OpenAPI document instance. + public static ReadResult Load(Stream stream, + string format, + OpenApiReaderSettings settings = null) + { + return LoadAsync(stream, format, settings).GetAwaiter().GetResult(); + } + + /// + /// Loads the TextReader input and parses it into an Open API document. + /// + /// The TextReader input. + /// The OpenApi reader settings. + /// The Open API format + /// An OpenAPI document instance. + public static ReadResult Load(TextReader input, + string format, + OpenApiReaderSettings settings = null) + { + return LoadAsync(input, format, settings).GetAwaiter().GetResult(); + } + + /// + /// Loads the input URL and parses it into an Open API document. + /// + /// The path to the OpenAPI file + /// The OpenApi reader settings. + /// + public static async Task LoadAsync(string url, OpenApiReaderSettings settings = null) + { + var format = GetFormat(url); + var stream = await GetStream(url); + return await LoadAsync(stream, format, settings); + } + + /// + /// Loads the input stream and parses it into an Open API document. + /// + /// The input stream. + /// The OpenApi reader settings. + /// Propagates notification that operations should be cancelled. + /// The Open API format + /// + public static async Task LoadAsync(Stream input, string format, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) + { + Utils.CheckArgumentNull(format, nameof(format)); + settings ??= new OpenApiReaderSettings(); + + MemoryStream bufferedStream; + if (input is MemoryStream stream) + { + bufferedStream = stream; + } + else + { + // Buffer stream so that OpenApiTextReaderReader can process it synchronously + // YamlDocument doesn't support async reading. + bufferedStream = new MemoryStream(); + await input.CopyToAsync(bufferedStream, 81920, cancellationToken); + bufferedStream.Position = 0; + } + + using var reader = new StreamReader(bufferedStream); + return await LoadAsync(reader, format, settings, cancellationToken); + } + + /// + /// Loads the TextReader input and parses it into an Open API document. + /// + /// The TextReader input. + /// The Open API format + /// The OpenApi reader settings. + /// Propagates notification that operations should be cancelled. + /// + public static async Task LoadAsync(TextReader input, string format, OpenApiReaderSettings settings = null, CancellationToken cancellationToken = default) + { + Utils.CheckArgumentNull(format, nameof(format)); + var reader = OpenApiReaderRegistry.GetReader(format); + return await reader.ReadAsync(input, settings, cancellationToken); + } + + /// + /// Reads the input string and parses it into an Open API document. + /// + /// The input string. + /// The Open API format + /// The OpenApi reader settings. + /// An OpenAPI document instance. + public static ReadResult Parse(string input, + string format = null, + OpenApiReaderSettings settings = null) + { + format ??= OpenApiConstants.Json; + settings ??= new OpenApiReaderSettings(); + using var reader = new StringReader(input); + return LoadAsync(reader, format, settings).GetAwaiter().GetResult(); + } + + /// + /// Reads the input string and parses it into an Open API document. + /// + /// The input string. + /// + /// The diagnostic entity containing information from the reading process. + /// The Open API format + /// The OpenApi reader settings. + /// An OpenAPI document instance. + public static T Parse(string input, + OpenApiSpecVersion version, + out OpenApiDiagnostic diagnostic, + string format = null, + OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + format ??= OpenApiConstants.Json; + settings ??= new OpenApiReaderSettings(); + using var reader = new StringReader(input); + return Load(reader, version, out diagnostic, format, settings); + } + + /// + /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. + /// + /// + /// The path to the OpenAPI file + /// Version of the OpenAPI specification that the fragment conforms to. + /// Returns diagnostic object containing errors detected during parsing. + /// The OpenApiReader settings. + /// Instance of newly created IOpenApiElement. + /// The OpenAPI element. + public static T Load(string url, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + var format = GetFormat(url); + settings ??= new OpenApiReaderSettings(); + var stream = GetStream(url).GetAwaiter().GetResult(); + return Load(stream, version, format, out diagnostic, settings); + } + + /// + /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. + /// + /// + /// Stream containing OpenAPI description to parse. + /// Version of the OpenAPI specification that the fragment conforms to. + /// + /// Returns diagnostic object containing errors detected during parsing. + /// The OpenApiReader settings. + /// Instance of newly created IOpenApiElement. + /// The OpenAPI element. + public static T Load(Stream input, OpenApiSpecVersion version, string format, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + format ??= OpenApiConstants.Json; + using var reader = new StreamReader(input); + return Load(reader, version, out diagnostic, format, settings); + } + + /// + /// Reads the TextReader input and parses the fragment of an OpenAPI description into an Open API Element. + /// + /// + /// TextReader containing OpenAPI description to parse. + /// Version of the OpenAPI specification that the fragment conforms to. + /// The OpenAPI format. + /// Returns diagnostic object containing errors detected during parsing. + /// The OpenApiReader settings. + /// Instance of newly created IOpenApiElement. + /// The OpenAPI element. + public static T Load(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, string format, OpenApiReaderSettings settings = null) where T : IOpenApiElement + { + format ??= OpenApiConstants.Json; + return OpenApiReaderRegistry.GetReader(format).ReadFragment(input, version, out diagnostic, settings); + } + + + private static string GetContentType(string url) + { + if (!string.IsNullOrEmpty(url)) + { + var response = _httpClient.GetAsync(url).GetAwaiter().GetResult(); + var mediaType = response.Content.Headers.ContentType.MediaType; + return mediaType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First(); + } + + return null; + } + + /// + /// Infers the OpenAPI format from the input URL. + /// + /// The input URL. + /// The OpenAPI format. + public static string GetFormat(string url) + { + if (!string.IsNullOrEmpty(url)) + { + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + // URL examples ---> https://example.com/path/to/file.json, https://example.com/path/to/file.yaml + var path = new Uri(url); + var urlSuffix = path.Segments[path.Segments.Length - 1].Split('.').LastOrDefault(); + + return !string.IsNullOrEmpty(urlSuffix) ? urlSuffix : GetContentType(url).Split('/').LastOrDefault(); + } + else + { + return Path.GetExtension(url).Split('.').LastOrDefault(); + } + } + return null; + } + + private static async Task GetStream(string url) + { + Stream stream; + if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + try + { + stream = await _httpClient.GetStreamAsync(new Uri(url)); + } + catch (HttpRequestException ex) + { + throw new InvalidOperationException($"Could not download the file at {url}", ex); + } + } + else + { + try + { + var fileInput = new FileInfo(url); + stream = fileInput.OpenRead(); + } + catch (Exception ex) when ( + ex is + FileNotFoundException or + PathTooLongException or + DirectoryNotFoundException or + IOException or + UnauthorizedAccessException or + SecurityException or + NotSupportedException) + { + throw new InvalidOperationException($"Could not open the file at {url}", ex); + } + } + + return stream; + } + + } +} From 480310e2fcfcb0e0edbf237c22c6b200993a2911 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 15 Feb 2024 17:02:28 +0300 Subject: [PATCH 34/47] Set the JsonReader as the default reader and use it in the YamlReader to reuse the ReadAsync() methods --- src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs index af4554c55..6605c12f7 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs @@ -14,6 +14,11 @@ public static class OpenApiReaderRegistry { private static readonly Dictionary _readers = new(StringComparer.OrdinalIgnoreCase); + /// + /// Defines a default OpenAPI reader. + /// + public static readonly IOpenApiReader DefaultReader = new OpenApiJsonReader(); + /// /// Registers an IOpenApiReader for a given OpenAPI format. /// From 782b2ec5f822472981dac5a7c9eabb21c2376631 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 15 Feb 2024 17:04:57 +0300 Subject: [PATCH 35/47] Remove depracated files --- .../OpenApiStreamReader.cs | 94 -------- .../OpenApiStringReader.cs | 46 ---- .../OpenApiTextReaderReader.cs | 128 ----------- .../OpenApiYamlDocumentReader.cs | 215 ------------------ .../OpenApiRemoteReferenceCollector.cs | 50 ---- .../Services/OpenApiWorkspaceLoader.cs | 66 ------ .../Reader/HttpClientFactory.cs | 29 --- 7 files changed, 628 deletions(-) delete mode 100644 src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs delete mode 100644 src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs delete mode 100644 src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs delete mode 100644 src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs delete mode 100644 src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs delete mode 100644 src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs delete mode 100644 src/Microsoft.OpenApi/Reader/HttpClientFactory.cs diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs deleted file mode 100644 index 9aabd9138..000000000 --- a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.Interface; - -namespace Microsoft.OpenApi.Readers -{ - /// - /// Service class for converting streams into OpenApiDocument instances - /// - public class OpenApiStreamReader : IOpenApiReader - { - private readonly OpenApiReaderSettings _settings; - - /// - /// Create stream reader with custom settings if desired. - /// - /// - public OpenApiStreamReader(OpenApiReaderSettings settings = null) - { - _settings = settings ?? new OpenApiReaderSettings(); - - if ((_settings.ReferenceResolution == ReferenceResolutionSetting.ResolveAllReferences || _settings.LoadExternalRefs) - && _settings.BaseUrl == null) - { - throw new ArgumentException("BaseUrl must be provided to resolve external references."); - } - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// Stream containing OpenAPI description to parse. - /// Returns diagnostic object containing errors detected during parsing. - /// Instance of newly created OpenApiDocument. - public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic) - { - var reader = new StreamReader(input); - var result = new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); - if (!_settings.LeaveStreamOpen) - { - reader.Dispose(); - } - - return result; - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// Stream containing OpenAPI description to parse. - /// Cancellation token. - /// Instance result containing newly created OpenApiDocument and diagnostics object from the process - public async Task ReadAsync(Stream input, CancellationToken cancellationToken = default) - { - MemoryStream bufferedStream; - if (input is MemoryStream stream) - { - bufferedStream = stream; - } - else - { - // Buffer stream so that OpenApiTextReaderReader can process it synchronously - // YamlDocument doesn't support async reading. - bufferedStream = new(); - await input.CopyToAsync(bufferedStream, 81920, cancellationToken); - bufferedStream.Position = 0; - } - - using var reader = new StreamReader(bufferedStream); - return await new OpenApiTextReaderReader(_settings).ReadAsync(reader, cancellationToken); - } - - /// - /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. - /// - /// Stream containing OpenAPI description to parse. - /// Version of the OpenAPI specification that the fragment conforms to. - /// Returns diagnostic object containing errors detected during parsing - /// Instance of newly created OpenApiDocument - public T ReadFragment(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiElement - { - using var reader = new StreamReader(input); - return new OpenApiTextReaderReader(_settings).ReadFragment(reader, version, out diagnostic); - } - } -} diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs deleted file mode 100644 index d7c41efe4..000000000 --- a/src/Microsoft.OpenApi.Readers/OpenApiStringReader.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System.IO; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.Interface; - -namespace Microsoft.OpenApi.Readers -{ - /// - /// Service class for converting strings into OpenApiDocument instances - /// - public class OpenApiStringReader : IOpenApiReader - { - private readonly OpenApiReaderSettings _settings; - - /// - /// Constructor tha allows reader to use non-default settings - /// - /// - public OpenApiStringReader(OpenApiReaderSettings settings = null) - { - _settings = settings ?? new OpenApiReaderSettings(); - } - - /// - /// Reads the string input and parses it into an Open API document. - /// - public OpenApiDocument Read(string input, out OpenApiDiagnostic diagnostic) - { - using var reader = new StringReader(input); - return new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); - } - - /// - /// Reads the string input and parses it into an Open API element. - /// - public T ReadFragment(string input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiElement - { - using var reader = new StringReader(input); - return new OpenApiTextReaderReader(_settings).ReadFragment(reader, version, out diagnostic); - } - } -} diff --git a/src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs deleted file mode 100644 index f5420dfe3..000000000 --- a/src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Nodes; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.Interface; -using SharpYaml; -using SharpYaml.Serialization; - -namespace Microsoft.OpenApi.Readers -{ - /// - /// Service class for converting contents of TextReader into OpenApiDocument instances - /// - public class OpenApiTextReaderReader : IOpenApiReader - { - private readonly OpenApiReaderSettings _settings; - - /// - /// Create stream reader with custom settings if desired. - /// - /// - public OpenApiTextReaderReader(OpenApiReaderSettings settings = null) - { - _settings = settings ?? new OpenApiReaderSettings(); - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// Returns diagnostic object containing errors detected during parsing - /// Instance of newly created OpenApiDocument - public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic) - { - JsonNode jsonNode; - - // Parse the YAML/JSON text in the TextReader into Json Nodes - try - { - jsonNode = LoadJsonNodesFromYamlDocument(input); - } - catch (YamlException ex) - { - diagnostic = new(); - diagnostic.Errors.Add(new($"#line={ex.Start.Line}", ex.Message)); - return new(); - } - - return new OpenApiYamlDocumentReader(this._settings).Read(jsonNode, out diagnostic); - } - - /// - /// Reads the content of the TextReader. If there are references to external documents then they will be read asynchronously. - /// - /// TextReader containing OpenAPI description to parse. - /// Cancellation token. - /// A ReadResult instance that contains the resulting OpenApiDocument and a diagnostics instance. - public async Task ReadAsync(TextReader input, CancellationToken cancellationToken = default) - { - JsonNode jsonNode; - - // Parse the YAML/JSON text in the TextReader into the YamlDocument - try - { - jsonNode = LoadJsonNodesFromYamlDocument(input); - } - catch (JsonException ex) - { - var diagnostic = new OpenApiDiagnostic(); - diagnostic.Errors.Add(new($"#line={ex.LineNumber}", ex.Message)); - return new() - { - OpenApiDocument = null, - OpenApiDiagnostic = diagnostic - }; - } - - return await new OpenApiYamlDocumentReader(this._settings).ReadAsync(jsonNode, cancellationToken); - } - - /// - /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. - /// - /// TextReader containing OpenAPI description to parse. - /// Version of the OpenAPI specification that the fragment conforms to. - /// Returns diagnostic object containing errors detected during parsing - /// Instance of newly created OpenApiDocument - public T ReadFragment(TextReader input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiElement - { - JsonNode jsonNode; - - // Parse the YAML/JSON - try - { - jsonNode = LoadJsonNodesFromYamlDocument(input); - } - catch (JsonException ex) - { - diagnostic = new(); - diagnostic.Errors.Add(new($"#line={ex.LineNumber}", ex.Message)); - return default; - } - - return new OpenApiYamlDocumentReader(this._settings).ReadFragment(jsonNode, version, out diagnostic); - } - - /// - /// Helper method to turn streams into YamlDocument - /// - /// Stream containing YAML formatted text - /// Instance of a YamlDocument - static JsonNode LoadJsonNodesFromYamlDocument(TextReader input) - { - var yamlStream = new YamlStream(); - yamlStream.Load(input); - var yamlDocument = yamlStream.Documents.First(); - return yamlDocument.ToJsonNode(); - } - } -} diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs deleted file mode 100644 index 8cbe331f3..000000000 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json.Nodes; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.OpenApi.Exceptions; -using Microsoft.OpenApi.Extensions; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Reader.Interface; -using Microsoft.OpenApi.Reader.Services; -using Microsoft.OpenApi.Services; -using Microsoft.OpenApi.Validations; - -namespace Microsoft.OpenApi.Readers -{ - /// - /// Service class for converting contents of TextReader into OpenApiDocument instances - /// - internal class OpenApiYamlDocumentReader : IOpenApiReader - { - private readonly OpenApiReaderSettings _settings; - - /// - /// Create stream reader with custom settings if desired. - /// - /// - public OpenApiYamlDocumentReader(OpenApiReaderSettings settings = null) - { - _settings = settings ?? new OpenApiReaderSettings(); - } - - /// - /// Reads the stream input and parses it into an Open API document. - /// - /// TextReader containing OpenAPI description to parse. - /// Returns diagnostic object containing errors detected during parsing - /// Instance of newly created OpenApiDocument - public OpenApiDocument Read(JsonNode input, out OpenApiDiagnostic diagnostic) - { - diagnostic = new(); - var context = new ParsingContext(diagnostic) - { - ExtensionParsers = _settings.ExtensionParsers, - BaseUrl = _settings.BaseUrl, - DefaultContentType = _settings.DefaultContentType - }; - - OpenApiDocument document = null; - try - { - // Parse the OpenAPI Document - document = context.Parse(input); - - if (_settings.LoadExternalRefs) - { - throw new InvalidOperationException("Cannot load external refs using the synchronous Read, use ReadAsync instead."); - } - - ResolveReferences(diagnostic, document); - } - catch (OpenApiException ex) - { - diagnostic.Errors.Add(new(ex)); - } - - // Validate the document - if (_settings.RuleSet != null && _settings.RuleSet.Rules.Any()) - { - var openApiErrors = document.Validate(_settings.RuleSet); - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Errors.Add(item); - } - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Warnings.Add(item); - } - } - - return document; - } - - public async Task ReadAsync(JsonNode input, CancellationToken cancellationToken = default) - { - var diagnostic = new OpenApiDiagnostic(); - var context = new ParsingContext(diagnostic) - { - ExtensionParsers = _settings.ExtensionParsers, - BaseUrl = _settings.BaseUrl - }; - - OpenApiDocument document = null; - try - { - // Parse the OpenAPI Document - document = context.Parse(input); - - if (_settings.LoadExternalRefs) - { - var diagnosticExternalRefs = await LoadExternalRefs(document, cancellationToken); - // Merge diagnostics of external reference - if (diagnosticExternalRefs != null) - { - diagnostic.Errors.AddRange(diagnosticExternalRefs.Errors); - diagnostic.Warnings.AddRange(diagnosticExternalRefs.Warnings); - } - } - - ResolveReferences(diagnostic, document); - } - catch (OpenApiException ex) - { - diagnostic.Errors.Add(new(ex)); - } - - // Validate the document - if (_settings.RuleSet != null && _settings.RuleSet.Rules.Any()) - { - var openApiErrors = document.Validate(_settings.RuleSet); - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Errors.Add(item); - } - foreach (var item in openApiErrors.OfType()) - { - diagnostic.Warnings.Add(item); - } - } - - return new() - { - OpenApiDocument = document, - OpenApiDiagnostic = diagnostic - }; - } - - private Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken = default) - { - // Create workspace for all documents to live in. - var openApiWorkSpace = new OpenApiWorkspace(); - - // Load this root document into the workspace - var streamLoader = new DefaultStreamLoader(_settings.BaseUrl); - var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, _settings.CustomExternalLoader ?? streamLoader, _settings); - return workspaceLoader.LoadAsync(new() { ExternalResource = "/" }, document, null, cancellationToken); - } - - private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument document) - { - var errors = new List(); - - // Resolve References if requested - switch (_settings.ReferenceResolution) - { - case ReferenceResolutionSetting.ResolveAllReferences: - throw new ArgumentException("Resolving external references is not supported"); - case ReferenceResolutionSetting.ResolveLocalReferences: - errors.AddRange(document.ResolveReferences()); - break; - case ReferenceResolutionSetting.DoNotResolveReferences: - break; - } - - foreach (var item in errors) - { - diagnostic.Errors.Add(item); - } - } - - /// - /// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element. - /// - /// TextReader containing OpenAPI description to parse. - /// Version of the OpenAPI specification that the fragment conforms to. - /// Returns diagnostic object containing errors detected during parsing - /// Instance of newly created OpenApiDocument - public T ReadFragment(JsonNode input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiElement - { - diagnostic = new(); - var context = new ParsingContext(diagnostic) - { - ExtensionParsers = _settings.ExtensionParsers - }; - - IOpenApiElement element = null; - try - { - // Parse the OpenAPI element - element = context.ParseFragment(input, version); - } - catch (OpenApiException ex) - { - diagnostic.Errors.Add(new(ex)); - } - - // Validate the element - if (_settings.RuleSet != null && _settings.RuleSet.Rules.Any()) - { - var errors = element.Validate(_settings.RuleSet); - foreach (var item in errors) - { - diagnostic.Errors.Add(item); - } - } - - return (T)element; - } - } -} diff --git a/src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs b/src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs deleted file mode 100644 index 1f7781def..000000000 --- a/src/Microsoft.OpenApi.Readers/Services/OpenApiRemoteReferenceCollector.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System.Collections.Generic; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Services; - -namespace Microsoft.OpenApi.Reader.Services -{ - /// - /// Builds a list of all remote references used in an OpenApi document - /// - internal class OpenApiRemoteReferenceCollector : OpenApiVisitorBase - { - private Dictionary _references = new(); - - /// - /// List of external references collected from OpenApiDocument - /// - public IEnumerable References - { - get - { - return _references.Values; - } - } - - /// - /// Collect reference for each reference - /// - /// - public override void Visit(IOpenApiReferenceable referenceable) - { - AddReference(referenceable.Reference); - } - - /// - /// Collect external reference - /// - private void AddReference(OpenApiReference reference) - { - if (reference is {IsExternal: true} && - !_references.ContainsKey(reference.ExternalResource)) - { - _references.Add(reference.ExternalResource, reference); - } - } - } -} diff --git a/src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs b/src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs deleted file mode 100644 index 0c0e4251b..000000000 --- a/src/Microsoft.OpenApi.Readers/Services/OpenApiWorkspaceLoader.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; -using Microsoft.OpenApi.Readers; -using Microsoft.OpenApi.Services; - -namespace Microsoft.OpenApi.Reader.Services -{ - internal class OpenApiWorkspaceLoader - { - private OpenApiWorkspace _workspace; - private IStreamLoader _loader; - private readonly OpenApiReaderSettings _readerSettings; - - public OpenApiWorkspaceLoader(OpenApiWorkspace workspace, IStreamLoader loader, OpenApiReaderSettings readerSettings) - { - _workspace = workspace; - _loader = loader; - _readerSettings = readerSettings; - } - - internal async Task LoadAsync(OpenApiReference reference, OpenApiDocument document, OpenApiDiagnostic diagnostic = null, CancellationToken cancellationToken = default) - { - _workspace.AddDocument(reference.ExternalResource, document); - document.Workspace = _workspace; - - // Collect remote references by walking document - var referenceCollector = new OpenApiRemoteReferenceCollector(); - var collectorWalker = new OpenApiWalker(referenceCollector); - collectorWalker.Walk(document); - - var reader = new OpenApiStreamReader(_readerSettings); - - if (diagnostic is null) - { - diagnostic = new(); - } - - // Walk references - foreach (var item in referenceCollector.References) - { - // If not already in workspace, load it and process references - if (!_workspace.Contains(item.ExternalResource)) - { - var input = await _loader.LoadAsync(new(item.ExternalResource, UriKind.RelativeOrAbsolute)); - var result = await reader.ReadAsync(input, cancellationToken); - // Merge diagnostics - if (result.OpenApiDiagnostic != null) - { - diagnostic.AppendDiagnostic(result.OpenApiDiagnostic, item.ExternalResource); - } - if (result.OpenApiDocument != null) - { - var loadDiagnostic = await LoadAsync(item, result.OpenApiDocument, diagnostic, cancellationToken); - diagnostic = loadDiagnostic; - } - } - } - - return diagnostic; - } - } -} diff --git a/src/Microsoft.OpenApi/Reader/HttpClientFactory.cs b/src/Microsoft.OpenApi/Reader/HttpClientFactory.cs deleted file mode 100644 index b9141f695..000000000 --- a/src/Microsoft.OpenApi/Reader/HttpClientFactory.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System.Net.Http; - -namespace Microsoft.OpenApi.Reader -{ - /// - /// Creates a single instance of HttpClient for reuse - /// - public static class HttpClientFactory - { - private static readonly HttpClient _httpClient; - - static HttpClientFactory() - { - _httpClient = new HttpClient(); - } - - /// - /// Returns a static http client instance - /// - /// A http client. - public static HttpClient GetHttpClient() - { - return _httpClient; - } - } -} From 298b3e91a62ecc2438380bd3389dbc5e5a8abc84 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 19 Feb 2024 13:09:23 +0300 Subject: [PATCH 36/47] Code refactoring --- .../OpenApiYamlReader.cs | 7 ++++--- src/Microsoft.OpenApi.Workbench/MainModel.cs | 5 +++-- .../Interfaces/IOpenApiReader.cs | 3 ++- src/Microsoft.OpenApi/Models/OpenApiDocument.cs | 4 ++-- src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs | 15 +++++++++------ .../Reader/OpenApiModelFactory.cs | 11 ++++++++++- .../Reader/Services/OpenApiWorkspaceLoader.cs | 4 +--- 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index 7cee092b4..cff6dd1da 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -10,6 +10,7 @@ using Microsoft.OpenApi.Reader; using SharpYaml.Serialization; using System.Linq; +using Microsoft.OpenApi.Models; namespace Microsoft.OpenApi.Readers { @@ -41,7 +42,7 @@ public async Task ReadAsync(TextReader input, }; } - return await ReadAsync(jsonNode, settings, cancellationToken); + return await ReadAsync(jsonNode, settings, cancellationToken: cancellationToken); } /// @@ -81,9 +82,9 @@ static JsonNode LoadJsonNodesFromYamlDocument(TextReader input) } /// - public async Task ReadAsync(JsonNode jsonNode, OpenApiReaderSettings settings, CancellationToken cancellationToken = default) + public async Task ReadAsync(JsonNode jsonNode, OpenApiReaderSettings settings, string format = null, CancellationToken cancellationToken = default) { - return await OpenApiReaderRegistry.DefaultReader.ReadAsync(jsonNode, settings, cancellationToken); + return await OpenApiReaderRegistry.DefaultReader.ReadAsync(jsonNode, settings, OpenApiConstants.Yaml, cancellationToken); } /// diff --git a/src/Microsoft.OpenApi.Workbench/MainModel.cs b/src/Microsoft.OpenApi.Workbench/MainModel.cs index 34f419c4b..e46b83b67 100644 --- a/src/Microsoft.OpenApi.Workbench/MainModel.cs +++ b/src/Microsoft.OpenApi.Workbench/MainModel.cs @@ -246,8 +246,9 @@ internal async Task ParseDocument() settings.BaseUrl = new("file://" + Path.GetDirectoryName(_inputFile) + "/"); } } - var readResult = await new OpenApiStreamReader(settings - ).ReadAsync(stream); + + var format = OpenApiModelFactory.GetFormat(_inputFile); + var readResult = await OpenApiDocument.LoadAsync(stream, format); var document = readResult.OpenApiDocument; var context = readResult.OpenApiDiagnostic; diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs index 956a00267..5f8b1cb22 100644 --- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs +++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs @@ -29,8 +29,9 @@ public interface IOpenApiReader /// The JsonNode input. /// The Reader settings to be used during parsing. /// Propagates notifications that operations should be cancelled. + /// The OpenAPI format. /// - Task ReadAsync(JsonNode jsonNode, OpenApiReaderSettings settings, CancellationToken cancellationToken = default); + Task ReadAsync(JsonNode jsonNode, OpenApiReaderSettings settings, string format = null, CancellationToken cancellationToken = default); /// /// Reads the TextReader input and parses the fragment of an OpenAPI description into an Open API Element. diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index fbdd652e9..17db8a438 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -636,8 +636,8 @@ public static ReadResult Load(string url, OpenApiReaderSettings settings = null) /// The OpenApi reader settings. /// public static ReadResult Load(Stream stream, - string format, - OpenApiReaderSettings settings = null) + string format, + OpenApiReaderSettings settings = null) { return OpenApiModelFactory.Load(stream, format, settings); } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs index 06f21861c..4673c7df2 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs @@ -54,7 +54,7 @@ public async Task ReadAsync(TextReader input, }; } - return await ReadAsync(jsonNode, settings, cancellationToken); + return await ReadAsync(jsonNode, settings, cancellationToken: cancellationToken); } /// @@ -62,17 +62,20 @@ public async Task ReadAsync(TextReader input, /// /// The JsonNode input. /// The Reader settings to be used during parsing. + /// The OpenAPI format. /// Propagates notifications that operations should be cancelled. /// - public async Task ReadAsync(JsonNode jsonNode, + public async Task ReadAsync(JsonNode jsonNode, OpenApiReaderSettings settings, + string format = null, CancellationToken cancellationToken = default) { var diagnostic = new OpenApiDiagnostic(); var context = new ParsingContext(diagnostic) { ExtensionParsers = settings.ExtensionParsers, - BaseUrl = settings.BaseUrl + BaseUrl = settings.BaseUrl, + DefaultContentType = settings.DefaultContentType }; OpenApiDocument document = null; @@ -83,7 +86,7 @@ public async Task ReadAsync(JsonNode jsonNode, if (settings.LoadExternalRefs) { - var diagnosticExternalRefs = await LoadExternalRefs(document, cancellationToken, settings); + var diagnosticExternalRefs = await LoadExternalRefs(document, cancellationToken, settings, format); // Merge diagnostics of external reference if (diagnosticExternalRefs != null) { @@ -208,7 +211,7 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc } } - private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken, OpenApiReaderSettings settings) + private async Task LoadExternalRefs(OpenApiDocument document, CancellationToken cancellationToken, OpenApiReaderSettings settings, string format = null) { // Create workspace for all documents to live in. var openApiWorkSpace = new OpenApiWorkspace(); @@ -216,7 +219,7 @@ private async Task LoadExternalRefs(OpenApiDocument document, // Load this root document into the workspace var streamLoader = new DefaultStreamLoader(settings.BaseUrl); var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); - return await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, OpenApiConstants.Json, null, cancellationToken); + return await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, format ?? OpenApiConstants.Json, null, cancellationToken); } } } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index a8d4ad34f..3e85fa5d9 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Net.Http; +using System.Runtime; using System.Security; using System.Threading; using System.Threading.Tasks; @@ -47,7 +48,15 @@ public static ReadResult Load(Stream stream, string format, OpenApiReaderSettings settings = null) { - return LoadAsync(stream, format, settings).GetAwaiter().GetResult(); + settings ??= new OpenApiReaderSettings(); + + var result = LoadAsync(stream, format, settings).GetAwaiter().GetResult(); + if (!settings.LeaveStreamOpen) + { + stream.Dispose(); + } + + return result; } /// diff --git a/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs b/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs index 82d3774c3..d6389d2fb 100644 --- a/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs +++ b/src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs @@ -34,8 +34,6 @@ internal async Task LoadAsync(OpenApiReference reference, var collectorWalker = new OpenApiWalker(referenceCollector); collectorWalker.Walk(document); - var reader = OpenApiReaderRegistry.GetReader(format); - diagnostic ??= new(); // Walk references @@ -45,7 +43,7 @@ internal async Task LoadAsync(OpenApiReference reference, if (!_workspace.Contains(item.ExternalResource)) { var input = await _loader.LoadAsync(new(item.ExternalResource, UriKind.RelativeOrAbsolute)); - var result = await reader.ReadAsync(input, _readerSettings, cancellationToken); + var result = await OpenApiDocument.LoadAsync(input, format, _readerSettings, cancellationToken); // Merge diagnostics if (result.OpenApiDiagnostic != null) { From 487b1f93da7cea980b38fe95e403328c92561b52 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 19 Feb 2024 13:09:44 +0300 Subject: [PATCH 37/47] Remove depracated interface --- .../Interface/IOpenApiReader.cs | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs diff --git a/src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs b/src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs deleted file mode 100644 index 1457df313..000000000 --- a/src/Microsoft.OpenApi.Readers/Interface/IOpenApiReader.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Models; - -namespace Microsoft.OpenApi.Reader.Interface -{ - /// - /// Interface for Open API readers. - /// - /// The type of input to read from. - /// The type of diagnostic for information from reading process. - public interface IOpenApiReader where TDiagnostic : IDiagnostic - { - /// - /// Reads the input and parses it into an Open API document. - /// - /// The input to read from. - /// The diagnostic entity containing information from the reading process. - /// The Open API document. - OpenApiDocument Read(TInput input, out TDiagnostic diagnostic); - } -} From 374fe98b5ec8b5e25fc13374eb71298d6ffc2611 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 19 Feb 2024 13:10:02 +0300 Subject: [PATCH 38/47] Fix failing tests --- .../Services/OpenApiServiceTests.cs | 8 +- .../OpenApiDiagnosticTests.cs | 29 ++-- .../OpenApiStreamReaderTests.cs | 15 +- .../UnsupportedSpecVersionTests.cs | 4 +- .../OpenApiWorkspaceStreamTests.cs | 7 +- .../ParseNodeTests.cs | 16 ++- .../TryLoadReferenceV2Tests.cs | 38 ++--- .../TestCustomExtension.cs | 9 +- .../V2Tests/ComparisonTests.cs | 9 +- .../V2Tests/OpenApiContactTests.cs | 3 +- .../V2Tests/OpenApiDocumentTests.cs | 46 +++--- .../V2Tests/OpenApiServerTests.cs | 134 ++++++++---------- .../V31Tests/OpenApiDocumentTests.cs | 31 ++-- .../V3Tests/JsonSchemaTests.cs | 26 ++-- .../V3Tests/OpenApiCallbackTests.cs | 2 +- .../V3Tests/OpenApiDocumentTests.cs | 70 ++++----- test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs | 13 +- .../GraphTests.cs | 9 +- .../Models/OpenApiDocumentTests.cs | 37 ++--- .../OpenApiCallbackReferenceTests.cs | 7 +- .../OpenApiExampleReferenceTests.cs | 7 +- .../References/OpenApiHeaderReferenceTests.cs | 7 +- .../References/OpenApiLinkReferenceTests.cs | 7 +- .../OpenApiParameterReferenceTests.cs | 7 +- .../OpenApiPathItemReferenceTests.cs | 7 +- .../OpenApiRequestBodyReferenceTests.cs | 7 +- .../OpenApiResponseReferenceTest.cs | 7 +- .../OpenApiSecuritySchemeReferenceTests.cs | 7 +- .../References/OpenApiTagReferenceTest.cs | 7 +- 29 files changed, 277 insertions(+), 299 deletions(-) diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs index b06e38d3f..4b61d3bd3 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs +++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs @@ -11,7 +11,8 @@ using Microsoft.OpenApi.Hidi.Utilities; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.OData; -using Microsoft.OpenApi.Services; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Readers; using Xunit; namespace Microsoft.OpenApi.Hidi.Tests @@ -24,8 +25,11 @@ public sealed class OpenApiServiceTests : IDisposable public OpenApiServiceTests() { _logger = new Logger(_loggerFactory); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yml, new OpenApiYamlReader()); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } - + [Theory] [InlineData("UtilityFiles/appsettingstest.json")] [InlineData(null)] diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs index db681f038..05c40c21d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs @@ -17,42 +17,43 @@ namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests [Collection("DefaultSettings")] public class OpenApiDiagnosticTests { + public OpenApiDiagnosticTests() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } + [Fact] public void DetectedSpecificationVersionShouldBeV2_0() { - using var stream = Resources.GetStream("V2Tests/Samples/basic.v2.yaml"); - new OpenApiStreamReader().Read(stream, out var diagnostic); + var actual = OpenApiDocument.Load("V2Tests/Samples/basic.v2.yaml"); - diagnostic.Should().NotBeNull(); - diagnostic.SpecificationVersion.Should().Be(OpenApiSpecVersion.OpenApi2_0); + actual.OpenApiDiagnostic.Should().NotBeNull(); + actual.OpenApiDiagnostic.SpecificationVersion.Should().Be(OpenApiSpecVersion.OpenApi2_0); } [Fact] public void DetectedSpecificationVersionShouldBeV3_0() { - using var stream = Resources.GetStream("V3Tests/Samples/OpenApiDocument/minimalDocument.yaml"); - new OpenApiStreamReader().Read(stream, out var diagnostic); + var actual = OpenApiDocument.Load("V3Tests/Samples/OpenApiDocument/minimalDocument.yaml"); - diagnostic.Should().NotBeNull(); - diagnostic.SpecificationVersion.Should().Be(OpenApiSpecVersion.OpenApi3_0); + actual.OpenApiDiagnostic.Should().NotBeNull(); + actual.OpenApiDiagnostic.SpecificationVersion.Should().Be(OpenApiSpecVersion.OpenApi3_0); } [Fact] public async Task DiagnosticReportMergedForExternalReference() { // Create a reader that will resolve all references - var reader = new OpenApiStreamReader(new() + var settings = new OpenApiReaderSettings { LoadExternalRefs = true, CustomExternalLoader = new ResourceLoader(), BaseUrl = new("fie://c:\\") - }); + }; ReadResult result; - using (var stream = Resources.GetStream("OpenApiReaderTests/Samples/OpenApiDiagnosticReportMerged/TodoMain.yaml")) - { - result = await reader.ReadAsync(stream); - } + result = await OpenApiDocument.LoadAsync("OpenApiReaderTests/Samples/OpenApiDiagnosticReportMerged/TodoMain.yaml", settings); + Assert.NotNull(result); Assert.NotNull(result.OpenApiDocument.Workspace); diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs index 91e271549..816a58226 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs @@ -2,6 +2,8 @@ // Licensed under the MIT license. using System.IO; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests @@ -10,12 +12,17 @@ public class OpenApiStreamReaderTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiDocument/"; + public OpenApiStreamReaderTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void StreamShouldCloseIfLeaveStreamOpenSettingEqualsFalse() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); - var reader = new OpenApiStreamReader(new() { LeaveStreamOpen = false }); - reader.Read(stream, out _); + var settings = new OpenApiReaderSettings { LeaveStreamOpen = false }; + _ = OpenApiDocument.Load(stream, "yaml", settings); Assert.False(stream.CanRead); } @@ -23,8 +30,8 @@ public void StreamShouldCloseIfLeaveStreamOpenSettingEqualsFalse() public void StreamShouldNotCloseIfLeaveStreamOpenSettingEqualsTrue() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); - var reader = new OpenApiStreamReader(new() { LeaveStreamOpen = true}); - reader.Read(stream, out _); + var settings = new OpenApiReaderSettings { LeaveStreamOpen = true }; + _ = OpenApiDocument.Load(stream, "yaml", settings); Assert.True(stream.CanRead); } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs index 6bce59be5..0b044e78b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs @@ -3,6 +3,7 @@ using FluentAssertions; using Microsoft.OpenApi.Exceptions; +using Microsoft.OpenApi.Models; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests @@ -13,10 +14,9 @@ public class UnsupportedSpecVersionTests [Fact] public void ThrowOpenApiUnsupportedSpecVersionException() { - using var stream = Resources.GetStream("OpenApiReaderTests/Samples/unsupported.v1.yaml"); try { - new OpenApiStreamReader().Read(stream, out var diagnostic); + _ = OpenApiDocument.Load("OpenApiReaderTests/Samples/unsupported.v1.yaml"); } catch (OpenApiUnsupportedSpecVersionException exception) { diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs index e85f97e7b..bf8c7c8a4 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs @@ -55,16 +55,15 @@ public async Task LoadingDocumentWithResolveAllReferencesShouldLoadDocumentIntoW public async Task LoadDocumentWithExternalReferenceShouldLoadBothDocumentsIntoWorkspace() { // Create a reader that will resolve all references - var reader = new OpenApiStreamReader(new() + var settings = new OpenApiReaderSettings { LoadExternalRefs = true, CustomExternalLoader = new ResourceLoader(), BaseUrl = new("fie://c:\\") - }); + }; ReadResult result; - using var stream = Resources.GetStream("V3Tests/Samples/OpenApiWorkspace/TodoMain.yaml"); - result = await reader.ReadAsync(stream); + result = await OpenApiDocument.LoadAsync("V3Tests/Samples/OpenApiWorkspace/TodoMain.yaml", settings); Assert.NotNull(result.OpenApiDocument.Workspace); Assert.True(result.OpenApiDocument.Workspace.Contains("TodoComponents.yaml")); diff --git a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs index 546be2c8b..3f7c669b0 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs @@ -5,6 +5,7 @@ using FluentAssertions; using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Xunit; @@ -12,6 +13,11 @@ namespace Microsoft.OpenApi.Tests { public class ParseNodeTests { + public ParseNodeTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void BrokenSimpleList() { @@ -25,10 +31,9 @@ public void BrokenSimpleList() paths: { } """; - var reader = new OpenApiStringReader(); - reader.Read(input, out var diagnostic); + var result = OpenApiDocument.Parse(input, "yaml"); - diagnostic.Errors.Should().BeEquivalentTo(new List() { + result.OpenApiDiagnostic.Errors.Should().BeEquivalentTo(new List() { new OpenApiError(new OpenApiReaderException("Expected a value.")), new OpenApiError("", "Paths is a REQUIRED field at #/") }); @@ -53,10 +58,9 @@ public void BadSchema() schema: asdasd """; - var reader = new OpenApiStringReader(); - reader.Read(input, out var diagnostic); + var res= OpenApiDocument.Parse(input, "yaml"); - diagnostic.Errors.Should().BeEquivalentTo(new List + res.OpenApiDiagnostic.Errors.Should().BeEquivalentTo(new List { new(new OpenApiReaderException("schema must be a map/object") { Pointer = "#/paths/~1foo/get/responses/200/content/application~1json/schema" diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs index d9d4e0eb3..398bbff42 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs @@ -19,12 +19,7 @@ public class TryLoadReferenceV2Tests public void LoadParameterReference() { // Arrange - OpenApiDocument document; - - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"))) - { - document = new OpenApiStreamReader().Read(stream, out var diagnostic); - } + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); var reference = new OpenApiReference { @@ -33,7 +28,7 @@ public void LoadParameterReference() }; // Act - var referencedObject = document.ResolveReferenceTo(reference); + var referencedObject = result.OpenApiDocument.ResolveReferenceTo(reference); // Assert referencedObject.Should().BeEquivalentTo( @@ -58,13 +53,7 @@ public void LoadParameterReference() [Fact] public void LoadSecuritySchemeReference() { - // Arrange - OpenApiDocument document; - - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"))) - { - document = new OpenApiStreamReader().Read(stream, out var diagnostic); - } + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); var reference = new OpenApiReference { @@ -73,7 +62,7 @@ public void LoadSecuritySchemeReference() }; // Act - var referencedObject = document.ResolveReferenceTo(reference); + var referencedObject = result.OpenApiDocument.ResolveReferenceTo(reference); // Assert referencedObject.Should().BeEquivalentTo( @@ -94,13 +83,7 @@ public void LoadSecuritySchemeReference() [Fact] public void LoadResponseReference() { - // Arrange - OpenApiDocument document; - - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"))) - { - document = new OpenApiStreamReader().Read(stream, out var diagnostic); - } + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); var reference = new OpenApiReference { @@ -109,7 +92,7 @@ public void LoadResponseReference() }; // Act - var referencedObject = document.ResolveReferenceTo(reference); + var referencedObject = result.OpenApiDocument.ResolveReferenceTo(reference); // Assert referencedObject.Should().BeEquivalentTo( @@ -132,13 +115,8 @@ public void LoadResponseReference() [Fact] public void LoadResponseAndSchemaReference() { - // Arrange - OpenApiDocument document; + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); - using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"))) - { - document = new OpenApiStreamReader().Read(stream, out var diagnostic); - } var reference = new OpenApiReference { @@ -147,7 +125,7 @@ public void LoadResponseAndSchemaReference() }; // Act - var referencedObject = document.ResolveReferenceTo(reference); + var referencedObject = result.OpenApiDocument.ResolveReferenceTo(reference); // Assert referencedObject.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs index 67bd6b968..25af4cdae 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs @@ -4,6 +4,7 @@ using System.Text.Json.Nodes; using FluentAssertions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; using Xunit; @@ -37,13 +38,11 @@ public void ParseCustomExtension() } } } }; - var reader = new OpenApiStringReader(settings); - + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); var diag = new OpenApiDiagnostic(); - var doc = reader.Read(description, out diag); + var actual = OpenApiDocument.Parse(description, "yaml", settings: settings); - var fooExtension = doc.Info.Extensions["x-foo"] as FooExtension; - //var fooExtension = JsonSerializer.Deserialize(fooExtensionNode); + var fooExtension = actual.OpenApiDocument.Info.Extensions["x-foo"] as FooExtension; fooExtension.Should().NotBeNull(); fooExtension.Bar.Should().Be("hey"); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs index f0d417f84..5df1291bd 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs @@ -3,6 +3,7 @@ using System.IO; using FluentAssertions; +using Microsoft.OpenApi.Models; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests @@ -20,12 +21,12 @@ public void EquivalentV2AndV3DocumentsShouldProductEquivalentObjects(string file { using var streamV2 = Resources.GetStream(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml")); using var streamV3 = Resources.GetStream(Path.Combine(SampleFolderPath, $"{fileName}.v3.yaml")); - var openApiDocV2 = new OpenApiStreamReader().Read(streamV2, out var diagnosticV2); - var openApiDocV3 = new OpenApiStreamReader().Read(streamV3, out var diagnosticV3); + var result1 = OpenApiDocument.Load(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml")); + var result2 = OpenApiDocument.Load(Path.Combine(SampleFolderPath, $"{fileName}.v3.yaml")); - openApiDocV3.Should().BeEquivalentTo(openApiDocV2); + result2.OpenApiDocument.Should().BeEquivalentTo(result1.OpenApiDocument); - diagnosticV2.Errors.Should().BeEquivalentTo(diagnosticV3.Errors); + result1.OpenApiDiagnostic.Errors.Should().BeEquivalentTo(result2.OpenApiDiagnostic.Errors); } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs index 6c015f7a4..413d3ee7b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs @@ -21,10 +21,9 @@ public void ParseStringContactFragmentShouldSucceed() "email": "support@swagger.io" } """; - var reader = new OpenApiStringReader(); // Act - var contact = reader.ReadFragment(input, OpenApiSpecVersion.OpenApi2_0, out var diagnostic); + var contact = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi2_0, out var diagnostic); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index 9ca153263..754de9e5a 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -1,7 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.IO; +using System.Linq; using FluentAssertions; using Json.Schema; using Microsoft.OpenApi.Models; @@ -14,10 +16,15 @@ public class OpenApiDocumentTests { private const string SampleFolderPath = "V2Tests/Samples/"; + public OpenApiDocumentTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ShouldParseProducesInAnyOrder() { - var doc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "twoResponses.json"), out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "twoResponses.json")); var okSchema = new JsonSchemaBuilder() .Ref("#/definitions/Item") @@ -39,7 +46,7 @@ public void ShouldParseProducesInAnyOrder() Schema = errorSchema }; - doc.Should().BeEquivalentTo(new OpenApiDocument + result.OpenApiDocument.Should().BeEquivalentTo(new OpenApiDocument { Info = new OpenApiInfo { @@ -147,11 +154,10 @@ public void ShouldParseProducesInAnyOrder() [Fact] public void ShouldAssignSchemaToAllResponses() { - OpenApiDocument document; using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "multipleProduces.json")); - document = OpenApiDocument.Load(stream, OpenApiConstants.Json, out var diagnostic); + var result = OpenApiDocument.Load(stream, OpenApiConstants.Json); - Assert.Equal(OpenApiSpecVersion.OpenApi2_0, diagnostic.SpecificationVersion); + Assert.Equal(OpenApiSpecVersion.OpenApi2_0, result.OpenApiDiagnostic.SpecificationVersion); var successSchema = new JsonSchemaBuilder() .Type(SchemaValueType.Array) @@ -167,7 +173,7 @@ public void ShouldAssignSchemaToAllResponses() ("fields", new JsonSchemaBuilder().Type(SchemaValueType.String))) .Build(); - var responses = document.Paths["/items"].Operations[OperationType.Get].Responses; + var responses = result.OpenApiDocument.Paths["/items"].Operations[OperationType.Get].Responses; foreach (var response in responses) { var targetSchema = response.Key == "200" ? successSchema : errorSchema; @@ -185,13 +191,9 @@ public void ShouldAssignSchemaToAllResponses() [Fact] public void ShouldAllowComponentsThatJustContainAReference() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "ComponentRootReference.json")); - OpenApiStreamReader reader = new OpenApiStreamReader(); - // Act - OpenApiDocument doc = reader.Read(stream, out OpenApiDiagnostic diags); - JsonSchema schema = doc.Components.Schemas["AllPets"]; + var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "ComponentRootReference.json")); + JsonSchema schema = actual.OpenApiDocument.Components.Schemas["AllPets"]; // Assert if (schema.Keywords.Count.Equals(1) && schema.GetRef() != null) @@ -204,11 +206,23 @@ public void ShouldAllowComponentsThatJustContainAReference() [Fact] public void ParseDocumentWithDefaultContentTypeSettingShouldSucceed() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithEmptyProduces.yaml")); - var doc = new OpenApiStreamReader(new() { DefaultContentType = new() { "application/json" } }) - .Read(stream, out var diags); - var mediaType = doc.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content; + var settings = new OpenApiReaderSettings + { + DefaultContentType = ["application/json"] + }; + + var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "docWithEmptyProduces.yaml"), settings); + var mediaType = actual.OpenApiDocument.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content; Assert.Contains("application/json", mediaType); } + + [Fact] + public void testContentType() + { + var contentType = "application/json; charset = utf-8"; + var res = contentType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First(); + var expected = res.Split('/').LastOrDefault(); + Assert.Equal("application/json", res); + } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs index 8f2d49658..7f1f7545d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs @@ -19,13 +19,10 @@ public void NoServer() version: 1.0.0 paths: {} """; - var reader = new OpenApiStringReader(new() - { - }); - var doc = reader.Read(input, out var diagnostic); + var result = OpenApiDocument.Parse(input, "yaml"); - Assert.Empty(doc.Servers); + Assert.Empty(result.OpenApiDocument.Servers); } [Fact] @@ -41,13 +38,9 @@ public void JustSchemeNoDefault() - http paths: {} """; - var reader = new OpenApiStringReader(new() - { - }); + var result = OpenApiDocument.Parse(input, "yaml"); - var doc = reader.Read(input, out var diagnostic); - - Assert.Empty(doc.Servers); + Assert.Empty(result.OpenApiDocument.Servers); } [Fact] @@ -62,14 +55,10 @@ public void JustHostNoDefault() host: www.foo.com paths: {} """; - var reader = new OpenApiStringReader(new() - { - }); + var result = OpenApiDocument.Parse(input, "yaml"); - var doc = reader.Read(input, out var _); - - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("//www.foo.com", server.Url); } @@ -87,15 +76,14 @@ public void NoBasePath() - http paths: {} """; - var reader = new OpenApiStringReader(new() + var settings = new OpenApiReaderSettings { BaseUrl = new("https://www.foo.com/spec.yaml") - }); - - var doc = reader.Read(input, out var diagnostic); + }; - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var result = OpenApiDocument.Parse(input, "yaml", settings); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("http://www.foo.com", server.Url); } @@ -111,14 +99,10 @@ public void JustBasePathNoDefault() basePath: /baz paths: {} """; - var reader = new OpenApiStringReader(new() - { - }); + var result = OpenApiDocument.Parse(input, "yaml"); - var doc = reader.Read(input, out var diagnostic); - - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("/baz", server.Url); } @@ -135,15 +119,15 @@ public void JustSchemeWithCustomHost() - http paths: {} """; - var reader = new OpenApiStringReader(new() + var settings = new OpenApiReaderSettings { BaseUrl = new("https://bing.com/foo") - }); + }; - var doc = reader.Read(input, out var diagnostic); + var result = OpenApiDocument.Parse(input, "yaml", settings); - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("http://bing.com/foo", server.Url); } @@ -160,15 +144,15 @@ public void JustSchemeWithCustomHostWithEmptyPath() - http paths: {} """; - var reader = new OpenApiStringReader(new() + var settings = new OpenApiReaderSettings { BaseUrl = new("https://bing.com") - }); + }; - var doc = reader.Read(input, out var diagnostic); + var result = OpenApiDocument.Parse(input, "yaml", settings); - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("http://bing.com", server.Url); } @@ -184,15 +168,15 @@ public void JustBasePathWithCustomHost() basePath: /api paths: {} """; - var reader = new OpenApiStringReader(new() + var settings = new OpenApiReaderSettings { BaseUrl = new("https://bing.com") - }); + }; - var doc = reader.Read(input, out var diagnostic); + var result = OpenApiDocument.Parse(input, "yaml", settings); - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("https://bing.com/api", server.Url); } @@ -208,15 +192,15 @@ public void JustHostWithCustomHost() host: www.example.com paths: {} """; - var reader = new OpenApiStringReader(new() + var settings = new OpenApiReaderSettings { BaseUrl = new("https://bing.com") - }); + }; - var doc = reader.Read(input, out var diagnostic); + var result = OpenApiDocument.Parse(input, "yaml", settings); - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("https://www.example.com", server.Url); } @@ -232,15 +216,15 @@ public void JustHostWithCustomHostWithApi() host: prod.bing.com paths: {} """; - var reader = new OpenApiStringReader(new() + + var settings = new OpenApiReaderSettings { BaseUrl = new("https://dev.bing.com/api/description.yaml") - }); + }; - var doc = reader.Read(input, out var _); - - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var result = OpenApiDocument.Parse(input, "yaml", settings); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("https://prod.bing.com", server.Url); } @@ -258,17 +242,17 @@ public void MultipleServers() - https paths: {} """; - var reader = new OpenApiStringReader(new() + + var settings = new OpenApiReaderSettings { BaseUrl = new("https://dev.bing.com/api") - }); + }; - var doc = reader.Read(input, out var diagnostic); - - var server = doc.Servers.First(); - Assert.Equal(2, doc.Servers.Count); + var result = OpenApiDocument.Parse(input, "yaml", settings); + var server = result.OpenApiDocument.Servers.First(); + Assert.Equal(2, result.OpenApiDocument.Servers.Count); Assert.Equal("http://dev.bing.com/api", server.Url); - Assert.Equal("https://dev.bing.com/api", doc.Servers.Last().Url); + Assert.Equal("https://dev.bing.com/api", result.OpenApiDocument.Servers.Last().Url); } [Fact] @@ -283,15 +267,16 @@ public void LocalHostWithCustomHost() host: localhost:23232 paths: {} """; - var reader = new OpenApiStringReader(new() + + var settings = new OpenApiReaderSettings { BaseUrl = new("https://bing.com") - }); + }; - var doc = reader.Read(input, out var diagnostic); + var result = OpenApiDocument.Parse(input, "yaml", settings); - var server = doc.Servers.First(); - Assert.Single(doc.Servers); + var server = result.OpenApiDocument.Servers.First(); + Assert.Single(result.OpenApiDocument.Servers); Assert.Equal("https://localhost:23232", server.Url); } @@ -307,14 +292,15 @@ public void InvalidHostShouldYieldError() host: http://test.microsoft.com paths: {} """; - var reader = new OpenApiStringReader(new() + + var settings = new OpenApiReaderSettings { BaseUrl = new("https://bing.com") - }); + }; - var doc = reader.Read(input, out var diagnostic); - doc.Servers.Count.Should().Be(0); - diagnostic.Should().BeEquivalentTo( + var result = OpenApiDocument.Parse(input, "yaml", settings); + result.OpenApiDocument.Servers.Count.Should().Be(0); + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic { Errors = diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index 465957e69..da786e6ce 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -30,15 +30,14 @@ public static T Clone(T element) where T : IOpenApiSerializable using var streamReader = new StreamReader(stream); var result = streamReader.ReadToEnd(); - return new OpenApiStringReader().ReadFragment(result, OpenApiSpecVersion.OpenApi3_1, out OpenApiDiagnostic diagnostic4); + return OpenApiModelFactory.Parse(result, OpenApiSpecVersion.OpenApi3_1, out OpenApiDiagnostic diagnostic4); } [Fact] public void ParseDocumentWithWebhooksShouldSucceed() { // Arrange and Act - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "documentWithWebhooks.yaml")); - var actual = new OpenApiStreamReader().Read(stream, out var diagnostic); + var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "documentWithWebhooks.yaml")); var petSchema = new JsonSchemaBuilder() .Type(SchemaValueType.Object) @@ -176,17 +175,16 @@ public void ParseDocumentWithWebhooksShouldSucceed() }; // Assert - var schema = actual.Webhooks["/pets"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; - diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1 }); - actual.Should().BeEquivalentTo(expected); + var schema = actual.OpenApiDocument.Webhooks["/pets"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; + actual.OpenApiDiagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1 }); + actual.OpenApiDocument.Should().BeEquivalentTo(expected); } [Fact] public void ParseDocumentsWithReusablePathItemInWebhooksSucceeds() { // Arrange && Act - using var stream = Resources.GetStream("V31Tests/Samples/OpenApiDocument/documentWithReusablePaths.yaml"); - var actual = new OpenApiStreamReader().Read(stream, out var context); + var actual = OpenApiDocument.Load("V31Tests/Samples/OpenApiDocument/documentWithReusablePaths.yaml"); var components = new OpenApiComponents { @@ -302,7 +300,7 @@ public void ParseDocumentsWithReusablePathItemInWebhooksSucceeds() { Type = ReferenceType.PathItem, Id = "/pets", - HostDocument = actual + HostDocument = actual.OpenApiDocument } } }; @@ -320,8 +318,8 @@ public void ParseDocumentsWithReusablePathItemInWebhooksSucceeds() }; // Assert - actual.Should().BeEquivalentTo(expected); - context.Should().BeEquivalentTo( + actual.OpenApiDocument.Should().BeEquivalentTo(expected); + actual.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1 }); } @@ -329,11 +327,10 @@ public void ParseDocumentsWithReusablePathItemInWebhooksSucceeds() public void ParseDocumentWithDescriptionInDollarRefsShouldSucceed() { // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "documentWithSummaryAndDescriptionInReference.yaml")); + var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "documentWithSummaryAndDescriptionInReference.yaml")); // Act - var actual = new OpenApiStreamReader().Read(stream, out var diagnostic); - var header = actual.Components.Responses["Test"].Headers["X-Test"]; + var header = actual.OpenApiDocument.Components.Responses["Test"].Headers["X-Test"]; // Assert Assert.True(header.Description == "A referenced X-Test header"); /*response header #ref's description overrides the header's description*/ @@ -343,12 +340,12 @@ public void ParseDocumentWithDescriptionInDollarRefsShouldSucceed() public void ParseDocumentWithExampleInSchemaShouldSucceed() { // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithExample.yaml")); var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = false }); + // Act - var actual = new OpenApiStreamReader().Read(stream, out var diagnostic); - actual.SerializeAsV31(writer); + var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "docWithExample.yaml")); + actual.OpenApiDocument.SerializeAsV31(writer); // Assert Assert.NotNull(actual); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs index daa71c020..50cadb81c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/JsonSchemaTests.cs @@ -24,6 +24,11 @@ public class JsonSchemaTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiSchema/"; + public JsonSchemaTests() + { + OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); + } + [Fact] public void ParsePrimitiveSchemaShouldSucceed() { @@ -59,11 +64,10 @@ public void ParseExampleStringFragmentShouldSucceed() ""foo"": ""bar"", ""baz"": [ 1,2] }"; - var reader = new OpenApiStringReader(); var diagnostic = new OpenApiDiagnostic(); // Act - var openApiAny = reader.ReadFragment(input, OpenApiSpecVersion.OpenApi3_0, out diagnostic); + var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out diagnostic); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); @@ -84,11 +88,10 @@ public void ParseEnumFragmentShouldSucceed() ""foo"", ""baz"" ]"; - var reader = new OpenApiStringReader(); var diagnostic = new OpenApiDiagnostic(); // Act - var openApiAny = reader.ReadFragment(input, OpenApiSpecVersion.OpenApi3_0, out diagnostic); + var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out diagnostic); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); @@ -111,11 +114,10 @@ public void ParsePathFragmentShouldSucceed() '200': description: Ok "; - var reader = new OpenApiStringReader(); var diagnostic = new OpenApiDiagnostic(); // Act - var openApiAny = reader.ReadFragment(input, OpenApiSpecVersion.OpenApi3_0, out diagnostic); + var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out diagnostic, "yaml"); // Assert diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic()); @@ -206,14 +208,13 @@ public void ParseBasicSchemaWithExampleShouldSucceed() [Fact] public void ParseBasicSchemaWithReferenceShouldSucceed() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicSchemaWithReference.yaml")); // Act - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "basicSchemaWithReference.yaml")); // Assert - var components = openApiDoc.Components; + var components = result.OpenApiDocument.Components; - diagnostic.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, @@ -257,9 +258,8 @@ public void ParseBasicSchemaWithReferenceShouldSucceed() [Fact] public void ParseAdvancedSchemaWithReferenceShouldSucceed() { - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "advancedSchemaWithReference.yaml")); // Act - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "advancedSchemaWithReference.yaml")); var expectedComponents = new OpenApiComponents { @@ -337,7 +337,7 @@ public void ParseAdvancedSchemaWithReferenceShouldSucceed() }; // We serialize so that we can get rid of the schema BaseUri properties which show up as diffs - var actual = openApiDoc.Components.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = result.OpenApiDocument.Components.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); var expected = expectedComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); // Assert diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs index 55c3eb64b..9190744d7 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs @@ -129,7 +129,7 @@ public void ParseMultipleCallbacksWithReferenceShouldSucceed() var path = result.OpenApiDocument.Paths.First().Value; var subscribeOperation = path.Operations[OperationType.Post]; - result.OpenApiDocument.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); var callback1 = subscribeOperation.Callbacks["simpleHook"]; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 748572ba5..d7b038830 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -46,7 +46,7 @@ public T Clone(T element) where T : IOpenApiSerializable using (var streamReader = new StreamReader(stream)) { var result = streamReader.ReadToEnd(); - return new OpenApiStringReader().ReadFragment(result, OpenApiSpecVersion.OpenApi3_0, out OpenApiDiagnostic diagnostic4); + return OpenApiModelFactory.Parse(result, OpenApiSpecVersion.OpenApi3_0, out OpenApiDiagnostic diagnostic4); } } } @@ -68,7 +68,7 @@ public OpenApiSecurityScheme CloneSecurityScheme(OpenApiSecurityScheme element) using (var streamReader = new StreamReader(stream)) { var result = streamReader.ReadToEnd(); - return new OpenApiStringReader().ReadFragment(result, OpenApiSpecVersion.OpenApi3_0, out OpenApiDiagnostic diagnostic4); + return OpenApiModelFactory.Parse(result, OpenApiSpecVersion.OpenApi3_0, out OpenApiDiagnostic diagnostic4); } } } @@ -76,16 +76,16 @@ public OpenApiSecurityScheme CloneSecurityScheme(OpenApiSecurityScheme element) [Fact] public void ParseDocumentFromInlineStringShouldSucceed() { - var openApiDoc = OpenApiDocument.Parse( + var result = OpenApiDocument.Parse( @" openapi : 3.0.0 info: title: Simple Document version: 0.9.1 paths: {}", - out var context, OpenApiConstants.Yaml); + OpenApiConstants.Yaml); - openApiDoc.Should().BeEquivalentTo( + result.OpenApiDocument.Should().BeEquivalentTo( new OpenApiDocument { Info = new OpenApiInfo @@ -96,7 +96,7 @@ public void ParseDocumentFromInlineStringShouldSucceed() Paths = new OpenApiPaths() }); - context.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, @@ -111,9 +111,9 @@ public void ParseDocumentFromInlineStringShouldSucceed() public void ParseBasicDocumentWithMultipleServersShouldSucceed() { var path = Path.Combine(SampleFolderPath, "basicDocumentWithMultipleServers.yaml"); - var openApiDoc = OpenApiDocument.Load(path, out var diagnostic); + var result = OpenApiDocument.Load(path); - diagnostic.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, @@ -123,7 +123,7 @@ public void ParseBasicDocumentWithMultipleServersShouldSucceed() } }); - openApiDoc.Should().BeEquivalentTo( + result.OpenApiDocument.Should().BeEquivalentTo( new OpenApiDocument { Info = new OpenApiInfo @@ -151,9 +151,9 @@ public void ParseBasicDocumentWithMultipleServersShouldSucceed() public void ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "brokenMinimalDocument.yaml")); - var openApiDoc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var diagnostic); + var result = OpenApiDocument.Load(stream, OpenApiConstants.Yaml); - openApiDoc.Should().BeEquivalentTo( + result.OpenApiDocument.Should().BeEquivalentTo( new OpenApiDocument { Info = new OpenApiInfo @@ -163,7 +163,7 @@ public void ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() Paths = new OpenApiPaths() }); - diagnostic.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic { Errors = @@ -178,9 +178,9 @@ public void ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() [Fact] public void ParseMinimalDocumentShouldSucceed() { - var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "minimalDocument.yaml"), out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "minimalDocument.yaml")); - openApiDoc.Should().BeEquivalentTo( + result.OpenApiDocument.Should().BeEquivalentTo( new OpenApiDocument { Info = new OpenApiInfo @@ -191,7 +191,7 @@ public void ParseMinimalDocumentShouldSucceed() Paths = new OpenApiPaths() }); - diagnostic.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, @@ -206,7 +206,7 @@ public void ParseMinimalDocumentShouldSucceed() public void ParseStandardPetStoreDocumentShouldSucceed() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); - var doc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var context); + var result = OpenApiDocument.Load(stream, OpenApiConstants.Yaml); var components = new OpenApiComponents { @@ -510,9 +510,9 @@ public void ParseStandardPetStoreDocumentShouldSucceed() Components = components }; - doc.Should().BeEquivalentTo(expectedDoc); + result.OpenApiDocument.Should().BeEquivalentTo(expectedDoc); - context.Should().BeEquivalentTo( + result.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); } @@ -520,7 +520,7 @@ public void ParseStandardPetStoreDocumentShouldSucceed() public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStoreWithTagAndSecurity.yaml")); - var actual = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var context); + var actual = OpenApiDocument.Load(stream, OpenApiConstants.Yaml); var components = new OpenApiComponents { @@ -561,7 +561,7 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() { Id = "securitySchemeName1", Type = ReferenceType.SecurityScheme, - HostDocument = actual + HostDocument = actual.OpenApiDocument } }, @@ -573,7 +573,7 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() { Id = "securitySchemeName2", Type = ReferenceType.SecurityScheme, - HostDocument = actual + HostDocument = actual.OpenApiDocument } } } @@ -943,39 +943,39 @@ public void ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() } }; - actual.Should().BeEquivalentTo(expected, options => options.Excluding(m => m.Name == "HostDocument")); + actual.OpenApiDocument.Should().BeEquivalentTo(expected, options => options.Excluding(m => m.Name == "HostDocument")); - context.Should().BeEquivalentTo( + actual.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); } [Fact] public void ParsePetStoreExpandedShouldSucceed() { - var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "petStoreExpanded.yaml"), out var context); + var actual = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "petStoreExpanded.yaml")); // TODO: Create the object in memory and compare with the one read from YAML file. - context.Should().BeEquivalentTo( + actual.OpenApiDiagnostic.Should().BeEquivalentTo( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); } [Fact] public void GlobalSecurityRequirementShouldReferenceSecurityScheme() { - var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "securedApi.yaml"), out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "securedApi.yaml")); - var securityRequirement = openApiDoc.SecurityRequirements.First(); + var securityRequirement = result.OpenApiDocument.SecurityRequirements.First(); - Assert.Same(securityRequirement.Keys.First(), openApiDoc.Components.SecuritySchemes.First().Value); + Assert.Same(securityRequirement.Keys.First(), result.OpenApiDocument.Components.SecuritySchemes.First().Value); } [Fact] public void HeaderParameterShouldAllowExample() { - var openApiDoc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml"), out var diagnostic); + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml")); - var exampleHeader = openApiDoc.Components?.Headers?["example-header"]; + var exampleHeader = result.OpenApiDocument.Components?.Headers?["example-header"]; Assert.NotNull(exampleHeader); exampleHeader.Should().BeEquivalentTo( new OpenApiHeader() @@ -999,7 +999,7 @@ public void HeaderParameterShouldAllowExample() }, options => options.IgnoringCyclicReferences() .Excluding(e => e.Example.Node.Parent)); - var examplesHeader = openApiDoc.Components?.Headers?["examples-header"]; + var examplesHeader = result.OpenApiDocument.Components?.Headers?["examples-header"]; Assert.NotNull(examplesHeader); examplesHeader.Should().BeEquivalentTo( new OpenApiHeader() @@ -1046,8 +1046,8 @@ public void ParseDocumentWithReferencedSecuritySchemeWorks() ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences }; - var doc = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml"), out var context, settings); - var securityScheme = doc.Components.SecuritySchemes["OAuth2"]; + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml"), settings); + var securityScheme = result.OpenApiDocument.Components.SecuritySchemes["OAuth2"]; // Assert Assert.False(securityScheme.UnresolvedReference); @@ -1065,9 +1065,9 @@ public void ParseDocumentWithJsonSchemaReferencesWorks() { ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences }; - var doc = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, out var diagnostic, settings); + var result = OpenApiDocument.Load(stream, OpenApiConstants.Yaml, settings); - var actualSchema = doc.Paths["/users/{userId}"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; + var actualSchema = result.OpenApiDocument.Paths["/users/{userId}"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; var expectedSchema = new JsonSchemaBuilder() .Ref("#/components/schemas/User") diff --git a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs index b2cd1143b..eb8366817 100644 --- a/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs +++ b/test/Microsoft.OpenApi.SmokeTests/ApiGurus.cs @@ -7,7 +7,8 @@ using System.Net; using System.Net.Http; using System.Threading.Tasks; -using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Newtonsoft.Json.Linq; using Xunit; using Xunit.Abstractions; @@ -87,17 +88,17 @@ public async Task EnsureThatICouldParse(string url) var stopwatch = new Stopwatch(); stopwatch.Start(); - var reader = new OpenApiStreamReader(); - var openApiDocument = reader.Read(stream, out var diagnostic); + var format = OpenApiModelFactory.GetFormat(url); + var result = OpenApiDocument.Load(stream, format); - if (diagnostic.Errors.Count > 0) + if (result.OpenApiDiagnostic.Errors.Count > 0) { _output.WriteLine($"Errors parsing {url}"); - _output.WriteLine(String.Join('\n', diagnostic.Errors)); + _output.WriteLine(String.Join('\n', result.OpenApiDiagnostic.Errors)); // Assert.True(false); // Uncomment to identify descriptions with errors. } - Assert.NotNull(openApiDocument); + Assert.NotNull(result.OpenApiDocument); stopwatch.Stop(); _output.WriteLine($"Parsing {url} took {stopwatch.ElapsedMilliseconds} ms."); } diff --git a/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs b/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs index 2e5cf9d4b..8e2344fc1 100644 --- a/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs +++ b/test/Microsoft.OpenApi.SmokeTests/GraphTests.cs @@ -3,7 +3,6 @@ using System; using System.Net; using System.Net.Http; -using Microsoft.OpenApi.Readers; using Xunit; using Xunit.Abstractions; @@ -38,13 +37,13 @@ public GraphTests(ITestOutputHelper output) var stream = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); ; - var reader = new OpenApiStreamReader(); - _graphOpenApi = reader.Read(stream, out var diagnostic); + var result = OpenApiDocument.Load(stream, "json"); + _graphOpenApi = result.OpenApiDocument; - if (diagnostic.Errors.Count > 0) + if (result.OpenApiDiagnostic.Errors.Count > 0) { _output.WriteLine($"Errors parsing"); - _output.WriteLine(String.Join('\n', diagnostic.Errors)); + _output.WriteLine(String.Join('\n', result.OpenApiDiagnostic.Errors)); // Assert.True(false); // Uncomment to identify descriptions with errors. } } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index af61e646d..d093ee64c 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -12,6 +12,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using Microsoft.VisualBasic; @@ -25,6 +26,11 @@ namespace Microsoft.OpenApi.Tests.Models [UsesVerify] public class OpenApiDocumentTests { + public OpenApiDocumentTests() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + } + public static readonly OpenApiComponents TopLevelReferencingComponents = new OpenApiComponents() { Schemas = @@ -857,13 +863,6 @@ public class OpenApiDocumentTests } }; - private readonly ITestOutputHelper _output; - - public OpenApiDocumentTests(ITestOutputHelper output) - { - _output = output; - } - [Theory] [InlineData(false)] [InlineData(true)] @@ -1202,32 +1201,12 @@ private static OpenApiDocument ParseInputFile(string filePath) { // Read in the input yaml file using FileStream stream = File.OpenRead(filePath); - var openApiDoc = new OpenApiStreamReader().Read(stream, out var diagnostic); + var format = OpenApiModelFactory.GetFormat(filePath); + var openApiDoc = OpenApiDocument.Load(stream, format).OpenApiDocument; return openApiDoc; } - //[Fact] - //public void CopyConstructorForAdvancedDocumentWorks() - //{ - // // Arrange & Act - // var doc = new OpenApiDocument(AdvancedDocument); - - // var docOpId = doc.Paths["/pets"].Operations[OperationType.Get].OperationId = "findAllMyPets"; - // var advancedDocOpId = AdvancedDocument.Paths["/pets"].Operations[OperationType.Get].OperationId; - // var responseSchemaTypeCopy = doc.Paths["/pets"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema.Type = "object"; - // var advancedDocResponseSchemaType = AdvancedDocument.Paths["/pets"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema.Type; - - // // Assert - // Assert.NotNull(doc.Info); - // Assert.NotNull(doc.Servers); - // Assert.NotNull(doc.Paths); - // Assert.Equal(2, doc.Paths.Count); - // Assert.NotNull(doc.Components); - // Assert.NotEqual(docOpId, advancedDocOpId); - // Assert.NotEqual(responseSchemaTypeCopy, advancedDocResponseSchemaType); - //} - [Fact] public void SerializeV2DocumentWithNonArraySchemaTypeDoesNotWriteOutCollectionFormat() { diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs index c2fd2b9db..02ee501e3 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -126,9 +127,9 @@ public class OpenApiCallbackReferenceTests public OpenApiCallbackReferenceTests() { - var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - OpenApiDocument openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + OpenApiDocument openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + OpenApiDocument openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; openApiDoc_2.Workspace = new(); openApiDoc_2.Workspace.AddDocument("http://localhost/callbackreference", openApiDoc); _localCallbackReference = new("callbackEvent", openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index 5ef061cbb..819c986de 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -85,9 +86,9 @@ public class OpenApiExampleReferenceTests public OpenApiExampleReferenceTests() { - var reader = new OpenApiStringReader(); - _openApiDoc = reader.Read(OpenApi, out _); - _openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + _openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; _openApiDoc_2.Workspace = new(); _openApiDoc_2.Workspace.AddDocument("http://localhost/examplereference", _openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs index 3ab1895d1..7f699725b 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -65,9 +66,9 @@ public class OpenApiHeaderReferenceTests public OpenApiHeaderReferenceTests() { - var reader = new OpenApiStringReader(); - _openApiDoc = reader.Read(OpenApi, out _); - _openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + _openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; _openApiDoc_2.Workspace = new(); _openApiDoc_2.Workspace.AddDocument("http://localhost/headerreference", _openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs index ccd4d3de6..a54a47db1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -99,9 +100,9 @@ public class OpenApiLinkReferenceTests public OpenApiLinkReferenceTests() { - var reader = new OpenApiStringReader(); - _openApiDoc = reader.Read(OpenApi, out _); - _openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + _openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; _openApiDoc_2.Workspace = new(); _openApiDoc_2.Workspace.AddDocument("http://localhost/linkreferencesample", _openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs index 593c76761..8568f1c44 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -66,9 +67,9 @@ public class OpenApiParameterReferenceTests public OpenApiParameterReferenceTests() { - var reader = new OpenApiStringReader(); - _openApiDoc = reader.Read(OpenApi, out _); - _openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + _openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; _openApiDoc_2.Workspace = new(); _openApiDoc_2.Workspace.AddDocument("http://localhost/parameterreference", _openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs index 86a82aacc..5d77bde1b 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -66,9 +67,9 @@ public class OpenApiPathItemReferenceTests public OpenApiPathItemReferenceTests() { - var reader = new OpenApiStringReader(); - _openApiDoc = reader.Read(OpenApi, out _); - _openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + _openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; _openApiDoc_2.Workspace = new(); _openApiDoc_2.Workspace.AddDocument("http://localhost/pathitemreference", _openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index edfb81e09..c0ce9bcef 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -9,6 +9,7 @@ using Json.Schema; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -79,9 +80,9 @@ public class OpenApiRequestBodyReferenceTests public OpenApiRequestBodyReferenceTests() { - var reader = new OpenApiStringReader(); - _openApiDoc = reader.Read(OpenApi, out _); - _openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + _openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; _openApiDoc_2.Workspace = new(); _openApiDoc_2.Workspace.AddDocument("http://localhost/requestbodyreference", _openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index 3ee277209..0fed16f31 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -8,6 +8,7 @@ using Json.Schema; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -63,9 +64,9 @@ public class OpenApiResponseReferenceTest public OpenApiResponseReferenceTest() { - var reader = new OpenApiStringReader(); - _openApiDoc = reader.Read(OpenApi, out _); - _openApiDoc_2 = reader.Read(OpenApi_2, out _); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + _openApiDoc = OpenApiDocument.Parse(OpenApi, "yaml").OpenApiDocument; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, "yaml").OpenApiDocument; _openApiDoc_2.Workspace = new(); _openApiDoc_2.Workspace.AddDocument("http://localhost/responsereference", _openApiDoc); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index a0bf9ea38..a74712829 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -42,9 +43,9 @@ public class OpenApiSecuritySchemeReferenceTests public OpenApiSecuritySchemeReferenceTests() { - var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiSecuritySchemeReference = new("mySecurityScheme", openApiDoc); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + var result = OpenApiDocument.Parse(OpenApi, "yaml"); + _openApiSecuritySchemeReference = new("mySecurityScheme", result.OpenApiDocument); } [Fact] diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs index bff7b6b8c..0b2efe1b0 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; using VerifyXunit; @@ -62,9 +63,9 @@ public class OpenApiTagReferenceTest public OpenApiTagReferenceTest() { - var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiTagReference = new("user", openApiDoc) + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + var result = OpenApiDocument.Parse(OpenApi, "yaml"); + _openApiTagReference = new("user", result.OpenApiDocument) { Description = "Users operations" }; From 895b48b138f6e5e2938591ba2324d5df16dfd174 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 19 Feb 2024 13:10:26 +0300 Subject: [PATCH 39/47] Update API interface --- .../PublicApi/PublicApi.approved.txt | 166 ++++-------------- 1 file changed, 31 insertions(+), 135 deletions(-) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 2d34a2ccb..9ec79d0b0 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -292,21 +292,12 @@ namespace Microsoft.OpenApi.Interfaces } public interface IOpenApiReader { - Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); - T Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) - where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; - Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.Stream stream, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); - Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.TextReader input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); - Microsoft.OpenApi.Models.OpenApiDocument Read(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null); - T Read(System.IO.Stream input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) - where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; - T Read(System.IO.TextReader input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); + System.Threading.Tasks.Task ReadAsync(System.Text.Json.Nodes.JsonNode jsonNode, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings, string format = null, System.Threading.CancellationToken cancellationToken = default); + T ReadFragment(System.IO.TextReader input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; - T Read(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + T ReadFragment(System.Text.Json.Nodes.JsonNode input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; - System.Threading.Tasks.Task ReadAsync(System.IO.Stream stream, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); - System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); - System.Threading.Tasks.Task ReadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default); } public interface IOpenApiReferenceable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -432,10 +423,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiCallback Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiCallback Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiCallback Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiCallback Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiComponents : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -455,10 +442,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiComponents Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiComponents Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiComponents Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiComponents Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public static class OpenApiConstants { @@ -608,10 +591,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiContact Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiContact Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiContact Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiContact Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiDiscriminator : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -623,10 +602,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiDiscriminator Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiDiscriminator Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiDocument : Json.Schema.IBaseDocument, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -652,13 +627,13 @@ namespace Microsoft.OpenApi.Models public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public static string GenerateHashValue(Microsoft.OpenApi.Models.OpenApiDocument doc) { } - public static Microsoft.OpenApi.Models.OpenApiDocument Load(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiDocument Load(System.IO.Stream stream, string format, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiDocument Load(System.IO.TextReader input, string format, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static System.Threading.Tasks.Task LoadAAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream stream, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Reader.ReadResult Load(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Reader.ReadResult Load(System.IO.Stream stream, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Reader.ReadResult Load(System.IO.TextReader input, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static System.Threading.Tasks.Task LoadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } public static System.Threading.Tasks.Task LoadAsync(System.IO.TextReader input, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream stream, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } + public static Microsoft.OpenApi.Reader.ReadResult Parse(string input, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiEncoding : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -673,10 +648,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiEncoding Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiEncoding Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiEncoding Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiEncoding Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiError { @@ -705,10 +676,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiExample Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiExample Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiExample Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiExample Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } 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 @@ -730,10 +697,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiExternalDocs Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiExternalDocs Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiExternalDocs Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiExternalDocs Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiHeader : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -760,10 +723,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiHeader Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiHeader Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiHeader Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiHeader Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiInfo : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -780,10 +739,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiInfo Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiInfo Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiInfo Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiInfo Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiLicense : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -796,10 +751,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiLicense Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiLicense Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiLicense Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiLicense Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiLink : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -821,10 +772,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiLink Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiLink Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiLink Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiLink Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiMediaType : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -838,10 +785,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiMediaType Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiMediaType Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiMediaType Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiMediaType Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiOAuthFlow : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -855,10 +798,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiOAuthFlow Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOAuthFlow Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOAuthFlow Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOAuthFlow Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiOAuthFlows : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -872,10 +811,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiOAuthFlows Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOAuthFlows Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOAuthFlows Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOAuthFlows Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiOperation : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -898,10 +833,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiOperation Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOperation Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOperation Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiOperation Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiParameter : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -930,10 +861,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiParameter Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiParameter Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiParameter Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiParameter Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiPathItem : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -955,10 +882,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiPathItem Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiPathItem Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiPathItem Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiPathItem Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiPaths : Microsoft.OpenApi.Models.OpenApiExtensibleDictionary { @@ -1001,10 +924,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiRequestBody Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiRequestBody Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiRequestBody Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiRequestBody Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiResponse : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1024,10 +943,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiResponse Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiResponse Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiResponse Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiResponse Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiResponses : Microsoft.OpenApi.Models.OpenApiExtensibleDictionary { @@ -1040,10 +955,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiSecurityRequirement Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiSecurityScheme : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1066,10 +977,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiSecurityScheme Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiServer : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1082,10 +989,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiServer Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiServer Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiServer Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiServer Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiServerVariable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1098,10 +1001,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiServerVariable Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiServerVariable Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiServerVariable Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiServerVariable Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1119,10 +1018,6 @@ namespace Microsoft.OpenApi.Models public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public static Microsoft.OpenApi.Models.OpenApiTag Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiTag Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiTag Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiTag Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public class OpenApiXml : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1137,10 +1032,6 @@ namespace Microsoft.OpenApi.Models 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 static Microsoft.OpenApi.Models.OpenApiXml Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiXml Load(System.IO.Stream stream, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiXml Load(System.IO.TextReader input, string format, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static Microsoft.OpenApi.Models.OpenApiXml Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } } public enum OperationType { @@ -1249,10 +1140,6 @@ namespace Microsoft.OpenApi.Models.References } namespace Microsoft.OpenApi.Reader { - public static class HttpClientFactory - { - public static System.Net.Http.HttpClient GetHttpClient() { } - } public class OpenApiDiagnostic : Microsoft.OpenApi.Interfaces.IDiagnostic { public OpenApiDiagnostic() { } @@ -1264,26 +1151,35 @@ namespace Microsoft.OpenApi.Reader public class OpenApiJsonReader : Microsoft.OpenApi.Interfaces.IOpenApiReader { public OpenApiJsonReader() { } - public Microsoft.OpenApi.Models.OpenApiDocument Parse(string input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public T Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } + public System.Threading.Tasks.Task ReadAsync(System.Text.Json.Nodes.JsonNode jsonNode, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings, string format = null, System.Threading.CancellationToken cancellationToken = default) { } + public T ReadFragment(System.IO.TextReader input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } - public Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.Stream stream, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public Microsoft.OpenApi.Models.OpenApiDocument Read(System.IO.TextReader input, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public Microsoft.OpenApi.Models.OpenApiDocument Read(string url, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public T Read(System.IO.Stream input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public T ReadFragment(System.Text.Json.Nodes.JsonNode input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } - public T Read(System.IO.TextReader input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + } + public static class OpenApiModelFactory + { + public static string GetFormat(string url) { } + public static Microsoft.OpenApi.Reader.ReadResult Load(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Reader.ReadResult Load(System.IO.Stream stream, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static Microsoft.OpenApi.Reader.ReadResult Load(System.IO.TextReader input, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static T Load(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } - public T Read(string url, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public static T Load(System.IO.Stream input, Microsoft.OpenApi.OpenApiSpecVersion version, string format, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } - public T Read(System.Text.Json.Nodes.JsonNode input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public static T Load(System.IO.TextReader input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } + public static System.Threading.Tasks.Task LoadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream input, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } + public static System.Threading.Tasks.Task LoadAsync(System.IO.TextReader input, string format, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } + public static Microsoft.OpenApi.Reader.ReadResult Parse(string input, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } + public static T Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } - public System.Threading.Tasks.Task ReadAsync(System.IO.Stream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } - public System.Threading.Tasks.Task ReadAsync(System.IO.TextReader input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } - public System.Threading.Tasks.Task ReadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } } public static class OpenApiReaderRegistry { + public static readonly Microsoft.OpenApi.Interfaces.IOpenApiReader DefaultReader; public static Microsoft.OpenApi.Interfaces.IOpenApiReader GetReader(string format) { } public static void RegisterReader(string format, Microsoft.OpenApi.Interfaces.IOpenApiReader reader) { } } From 77f45b0d35c3ebb8be1b85545a8162f1d4e8fb8b Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Mon, 19 Feb 2024 14:27:07 +0300 Subject: [PATCH 40/47] Remove unnecessary usings --- src/Microsoft.OpenApi/Models/OpenApiCallback.cs | 4 +--- src/Microsoft.OpenApi/Models/OpenApiComponents.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiContact.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiDocument.cs | 1 - src/Microsoft.OpenApi/Models/OpenApiEncoding.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiExample.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiInfo.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiLicense.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiLink.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiMediaType.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiOperation.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiParameter.cs | 3 --- src/Microsoft.OpenApi/Models/OpenApiPathItem.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiResponse.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiServer.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiTag.cs | 2 -- src/Microsoft.OpenApi/Models/OpenApiXml.cs | 2 -- 26 files changed, 1 insertion(+), 53 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index 51167a81d..23910545b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -188,6 +186,6 @@ public void SerializeAsV2(IOpenApiWriter writer) public void SerializeAsV2WithoutReference(IOpenApiWriter writer) { // Callback object does not exist in V2. - } + } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index 92131ff6b..4af4248ab 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -3,11 +3,9 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using Json.Schema; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiContact.cs b/src/Microsoft.OpenApi/Models/OpenApiContact.cs index 7fda17102..15d67cc76 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiContact.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiContact.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs index 3925491ac..342025f9f 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs @@ -2,9 +2,7 @@ // Licensed under the MIT license. using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 17db8a438..d42f46638 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Security.Cryptography; using System.Text; -using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; using Json.Schema; diff --git a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs index 79151f3f3..9ab0e7468 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index c57ca3908..8d101b129 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -3,11 +3,9 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs index e8d3b09ec..cceace01d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index 4c4429f69..be10435dd 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -3,13 +3,11 @@ using System; using System.Collections.Generic; -using System.IO; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs index 9f9ac6fb1..68e37ee20 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs index da53b183d..6a8d4bcf7 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiLink.cs b/src/Microsoft.OpenApi/Models/OpenApiLink.cs index 90894b709..794d1c15a 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLink.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLink.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs index 32df23c0c..353f88f11 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs @@ -3,12 +3,10 @@ using System; using System.Collections.Generic; -using System.IO; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs index ebf70ed2d..2385a4c55 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs index f650cd9a7..5211159a4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs index 9d5b181b8..9f05669f0 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index dd78df33c..dab561d37 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -3,14 +3,11 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Linq; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs index a84b429ed..18a56a94b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs index 8fb5960ee..70abaf5ff 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -3,12 +3,10 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using Json.Schema; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index fcb49c9e3..9aa136a77 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs index 675487ca4..d78a4d8e3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index dd7f84f4b..2f2f7fa5f 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiServer.cs b/src/Microsoft.OpenApi/Models/OpenApiServer.cs index f932465e6..b580f7fbb 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServer.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServer.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs index 62b24f44e..f178c23a1 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs @@ -2,9 +2,7 @@ // Licensed under the MIT license. using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs index 964070444..0feeb685c 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models diff --git a/src/Microsoft.OpenApi/Models/OpenApiXml.cs b/src/Microsoft.OpenApi/Models/OpenApiXml.cs index 4edaf0916..d0ee6a00b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiXml.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiXml.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.IO; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models From 085c1f1da526c0f8b6e0804f2ddbe46c137f7935 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 20 Feb 2024 18:03:52 +0300 Subject: [PATCH 41/47] Auto-register the YamlReader in Hidi --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 95513328f..9adc4e2dc 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -40,6 +40,12 @@ namespace Microsoft.OpenApi.Hidi { internal static class OpenApiService { + static OpenApiService() + { + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yml, new OpenApiYamlReader()); + } + /// /// Implementation of the transform command /// From 889fcdeedb9f40f48435d76805a306abb94fe12e Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 20 Feb 2024 18:04:08 +0300 Subject: [PATCH 42/47] Remove unnecessary usings --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 3 +-- src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 9adc4e2dc..fd8b53592 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -19,7 +19,6 @@ using System.Xml.Xsl; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; using Microsoft.OData.Edm.Csdl; using Microsoft.OpenApi.ApiManifest; using Microsoft.OpenApi.ApiManifest.OpenAI; diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index 3e85fa5d9..e2ec7bdc9 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -5,7 +5,6 @@ using System.IO; using System.Linq; using System.Net.Http; -using System.Runtime; using System.Security; using System.Threading; using System.Threading.Tasks; From fcbabd48e5e68f83c0d45ae6eed5649fd6b65fdc Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 28 Feb 2024 12:59:32 +0300 Subject: [PATCH 43/47] Add the SpecVersionAttribute decorator to the custom Extensions keyword for JsonSchema.NET to qualify it as a valid keyword --- src/Microsoft.OpenApi/Extensions/JsonSchemaBuilderExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.OpenApi/Extensions/JsonSchemaBuilderExtensions.cs b/src/Microsoft.OpenApi/Extensions/JsonSchemaBuilderExtensions.cs index e8d3a95c0..11118a207 100644 --- a/src/Microsoft.OpenApi/Extensions/JsonSchemaBuilderExtensions.cs +++ b/src/Microsoft.OpenApi/Extensions/JsonSchemaBuilderExtensions.cs @@ -278,6 +278,7 @@ public void Evaluate(EvaluationContext context) /// The extensions keyword /// [SchemaKeyword(Name)] + [SchemaSpecVersion(SpecVersion.Draft202012)] public class ExtensionsKeyword : IJsonSchemaKeyword { /// From 538013df93653370dfe43072ac9d5e6130888097 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 28 Feb 2024 13:04:30 +0300 Subject: [PATCH 44/47] Clean up --- src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs b/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs index caaddbafc..05ab521ab 100644 --- a/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs +++ b/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -52,7 +52,7 @@ public static void ValidateDataTypeMismatch( return; } - var type = schema.GetJsonType().Value.GetDisplayName(); + var type = schema.GetJsonType()?.GetDisplayName(); var format = schema.GetFormat()?.Key; var jsonElement = JsonSerializer.Deserialize(value); From 2e5c5f89058cd9a3c83c28c6636f60d7d268e15d Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 28 Feb 2024 15:11:26 +0300 Subject: [PATCH 45/47] If supplied, use the input OpenApi format as the output file extension, else default to the input file extension --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index fd8b53592..ad689ba18 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -59,7 +59,10 @@ public static async Task TransformOpenApiDocument(HidiOptions options, ILogger l { if (options.Output == null) { - var inputExtension = GetInputPathExtension(options.OpenApi, options.Csdl); +#pragma warning disable CA1308 // Normalize strings to uppercase + var inputExtension = string.Concat(".", options.OpenApiFormat.GetDisplayName().ToLowerInvariant()) + ?? GetInputPathExtension(options.OpenApi, options.Csdl); +#pragma warning restore CA1308 // Normalize strings to uppercase options.Output = new($"./output{inputExtension}"); }; From 951aadb352ea93b3838318418303819a895e642a Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 26 Mar 2024 10:43:40 +0300 Subject: [PATCH 46/47] Update API interface --- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 9ec79d0b0..38f48d1a2 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -181,6 +181,7 @@ namespace Microsoft.OpenApi.Extensions public static string GetDisplayName(this System.Enum enumValue) { } } [Json.Schema.SchemaKeyword("extensions")] + [Json.Schema.SchemaSpecVersion(Json.Schema.SpecVersion.Draft202012)] public class ExtensionsKeyword : Json.Schema.IJsonSchemaKeyword { public const string Name = "extensions"; From 2583b89b3cfc4fde04ebb03b257ce1279147cc53 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Tue, 26 Mar 2024 10:55:29 +0300 Subject: [PATCH 47/47] Clean up tests --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 2 +- .../V31Tests/OpenApiDocumentTests.cs | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index ad689ba18..519de3503 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -60,7 +60,7 @@ public static async Task TransformOpenApiDocument(HidiOptions options, ILogger l if (options.Output == null) { #pragma warning disable CA1308 // Normalize strings to uppercase - var inputExtension = string.Concat(".", options.OpenApiFormat.GetDisplayName().ToLowerInvariant()) + var inputExtension = string.Concat(".", options.OpenApiFormat?.GetDisplayName().ToLowerInvariant()) ?? GetInputPathExtension(options.OpenApi, options.Csdl); #pragma warning restore CA1308 // Normalize strings to uppercase options.Output = new($"./output{inputExtension}"); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index a459e1244..0bdfea92e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -356,13 +356,9 @@ public void ParseDocumentWithExampleInSchemaShouldSucceed() [Fact] public void ParseDocumentWithPatternPropertiesInSchemaWorks() { - // Arrange - using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithPatternPropertiesInSchema.yaml")); - - // Act - var doc = new OpenApiStreamReader().Read(stream, out var diagnostic); - - var actualSchema = doc.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; + // Arrange and Act + var result = OpenApiDocument.Load(Path.Combine(SampleFolderPath, "docWithPatternPropertiesInSchema.yaml")); + var actualSchema = result.OpenApiDocument.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; var expectedSchema = new JsonSchemaBuilder() .Type(SchemaValueType.Object) @@ -375,7 +371,7 @@ public void ParseDocumentWithPatternPropertiesInSchemaWorks() .Build(); // Serialization - var mediaType = doc.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content["application/json"]; + var mediaType = result.OpenApiDocument.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content["application/json"]; var expectedMediaType = @"schema: type: object