Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
5741ae6
Add root property jsonSchemaDialect and serialization and deserializa…
MaggieKimani1 Jan 23, 2023
c0f218a
Add test for validation; refactor existing tests by updating spec ver…
MaggieKimani1 Jan 23, 2023
312abb0
Add an optional spec version parameter to serialize method to write o…
MaggieKimani1 Jan 23, 2023
3fff889
Update the spec version in the diagnostic object to be more explicit
MaggieKimani1 Jan 23, 2023
e62c71f
Update verifier text result
MaggieKimani1 Jan 23, 2023
00e19eb
Update public API surface
MaggieKimani1 Jan 23, 2023
d57aad8
Implement SerializeAs31 across model objects
MaggieKimani1 Feb 20, 2023
f381fb7
Clean up tests
MaggieKimani1 Feb 20, 2023
970a74c
Simplify null check by using a coalescing operator
MaggieKimani1 Feb 22, 2023
862504f
Clean up tests
MaggieKimani1 Feb 22, 2023
a6a68c2
Update public API
MaggieKimani1 Feb 22, 2023
f2f866a
Implement PR feedback
MaggieKimani1 Feb 27, 2023
07d66aa
Update property ordering
MaggieKimani1 Feb 27, 2023
2baa14c
Use a callback to explicitly call the Serialize methods
MaggieKimani1 Feb 28, 2023
8963468
Use action function instead of delegate; Add method for serializing v…
MaggieKimani1 Mar 1, 2023
b1a695e
Code cleanup
MaggieKimani1 Mar 6, 2023
f2b651e
Refactor to reorder how properties are written for scope to be ended …
MaggieKimani1 Mar 6, 2023
82b4c60
Use string comparison; refactor code
MaggieKimani1 Mar 7, 2023
7d7e056
Fix failing test and update public API surface
MaggieKimani1 Mar 7, 2023
06f91f6
Apply suggestions from code review
baywet Mar 7, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Microsoft.OpenApi.Readers/ParsingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ internal OpenApiDocument Parse(YamlDocument yamlDocument)
case string version when version.is3_0() || version.is3_1():
VersionService = new OpenApiV3VersionService(Diagnostic);
doc = VersionService.LoadDocument(RootNode);
this.Diagnostic.SpecificationVersion = OpenApiSpecVersion.OpenApi3_0;
this.Diagnostic.SpecificationVersion = version.is3_1() ? OpenApiSpecVersion.OpenApi3_1 : OpenApiSpecVersion.OpenApi3_0;
ValidateRequiredFields(doc, version);
break;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ internal static partial class OpenApiV3Deserializer
} /* Version is valid field but we already parsed it */
},
{"info", (o, n) => o.Info = LoadInfo(n)},
{"jsonSchemaDialect", (o, n) => o.JsonSchemaDialect = n.GetScalarValue() },
{"servers", (o, n) => o.Servers = n.CreateList(LoadServer)},
{"paths", (o, n) => o.Paths = LoadPaths(n)},
{"webhooks", (o, n) => o.Webhooks = LoadPaths(n)},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ public static void Serialize<T>(this T element, IOpenApiWriter writer, OpenApiSp

switch (specVersion)
{
case OpenApiSpecVersion.OpenApi3_1:
element.SerializeAsV3(writer, OpenApiSpecVersion.OpenApi3_1);
break;

case OpenApiSpecVersion.OpenApi3_0:
element.SerializeAsV3(writer);
break;
Expand Down
3 changes: 2 additions & 1 deletion src/Microsoft.OpenApi/Interfaces/IOpenApiSerializable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ public interface IOpenApiSerializable : IOpenApiElement
/// Serialize Open API element to v3.0.
/// </summary>
/// <param name="writer">The writer.</param>
void SerializeAsV3(IOpenApiWriter writer);
/// <param name="specVersion">The OpenApi specification version.</param>
Comment thread
MaggieKimani1 marked this conversation as resolved.
Outdated
void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion specVersion = OpenApiSpecVersion.OpenApi3_0);

/// <summary>
/// Serialize Open API element to v2.0.
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.OpenApi/Models/OpenApiCallback.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void AddPathItem(RuntimeExpression expression, OpenApiPathItem pathItem)
/// <summary>
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand Down
13 changes: 8 additions & 5 deletions src/Microsoft.OpenApi/Models/OpenApiComponents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public OpenApiComponents(OpenApiComponents components)
/// <summary>
/// Serialize <see cref="OpenApiComponents"/> to Open Api v3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand Down Expand Up @@ -293,8 +293,10 @@ public void SerializeAsV3(IOpenApiWriter writer)
}
});

