Skip to content

Commit 6e07252

Browse files
authored
Add support for examples diff (#671)
1 parent a8ef8e0 commit 6e07252

19 files changed

+1054
-22
lines changed

core/src/main/java/org/openapitools/openapidiff/core/compare/ContentDiff.java

+7-12
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
import io.swagger.v3.oas.models.media.Content;
77
import io.swagger.v3.oas.models.media.MediaType;
8-
import java.util.*;
8+
import java.util.LinkedHashMap;
9+
import java.util.List;
10+
import java.util.Map;
911
import org.openapitools.openapidiff.core.model.Changed;
1012
import org.openapitools.openapidiff.core.model.ChangedContent;
1113
import org.openapitools.openapidiff.core.model.ChangedMediaType;
@@ -34,22 +36,15 @@ public DeferredChanged<ChangedContent> diff(Content left, Content right, DiffCon
3436
MediaType oldMediaType = left.get(mediaTypeKey);
3537
MediaType newMediaType = right.get(mediaTypeKey);
3638

37-
ChangedMediaType changedMediaType =
38-
new ChangedMediaType(oldMediaType.getSchema(), newMediaType.getSchema(), context);
39-
4039
builder
4140
.with(
4241
openApiDiff
43-
.getSchemaDiff()
44-
.diff(
45-
oldMediaType.getSchema(),
46-
newMediaType.getSchema(),
47-
context.copyWithRequired(true)))
42+
.getMediaTypeDiff()
43+
.diff(oldMediaType, newMediaType, context.copyWithRequired(true)))
4844
.ifPresent(
4945
value -> {
50-
changedMediaType.setSchema(value);
51-
if (!isUnchanged(changedMediaType)) {
52-
changedMediaTypes.put(mediaTypeKey, changedMediaType);
46+
if (!isUnchanged(value)) {
47+
changedMediaTypes.put(mediaTypeKey, value);
5348
}
5449
});
5550
});

core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.util.Objects;
77
import java.util.Optional;
88
import org.openapitools.openapidiff.core.model.Changed;
9+
import org.openapitools.openapidiff.core.model.ChangedExample;
10+
import org.openapitools.openapidiff.core.model.ChangedExamples;
911
import org.openapitools.openapidiff.core.model.ChangedHeader;
1012
import org.openapitools.openapidiff.core.model.DiffContext;
1113
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
@@ -49,7 +51,9 @@ protected DeferredChanged<ChangedHeader> computeDiff(
4951
!Boolean.TRUE.equals(left.getDeprecated())
5052
&& Boolean.TRUE.equals(right.getDeprecated()))
5153
.setStyle(!Objects.equals(left.getStyle(), right.getStyle()))
52-
.setExplode(getBooleanDiff(left.getExplode(), right.getExplode()));
54+
.setExplode(getBooleanDiff(left.getExplode(), right.getExplode()))
55+
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()))
56+
.setExample(new ChangedExample(left.getExample(), right.getExample()));
5357
builder
5458
.with(
5559
openApiDiff
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.openapitools.openapidiff.core.compare;
2+
3+
import static org.openapitools.openapidiff.core.utils.ChangedUtils.isChanged;
4+
5+
import io.swagger.v3.oas.models.media.MediaType;
6+
import org.openapitools.openapidiff.core.model.Changed;
7+
import org.openapitools.openapidiff.core.model.ChangedExample;
8+
import org.openapitools.openapidiff.core.model.ChangedExamples;
9+
import org.openapitools.openapidiff.core.model.ChangedMediaType;
10+
import org.openapitools.openapidiff.core.model.DiffContext;
11+
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
12+
import org.openapitools.openapidiff.core.model.deferred.DeferredChanged;
13+
14+
public class MediaTypeDiff {
15+
16+
private final OpenApiDiff openApiDiff;
17+
18+
public MediaTypeDiff(OpenApiDiff openApiDiff) {
19+
this.openApiDiff = openApiDiff;
20+
}
21+
22+
public DeferredChanged<ChangedMediaType> diff(
23+
MediaType left, MediaType right, DiffContext context) {
24+
DeferredBuilder<Changed> builder = new DeferredBuilder<>();
25+
26+
ChangedMediaType changedMediaType =
27+
new ChangedMediaType(left.getSchema(), right.getSchema(), context)
28+
.setExample(new ChangedExample(left.getExample(), right.getExample()))
29+
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()));
30+
31+
builder
32+
.with(
33+
openApiDiff
34+
.getSchemaDiff()
35+
.diff(left.getSchema(), right.getSchema(), context.copyWithRequired(true)))
36+
.ifPresent(changedMediaType::setSchema);
37+
38+
return builder.build().mapOptional(value -> isChanged(changedMediaType));
39+
}
40+
}

core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java

