Skip to content

Commit 3eb2200

Browse files
authored
Open api example comparer (#331)
* Added Comparer logic for Example
1 parent 59260d3 commit 3eb2200

17 files changed

+1298
-23
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System;
5+
using System.IO;
6+
using Microsoft.OpenApi.Any;
7+
using Microsoft.OpenApi.Writers;
8+
9+
namespace Microsoft.OpenApi.Services
10+
{
11+
/// <summary>
12+
/// Defines behavior for comparing properties of <see cref="IOpenApiAny"/>.
13+
/// </summary>
14+
public class OpenApiAnyComparer : OpenApiComparerBase<IOpenApiAny>
15+
{
16+
/// <summary>
17+
/// Executes comparision against source and target <see cref="IOpenApiAny"/>.
18+
/// </summary>
19+
/// <param name="source">The source.</param>
20+
/// <param name="target">The target.</param>
21+
/// <param name="comparisonContext">Context under which to compare the source and target.</param>
22+
public override void Compare(
23+
IOpenApiAny source,
24+
IOpenApiAny target,
25+
ComparisonContext comparisonContext)
26+
{
27+
if (source == null && target == null)
28+
{
29+
return;
30+
}
31+
32+
if (source == null || target == null)
33+
{
34+
comparisonContext.AddOpenApiDifference(
35+
new OpenApiDifference
36+
{
37+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
38+
SourceValue = source,
39+
TargetValue = target,
40+
OpenApiComparedElementType = typeof(IOpenApiAny),
41+
Pointer = comparisonContext.PathString
42+
});
43+
44+
return;
45+
}
46+
47+
var sourceStringWriter = new StringWriter();
48+
var sourceWriter = new OpenApiJsonWriter(sourceStringWriter);
49+
50+
source.Write(sourceWriter, OpenApiSpecVersion.OpenApi3_0);
51+
var sourceValue = sourceStringWriter.GetStringBuilder().ToString();
52+
53+
var targetStringWriter = new StringWriter();
54+
var targetWriter = new OpenApiJsonWriter(targetStringWriter);
55+
56+
target.Write(targetWriter, OpenApiSpecVersion.OpenApi3_0);
57+
var targetValue = targetStringWriter.GetStringBuilder().ToString();
58+
59+
if (string.Compare(sourceValue, targetValue, StringComparison.InvariantCulture) != 0)
60+
{
61+
comparisonContext.AddOpenApiDifference(new OpenApiDifference
62+
{
63+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
64+
OpenApiComparedElementType = typeof(IOpenApiAny),
65+
SourceValue = source,
66+
TargetValue = target,
67+
Pointer = comparisonContext.PathString
68+
});
69+
}
70+
}
71+
}
72+
}

src/Microsoft.OpenApi/Services/OpenApiComparerFactory.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using Microsoft.OpenApi.Any;
67
using Microsoft.OpenApi.Models;
78

89
namespace Microsoft.OpenApi.Services
@@ -55,7 +56,10 @@ public class OpenApiComparerFactory
5556
{typeof(IList<OpenApiTag>), new OpenApiOrderedListComparer<OpenApiTag>()},
5657
{typeof(OpenApiExternalDocs), new OpenApiExternalDocsComparer()},
5758
{typeof(OpenApiTag), new OpenApiTagComparer()},
58-
{typeof(OpenApiSecurityScheme), new OpenApiSecuritySchemeComparer()}
59+
{typeof(OpenApiSecurityScheme), new OpenApiSecuritySchemeComparer()},
60+
{typeof(OpenApiExample), new OpenApiExampleComparer()},
61+
{typeof(IDictionary<string, OpenApiExample>), new OpenApiDictionaryComparer<OpenApiExample>()},
62+
{typeof(IOpenApiAny), new OpenApiAnyComparer()}
5963
};
6064

6165
private readonly Dictionary<Type, object> _typeToComparerMap = new Dictionary<Type, object>();

src/Microsoft.OpenApi/Services/OpenApiComponentsComparer.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,15 @@ public override void Compare(
8484
.GetComparer<IDictionary<string, OpenApiSecurityScheme>>()
8585
.Compare(sourceComponents.SecuritySchemes, targetComponents.SecuritySchemes, comparisonContext));
8686

