Skip to content

Commit 754f763

Browse files
committed
feat: makes document optional
Signed-off-by: Vincent Biret <[email protected]>
1 parent 317ad10 commit 754f763

32 files changed

+170
-209
lines changed

src/Microsoft.OpenApi/Models/OpenApiDocument.cs

+7
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ namespace Microsoft.OpenApi.Models
2626
/// </summary>
2727
public class OpenApiDocument : IOpenApiSerializable, IOpenApiExtensible, IOpenApiAnnotatable
2828
{
29+
/// <summary>
30+
/// Register components in the document to the workspace
31+
/// </summary>
32+
public void RegisterComponents()
33+
{
34+
Workspace?.RegisterComponents(this);
35+
}
2936
/// <summary>
3037
/// Related workspace containing components that are referenced in a document
3138
/// </summary>

src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs

+3-17
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,11 @@ namespace Microsoft.OpenApi.Models.References;
1010
/// <typeparam name="V">The interface type for the model.</typeparam>
1111
public abstract class BaseOpenApiReferenceHolder<T, V> : IOpenApiReferenceHolder<T, V> where T : class, IOpenApiReferenceable, V where V : IOpenApiSerializable
1212
{
13-
/// <summary>
14-
/// The resolved target object. This should remain readonly, otherwise mutating the reference will have side effects.
15-
/// </summary>
16-
protected readonly T _target;
1713
/// <inheritdoc/>
1814
public virtual T Target
1915
{
2016
get
2117
{
22-
if (_target is not null) return _target;
2318
return Reference.HostDocument?.ResolveReferenceTo<T>(Reference);
2419
}
2520
}
@@ -34,17 +29,6 @@ protected BaseOpenApiReferenceHolder(BaseOpenApiReferenceHolder<T, V> source)
3429
//no need to copy summary and description as if they are not overridden, they will be fetched from the target
3530
//if they are, the reference copy will handle it
3631
}
37-
private protected BaseOpenApiReferenceHolder(T target, string referenceId, ReferenceType referenceType)
38-
{
39-
Utils.CheckArgumentNull(target);
40-
_target = target;
41-
42-
Reference = new OpenApiReference()
43-
{
44-
Id = referenceId,
45-
Type = referenceType,
46-
};
47-
}
4832
/// <summary>
4933
/// Constructor initializing the reference object.
5034
/// </summary>
@@ -56,9 +40,11 @@ private protected BaseOpenApiReferenceHolder(T target, string referenceId, Refer
5640
/// 1. a absolute/relative file path, for example: ../commons/pet.json
5741
/// 2. a Url, for example: http://localhost/pet.json
5842
/// </param>
59-
protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument hostDocument, ReferenceType referenceType, string externalResource = null)
43+
protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument hostDocument, ReferenceType referenceType, string externalResource)
6044
{
6145
Utils.CheckArgumentNullOrEmpty(referenceId);
46+
// we're not checking for null hostDocument as it's optional and can be set via additional methods by a walker
47+
// this way object initialization of a whole document is supported
6248

6349
Reference = new OpenApiReference()
6450
{

src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class OpenApiCallbackReference : BaseOpenApiReferenceHolder<OpenApiCallba
2525
/// 1. an absolute/relative file path, for example: ../commons/pet.json
2626
/// 2. a Url, for example: http://localhost/pet.json
2727
/// </param>
28-
public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Callback, externalResource)
28+
public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Callback, externalResource)
2929
{
3030
}
3131
/// <summary>
@@ -37,10 +37,6 @@ private OpenApiCallbackReference(OpenApiCallbackReference callback):base(callbac
3737

3838
}
3939

40-
internal OpenApiCallbackReference(OpenApiCallback target, string referenceId):base(target, referenceId, ReferenceType.Callback)
41-
{
42-
}
43-
4440
/// <inheritdoc/>
4541
public Dictionary<RuntimeExpression, IOpenApiPathItem> PathItems { get => Target?.PathItems; }
4642

src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class OpenApiExampleReference : BaseOpenApiReferenceHolder<OpenApiExample
2525
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2626
/// 2. a Url, for example: http://localhost/pet.json
2727
/// </param>
28-
public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Example, externalResource)
28+
public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Example, externalResource)
2929
{
3030
}
3131
/// <summary>
@@ -36,10 +36,6 @@ private OpenApiExampleReference(OpenApiExampleReference example):base(example)
3636
{
3737
}
3838

