Skip to content

Commit 1ac5b1b

Browse files
committed
Add spec version param for writing out $refs for different versions
1 parent 10c69a8 commit 1ac5b1b

File tree

9 files changed

+60
-47
lines changed

9 files changed

+60
-47
lines changed

src/Microsoft.OpenApi/Helpers/SchemaSerializerHelper.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ namespace Microsoft.OpenApi.Helpers
1313
{
1414
internal static class SchemaSerializerHelper
1515
{
16-
internal static void WriteAsItemsProperties(JsonSchema schema, IOpenApiWriter writer, IDictionary<string, IOpenApiExtension> extensions)
16+
internal static void WriteAsItemsProperties(JsonSchema schema,
17+
IOpenApiWriter writer,
18+
IDictionary<string, IOpenApiExtension> extensions,
19+
OpenApiSpecVersion version)
1720
{
1821
if (writer == null)
1922
{
@@ -39,7 +42,7 @@ internal static void WriteAsItemsProperties(JsonSchema schema, IOpenApiWriter wr
3942

4043
// items
4144
writer.WriteOptionalObject(OpenApiConstants.Items, schema.GetItems(),
42-
(w, s) => w.WriteJsonSchema(s));
45+
(w, s) => w.WriteJsonSchema(s, version));
4346

4447
// collectionFormat
4548
// We need information from style in parameter to populate this.
@@ -96,7 +99,7 @@ internal static void WriteAsItemsProperties(JsonSchema schema, IOpenApiWriter wr
9699
// extensions
97100
writer.WriteExtensions(extensions, OpenApiSpecVersion.OpenApi2_0);
98101
}
99-
102+
100103
private static string RetrieveFormatFromNestedSchema(IReadOnlyCollection<JsonSchema> schema)
101104
{
102105
if (schema != null)

src/Microsoft.OpenApi/Models/OpenApiComponents.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void SerializeAsV31(IOpenApiWriter writer)
109109
// however if they have cycles, then we will need a component rendered
110110
if (writer.GetSettings().InlineLocalReferences)
111111
{
112-
RenderComponents(writer);
112+
RenderComponents(writer, OpenApiSpecVersion.OpenApi3_1);
113113
return;
114114
}
115115

@@ -149,7 +149,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
149149
// however if they have cycles, then we will need a component rendered
150150
if (writer.GetSettings().InlineLocalReferences)
151151
{
152-
RenderComponents(writer);
152+
RenderComponents(writer, OpenApiSpecVersion.OpenApi3_0);
153153
return;
154154
}
155155

@@ -177,11 +177,11 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
177177
if (reference != null &&
178178
reference.OriginalString.Split('/').Last().Equals(key))
179179
{
180-
w.WriteJsonSchemaWithoutReference(w, s);
180+
w.WriteJsonSchemaWithoutReference(w, s, version);
181181
}
182182
else
183183
{
184-
w.WriteJsonSchema(s);
184+
w.WriteJsonSchema(s, version);
185185
}
186186
});
187187

@@ -335,7 +335,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
335335
writer.WriteEndObject();
336336
}
337337

338-
private void RenderComponents(IOpenApiWriter writer)
338+
private void RenderComponents(IOpenApiWriter writer, OpenApiSpecVersion version)
339339
{
340340
var loops = writer.GetSettings().LoopDetector.Loops;
341341
writer.WriteStartObject();
@@ -344,7 +344,7 @@ private void RenderComponents(IOpenApiWriter writer)
344344
writer.WriteOptionalMap(
345345
OpenApiConstants.Schemas,
346346
Schemas,
347-
static (w, key, s) => { w.WriteJsonSchema(s); });
347+
(w, key, s) => { w.WriteJsonSchema(s, version); });
348348
}
349349
writer.WriteEndObject();
350350
}