87-
// To Do compare Examples
87+
WalkAndCompare(
88+
comparisonContext,
89+
OpenApiConstants.Examples,
90+
() => comparisonContext
91+
.GetComparer<IDictionary<string, OpenApiExample>>()
92+
.Compare(sourceComponents.Examples, targetComponents.Examples, comparisonContext));
93+
8894
// To Do compare Links
8995
// To Do compare Callbacks
90-
// To Do compare Extensions
9196
}
9297
}
9398
}

src/Microsoft.OpenApi/Services/OpenApiEncodingComparer.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ public override void Compare(
6060
() => comparisonContext
6161
.GetComparer<IDictionary<string, OpenApiHeader>>()
6262
.Compare(sourceEncoding.Headers, targetEncoding.Headers, comparisonContext));
63-
64-
// To Do Compare Extensions
6563
}
6664
}
6765
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using Microsoft.OpenApi.Any;
5+
using Microsoft.OpenApi.Models;
6+
7+
namespace Microsoft.OpenApi.Services
8+
{
9+
/// <summary>
10+
/// Defines behavior for comparing properties of <see cref="OpenApiExample"/>.
11+
/// </summary>
12+
public class OpenApiExampleComparer : OpenApiComparerBase<OpenApiExample>
13+
{
14+
/// <summary>
15+
/// Executes comparision against source and target <see cref="OpenApiExample"/>.
16+
/// </summary>
17+
/// <param name="sourceExample">The source.</param>
18+
/// <param name="targetExample">The target.</param>
19+
/// <param name="comparisonContext">Context under which to compare the source and target.</param>
20+
public override void Compare(
21+
OpenApiExample sourceExample,
22+
OpenApiExample targetExample,
23+
ComparisonContext comparisonContext)
24+
{
25+
if (sourceExample == null && targetExample == null)
26+
{
27+
return;
28+
}
29+
30+
if (sourceExample == null || targetExample == null)
31+
{
32+
comparisonContext.AddOpenApiDifference(
33+
new OpenApiDifference
34+
{
35+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
36+
SourceValue = sourceExample,
37+
TargetValue = targetExample,
38+
OpenApiComparedElementType = typeof(OpenApiExample),
39+
Pointer = comparisonContext.PathString
40+
});
41+
42+
return;
43+
}
44+
45+
new OpenApiReferenceComparer<OpenApiExample>()
46+
.Compare(sourceExample.Reference, targetExample.Reference, comparisonContext);
47+
48+
WalkAndCompare(comparisonContext, OpenApiConstants.Description,
49+
() => Compare(sourceExample.Description, targetExample.Description, comparisonContext));
50+
51+
WalkAndCompare(comparisonContext, OpenApiConstants.Summary,
52+
() => Compare(sourceExample.Summary, targetExample.Summary, comparisonContext));
53+
54+
WalkAndCompare(comparisonContext, OpenApiConstants.ExternalValue,
55+
() => Compare(sourceExample.ExternalValue, targetExample.ExternalValue, comparisonContext));
56+
57+
WalkAndCompare(
58+
comparisonContext,
59+
OpenApiConstants.Value,
60+
() => comparisonContext
61+
.GetComparer<IOpenApiAny>()
62+
.Compare(sourceExample.Value, targetExample.Value, comparisonContext));
63+
}
64+
}
65+
}

src/Microsoft.OpenApi/Services/OpenApiHeaderComparer.cs

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

44
using System.Collections.Generic;
5+
using Microsoft.OpenApi.Any;
56
using Microsoft.OpenApi.Models;
67

78
namespace Microsoft.OpenApi.Services
@@ -104,9 +105,19 @@ public override void Compare(
104105
.GetComparer<OpenApiSchema>()
105106
.Compare(sourceHeader.Schema, targetHeader.Schema, comparisonContext));
106107