39-
internal OpenApiExampleReference(OpenApiExample target, string referenceId):base(target, referenceId, ReferenceType.Example)
40-
{
41-
}
42-
4339
/// <inheritdoc/>
4440
public string Description
4541
{

src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class OpenApiHeaderReference : BaseOpenApiReferenceHolder<OpenApiHeader,
2424
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2525
/// 2. a Url, for example: http://localhost/pet.json
2626
/// </param>
27-
public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Header, externalResource)
27+
public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Header, externalResource)
2828
{
2929
}
3030

@@ -36,10 +36,6 @@ private OpenApiHeaderReference(OpenApiHeaderReference header):base(header)
3636
{
3737
}
3838

39-
internal OpenApiHeaderReference(OpenApiHeader target, string referenceId):base(target, referenceId, ReferenceType.Header)
40-
{
41-
}
42-
4339
/// <inheritdoc/>
4440
public string Description
4541
{

src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs

+1-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class OpenApiLinkReference : BaseOpenApiReferenceHolder<OpenApiLink, IOpe
2424
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2525
/// 2. a Url, for example: http://localhost/pet.json
2626
/// </param>
27-
public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Link, externalResource)
27+
public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Link, externalResource)
2828
{
2929
}
3030
/// <summary>
@@ -34,9 +34,6 @@ public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument, st
3434
private OpenApiLinkReference(OpenApiLinkReference reference):base(reference)
3535
{
3636
}
37-
internal OpenApiLinkReference(OpenApiLink target, string referenceId):base(target, referenceId, ReferenceType.Link)
38-
{
39-
}
4037

4138
/// <inheritdoc/>
4239
public string Description

src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class OpenApiParameterReference : BaseOpenApiReferenceHolder<OpenApiParam
2323
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2424
/// 2. a Url, for example: http://localhost/pet.json
2525
/// </param>
26-
public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Parameter, externalResource)
26+
public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Parameter, externalResource)
2727
{
2828
}
2929

@@ -35,10 +35,6 @@ private OpenApiParameterReference(OpenApiParameterReference parameter):base(para
3535
{
3636
}
3737

38-
internal OpenApiParameterReference(OpenApiParameter target, string referenceId):base(target, referenceId, ReferenceType.Parameter)
39-
{
40-
}
41-
4238
/// <inheritdoc/>
4339
public string Name { get => Target?.Name; }
4440

src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class OpenApiPathItemReference : BaseOpenApiReferenceHolder<OpenApiPathIt
2424
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2525
/// 2. a Url, for example: http://localhost/pet.json
2626
/// </param>
27-
public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null): base(referenceId, hostDocument, ReferenceType.PathItem, externalResource)
27+
public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null): base(referenceId, hostDocument, ReferenceType.PathItem, externalResource)
2828
{
2929
}
3030

@@ -37,10 +37,6 @@ private OpenApiPathItemReference(OpenApiPathItemReference pathItem):base(pathIte
3737

3838
}
3939

40-
internal OpenApiPathItemReference(OpenApiPathItem target, string referenceId):base(target, referenceId, ReferenceType.PathItem)
41-
{
42-
}
43-
4440
/// <inheritdoc/>
4541
public string Summary
4642
{

src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs

+1-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class OpenApiRequestBodyReference : BaseOpenApiReferenceHolder<OpenApiReq
2525
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2626
/// 2. a Url, for example: http://localhost/pet.json
2727
/// </param>
28-
public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.RequestBody, externalResource)
28+
public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.RequestBody, externalResource)
2929
{
3030
}
3131
/// <summary>
@@ -35,9 +35,6 @@ public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocum
3535
private OpenApiRequestBodyReference(OpenApiRequestBodyReference openApiRequestBodyReference):base(openApiRequestBodyReference)
3636
{
3737

38-
}
39-
internal OpenApiRequestBodyReference(OpenApiRequestBody target, string referenceId):base(target, referenceId, ReferenceType.RequestBody)
40-
{
4138
}
4239

4340
/// <inheritdoc/>

