Skip to content

Commit 6cd0f02

Browse files
Merge branch 'release/2.0.0' into mk/validate-json-schema
2 parents d0380ce + efa812a commit 6cd0f02

File tree

10 files changed

+52
-33
lines changed

10 files changed

+52
-33
lines changed

src/Microsoft.OpenApi/Models/OpenApiConstants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,11 @@ public static class OpenApiConstants
635635
/// </summary>
636636
public const string BaseRegistryUri = "https://openapi.net/";
637637

638+
/// <summary>
639+
/// The components path segment in a $ref value.
640+
/// </summary>
641+
public const string ComponentsSegment = "/components/";
642+
638643
#region V2.0
639644

640645
/// <summary>

src/Microsoft.OpenApi/Models/OpenApiDocument.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -483,22 +483,22 @@ public IOpenApiReferenceable ResolveReference(OpenApiReference reference)
483483
/// <param name="referenceUri"></param>
484484
/// <returns>A JsonSchema ref.</returns>
485485
public JsonSchema ResolveJsonSchemaReference(Uri referenceUri)
486-
{
486+
{
487+
const char pound = '#';
487488
string uriLocation;
488-
string id = referenceUri.OriginalString.Split('/')?.Last();
489-
string relativePath = "/components/" + ReferenceType.Schema.GetDisplayName() + "/" + id;
490-
491-
if (referenceUri.OriginalString.StartsWith("#"))
489+
int poundIndex = referenceUri.OriginalString.IndexOf(pound);
490+
491+
if (poundIndex > 0)
492492
{
493-
// Local reference
494-
uriLocation = BaseUri + relativePath;
493+
// External reference, ex: ./TodoReference.yaml#/components/schemas/todo
494+
string externalUri = referenceUri.OriginalString.Split(pound).First();
495+
Uri externalDocId = Workspace.GetDocumentId(externalUri);
496+
string relativePath = referenceUri.OriginalString.Split(pound).Last();
497+
uriLocation = externalDocId + relativePath;
495498
}
496499
else
497500
{
498-
// External reference
499-
var externalUri = referenceUri.OriginalString.Split('#').First();
500-
var externalDocId = Workspace.GetDocumentId(externalUri);
501-
uriLocation = externalDocId + relativePath;
501+
uriLocation = BaseUri + referenceUri.ToString().TrimStart(pound);
502502
}
503503

504504
return (JsonSchema)Workspace.ResolveReference<IBaseDocument>(uriLocation);
@@ -569,7 +569,7 @@ internal IOpenApiReferenceable ResolveReference(OpenApiReference reference, bool
569569
}
570570

571571
string uriLocation;
572-
string relativePath = "/components/" + reference.Type.GetDisplayName() + "/" + reference.Id;
572+
string relativePath = OpenApiConstants.ComponentsSegment + reference.Type.GetDisplayName() + "/" + reference.Id;
573573

574574
uriLocation = useExternal
575575
? Workspace.GetDocumentId(reference.ExternalResource)?.OriginalString + relativePath

src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Threading;
33
using System.Threading.Tasks;
44
using Microsoft.OpenApi.Interfaces;
@@ -27,15 +27,16 @@ internal async Task<OpenApiDiagnostic> LoadAsync(OpenApiReference reference,
2727
CancellationToken cancellationToken = default)
2828
{
2929
_workspace.AddDocumentId(reference.ExternalResource, document.BaseUri);
30-
_workspace.RegisterComponents(document);
30+
var version = diagnostic?.SpecificationVersion ?? OpenApiSpecVersion.OpenApi3_0;
31+
_workspace.RegisterComponents(document, version);
3132
document.Workspace = _workspace;
3233

3334
// Collect remote references by walking document
3435
var referenceCollector = new OpenApiRemoteReferenceCollector();
3536
var collectorWalker = new OpenApiWalker(referenceCollector);
3637
collectorWalker.Walk(document);
3738

38-
diagnostic ??= new();
39+
diagnostic ??= new() { SpecificationVersion = version };
3940

4041
// Walk references
4142
foreach (var item in referenceCollector.References)

src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public static OpenApiDocument LoadOpenApi(RootNode rootNode)
253253
FixRequestBodyReferences(openApiDoc);
254254

255255
// Register components
256-
openApiDoc.Workspace.RegisterComponents(openApiDoc);
256+
openApiDoc.Workspace.RegisterComponents(openApiDoc, OpenApiSpecVersion.OpenApi2_0);
257257

258258
return openApiDoc;
259259
}

src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public static OpenApiDocument LoadOpenApi(RootNode rootNode)
5454
ParseMap(openApiNode, openApiDoc, _openApiFixedFields, _openApiPatternFields, openApiDoc);
5555

5656
// Register components
57-
openApiDoc.Workspace.RegisterComponents(openApiDoc);
57+
openApiDoc.Workspace.RegisterComponents(openApiDoc, OpenApiSpecVersion.OpenApi3_0);
5858

5959
return openApiDoc;
6060
}

src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static OpenApiDocument LoadOpenApi(RootNode rootNode)
5353
ParseMap(openApiNode, openApiDoc, _openApiFixedFields, _openApiPatternFields, openApiDoc);
5454

5555
// Register components
56-
openApiDoc.Workspace.RegisterComponents(openApiDoc);
56+
openApiDoc.Workspace.RegisterComponents(openApiDoc, OpenApiSpecVersion.OpenApi3_1);
5757

5858
return openApiDoc;
5959
}