107-
// To do compare example
108-
// To do compare examples
109-
// To do compare extensions
108+
WalkAndCompare(
109+
comparisonContext,
110+
OpenApiConstants.Examples,
111+
() => comparisonContext
112+
.GetComparer<IDictionary<string, OpenApiExample>>()
113+
.Compare(sourceHeader.Examples, targetHeader.Examples, comparisonContext));
114+
115+
WalkAndCompare(
116+
comparisonContext,
117+
OpenApiConstants.Example,
118+
() => comparisonContext
119+
.GetComparer<IOpenApiAny>()
120+
.Compare(sourceHeader.Example, targetHeader.Example, comparisonContext));
110121
}
111122
}
112123
}

src/Microsoft.OpenApi/Services/OpenApiMediaTypeComparer.cs

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

44
using System.Collections.Generic;
5+
using Microsoft.OpenApi.Any;
56
using Microsoft.OpenApi.Models;
67

78
namespace Microsoft.OpenApi.Services
@@ -47,7 +48,7 @@ public override void Compare(
4748
OpenApiConstants.Schema,
4849
() => comparisonContext
4950
.GetComparer<OpenApiSchema>()
50-
.Compare( sourceMediaType.Schema, targetMediaType.Schema, comparisonContext ) );
51+
.Compare(sourceMediaType.Schema, targetMediaType.Schema, comparisonContext));
5152

5253
WalkAndCompare(
5354
comparisonContext,
@@ -56,9 +57,19 @@ public override void Compare(
5657
.GetComparer<IDictionary<string, OpenApiEncoding>>()
5758
.Compare(sourceMediaType.Encoding, sourceMediaType.Encoding, comparisonContext));
5859

59-
// To Do Compare Example
60-
// To Do Compare Examples
61-
// To Do Compare Extensions
60+
WalkAndCompare(
61+
comparisonContext,
62+
OpenApiConstants.Examples,
63+
() => comparisonContext
64+
.GetComparer<IDictionary<string, OpenApiExample>>()
65+
.Compare(sourceMediaType.Examples, targetMediaType.Examples, comparisonContext));
66+
67+
WalkAndCompare(
68+
comparisonContext,
69+
OpenApiConstants.Example,
70+
() => comparisonContext
71+
.GetComparer<IOpenApiAny>()
72+
.Compare(sourceMediaType.Example, targetMediaType.Example, comparisonContext));
6273
}
6374
}
6475
}

src/Microsoft.OpenApi/Services/OpenApiParameterComparer.cs

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

44
using System.Collections.Generic;
5+
using Microsoft.OpenApi.Any;
56
using Microsoft.OpenApi.Models;
67

78
namespace Microsoft.OpenApi.Services
@@ -86,8 +87,19 @@ public override void Compare(
8687
.GetComparer<OpenApiSchema>()
8788
.Compare(sourceParameter.Schema, targetParameter.Schema, comparisonContext));
8889

89-
// To Do Compare Examples
90-
// To Do Compare parameter as IOpenApiExtensible
90+
WalkAndCompare(
91+
comparisonContext,
92+
OpenApiConstants.Examples,
93+
() => comparisonContext
94+
.GetComparer<IDictionary<string, OpenApiExample>>()
95+
.Compare(sourceParameter.Examples, targetParameter.Examples, comparisonContext));
96+
97+
WalkAndCompare(
98+
comparisonContext,
99+
OpenApiConstants.Example,
100+
() => comparisonContext
101+
.GetComparer<IOpenApiAny>()
102+
.Compare(sourceParameter.Example, targetParameter.Example, comparisonContext));
91103
}
92104
}
93105
}

src/Microsoft.OpenApi/Services/OpenApiPathItemComparer.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ public override void Compare(
5353
() => comparisonContext
5454
.GetComparer<IList<OpenApiServer>>()
5555
.Compare(sourcePathItem?.Servers, targetPathItem?.Servers, comparisonContext));
56-
57-
// To Do Compare Extensions
5856
}
5957
}
6058
}

src/Microsoft.OpenApi/Services/OpenApiRequestBodyComparer.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ public override void Compare(
5757
() => comparisonContext
5858
.GetComparer<IDictionary<string, OpenApiMediaType>>()
5959
.Compare(sourceRequestBody.Content, targetRequestBody.Content, comparisonContext));
60-
61-
//To Do Compare Extensions
6260
}
6361
}
6462
}

0 commit comments

Comments
 (0)