Skip to content

Commit f00c27c

Browse files
committed
Added support for inlining references when writing out API descriptions
1 parent 3fffa56 commit f00c27c

16 files changed

+131
-17
lines changed

src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Microsoft.OpenApi.Any;
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using Microsoft.OpenApi.Any;
25
using Microsoft.OpenApi.Interfaces;
36
using Microsoft.OpenApi.Readers.ParseNodes;
47
using Microsoft.OpenApi.Validations;

src/Microsoft.OpenApi.Workbench/MainModel.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
using System;
55
using System.ComponentModel;
66
using System.Diagnostics;
7+
using System.Globalization;
78
using System.IO;
89
using System.Text;
910
using Microsoft.OpenApi.Extensions;
1011
using Microsoft.OpenApi.Models;
1112
using Microsoft.OpenApi.Readers;
1213
using Microsoft.OpenApi.Services;
1314
using Microsoft.OpenApi.Validations;
15+
using Microsoft.OpenApi.Writers;
1416

1517
namespace Microsoft.OpenApi.Workbench
1618
{
@@ -31,6 +33,11 @@ public class MainModel : INotifyPropertyChanged
3133

3234
private string _renderTime;
3335

36+
/// <summary>
37+
/// Default format.
38+
/// </summary>
39+
private bool _Inline = false;
40+
3441
/// <summary>
3542
/// Default format.
3643
/// </summary>
@@ -112,6 +119,16 @@ public OpenApiFormat Format
112119
}
113120
}
114121

