Skip to content

Commit f59c308

Browse files
committed
More diff work
1 parent 3c3e74f commit f59c308

21 files changed

+2287
-44
lines changed

src/Microsoft.OpenApi/Services/OpenApiComparerBase.cs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ internal void Compare(bool? source, bool? target, ComparisonContext comparisonCo
6464
comparisonContext.AddOpenApiDifference(new OpenApiDifference
6565
{
6666
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
67-
OpenApiComparedElementType = typeof(bool),
67+
OpenApiComparedElementType = typeof(bool?),
6868
SourceValue = source,
6969
TargetValue = target,
7070
Pointer = comparisonContext.PathString
@@ -90,7 +90,47 @@ internal void Compare(decimal? source, decimal? target, ComparisonContext compar
9090
comparisonContext.AddOpenApiDifference(new OpenApiDifference
9191
{
9292
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
93-
OpenApiComparedElementType = typeof(decimal),
93+
OpenApiComparedElementType = typeof(decimal?),
94+
SourceValue = source,
95+
TargetValue = target,
96+
Pointer = comparisonContext.PathString
97+
});
98+
}
99+
}
100+
101+
/// <summary>
102+
/// Compares Enum.
103+
/// </summary>
104+
/// <param name="source">The source.</param>
105+
/// <param name="target">The target.</param>
106+
/// <param name="comparisonContext">The context under which to compare the objects.</param>
107+
internal void Compare<TE>(Enum source, Enum target, ComparisonContext comparisonContext)
108+
{
109+
if (source == null && target == null)
110+
{
111+
return;
112+
}
113+
114+
if (source == null || target == null)
115+
{
116+
comparisonContext.AddOpenApiDifference(new OpenApiDifference
117+
{
118+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
119+
OpenApiComparedElementType = typeof(TE),
120+
SourceValue = source,
121+
TargetValue = target,
122+
Pointer = comparisonContext.PathString
123+
});
124+
125+
return;
126+
}
127+
128+
if (!source.Equals(target))
129+
{
130+
comparisonContext.AddOpenApiDifference(new OpenApiDifference
131+
{
132+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
133+
OpenApiComparedElementType = typeof(T),
94134
SourceValue = source,
95135
TargetValue = target,
96136
Pointer = comparisonContext.PathString

src/Microsoft.OpenApi/Services/OpenApiComparerFactory.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,23 @@ public class OpenApiComparerFactory
2424
{typeof(OpenApiMediaType), new OpenApiMediaTypeComparer()},
2525
{typeof(IDictionary<string, OpenApiMediaType>), new OpenApiDictionaryComparer<OpenApiMediaType>()},
2626
{typeof(IDictionary<string, OpenApiResponse>), new OpenApiDictionaryComparer<OpenApiResponse>()},
27+
{typeof(IDictionary<string, OpenApiHeader>), new OpenApiDictionaryComparer<OpenApiHeader>()},
28+
{typeof(IDictionary<string, OpenApiEncoding>), new OpenApiDictionaryComparer<OpenApiEncoding>()},
29+
{
30+
typeof(IDictionary<string, OpenApiServerVariable>),
31+
new OpenApiDictionaryComparer<OpenApiServerVariable>()
32+
},
33+
{typeof(IDictionary<string, OpenApiParameter>), new OpenApiDictionaryComparer<OpenApiParameter>()},
34+
{typeof(IDictionary<string, OpenApiRequestBody>), new OpenApiDictionaryComparer<OpenApiRequestBody>()},
35+
{typeof(IDictionary<string, OpenApiSchema>), new OpenApiDictionaryComparer<OpenApiSchema>()},
36+
{typeof(OpenApiHeader), new OpenApiHeaderComparer()},
2737
{typeof(OpenApiRequestBody), new OpenApiRequestBodyComparer()},
28-
{typeof(OpenApiResponse), new OpenApiResponseComparer()}
38+
{typeof(OpenApiResponse), new OpenApiResponseComparer()},
39+
{typeof(OpenApiComponents), new OpenApiComponentsComparer()},
40+
{typeof(OpenApiEncoding), new OpenApiEncodingComparer()},
41+
{typeof(IList<OpenApiServer>), new OpenApiServersComparer()},
42+
{typeof(OpenApiServer), new OpenApiServerComparer()},
43+
{typeof(OpenApiServerVariable), new OpenApiServerVariableComparer()}
2944
};
3045

3146
private readonly Dictionary<Type, object> _typeToComparerMap = new Dictionary<Type, object>();
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using Microsoft.OpenApi.Models;
6+
7+
namespace Microsoft.OpenApi.Services
8+
{
9+
/// <summary>
10+
/// Defines behavior for comparing properties of <see cref="OpenApiComponents"/>.
11+
/// </summary>
12+
public class OpenApiComponentsComparer : OpenApiComparerBase<OpenApiComponents>
13+
{
14+
/// <summary>
15+
/// Executes comparision against source and target <see cref="OpenApiComponents"/>.
16+
/// </summary>
17+
/// <param name="sourceComponents">The source.</param>
18+
/// <param name="targetComponents">The target.</param>
19+
/// <param name="comparisonContext">Context under which to compare the source and target.</param>
20+
public override void Compare(
21+
OpenApiComponents sourceComponents,
22+
OpenApiComponents targetComponents,
23+
ComparisonContext comparisonContext)
24+
{
25+
if (sourceComponents == null && targetComponents == null)
26+
{
27+
return;
28+
}
29+
30+
if (sourceComponents == null || targetComponents == null)
31+
{
32+
comparisonContext.AddOpenApiDifference(
33+
new OpenApiDifference
34+
{
35+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
36+
SourceValue = sourceComponents,
37+
TargetValue = targetComponents,
38+
OpenApiComparedElementType = typeof(OpenApiComponents),
39+
Pointer = comparisonContext.PathString
40+
});
41+
42+
return;
43+
}
44+
45+
WalkAndCompare(
46+
comparisonContext,
47+
OpenApiConstants.Parameters,
48+
() => comparisonContext
49+
.GetComparer<IDictionary<string, OpenApiParameter>>()
50+
.Compare(sourceComponents.Parameters, targetComponents.Parameters, comparisonContext));
51+
52+
WalkAndCompare(
53+
comparisonContext,
54+
OpenApiConstants.RequestBodies,
55+
() => comparisonContext
56+
.GetComparer<IDictionary<string, OpenApiRequestBody>>()
57+
.Compare(sourceComponents.RequestBodies, targetComponents.RequestBodies, comparisonContext));
58+
59+
WalkAndCompare(
60+
comparisonContext,
61+
OpenApiConstants.Responses,
62+
() => comparisonContext
63+
.GetComparer<IDictionary<string, OpenApiResponse>>()
64+
.Compare(sourceComponents.Responses, targetComponents.Responses, comparisonContext));
65+
66+
WalkAndCompare(
67+
comparisonContext,
68+
OpenApiConstants.Schemas,
69+
() => comparisonContext
70+
.GetComparer<IDictionary<string, OpenApiSchema>>()
71+
.Compare(sourceComponents.Schemas, targetComponents.Schemas, comparisonContext));
72+
73+
WalkAndCompare(
74+
comparisonContext,
75+
OpenApiConstants.Headers,
76+
() => comparisonContext
77+
.GetComparer<IDictionary<string, OpenApiHeader>>()
78+
.Compare(sourceComponents.Headers, targetComponents.Headers, comparisonContext));
79+
80+
// To Do compare Examples
81+
// To Do compare SecuritySchemes
82+
// To Do compare Links
83+
// To Do compare Callbacks
84+
// To Do compare Extensions
85+
}
86+
}
87+
}

src/Microsoft.OpenApi/Services/OpenApiDocumentComparer.cs

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

4+
using System.Collections.Generic;
45
using Microsoft.OpenApi.Models;
56

67
namespace Microsoft.OpenApi.Services
@@ -14,7 +15,7 @@ public class OpenApiDocumentComparer : OpenApiComparerBase<OpenApiDocument>
1415
/// Executes comparision against source and target <see cref="OpenApiDocument"/>.
1516
/// </summary>
1617
/// <param name="sourceDocument">The source.</param>
17-
/// <param name="targetDocument">The target</param>
18+
/// <param name="targetDocument">The target.</param>
1819
/// <param name="comparisonContext">Context under which to compare the source and target.</param>
1920
public override void Compare(
2021
OpenApiDocument sourceDocument,
@@ -28,9 +29,21 @@ public override void Compare(
2829
.GetComparer<OpenApiPaths>()
2930
.Compare(sourceDocument.Paths, targetDocument.Paths, comparisonContext));
3031

32+
WalkAndCompare(
33+
comparisonContext,
34+
OpenApiConstants.Components,
35+
() => comparisonContext
36+
.GetComparer<OpenApiComponents>()
37+
.Compare(sourceDocument.Components, targetDocument.Components, comparisonContext));
38+
39+
WalkAndCompare(
40+
comparisonContext,
41+
OpenApiConstants.Components,
42+
() => comparisonContext
43+
.GetComparer<IList<OpenApiServer>>()
44+
.Compare(sourceDocument.Servers, targetDocument.Servers, comparisonContext));
45+
3146
// To Do Compare Info
32-
// To Do Compare Servers
33-
// To Do Compare Components
3447
// To Do Compare Security Requirements
3548
// To Do Compare Tags
3649
// To Do Compare External Docs
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using Microsoft.OpenApi.Models;
6+
7+
namespace Microsoft.OpenApi.Services
8+
{
9+
/// <summary>
10+
/// Defines behavior for comparing properties of <see cref="OpenApiEncoding"/>.
11+
/// </summary>
12+
public class OpenApiEncodingComparer : OpenApiComparerBase<OpenApiEncoding>
13+
{
14+
/// <summary>
15+
/// Executes comparision against source and target <see cref="OpenApiEncoding"/>.
16+
/// </summary>
17+
/// <param name="sourceEncoding">The source.</param>
18+
/// <param name="targetEncoding">The target.</param>
19+
/// <param name="comparisonContext">Context under which to compare the source and target.</param>
20+
public override void Compare(
21+
OpenApiEncoding sourceEncoding,
22+
OpenApiEncoding targetEncoding,
23+
ComparisonContext comparisonContext)
24+
{
25+
if (sourceEncoding == null && targetEncoding == null)
26+
{
27+
return;
28+
}
29+
30+
if (sourceEncoding == null || targetEncoding == null)
31+
{
32+
comparisonContext.AddOpenApiDifference(
33+
new OpenApiDifference
34+
{
35+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
36+
SourceValue = sourceEncoding,
37+
TargetValue = targetEncoding,
38+
OpenApiComparedElementType = typeof(OpenApiEncoding),
39+
Pointer = comparisonContext.PathString
40+
});
41+
42+
return;
43+
}
44+
45+
WalkAndCompare(comparisonContext, OpenApiConstants.ContentType,
46+
() => Compare(sourceEncoding.ContentType, targetEncoding.ContentType, comparisonContext));
47+
48+
WalkAndCompare(comparisonContext, OpenApiConstants.Explode,
49+
() => Compare(sourceEncoding.Explode, targetEncoding.Explode, comparisonContext));
50+
51+
WalkAndCompare(comparisonContext, OpenApiConstants.AllowReserved,
52+
() => Compare(sourceEncoding.AllowReserved, targetEncoding.AllowReserved, comparisonContext));
53+
54+
55+
WalkAndCompare(comparisonContext, OpenApiConstants.Style,
56+
() => Compare<ParameterStyle>(sourceEncoding.Style, targetEncoding.Style, comparisonContext));
57+
58+
WalkAndCompare(
59+
comparisonContext,
60+
OpenApiConstants.Headers,
61+
() => comparisonContext
62+
.GetComparer<IDictionary<string, OpenApiHeader>>()
63+
.Compare(sourceEncoding.Headers, targetEncoding.Headers, comparisonContext));
64+
65+
// To Do Compare Extensions
66+
}
67+
}
68+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using Microsoft.OpenApi.Models;
6+
7+
namespace Microsoft.OpenApi.Services
8+
{
9+
/// <summary>
10+
/// Defines behavior for comparing properties of <see cref="OpenApiHeader"/>.
11+
/// </summary>
12+
public class OpenApiHeaderComparer : OpenApiComparerBase<OpenApiHeader>
13+
{
14+
/// <summary>
15+
/// Executes comparision against source and target <see cref="OpenApiHeader"/>.
16+
/// </summary>
17+
/// <param name="sourceHeader">The source.</param>
18+
/// <param name="targetHeader">The target.</param>
19+
/// <param name="comparisonContext">Context under which to compare the source and target.</param>
20+
public override void Compare(
21+
OpenApiHeader sourceHeader,
22+
OpenApiHeader targetHeader,
23+
ComparisonContext comparisonContext)
24+
{
25+
if (sourceHeader == null && targetHeader == null)
26+
{
27+
return;
28+
}
29+
30+
if (sourceHeader == null || targetHeader == null)
31+
{
32+
comparisonContext.AddOpenApiDifference(
33+
new OpenApiDifference
34+
{
35+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
36+
SourceValue = sourceHeader,
37+
TargetValue = targetHeader,
38+
OpenApiComparedElementType = typeof(OpenApiHeader),
39+
Pointer = comparisonContext.PathString
40+
});
41+
42+
return;
43+
}
44+
45+
if (sourceHeader.Reference != null
46+
&& targetHeader.Reference != null
47+
&& sourceHeader.Reference.Id != targetHeader.Reference.Id)
48+
{
49+
WalkAndAddOpenApiDifference(
50+
comparisonContext,
51+
"$ref",
52+
new OpenApiDifference
53+
{
54+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
55+
SourceValue = sourceHeader.Reference,
56+
TargetValue = targetHeader.Reference,
57+
OpenApiComparedElementType = typeof(OpenApiReference)
58+
});
59+
60+
return;
61+
}
62+
63+
if (sourceHeader.Reference != null)
64+
{
65+
sourceHeader = (OpenApiHeader) comparisonContext.SourceDocument.ResolveReference(
66+
targetHeader.Reference);
67+
}
68+
69+
if (targetHeader.Reference != null)
70+
{
71+
targetHeader = (OpenApiHeader) comparisonContext.TargetDocument.ResolveReference(
72+
targetHeader.Reference);
73+
}
74+
75+
WalkAndCompare(comparisonContext, OpenApiConstants.Description,
76+
() => Compare(sourceHeader.Description, targetHeader.Description, comparisonContext));
77+
78+
WalkAndCompare(comparisonContext, OpenApiConstants.Required,
79+
() => Compare(sourceHeader.Required, targetHeader.Required, comparisonContext));
80+
81+
WalkAndCompare(comparisonContext, OpenApiConstants.Deprecated,
82+
() => Compare(sourceHeader.Deprecated, targetHeader.Deprecated, comparisonContext));
83+
84+
WalkAndCompare(comparisonContext, OpenApiConstants.AllowEmptyValue,
85+
() => Compare(sourceHeader.AllowEmptyValue, targetHeader.AllowEmptyValue, comparisonContext));
86+
87+
WalkAndCompare(comparisonContext, OpenApiConstants.Explode,
88+
() => Compare(sourceHeader.Explode, targetHeader.Explode, comparisonContext));
89+
90+
WalkAndCompare(comparisonContext, OpenApiConstants.AllowReserved,
91+
() => Compare(sourceHeader.AllowReserved, targetHeader.AllowReserved, comparisonContext));
92+
93+
WalkAndCompare(
94+
comparisonContext,
95+
OpenApiConstants.Content,
96+
() => comparisonContext
97+
.GetComparer<IDictionary<string, OpenApiMediaType>>()
98+
.Compare(sourceHeader.Content, targetHeader.Content, comparisonContext));
99+
100+
WalkAndCompare(
101+
comparisonContext,
102+
OpenApiConstants.Schema,
103+
() => comparisonContext
104+
.GetComparer<OpenApiSchema>()
105+
.Compare(sourceHeader.Schema, targetHeader.Schema, comparisonContext));
106+
107+
// To do compare example
108+
// To do compare examples
109+
// To do compare extensions
110+
}
111+
}
112+
}

0 commit comments

Comments
 (0)