Skip to content

Commit 6b26052

Browse files
authored
Merge pull request #559 from microsoft/issue/288
Add support for $ref in PathItems
2 parents 3cca127 + 3914db4 commit 6b26052

File tree

6 files changed

+83
-30
lines changed

6 files changed

+83
-30
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ internal static partial class OpenApiV2Deserializer
1818
{
1919
"$ref", (o, n) =>
2020
{
21-
/* Not supported yet */
21+
o.Reference = new OpenApiReference() { ExternalResource = n.GetScalarValue() };
22+
o.UnresolvedReference =true;
2223
}
2324
},
2425
{"get", (o, n) => o.AddOperation(OperationType.Get, LoadOperation(n))},

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ internal static partial class OpenApiV3Deserializer
1515
{
1616
private static readonly FixedFieldMap<OpenApiPathItem> _pathItemFixedFields = new FixedFieldMap<OpenApiPathItem>
1717
{
18-
// $ref
18+
19+
{
20+
"$ref", (o,n) => {
21+
o.Reference = new OpenApiReference() { ExternalResource = n.GetScalarValue() };
22+
o.UnresolvedReference =true;
23+
}
24+
},
1925
{
2026
"summary", (o, n) =>
2127
{

src/Microsoft.OpenApi/Models/OpenApiPathItem.cs

Lines changed: 67 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the MIT license.
33

44
using System.Collections.Generic;
5-
using Microsoft.OpenApi.Any;
65
using Microsoft.OpenApi.Extensions;
76
using Microsoft.OpenApi.Interfaces;
87
using Microsoft.OpenApi.Writers;
@@ -12,7 +11,7 @@ namespace Microsoft.OpenApi.Models
1211
/// <summary>
1312
/// Path Item Object: to describe the operations available on a single path.
1413
/// </summary>
15-
public class OpenApiPathItem : IOpenApiSerializable, IOpenApiExtensible
14+
public class OpenApiPathItem : IOpenApiSerializable, IOpenApiExtensible, IOpenApiReferenceable
1615
{
1716
/// <summary>
1817
/// An optional, string summary, intended to apply to all operations in this path.
@@ -46,6 +45,16 @@ public class OpenApiPathItem : IOpenApiSerializable, IOpenApiExtensible
4645
/// </summary>
4746
public IDictionary<string, IOpenApiExtension> Extensions { get; set; } = new Dictionary<string, IOpenApiExtension>();
4847

48+
/// <summary>
49+
/// Indicates if object is populated with data or is just a reference to the data
50+
/// </summary>
51+
public bool UnresolvedReference { get; set; }
52+
53+
/// <summary>
54+
/// Reference object.
55+
/// </summary>
56+
public OpenApiReference Reference { get; set; }
57+
4958
/// <summary>
5059
/// Add one operation into this path item.
5160
/// </summary>
@@ -66,33 +75,14 @@ public void SerializeAsV3(IOpenApiWriter writer)
6675
throw Error.ArgumentNull(nameof(writer));
6776
}
6877

69-
writer.WriteStartObject();
70-
71-
// summary
72-
writer.WriteProperty(OpenApiConstants.Summary, Summary);
73-
74-
// description
75-
writer.WriteProperty(OpenApiConstants.Description, Description);
76-
77-
// operations
78-
foreach (var operation in Operations)
78+
if (Reference != null && writer.GetSettings().ReferenceInline != ReferenceInlineSetting.InlineAllReferences)
7979
{
80-
writer.WriteOptionalObject(
81-
operation.Key.GetDisplayName(),
82-
operation.Value,
83-
(w, o) => o.SerializeAsV3(w));
80+
Reference.SerializeAsV3(writer);
81+
return;
8482
}
8583

86-
// servers
87-
writer.WriteOptionalCollection(OpenApiConstants.Servers, Servers, (w, s) => s.SerializeAsV3(w));
88-
89-
// parameters
90-
writer.WriteOptionalCollection(OpenApiConstants.Parameters, Parameters, (w, p) => p.SerializeAsV3(w));
91-
92-
// specification extensions
93-
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
84+
SerializeAsV3WithoutReference(writer);
9485

95-
writer.WriteEndObject();
9686
}
9787

9888
/// <summary>
@@ -105,6 +95,21 @@ public void SerializeAsV2(IOpenApiWriter writer)
10595
throw Error.ArgumentNull(nameof(writer));
10696
}
10797

98+
if (Reference != null && writer.GetSettings().ReferenceInline != ReferenceInlineSetting.InlineAllReferences)
99+
{
100+
Reference.SerializeAsV2(writer);
101+
return;
102+
}
103+
104+
SerializeAsV2WithoutReference(writer);
105+
}
106+
107+
/// <summary>
108+
/// Serialize inline PathItem in OpenAPI V2
109+
/// </summary>
110+
/// <param name="writer"></param>
111+
public void SerializeAsV2WithoutReference(IOpenApiWriter writer)
112+
{
108113
writer.WriteStartObject();
109114

110115
// operations except "trace"
@@ -133,6 +138,43 @@ public void SerializeAsV2(IOpenApiWriter writer)
133138
// specification extensions
134139
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi2_0);
135140

141+
writer.WriteEndObject();
142+
143+
}
144+
145+
/// <summary>
146+
/// Serialize inline PathItem in OpenAPI V3
147+
/// </summary>
148+
/// <param name="writer"></param>
149+
public void SerializeAsV3WithoutReference(IOpenApiWriter writer)
150+
{
151+
152+
writer.WriteStartObject();
153+
154+
// summary
155+
writer.WriteProperty(OpenApiConstants.Summary, Summary);
156+
157+
// description
158+
writer.WriteProperty(OpenApiConstants.Description, Description);
159+
160+
// operations
161+
foreach (var operation in Operations)
162+
{
163+
writer.WriteOptionalObject(
164+
operation.Key.GetDisplayName(),
165+
operation.Value,
166+
(w, o) => o.SerializeAsV3(w));
167+
}
168+
169+
// servers
170+
writer.WriteOptionalCollection(OpenApiConstants.Servers, Servers, (w, s) => s.SerializeAsV3(w));
171+
172+
// parameters
173+
writer.WriteOptionalCollection(OpenApiConstants.Parameters, Parameters, (w, p) => p.SerializeAsV3(w));
174+
175+
// specification extensions
176+
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
177+
136178
writer.WriteEndObject();
137179
}
138180
}

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,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFrameworks>net462</TargetFrameworks>
3+
<TargetFrameworks>net462;net50</TargetFrameworks>
44
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
55
<Authors></Authors>
66
<Company>Microsoft</Company>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFrameworks>net462</TargetFrameworks>
3+
<TargetFrameworks>net462;net50</TargetFrameworks>
44
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
55
<Authors></Authors>
66
<Company>Microsoft</Company>

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,18 +695,22 @@ namespace Microsoft.OpenApi.Models
695695
public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
696696
public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
697697
}
698-
public class OpenApiPathItem : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
698+
public class OpenApiPathItem : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
699699
{
700700
public OpenApiPathItem() { }
701701
public string Description { get; set; }
702702
public System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Interfaces.IOpenApiExtension> Extensions { get; set; }
703703
public System.Collections.Generic.IDictionary<Microsoft.OpenApi.Models.OperationType, Microsoft.OpenApi.Models.OpenApiOperation> Operations { get; set; }
704704
public System.Collections.Generic.IList<Microsoft.OpenApi.Models.OpenApiParameter> Parameters { get; set; }
705+
public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; }
705706
public System.Collections.Generic.IList<Microsoft.OpenApi.Models.OpenApiServer> Servers { get; set; }
706707
public string Summary { get; set; }
708+
public bool UnresolvedReference { get; set; }
707709
public void AddOperation(Microsoft.OpenApi.Models.OperationType operationType, Microsoft.OpenApi.Models.OpenApiOperation operation) { }
708710
public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
711+
public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
709712
public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
713+
public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
710714
}
711715
public class OpenApiPaths : Microsoft.OpenApi.Models.OpenApiExtensibleDictionary<Microsoft.OpenApi.Models.OpenApiPathItem>
712716
{

0 commit comments

Comments
 (0)