src/Microsoft.OpenApi/Models/OpenApiDocument.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
246246
writer.WriteOptionalMap(
247247
OpenApiConstants.Definitions,
248248
openApiSchemas,
249-
(w, key, s) => w.WriteJsonSchema(s));
249+
(w, key, s) => w.WriteJsonSchema(s, OpenApiSpecVersion.OpenApi2_0));
250250
}
251251
}
252252
else
@@ -265,11 +265,11 @@ public void SerializeAsV2(IOpenApiWriter writer)
265265
if (reference != null &&
266266
reference.OriginalString.Split('/').Last().Equals(key))
267267
{
268-
w.WriteJsonSchemaWithoutReference(w, s);
268+
w.WriteJsonSchemaWithoutReference(w, s, OpenApiSpecVersion.OpenApi2_0);
269269
}
270270
else
271271
{
272-
w.WriteJsonSchema(s);
272+
w.WriteJsonSchema(s, OpenApiSpecVersion.OpenApi2_0);
273273
}
274274
});
275275
}

src/Microsoft.OpenApi/Models/OpenApiHeader.cs

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

44
using System;
@@ -225,7 +225,7 @@ internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, O
225225
writer.WriteProperty(OpenApiConstants.AllowReserved, AllowReserved, false);
226226

227227
// schema
228-
writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => writer.WriteJsonSchema(s));
228+
writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => writer.WriteJsonSchema(s, version));
229229

230230
// example
231231
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, s) => w.WriteAny(s));
@@ -295,7 +295,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer)
295295
writer.WriteProperty(OpenApiConstants.AllowReserved, AllowReserved, false);
296296

297297
// schema
298-
SchemaSerializerHelper.WriteAsItemsProperties(Schema, writer, Extensions);
298+
SchemaSerializerHelper.WriteAsItemsProperties(Schema, writer, Extensions, OpenApiSpecVersion.OpenApi2_0);
299299

300300
// example
301301
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, s) => w.WriteAny(s));

src/Microsoft.OpenApi/Models/OpenApiMediaType.cs

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

44
using System;
@@ -97,7 +97,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
9797
writer.WriteStartObject();
9898

9999
// schema
100-
writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => writer.WriteJsonSchema(s));
100+
writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => writer.WriteJsonSchema(s, version));
101101

102102
// example
103103
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, e) => w.WriteAny(e));

src/Microsoft.OpenApi/Models/OpenApiParameter.cs

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

44
using System;
@@ -291,7 +291,7 @@ internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, O
291291
if (Schema != null)
292292
{
293293
writer.WritePropertyName(OpenApiConstants.Schema);
294-
writer.WriteJsonSchema(Schema);
294+
writer.WriteJsonSchema(Schema, version);
295295
}
296296