src/Microsoft.OpenApi/Services/OpenApiComponentsRegistryExtensions.cs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,98 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using Json.Schema;
45
using Microsoft.OpenApi.Extensions;
56
using Microsoft.OpenApi.Models;
67

78
namespace Microsoft.OpenApi.Services
89
{
910
internal static class OpenApiComponentsRegistryExtensions
1011
{
11-
public static void RegisterComponents(this OpenApiWorkspace workspace, OpenApiDocument document)
12+
public static void RegisterComponents(this OpenApiWorkspace workspace, OpenApiDocument document, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
1213
{
1314
if (document?.Components == null) return;
1415

15-
var baseUri = document.BaseUri + "/components/";
16+
string baseUri = document.BaseUri + OpenApiConstants.ComponentsSegment;
17+
string location;
1618

1719
// Register Schema
1820
foreach (var item in document.Components.Schemas)
1921
{
20-
var location = baseUri + ReferenceType.Schema.GetDisplayName() + "/" + item.Key;
22+
if (item.Value.GetId() != null)
23+
{
24+
location = document.BaseUri + item.Value.GetId().ToString();
25+
}
26+
else
27+
{
28+
location = version == OpenApiSpecVersion.OpenApi2_0
29+
? document.BaseUri + "/" + OpenApiConstants.Definitions + "/" + item.Key
30+
: baseUri + ReferenceType.Schema.GetDisplayName() + "/" + item.Key;
31+
}
32+
2133
workspace.RegisterComponent(location, item.Value);
2234
}
2335

2436
// Register Parameters
2537
foreach (var item in document.Components.Parameters)
2638
{
27-
var location = baseUri + ReferenceType.Parameter.GetDisplayName() + "/" + item.Key;
39+
location = baseUri + ReferenceType.Parameter.GetDisplayName() + "/" + item.Key;
2840
workspace.RegisterComponent(location, item.Value);
2941
}
3042

3143
// Register Responses
3244
foreach (var item in document.Components.Responses)
3345
{
34-
var location = baseUri + ReferenceType.Response.GetDisplayName() + "/" + item.Key;
46+
location = baseUri + ReferenceType.Response.GetDisplayName() + "/" + item.Key;
3547
workspace.RegisterComponent(location, item.Value);
3648
}
3749

3850
// Register RequestBodies
3951
foreach (var item in document.Components.RequestBodies)
4052
{
41-
var location = baseUri + ReferenceType.RequestBody.GetDisplayName() + "/" + item.Key;
53+
location = baseUri + ReferenceType.RequestBody.GetDisplayName() + "/" + item.Key;
4254
workspace.RegisterComponent(location, item.Value);
4355
}
4456

4557
// Register Links
4658
foreach (var item in document.Components.Links)
4759
{
48-
var location = baseUri + ReferenceType.Link.GetDisplayName() + "/" + item.Key;
60+
location = baseUri + ReferenceType.Link.GetDisplayName() + "/" + item.Key;
4961
workspace.RegisterComponent(location, item.Value);
5062
}
5163

5264
// Register Callbacks
5365
foreach (var item in document.Components.Callbacks)
5466
{
55-
var location = baseUri + ReferenceType.Callback.GetDisplayName() + "/" + item.Key;
67+
location = baseUri + ReferenceType.Callback.GetDisplayName() + "/" + item.Key;
5668
workspace.RegisterComponent(location, item.Value);
5769
}
5870

5971
// Register PathItems
6072
foreach (var item in document.Components.PathItems)
6173
{
62-
var location = baseUri + ReferenceType.PathItem.GetDisplayName() + "/" + item.Key;
74+
location = baseUri + ReferenceType.PathItem.GetDisplayName() + "/" + item.Key;
6375
workspace.RegisterComponent(location, item.Value);
6476
}
6577

6678
// Register Examples
6779
foreach (var item in document.Components.Examples)
6880
{
69-
var location = baseUri + ReferenceType.Example.GetDisplayName() + "/" + item.Key;
81+
location = baseUri + ReferenceType.Example.GetDisplayName() + "/" + item.Key;
7082
workspace.RegisterComponent(location, item.Value);
7183
}
7284

7385
// Register Headers
7486
foreach (var item in document.Components.Headers)
7587
{
76-
var location = baseUri + ReferenceType.Header.GetDisplayName() + "/" + item.Key;
88+
location = baseUri + ReferenceType.Header.GetDisplayName() + "/" + item.Key;
7789
workspace.RegisterComponent(location, item.Value);
7890
}
7991

8092
// Register SecuritySchemes
8193
foreach (var item in document.Components.SecuritySchemes)
8294
{
83-
var location = baseUri + ReferenceType.SecurityScheme.GetDisplayName() + "/" + item.Key;
95+
location = baseUri + ReferenceType.SecurityScheme.GetDisplayName() + "/" + item.Key;
8496
workspace.RegisterComponent(location, item.Value);
8597
}
8698
}

test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>net8.0</TargetFramework>
44
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>

test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public OpenApiPathItemReferenceTests()
8383
_openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).OpenApiDocument;
8484
_openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).OpenApiDocument;
8585
_openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri);
86-
_openApiDoc.Workspace.RegisterComponents(_openApiDoc_2);
87-
_openApiDoc_2.Workspace.RegisterComponents(_openApiDoc_2);
86+
_openApiDoc.Workspace.RegisterComponents(_openApiDoc_2, OpenApiSpecVersion.OpenApi3_1);
87+
_openApiDoc_2.Workspace.RegisterComponents(_openApiDoc_2, OpenApiSpecVersion.OpenApi3_1);
8888

8989
_localPathItemReference = new OpenApiPathItemReference("userPathItem", _openApiDoc_2)
9090
{

test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,7 @@ namespace Microsoft.OpenApi.Models
460460
public const string Callbacks = "callbacks";
461461
public const string ClientCredentials = "clientCredentials";
462462
public const string Components = "components";
463+
public const string ComponentsSegment = "/components/";
463464
public const string Consumes = "consumes";
464465
public const string Contact = "contact";
465466
public const string Content = "content";

0 commit comments

Comments
 (0)