+6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class OpenApiDiff {
2424
private PathDiff pathDiff;
2525
private SchemaDiff schemaDiff;
2626
private ContentDiff contentDiff;
27+
private MediaTypeDiff mediaTypeDiff;
2728
private ParametersDiff parametersDiff;
2829
private ParameterDiff parameterDiff;
2930
private RequestBodyDiff requestBodyDiff;
@@ -76,6 +77,7 @@ private void initializeFields() {
7677
this.pathDiff = new PathDiff(this);
7778
this.schemaDiff = new SchemaDiff(this);
7879
this.contentDiff = new ContentDiff(this);
80+
this.mediaTypeDiff = new MediaTypeDiff(this);
7981
this.parametersDiff = new ParametersDiff(this);
8082
this.parameterDiff = new ParameterDiff(this);
8183
this.requestBodyDiff = new RequestBodyDiff(this);
@@ -204,6 +206,10 @@ public ContentDiff getContentDiff() {
204206
return this.contentDiff;
205207
}
206208

209+
public MediaTypeDiff getMediaTypeDiff() {
210+
return this.mediaTypeDiff;
211+
}
212+
207213
public ParametersDiff getParametersDiff() {
208214
return this.parametersDiff;
209215
}

core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.util.Objects;
77
import java.util.Optional;
88
import org.openapitools.openapidiff.core.model.Changed;
9+
import org.openapitools.openapidiff.core.model.ChangedExample;
10+
import org.openapitools.openapidiff.core.model.ChangedExamples;
911
import org.openapitools.openapidiff.core.model.ChangedParameter;
1012
import org.openapitools.openapidiff.core.model.DiffContext;
1113
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
@@ -56,7 +58,9 @@ protected DeferredChanged<ChangedParameter> computeDiff(
5658
.setChangeAllowEmptyValue(
5759
getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue()))
5860
.setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle()))
59-
.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode()));
61+
.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode()))
62+
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()))
63+
.setExample(new ChangedExample(left.getExample(), right.getExample()));
6064
builder
6165
.with(
6266
openApiDiff

core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ protected static Schema<?> resolveComposedSchema(
106106
return schema;
107107
}
108108

109-
protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) {
109+
protected static <T, U> Schema<T> addSchema(Schema<T> schema, Schema<U> fromSchema) {
110110
if (fromSchema.getProperties() != null) {
111111
if (schema.getProperties() == null) {
112112
schema.setProperties(new LinkedHashMap<>());
@@ -206,6 +206,9 @@ protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) {
206206
if (fromSchema.getExample() != null) {
207207
schema.setExample(fromSchema.getExample());
208208
}
209+
if (fromSchema.getExamples() != null) {
210+
schema.setExamples((List<T>) fromSchema.getExamples());
211+
}
209212
if (fromSchema.getExternalDocs() != null) {
210213
if (schema.getExternalDocs() == null) {
211214
schema.setExternalDocs(new ExternalDocumentation());

core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.openapitools.openapidiff.core.compare.OpenApiDiff;
1212
import org.openapitools.openapidiff.core.model.Change;
1313
import org.openapitools.openapidiff.core.model.Changed;
14+
import org.openapitools.openapidiff.core.model.ChangedExample;
15+
import org.openapitools.openapidiff.core.model.ChangedExamples;
1416
import org.openapitools.openapidiff.core.model.ChangedSchema;
1517
import org.openapitools.openapidiff.core.model.DiffContext;
1618
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
@@ -70,7 +72,9 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff(
7072
right.getExclusiveMinimum(),
7173
left.getExclusiveMaximum(),
7274
right.getExclusiveMaximum(),
73-
context));
75+
context))
76+
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()))
77+
.setExample(new ChangedExample(left.getExample(), right.getExample()));
7478
builder
7579
.with(
7680
openApiDiff
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.openapitools.openapidiff.core.model;
2+
3+
import java.util.Objects;
4+
5+
public class ChangedExample implements Changed {
6+
7+
private Object leftExample;
8+
private Object rightExample;
9+
10+
public ChangedExample(Object leftExample, Object rightExample) {
11+
this.leftExample = leftExample;
12+
this.rightExample = rightExample;
13+
}
14+
15+
public Object getLeftExample() {
16+
return leftExample;
17+
}
18+
19+
public void setLeftExample(Object leftExample) {
20+
this.leftExample = leftExample;
21+
}
22+
23+
public Object getRightExample() {
24+
return rightExample;
25+
}
26+
27+
public void setRightExample(Object rightExample) {
28+
this.rightExample = rightExample;
29+
}
30+
31+
@Override
32+
public DiffResult isChanged() {
33+
if (!Objects.equals(leftExample, rightExample)) {
34+
return DiffResult.METADATA;
35+
}
36+
return DiffResult.NO_CHANGES;
37+
}
38+
39+
@Override
40+
public boolean equals(Object object) {
41+
if (this == object) {
42+
return true;
43+
}
44+
if (object == null || getClass() != object.getClass()) {
45+
return false;
46+
}
47+
ChangedExample that = (ChangedExample) object;
48+
return Objects.equals(leftExample, that.leftExample)
49+
&& Objects.equals(rightExample, that.rightExample);
50+
}
51+
52+
@Override
53+
public int hashCode() {
54+
return Objects.hash(leftExample, rightExample);
55+
}
56+
57+
@Override
58+
public String toString() {
59+
return "ChangedExample{"
60+
+ "leftExample="
61+
+ leftExample
62+
+ ", rightExample="
63+
+ rightExample
64+
+ '}';
65+
}
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.openapitools.openapidiff.core.model;
2+
3+
import java.util.Objects;
4+
5+
public class ChangedExamples implements Changed {
6+
7+
private Object leftExamples;
8+
private Object rightExamples;
9+
10+
public ChangedExamples(Object leftExamples, Object rightExamples) {
11+
this.leftExamples = leftExamples;
12+
this.rightExamples = rightExamples;
13+
}
14+
15+
public Object getLeftExamples() {
16+
return leftExamples;
17+
}
18+
19+
public void setLeftExamples(Object leftExamples) {
20+
this.leftExamples = leftExamples;
21+
}
22+
23+
public Object getRightExamples() {
24+
return rightExamples;
25+
}
26+
27+
public void setRightExamples(Object rightExamples) {
28+
this.rightExamples = rightExamples;
29+
}
30+
31+
@Override
32+
public DiffResult isChanged() {
33+
if (!Objects.equals(leftExamples, rightExamples)) {
34+
return DiffResult.METADATA;
35+
}
36+
return DiffResult.NO_CHANGES;
37+
}
38+
39+
@Override
40+
public boolean equals(Object object) {
41+
if (this == object) {
42+
return true;
43+
}
44+
if (object == null || getClass() != object.getClass()) {
45+
return false;
46+
}
47+
ChangedExamples that = (ChangedExamples) object;
48+
return Objects.equals(leftExamples, that.leftExamples)
49+
&& Objects.equals(rightExamples, that.rightExamples);
50+
}
51+
52+
@Override
53+
public int hashCode() {
54+
return Objects.hash(leftExamples, rightExamples);
55+
}
56+
57+
@Override
58+
public String toString() {
59+
return "ChangedExamples{"
60+
+ ", leftExamples="
61+
+ leftExamples
62+
+ ", rightExamples="
63+
+ rightExamples
64+
+ '}';
65+
}
66+
}

core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java

+29-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class ChangedHeader implements ComposedChanged {
1818
private boolean style;
1919
private boolean explode;
2020
private ChangedMetadata description;
21+
private ChangedExamples examples;
22+
private ChangedExample example;
2123
private ChangedSchema schema;
2224
private ChangedContent content;
2325
private ChangedExtensions extensions;
@@ -30,7 +32,7 @@ public ChangedHeader(Header oldHeader, Header newHeader, DiffContext context) {
3032

3133
@Override
3234
public List<Changed> getChangedElements() {
33-
return Arrays.asList(description, schema, content, extensions);
35+
return Arrays.asList(description, example, examples, schema, content, extensions);
3436
}
3537

3638
@Override
@@ -96,6 +98,14 @@ public ChangedMetadata getDescription() {
9698
return this.description;
9799
}
98100

101+
public ChangedExamples getExamples() {
102+
return this.examples;
103+
}
104+
105+
public ChangedExample getExample() {
106+
return this.example;
107+
}
108+
99109
public ChangedSchema getSchema() {
100110
return this.schema;
101111
}
@@ -133,6 +143,16 @@ public ChangedHeader setDescription(final ChangedMetadata description) {
133143
return this;
134144
}
135145

146+
public ChangedHeader setExamples(ChangedExamples examples) {
147+
this.examples = examples;
148+
return this;
149+
}
150+
151+
public ChangedHeader setExample(ChangedExample example) {
152+
this.example = example;
153+
return this;
154+
}
155+
136156
public ChangedHeader setSchema(final ChangedSchema schema) {
137157
this.schema = schema;
138158
return this;
@@ -161,6 +181,8 @@ public boolean equals(Object o) {
161181
&& Objects.equals(newHeader, that.newHeader)
162182
&& Objects.equals(context, that.context)
163183
&& Objects.equals(description, that.description)
184+
&& Objects.equals(examples, that.examples)
185+
&& Objects.equals(example, that.example)
164186
&& Objects.equals(schema, that.schema)
165187
&& Objects.equals(content, that.content)
166188
&& Objects.equals(extensions, that.extensions);
@@ -177,6 +199,8 @@ public int hashCode() {
177199
style,
178200
explode,
179201
description,
202+
examples,
203+
example,
180204
schema,
181205
content,
182206
extensions);
@@ -200,6 +224,10 @@ public java.lang.String toString() {
200224
+ this.isExplode()
201225
+ ", description="
202226
+ this.getDescription()
227+
+ ", examples="
228+
+ this.getExamples()
229+
+ ", example="
230+
+ this.getExample()
203231
+ ", schema="
204232
+ this.getSchema()
205233
+ ", content="

0 commit comments

Comments
 (0)