297297
// example
@@ -371,7 +371,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer)
371371
// schema
372372
if (this is OpenApiBodyParameter)
373373
{
374-
writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => writer.WriteJsonSchema(s));
374+
writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => writer.WriteJsonSchema(s, OpenApiSpecVersion.OpenApi2_0));
375375
}
376376
// In V2 parameter's type can't be a reference to a custom object schema or can't be of type object
377377
// So in that case map the type as string.
@@ -400,7 +400,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer)
400400
// multipleOf
401401
if (Schema != null)
402402
{
403-
SchemaSerializerHelper.WriteAsItemsProperties(Schema, writer, Extensions);
403+
SchemaSerializerHelper.WriteAsItemsProperties(Schema, writer, Extensions, OpenApiSpecVersion.OpenApi2_0);
404404
var extensions = Schema.GetExtensions();
405405
if (extensions != null)
406406
{

src/Microsoft.OpenApi/Models/OpenApiResponse.cs

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

44
using System;
55
using System.Collections.Generic;
66
using System.Linq;
7-
using System.Text.Json;
8-
using System.Text.Json.Nodes;
9-
using Json.More;
10-
using Microsoft.OpenApi.Helpers;
117
using Microsoft.OpenApi.Interfaces;
128
using Microsoft.OpenApi.Writers;
139

@@ -215,7 +211,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer)
215211
if (mediatype.Value != null)
216212
{
217213
// schema
218-
writer.WriteOptionalObject(OpenApiConstants.Schema, mediatype.Value.Schema, (w, s) => writer.WriteJsonSchema(s));
214+
writer.WriteOptionalObject(OpenApiConstants.Schema, mediatype.Value.Schema, (w, s) => writer.WriteJsonSchema(s, OpenApiSpecVersion.OpenApi2_0));
219215

220216
// examples
221217
if (Content.Values.Any(m => m.Example != null))

src/Microsoft.OpenApi/Writers/IOpenApiWriter.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,16 @@ public interface IOpenApiWriter
7676
/// Write the JsonSchema object
7777
/// </summary>
7878
/// <param name="schema"></param>
79-
void WriteJsonSchema(JsonSchema schema);
79+
/// <param name="version"></param>
80+
void WriteJsonSchema(JsonSchema schema, OpenApiSpecVersion version);
8081

8182
/// <summary>
8283
/// Write the JsonSchema object
8384
/// </summary>
8485
/// <param name="writer">The IOpenApiWriter object</param>
8586
/// <param name="schema">The JsonSchema object</param>
86-
void WriteJsonSchemaWithoutReference(IOpenApiWriter writer, JsonSchema schema);
87+
/// <param name="version"></param>
88+
void WriteJsonSchemaWithoutReference(IOpenApiWriter writer, JsonSchema schema, OpenApiSpecVersion version);
8789

8890
/// <summary>
8991
/// Flush the writer.
@@ -95,6 +97,7 @@ public interface IOpenApiWriter
9597
/// </summary>
9698
/// <param name="writer"></param>
9799
/// <param name="reference"></param>
98-
void WriteJsonSchemaReference(IOpenApiWriter writer, Uri reference);
100+
/// <param name="version"></param>
101+
void WriteJsonSchemaReference(IOpenApiWriter writer, Uri reference, OpenApiSpecVersion version);
99102
}
100103
}

src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs

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

44
using System;
@@ -422,19 +422,20 @@ protected void VerifyCanWritePropertyName(string name)
422422
/// Writes out a JsonSchema object
423423
/// </summary>
424424
/// <param name="schema"></param>
425-
public void WriteJsonSchema(JsonSchema schema)
425+
/// <param name="version"></param>
426+
public void WriteJsonSchema(JsonSchema schema, OpenApiSpecVersion version)
426427
{
427428
if (schema == null)
428429
{
429430
return;
430431
}
431-
432+
432433
var reference = schema.GetRef();
433434
if (reference != null)
434435
{
435436
if (!Settings.ShouldInlineReference())
436437
{
437-
WriteJsonSchemaReference(this, reference);
438+
WriteJsonSchemaReference(this, reference, version);
438439
return;
439440
}
440441
else
@@ -446,13 +447,13 @@ public void WriteJsonSchema(JsonSchema schema)
446447
if (!Settings.LoopDetector.PushLoop(schema))
447448
{
448449
Settings.LoopDetector.SaveLoop(schema);
449-
WriteJsonSchemaReference(this, reference);
450+
WriteJsonSchemaReference(this, reference, version);
450451
return;
451452
}
452453
}
453454
}
454455

455-
WriteJsonSchemaWithoutReference(this, schema);
456+
WriteJsonSchemaWithoutReference(this, schema, version);
456457

457458
if (reference != null)
458459
{
@@ -461,7 +462,7 @@ public void WriteJsonSchema(JsonSchema schema)
461462
}
462463

