Skip to content

Commit 1697d8a

Browse files
committed
Local references working
1 parent 202fbe1 commit 1697d8a

File tree

13 files changed

+115
-27
lines changed

13 files changed

+115
-27
lines changed

src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class OpenApiReaderSettings
3737
/// <summary>
3838
/// Indicates how references in the source document should be handled.
3939
/// </summary>
40-
public ReferenceResolutionSetting ReferenceResolution { get; set; } = ReferenceResolutionSetting.ResolveRemoteReferences;
40+
public ReferenceResolutionSetting ReferenceResolution { get; set; } = ReferenceResolutionSetting.ResolveLocalReferences;
4141

4242
/// <summary>
4343
/// Dictionary of parsers for converting extensions into strongly typed classes

src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.IO;
56
using System.Linq;
67
using Microsoft.OpenApi.Extensions;
78
using Microsoft.OpenApi.Models;
89
using Microsoft.OpenApi.Readers.Interface;
10+
using Microsoft.OpenApi.Readers.Services;
911
using Microsoft.OpenApi.Services;
10-
using Microsoft.OpenApi.Validations;
1112
using SharpYaml;
1213
using SharpYaml.Serialization;
1314

@@ -64,6 +65,7 @@ public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
6465
switch (_settings.ReferenceResolution)
6566
{
6667
case ReferenceResolutionSetting.ResolveRemoteReferences:
68+
throw new ArgumentException(Properties.SRResource.CannotResolveRemoteReferencesSynchronously);
6769
case ReferenceResolutionSetting.ResolveLocalReferences:
6870
var resolver = new OpenApiReferenceResolver(document);
6971
var walker = new OpenApiWalker(resolver);

src/Microsoft.OpenApi.Readers/ParseNodes/MapNode.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ public override Dictionary<string, T> CreateMap<T>(Func<MapNode, T> map)
8080

8181
public override Dictionary<string, T> CreateMapWithReference<T>(
8282
ReferenceType referenceType,
83-
string refpointerbase,
8483
Func<MapNode, T> map)
8584
{
8685
var yamlMap = _node;

src/Microsoft.OpenApi.Readers/ParseNodes/ParseNode.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ public virtual Dictionary<string, T> CreateMap<T>(Func<MapNode, T> map)
7979

8080
public virtual Dictionary<string, T> CreateMapWithReference<T>(
8181
ReferenceType referenceType,
82-
string refpointer,
8382
Func<MapNode, T> map)
8483
where T : class, IOpenApiReferenceable
8584
{

src/Microsoft.OpenApi.Readers/Properties/SRResource.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Microsoft.OpenApi.Readers/Properties/SRResource.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@
120120
<data name="ArgumentNullOrWhiteSpace" xml:space="preserve">
121121
<value>The argument '{0}' is null, empty or consists only of white-space.</value>
122122
</data>
123+
<data name="CannotResolveRemoteReferencesSynchronously" xml:space="preserve">
124+
<value>"Cannot resolve remote references automatically in a syncronous call."</value>
125+
</data>
123126
<data name="LoadReferencedObjectFromExternalNotImplmented" xml:space="preserve">
124127
<value>Not implemented to find referenced element from external resource.</value>
125128
</data>

src/Microsoft.OpenApi.Readers/Resolver.cs renamed to src/Microsoft.OpenApi.Readers/Services/OpenApiReferenceResolver.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
using Microsoft.OpenApi.Models;
99
using Microsoft.OpenApi.Services;
1010

11-
namespace Microsoft.OpenApi.Readers
11+
namespace Microsoft.OpenApi.Readers.Services
1212
{
1313
/// <summary>
1414
/// This class is used to walk an OpenApiDocument and convert unresolved references to references to populated objects
@@ -18,7 +18,7 @@ internal class OpenApiReferenceResolver : OpenApiVisitorBase
1818
private OpenApiDocument _currentDocument;
1919
private bool _resolveRemoteReferences;
2020

21-
public OpenApiReferenceResolver(OpenApiDocument currentDocument, bool resolveRemoteReferences = true) // In future pass in Workbench for remote references
21+
public OpenApiReferenceResolver(OpenApiDocument currentDocument, bool resolveRemoteReferences = true)
2222
{
2323
_currentDocument = currentDocument;
2424
_resolveRemoteReferences = resolveRemoteReferences;
@@ -34,12 +34,22 @@ public override void Visit(OpenApiDocument doc)
3434

3535
public override void Visit(OpenApiComponents components)
3636
{
37+
ResolveMap(components.Parameters);
38+
ResolveMap(components.RequestBodies);
39+
ResolveMap(components.Responses);
40+
ResolveMap(components.Links);
41+
ResolveMap(components.Callbacks);
42+
ResolveMap(components.Examples);
3743
ResolveMap(components.Schemas);
44+
ResolveMap(components.SecuritySchemes);
3845
}
39-
// TODO: Resolve Paths
40-
// TODO: Resolve Callbacks
4146

4247

48+
public override void Visit(IDictionary<string, OpenApiCallback> callbacks)
49+
{
50+
ResolveMap(callbacks);
51+
}
52+
4353
/// <summary>
4454
/// Resolve all references used in an operation
4555
/// </summary>

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ internal static partial class OpenApiV2Deserializer
5050

5151
o.Components.Schemas = n.CreateMapWithReference(
5252
ReferenceType.Schema,
53-
"#/definitions/",
5453
LoadSchema);
5554
}
5655
},
@@ -65,7 +64,6 @@ internal static partial class OpenApiV2Deserializer
6564

6665
o.Components.Parameters = n.CreateMapWithReference(
6766
ReferenceType.Parameter,
68-
"#/parameters/",
6967
LoadParameter);
7068
}
7169
},
@@ -77,7 +75,9 @@ internal static partial class OpenApiV2Deserializer
7775
o.Components = new OpenApiComponents();
7876
}
7977