src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class OpenApiResponseReference : BaseOpenApiReferenceHolder<OpenApiRespon
2323
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2424
/// 2. a Url, for example: http://localhost/pet.json
2525
/// </param>
26-
public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Response, externalResource)
26+
public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Response, externalResource)
2727
{
2828
}
2929
/// <summary>
@@ -35,10 +35,6 @@ private OpenApiResponseReference(OpenApiResponseReference openApiResponseReferen
3535

3636
}
3737

38-
internal OpenApiResponseReference(OpenApiResponse target, string referenceId):base(target, referenceId, ReferenceType.Response)
39-
{
40-
}
41-
4238
/// <inheritdoc/>
4339
public string Description
4440
{

src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class OpenApiSchemaReference : BaseOpenApiReferenceHolder<OpenApiSchema,
2525
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2626
/// 2. a Url, for example: http://localhost/pet.json
2727
/// </param>
28-
public OpenApiSchemaReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Schema, externalResource)
28+
public OpenApiSchemaReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Schema, externalResource)
2929
{
3030
}
3131
/// <summary>
@@ -36,10 +36,6 @@ private OpenApiSchemaReference(OpenApiSchemaReference schema):base(schema)
3636
{
3737
}
3838

39-
internal OpenApiSchemaReference(OpenApiSchema target, string referenceId):base(target, referenceId, ReferenceType.Schema)
40-
{
41-
}
42-
4339
/// <inheritdoc/>
4440
public string Description
4541
{

src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs

+1-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class OpenApiSecuritySchemeReference : BaseOpenApiReferenceHolder<OpenApi
1919
/// <param name="referenceId">The reference Id.</param>
2020
/// <param name="hostDocument">The host OpenAPI document.</param>
2121
/// <param name="externalResource">The externally referenced file.</param>
22-
public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.SecurityScheme, externalResource)
22+
public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.SecurityScheme, externalResource)
2323
{
2424
}
2525
/// <summary>
@@ -29,9 +29,6 @@ public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDo
2929
private OpenApiSecuritySchemeReference(OpenApiSecuritySchemeReference openApiSecuritySchemeReference):base(openApiSecuritySchemeReference)
3030
{
3131

32-
}
33-
internal OpenApiSecuritySchemeReference(OpenApiSecurityScheme target, string referenceId):base(target, referenceId, ReferenceType.SecurityScheme)
34-
{
3532
}
3633

3734
/// <inheritdoc/>

src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public override OpenApiTag Target
2121
{
2222
get
2323
{
24-
if (_target is not null) return _target;
2524
return Reference.HostDocument?.Tags.FirstOrDefault(t => StringComparer.Ordinal.Equals(t.Name, Reference.Id));
2625
}
2726
}
@@ -31,7 +30,12 @@ public override OpenApiTag Target
3130
/// </summary>
3231
/// <param name="referenceId">The reference Id.</param>
3332
/// <param name="hostDocument">The host OpenAPI document.</param>
34-
public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument):base(referenceId, hostDocument, ReferenceType.Tag)
33+
/// <param name="externalResource">Optional: External resource in the reference.
34+
/// It may be:
35+
/// 1. a absolute/relative file path, for example: ../commons/pet.json
36+
/// 2. a Url, for example: http://localhost/pet.json
37+
/// </param>
38+
public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument = null, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Tag, externalResource)
3539
{
3640
}
3741
/// <summary>
@@ -43,10 +47,6 @@ private OpenApiTagReference(OpenApiTagReference openApiTagReference):base(openAp
4347

4448
}
4549

46-
internal OpenApiTagReference(OpenApiTag target, string referenceId):base(target, referenceId, ReferenceType.Tag)
47-
{
48-
}
49-
5050
/// <inheritdoc/>
5151
public string Description
5252
{

test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs

+1-15
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,7 @@ public async Task LoadResponseAndSchemaReference()
9999
{
100100
["application/json"] = new()
101101
{
102-
Schema = new OpenApiSchemaReference(new OpenApiSchema()
103-
{
104-
Description = "Sample description",
105-
Required = new HashSet<string> {"name" },
106-
Properties = {
107-
["name"] = new OpenApiSchema()
108-
{
109-
Type = JsonSchemaType.String
110-
},
111-
["tag"] = new OpenApiSchema()
112-
{
113-
Type = JsonSchemaType.String
114-
}
115-
},
116-
}, "SampleObject2")
102+
Schema = new OpenApiSchemaReference("SampleObject2")
117103
}
118104
}
119105
};

0 commit comments

Comments
 (0)