463464
/// <inheritdoc />
464-
public void WriteJsonSchemaWithoutReference(IOpenApiWriter writer, JsonSchema schema)
465+
public void WriteJsonSchemaWithoutReference(IOpenApiWriter writer, JsonSchema schema, OpenApiSpecVersion version)
465466
{
466467
writer.WriteStartObject();
467468

@@ -517,31 +518,31 @@ public void WriteJsonSchemaWithoutReference(IOpenApiWriter writer, JsonSchema sc
517518
writer.WriteProperty(OpenApiConstants.Type, schema.GetJsonType()?.ToString().ToLowerInvariant());
518519

519520
// allOf
520-
writer.WriteOptionalCollection(OpenApiConstants.AllOf, schema.GetAllOf(), (w, s) => w.WriteJsonSchema(s));
521+
writer.WriteOptionalCollection(OpenApiConstants.AllOf, schema.GetAllOf(), (w, s) => w.WriteJsonSchema(s, version));
521522

522523
// anyOf
523-
writer.WriteOptionalCollection(OpenApiConstants.AnyOf, schema.GetAnyOf(), (w, s) => w.WriteJsonSchema(s));
524+
writer.WriteOptionalCollection(OpenApiConstants.AnyOf, schema.GetAnyOf(), (w, s) => w.WriteJsonSchema(s, version));
524525

525526
// oneOf
526-
writer.WriteOptionalCollection(OpenApiConstants.OneOf, schema.GetOneOf(), (w, s) => w.WriteJsonSchema(s));
527+
writer.WriteOptionalCollection(OpenApiConstants.OneOf, schema.GetOneOf(), (w, s) => w.WriteJsonSchema(s, version));
527528

528529
// not
529-
writer.WriteOptionalObject(OpenApiConstants.Not, schema.GetNot(), (w, s) => w.WriteJsonSchema(s));
530+
writer.WriteOptionalObject(OpenApiConstants.Not, schema.GetNot(), (w, s) => w.WriteJsonSchema(s, version));
530531

531532
// items
532-
writer.WriteOptionalObject(OpenApiConstants.Items, schema.GetItems(), (w, s) => w.WriteJsonSchema(s));
533+
writer.WriteOptionalObject(OpenApiConstants.Items, schema.GetItems(), (w, s) => w.WriteJsonSchema(s, version));
533534

534535
// properties
535536
writer.WriteOptionalMap(OpenApiConstants.Properties, (IDictionary<string, JsonSchema>)schema.GetProperties(),
536-
(w, key, s) => w.WriteJsonSchema(s));
537+
(w, key, s) => w.WriteJsonSchema(s, version));
537538

538539
// additionalProperties
539540
if (schema.GetAdditionalPropertiesAllowed() ?? false)
540541
{
541542
writer.WriteOptionalObject(
542543
OpenApiConstants.AdditionalProperties,
543544
schema.GetAdditionalProperties(),
544-
(w, s) => w.WriteJsonSchema(s));
545+
(w, s) => w.WriteJsonSchema(s, version));
545546
}
546547
else
547548
{
@@ -588,10 +589,20 @@ public void WriteJsonSchemaWithoutReference(IOpenApiWriter writer, JsonSchema sc
588589
}
589590

590591
/// <inheritdoc />
591-
public void WriteJsonSchemaReference(IOpenApiWriter writer, Uri reference)
592+
public void WriteJsonSchemaReference(IOpenApiWriter writer, Uri referenceUri, OpenApiSpecVersion version)
592593
{
593-
this.WriteStartObject();
594-
this.WriteProperty(OpenApiConstants.DollarRef, reference.OriginalString);
594+
var reference = String.Empty;
595+
if (version.Equals(OpenApiSpecVersion.OpenApi2_0))
596+
{
597+
reference = referenceUri.OriginalString.Replace("components/schemas", "definitions");
598+
}
599+
else
600+
{
601+
reference = referenceUri.OriginalString;
602+
}
603+
604+
WriteStartObject();
605+
this.WriteProperty(OpenApiConstants.DollarRef, reference);
595606
WriteEndObject();
596607
}
597608
}

0 commit comments

Comments
 (0)