80-
o.Components.Responses = n.CreateMap(LoadResponse);
78+
o.Components.Responses = n.CreateMapWithReference(
79+
ReferenceType.Response,
80+
LoadResponse);
8181
}
8282
},
8383
{
@@ -88,7 +88,10 @@ internal static partial class OpenApiV2Deserializer
8888
o.Components = new OpenApiComponents();
8989
}
9090

91-
o.Components.SecuritySchemes = n.CreateMap(LoadSecurityScheme);
91+
o.Components.SecuritySchemes = n.CreateMapWithReference(
92+
ReferenceType.SecurityScheme,
93+
LoadSecurityScheme
94+
);
9295
}
9396
},
9497
{"security", (o, n) => o.SecurityRequirements = n.CreateList(LoadSecurityRequirement)},

src/Microsoft.OpenApi.Readers/V3/OpenApiComponentsDeserializer.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,16 @@ internal static partial class OpenApiV3Deserializer
1818
private static FixedFieldMap<OpenApiComponents> _componentsFixedFields = new FixedFieldMap<OpenApiComponents>
1919
{
2020
{
21-
"schemas", (o, n) =>
22-
{
23-
o.Schemas = n.CreateMapWithReference(ReferenceType.Schema, "", LoadSchema);
24-
}
21+
"schemas", (o, n) => o.Schemas = n.CreateMapWithReference(ReferenceType.Schema, LoadSchema)
2522
},
26-
{"responses", (o, n) => o.Responses = n.CreateMap(LoadResponse)},
27-
{"parameters", (o, n) => o.Parameters = n.CreateMap(LoadParameter)},
28-
{"examples", (o, n) => o.Examples = n.CreateMap(LoadExample)},
29-
{"requestBodies", (o, n) => o.RequestBodies = n.CreateMap(LoadRequestBody)},
30-
{"headers", (o, n) => o.Headers = n.CreateMap(LoadHeader)},
31-
{"securitySchemes", (o, n) => o.SecuritySchemes = n.CreateMap(LoadSecurityScheme)},
32-
{"links", (o, n) => o.Links = n.CreateMap(LoadLink)},
33-
{"callbacks", (o, n) => o.Callbacks = n.CreateMap(LoadCallback)},
23+
{"responses", (o, n) => o.Responses = n.CreateMapWithReference(ReferenceType.Response, LoadResponse)},
24+
{"parameters", (o, n) => o.Parameters = n.CreateMapWithReference(ReferenceType.Parameter, LoadParameter)},
25+
{"examples", (o, n) => o.Examples = n.CreateMapWithReference(ReferenceType.Example, LoadExample)},
26+
{"requestBodies", (o, n) => o.RequestBodies = n.CreateMapWithReference(ReferenceType.RequestBody, LoadRequestBody)},
27+
{"headers", (o, n) => o.Headers = n.CreateMapWithReference(ReferenceType.Header, LoadHeader)},
28+
{"securitySchemes", (o, n) => o.SecuritySchemes = n.CreateMapWithReference(ReferenceType.SecurityScheme, LoadSecurityScheme)},
29+
{"links", (o, n) => o.Links = n.CreateMapWithReference(ReferenceType.Link, LoadLink)},
30+
{"callbacks", (o, n) => o.Callbacks = n.CreateMapWithReference(ReferenceType.Callback, LoadCallback)},
3431
};
3532

3633

src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ public virtual void Visit(IDictionary<string, OpenApiHeader> headers)
158158
{
159159
}
160160

161+
/// <summary>
162+
/// Visits headers.
163+
/// </summary>
164+
public virtual void Visit(IDictionary<string, OpenApiCallback> callbacks)
165+
{
166+
}
161167

162168
/// <summary>
163169
/// Visits <see cref="OpenApiResponse"/>

0 commit comments

Comments
 (0)