122+
public bool Inline
123+
{
124+
get => _Inline;
125+
set
126+
{
127+
_Inline = value;
128+
OnPropertyChanged(nameof(Inline));
129+
}
130+
}
131+
115132
public OpenApiSpecVersion Version
116133
{
117134
get => _version;
@@ -232,10 +249,14 @@ internal void ParseDocument()
232249
private string WriteContents(OpenApiDocument document)
233250
{
234251
var outputStream = new MemoryStream();
252+
235253
document.Serialize(
236254
outputStream,
237255
Version,
238-
Format);
256+
Format,
257+
new OpenApiWriterSettings() {
258+
ReferenceInline = this.Inline == true ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences
259+
});
239260

240261
outputStream.Position = 0;
241262

src/Microsoft.OpenApi.Workbench/MainWindow.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<RadioButton GroupName="Format" Content="V3.0.1" Padding="5" Height="24" VerticalAlignment="Top" IsChecked="{Binding IsV3_0}" />
4343
<RadioButton GroupName="Format" Content="V2.0" Padding="5" Height="24" VerticalAlignment="Top" IsChecked="{Binding IsV2_0}" />
4444
</StackPanel>
45+
<CheckBox Name="Inline" Content="Inline" IsChecked="{Binding Inline}" />
4546
</StackPanel>
4647
</StackPanel>
4748
<TextBox x:Name="txtErrors" Margin="10,10,10,10" TextWrapping="Wrap" Text="{Binding Errors}" Background="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" DockPanel.Dock="Top" MaxHeight="100" ScrollViewer.VerticalScrollBarVisibility="Auto" IsReadOnlyCaretVisible="True" IsManipulationEnabled="True" />
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Microsoft.OpenApi.Writers;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace Microsoft.OpenApi
9+
{
10+
internal static class OpenAPIWriterExtensions
11+
{
12+
/// <summary>
13+
/// Temporary extension method until we add Settings property to IOpenApiWriter in next major version
14+
/// </summary>
15+
/// <param name="openApiWriter"></param>
16+
/// <returns></returns>
17+
internal static OpenApiWriterSettings GetSettings(this IOpenApiWriter openApiWriter)
18+
{
19+
if (openApiWriter is OpenApiWriterBase)
20+
{
21+
return ((OpenApiWriterBase)openApiWriter).Settings;
22+
}
23+
return new OpenApiWriterSettings();
24+
}
25+
}
26+
}

src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ public static void Serialize<T>(
5454
this T element,
5555
Stream stream,
5656
OpenApiSpecVersion specVersion,
57-
OpenApiFormat format)
57+
OpenApiFormat format,
58+
OpenApiWriterSettings settings = null)
5859
where T : IOpenApiSerializable
5960
{
6061
if (stream == null)
@@ -67,10 +68,10 @@ public static void Serialize<T>(
6768
switch (format)
6869
{
6970
case OpenApiFormat.Json:
70-
writer = new OpenApiJsonWriter(streamWriter);
71+
writer = new OpenApiJsonWriter(streamWriter,settings);
7172
break;
7273
case OpenApiFormat.Yaml:
73-
writer = new OpenApiYamlWriter(streamWriter);
74+
writer = new OpenApiYamlWriter(streamWriter, settings);
7475
break;
7576
default:
7677
throw new OpenApiException(string.Format(SRResource.OpenApiFormatNotSupported, format));
@@ -86,6 +87,7 @@ public static void Serialize<T>(
8687
/// <param name="element">The Open API element.</param>
8788
/// <param name="writer">The output writer.</param>
8889
/// <param name="specVersion">Version of the specification the output should conform to</param>
90+
8991
public static void Serialize<T>(this T element, IOpenApiWriter writer, OpenApiSpecVersion specVersion)
9092
where T : IOpenApiSerializable
9193
{
@@ -116,6 +118,7 @@ public static void Serialize<T>(this T element, IOpenApiWriter writer, OpenApiSp
116118
writer.Flush();
117119
}
118120

121+
119122
/// <summary>
120123
/// Serializes the <see cref="IOpenApiSerializable"/> to the Open API document as a string in JSON format.
121124
/// </summary>

src/Microsoft.OpenApi/Models/OpenApiCallback.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
7070
throw Error.ArgumentNull(nameof(writer));
7171
}
7272

73-
if (Reference != null)
73+
if (Reference != null && writer.GetSettings().ReferenceInline != ReferenceInlineSetting.InlineLocalReferences)
7474
{
7575
Reference.SerializeAsV3(writer);
7676
return;

src/Microsoft.OpenApi/Models/OpenApiComponents.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ public void SerializeAsV3(IOpenApiWriter writer)
7676
throw Error.ArgumentNull(nameof(writer));
7777
}
7878

79+
// If references have been inlined we don't need the to render the components section
80+
if (writer.GetSettings().ReferenceInline != ReferenceInlineSetting.DoNotInlineReferences)
81+
{
82+
return;
83+
}
84+
7985
writer.WriteStartObject();
8086

8187
// Serialize each referenceable object as full object without reference if the reference in the object points to itself.

src/Microsoft.OpenApi/Models/OpenApiExample.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
6464
throw Error.ArgumentNull(nameof(writer));
6565
}
6666

67-
if (Reference != null)
67+
if (Reference != null && writer.GetSettings().ReferenceInline != ReferenceInlineSetting.InlineLocalReferences)
6868
{
6969
Reference.SerializeAsV3(writer);
7070
return;

src/Microsoft.OpenApi/Models/OpenApiLink.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
7171
throw Error.ArgumentNull(nameof(writer));
7272
}
7373

74-
if (Reference != null)
74+
if (Reference != null && writer.GetSettings().ReferenceInline != ReferenceInlineSetting.InlineLocalReferences)
7575
{
7676
Reference.SerializeAsV3(writer);
7777
return;

src/Microsoft.OpenApi/Models/OpenApiParameter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
139139
throw Error.ArgumentNull(nameof(writer));
140140
}
141141

142-
if (Reference != null)
142+
if (Reference != null && writer.GetSettings().ReferenceInline != ReferenceInlineSetting.InlineLocalReferences)
143143
{
144144
Reference.SerializeAsV3(writer);
145145
return;
@@ -210,7 +210,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
210210
throw Error.ArgumentNull(nameof(writer));
211211
}
212212

213-
if (Reference != null)
213+
if (Reference != null && writer.GetSettings().ReferenceInline != ReferenceInlineSetting.InlineLocalReferences)
214214
{
215215
Reference.SerializeAsV2(writer);
216216
return;

0 commit comments

Comments
 (0)