// pathItems
writer.WriteOptionalMap(
// pathItems - only present in v3.1
if(version == OpenApiSpecVersion.OpenApi3_1)
Comment thread
baywet marked this conversation as resolved.
Outdated
{
writer.WriteOptionalMap(
OpenApiConstants.PathItems,
PathItems,
(w, key, component) =>
Expand All @@ -310,9 +312,10 @@ public void SerializeAsV3(IOpenApiWriter writer)
component.SerializeAsV3(w);
}
});

}

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
writer.WriteExtensions(Extensions, version);

writer.WriteEndObject();
}
Expand Down
5 changes: 5 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ public static class OpenApiConstants
/// Field: Info
/// </summary>
public const string Info = "info";

/// <summary>
/// Field: JsonSchemaDialect
/// </summary>
public const string JsonSchemaDialect = "jsonSchemaDialect";

/// <summary>
/// Field: Webhooks
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiContact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ public OpenApiContact(OpenApiContact contact)
/// <summary>
/// Serialize <see cref="OpenApiContact"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_0);
WriteInternal(writer, version);
}

/// <summary>
/// Serialize <see cref="OpenApiContact"/> to Open Api v2.0
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public OpenApiDiscriminator(OpenApiDiscriminator discriminator)
/// <summary>
/// Serialize <see cref="OpenApiDiscriminator"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand Down
34 changes: 29 additions & 5 deletions src/Microsoft.OpenApi/Models/OpenApiDocument.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ public class OpenApiDocument : IOpenApiSerializable, IOpenApiExtensible
/// </summary>
public OpenApiInfo Info { get; set; }

/// <summary>
/// The default value for the $schema keyword within Schema Objects contained within this OAS document. This MUST be in the form of a URI.
/// </summary>
public string JsonSchemaDialect { get; set; }

/// <summary>
/// An array of Server Objects, which provide connectivity information to a target server.
/// </summary>
Expand Down Expand Up @@ -89,6 +94,7 @@ public OpenApiDocument(OpenApiDocument document)
{
Workspace = document?.Workspace != null ? new(document?.Workspace) : null;
Info = document?.Info != null ? new(document?.Info) : null;
JsonSchemaDialect = document?.JsonSchemaDialect ?? JsonSchemaDialect;
Servers = document?.Servers != null ? new List<OpenApiServer>(document.Servers) : null;
Paths = document?.Paths != null ? new(document?.Paths) : null;
Webhooks = document?.Webhooks != null ? new Dictionary<string, OpenApiPathItem>(document.Webhooks) : null;
Expand All @@ -102,7 +108,7 @@ public OpenApiDocument(OpenApiDocument document)
/// <summary>
/// Serialize <see cref="OpenApiDocument"/> to the latest patch of OpenAPI object V3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand All @@ -112,19 +118,36 @@ public void SerializeAsV3(IOpenApiWriter writer)
writer.WriteStartObject();

// openapi
writer.WriteProperty(OpenApiConstants.OpenApi, "3.0.1");

switch (version)
{
case OpenApiSpecVersion.OpenApi3_1:
writer.WriteProperty(OpenApiConstants.OpenApi, "3.1.0");
break;
case OpenApiSpecVersion.OpenApi3_0:
writer.WriteProperty(OpenApiConstants.OpenApi, "3.0.1");
break;
default:
writer.WriteProperty(OpenApiConstants.OpenApi, "3.0.1");
break;
}

// info
writer.WriteRequiredObject(OpenApiConstants.Info, Info, (w, i) => i.SerializeAsV3(w));

// jsonSchemaDialect
if(version == OpenApiSpecVersion.OpenApi3_1)
writer.WriteProperty(OpenApiConstants.JsonSchemaDialect, JsonSchemaDialect);

// servers
writer.WriteOptionalCollection(OpenApiConstants.Servers, Servers, (w, s) => s.SerializeAsV3(w));

// paths
writer.WriteRequiredObject(OpenApiConstants.Paths, Paths, (w, p) => p.SerializeAsV3(w));

// webhooks
writer.WriteOptionalMap(
if (version == OpenApiSpecVersion.OpenApi3_1)
Comment thread
MaggieKimani1 marked this conversation as resolved.
Outdated
{
writer.WriteOptionalMap(
OpenApiConstants.Webhooks,
Webhooks,
(w, key, component) =>
Expand All @@ -140,6 +163,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
component.SerializeAsV3(w);
}
});
}

// components
writer.WriteOptionalObject(OpenApiConstants.Components, Components, (w, c) => c.SerializeAsV3(w));
Expand All @@ -157,7 +181,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
writer.WriteOptionalObject(OpenApiConstants.ExternalDocs, ExternalDocs, (w, e) => e.SerializeAsV3(w));

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
writer.WriteExtensions(Extensions, version);

writer.WriteEndObject();
}
Expand Down
4 changes: 2 additions & 2 deletions src/Microsoft.OpenApi/Models/OpenApiEncoding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public OpenApiEncoding(OpenApiEncoding encoding)
/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand All @@ -99,7 +99,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
writer.WriteProperty(OpenApiConstants.AllowReserved, AllowReserved, false);

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
writer.WriteExtensions(Extensions, version);

writer.WriteEndObject();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.OpenApi/Models/OpenApiExample.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public OpenApiExample(OpenApiExample example)
/// <summary>
/// Serialize <see cref="OpenApiExample"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand Down
4 changes: 2 additions & 2 deletions src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ protected OpenApiExtensibleDictionary(
/// <summary>
/// Serialize to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand All @@ -55,7 +55,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
writer.WriteRequiredObject(item.Key, item.Value, (w, p) => p.SerializeAsV3(w));
}

writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
writer.WriteExtensions(Extensions, version);

writer.WriteEndObject();
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ public OpenApiExternalDocs(OpenApiExternalDocs externalDocs)
/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_0);
WriteInternal(writer, version);
}

/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v2.0.
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.OpenApi/Models/OpenApiHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public OpenApiHeader(OpenApiHeader header)
/// <summary>
/// Serialize <see cref="OpenApiHeader"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand Down
11 changes: 7 additions & 4 deletions src/Microsoft.OpenApi/Models/OpenApiInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public OpenApiInfo(OpenApiInfo info)
/// <summary>
/// Serialize <see cref="OpenApiInfo"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand All @@ -88,9 +88,12 @@ public void SerializeAsV3(IOpenApiWriter writer)
// title
writer.WriteProperty(OpenApiConstants.Title, Title);

// summary
writer.WriteProperty(OpenApiConstants.Summary, Summary);

// summary - present in 3.1
if (version == OpenApiSpecVersion.OpenApi3_1)
{
writer.WriteProperty(OpenApiConstants.Summary, Summary);
}

// description
writer.WriteProperty(OpenApiConstants.Description, Description);

Expand Down
11 changes: 7 additions & 4 deletions src/Microsoft.OpenApi/Models/OpenApiLicense.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ public OpenApiLicense(OpenApiLicense license)
/// <summary>
/// Serialize <see cref="OpenApiLicense"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_0);
WriteInternal(writer, version);
}

/// <summary>
Expand All @@ -78,8 +78,11 @@ private void WriteInternal(IOpenApiWriter writer, OpenApiSpecVersion specVersion
// name
writer.WriteProperty(OpenApiConstants.Name, Name);

// identifier
writer.WriteProperty(OpenApiConstants.Identifier, Identifier);
// identifier - present in v3.1
if (specVersion == OpenApiSpecVersion.OpenApi3_1)
{
writer.WriteProperty(OpenApiConstants.Identifier, Identifier);
}

// url
writer.WriteProperty(OpenApiConstants.Url, Url?.OriginalString);
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.OpenApi/Models/OpenApiLink.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public OpenApiLink(OpenApiLink link)
/// <summary>
/// Serialize <see cref="OpenApiLink"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand Down
4 changes: 2 additions & 2 deletions src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public OpenApiMediaType(OpenApiMediaType mediaType)
/// <summary>
/// Serialize <see cref="OpenApiMediaType"/> to Open Api v3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand All @@ -85,7 +85,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
writer.WriteOptionalMap(OpenApiConstants.Encoding, Encoding, (w, e) => e.SerializeAsV3(w));
Comment thread
MaggieKimani1 marked this conversation as resolved.
Outdated

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
writer.WriteExtensions(Extensions, version);

writer.WriteEndObject();
}
Expand Down
4 changes: 2 additions & 2 deletions src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public OpenApiOAuthFlow(OpenApiOAuthFlow oAuthFlow)
/// <summary>
/// Serialize <see cref="OpenApiOAuthFlow"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand All @@ -83,7 +83,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
writer.WriteRequiredMap(OpenApiConstants.Scopes, Scopes, (w, s) => w.WriteValue(s));

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
writer.WriteExtensions(Extensions, version);

writer.WriteEndObject();
}
Expand Down
4 changes: 2 additions & 2 deletions src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public OpenApiOAuthFlows(OpenApiOAuthFlows oAuthFlows)
/// <summary>
/// Serialize <see cref="OpenApiOAuthFlows"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public void SerializeAsV3(IOpenApiWriter writer, OpenApiSpecVersion version = OpenApiSpecVersion.OpenApi3_0)
{
if (writer == null)
{
Expand Down Expand Up @@ -87,7 +87,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
(w, o) => o.SerializeAsV3(w));

// extensions
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_0);
writer.WriteExtensions(Extensions, version);

writer.WriteEndObject();
}
Expand Down
Loading