Skip to content

Commit eb2c794

Browse files
authored
Merge pull request #43 from quen2404/oneof-full-support
Oneof full support
2 parents 0712198 + 3c7657b commit eb2c794

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+992
-444
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
<groupId>com.qdesrame</groupId>
1111
<artifactId>openapi-diff</artifactId>
12-
<version>1.2.1-SNAPSHOT</version>
12+
<version>2.0.0-SNAPSHOT</version>
1313
<packaging>jar</packaging>
1414

1515
<name>openapi-diff</name>

src/main/java/com/qdesrame/openapi/diff/Main.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,10 @@ public static void main(String... args) {
131131
}
132132
}
133133
if (line.hasOption("state")) {
134-
System.out.println(result.isDiff() ? result.isDiffBackwardCompatible() ? "compatible" : "incompatible" : "no_changes");
134+
System.out.println(result.isChanged().getValue());
135135
System.exit(0);
136136
} else {
137-
System.exit(result.isDiff() ? 1 : 0);
137+
System.exit(result.isUnchanged() ? 0 : 1);
138138
}
139139
} catch (ParseException e) {
140140
// oops, something went wrong

src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.qdesrame.openapi.diff.model.ChangedApiResponse;
44
import com.qdesrame.openapi.diff.model.ChangedResponse;
5+
import com.qdesrame.openapi.diff.model.DiffContext;
56
import io.swagger.v3.oas.models.responses.ApiResponse;
67
import io.swagger.v3.oas.models.responses.ApiResponses;
78

@@ -10,6 +11,8 @@
1011
import java.util.Map;
1112
import java.util.Optional;
1213

14+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
15+
1316
/**
1417
* Created by adarsh.sharma on 04/01/18.
1518
*/
@@ -20,19 +23,18 @@ public ApiResponseDiff(OpenApiDiff openApiDiff) {
2023
this.openApiDiff = openApiDiff;
2124
}
2225

23-
public Optional<ChangedApiResponse> diff(ApiResponses left, ApiResponses right) {
26+
public Optional<ChangedApiResponse> diff(ApiResponses left, ApiResponses right, DiffContext context) {
2427
MapKeyDiff<String, ApiResponse> responseMapKeyDiff = MapKeyDiff.diff(left, right);
25-
ChangedApiResponse changedApiResponse = new ChangedApiResponse(left, right);
28+
ChangedApiResponse changedApiResponse = new ChangedApiResponse(left, right, context);
2629
changedApiResponse.setAddResponses(responseMapKeyDiff.getIncreased());
2730
changedApiResponse.setMissingResponses(responseMapKeyDiff.getMissing());
2831
List<String> sharedResponseCodes = responseMapKeyDiff.getSharedKey();
29-
3032
Map<String, ChangedResponse> resps = new HashMap<>();
3133
for (String responseCode : sharedResponseCodes) {
32-
openApiDiff.getResponseDiff().diff(left.get(responseCode), right.get(responseCode))
34+
openApiDiff.getResponseDiff().diff(left.get(responseCode), right.get(responseCode), context)
3335
.ifPresent(changedResponse -> resps.put(responseCode, changedResponse));
3436
}
3537
changedApiResponse.setChangedResponses(resps);
36-
return changedApiResponse.isDiff() ? Optional.of(changedApiResponse) : Optional.empty();
38+
return isChanged(changedApiResponse);
3739
}
3840
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.qdesrame.openapi.diff.compare;
2+
3+
import com.qdesrame.openapi.diff.model.DiffContext;
4+
import lombok.Getter;
5+
import org.apache.commons.lang3.builder.EqualsBuilder;
6+
import org.apache.commons.lang3.builder.HashCodeBuilder;
7+
8+
@Getter
9+
public final class CacheKey {
10+
private final String left;
11+
private final String right;
12+
private final DiffContext context;
13+
14+
public CacheKey(final String left, final String right, final DiffContext context) {
15+
this.left = left;
16+
this.right = right;
17+
this.context = context;
18+
}
19+
20+
@Override
21+
public boolean equals(Object o) {
22+
if (this == o) return true;
23+
24+
if (o == null || getClass() != o.getClass()) return false;
25+
26+
CacheKey cacheKey = (CacheKey) o;
27+
28+
return new EqualsBuilder()
29+
.append(left, cacheKey.left)
30+
.append(right, cacheKey.right)
31+
.append(context, cacheKey.context)
32+
.isEquals();
33+
}
34+
35+
@Override
36+
public int hashCode() {
37+
return new HashCodeBuilder(17, 37)
38+
.append(left)
39+
.append(right)
40+
.append(context)
41+
.toHashCode();
42+
}
43+
}

src/main/java/com/qdesrame/openapi/diff/compare/ContentDiff.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22

33
import com.qdesrame.openapi.diff.model.ChangedContent;
44
import com.qdesrame.openapi.diff.model.ChangedMediaType;
5+
import com.qdesrame.openapi.diff.model.DiffContext;
56
import io.swagger.v3.oas.models.media.Content;
67
import io.swagger.v3.oas.models.media.MediaType;
78

89
import java.util.*;
910

11+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
12+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isUnchanged;
13+
1014
public class ContentDiff implements Comparable<Content> {
1115

1216
private OpenApiDiff openApiDiff;
@@ -20,8 +24,8 @@ public boolean compare(Content left, Content right) {
2024
return false;
2125
}
2226

23-
public Optional<ChangedContent> diff(Content left, Content right) {
24-
ChangedContent changedContent = new ChangedContent(left, right);
27+
public Optional<ChangedContent> diff(Content left, Content right, DiffContext context) {
28+
ChangedContent changedContent = new ChangedContent(left, right, context);
2529

2630
MapKeyDiff<String, MediaType> mediaTypeDiff = MapKeyDiff.diff(left, right);
2731
changedContent.setIncreased(mediaTypeDiff.getIncreased());
@@ -31,13 +35,13 @@ public Optional<ChangedContent> diff(Content left, Content right) {
3135
for (String mediaTypeKey : sharedMediaTypes) {
3236
MediaType oldMediaType = left.get(mediaTypeKey);
3337
MediaType newMediaType = right.get(mediaTypeKey);
34-
ChangedMediaType changedMediaType = new ChangedMediaType(oldMediaType.getSchema(), newMediaType.getSchema());
35-
openApiDiff.getSchemaDiff().diff(new HashSet<>(), oldMediaType.getSchema(), newMediaType.getSchema()).ifPresent(changedMediaType::setChangedSchema);
36-
if (changedMediaType.isDiff()) {
38+
ChangedMediaType changedMediaType = new ChangedMediaType(oldMediaType.getSchema(), newMediaType.getSchema(), context);
39+
openApiDiff.getSchemaDiff().diff(new HashSet<>(), oldMediaType.getSchema(), newMediaType.getSchema(), context).ifPresent(changedMediaType::setChangedSchema);
40+
if (!isUnchanged(changedMediaType)) {
3741
changedMediaTypes.put(mediaTypeKey, changedMediaType);
3842
}
3943
}
4044
changedContent.setChanged(changedMediaTypes);
41-
return changedContent.isDiff() ? Optional.of(changedContent) : Optional.empty();
45+
return isChanged(changedContent);
4246
}
4347
}

src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.qdesrame.openapi.diff.compare;
22

33
import com.qdesrame.openapi.diff.model.ChangedHeader;
4+
import com.qdesrame.openapi.diff.model.DiffContext;
45
import com.qdesrame.openapi.diff.utils.RefPointer;
56
import com.qdesrame.openapi.diff.utils.RefType;
67
import io.swagger.v3.oas.models.Components;
@@ -10,6 +11,8 @@
1011
import java.util.Objects;
1112
import java.util.Optional;
1213

14+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
15+
1316
/**
1417
* Created by adarsh.sharma on 28/12/17.
1518
*/
@@ -25,26 +28,26 @@ public HeaderDiff(OpenApiDiff openApiDiff) {
2528
this.rightComponents = openApiDiff.getNewSpecOpenApi() != null ? openApiDiff.getNewSpecOpenApi().getComponents() : null;
2629
}
2730

28-
public Optional<ChangedHeader> diff(Header left, Header right) {
29-
return cachedDiff(new HashSet<>(), left, right, left.get$ref(), right.get$ref());
31+
public Optional<ChangedHeader> diff(Header left, Header right, DiffContext context) {
32+
return cachedDiff(new HashSet<>(), left, right, left.get$ref(), right.get$ref(), context);
3033
}
3134

3235
@Override
33-
protected Optional<ChangedHeader> computeDiff(HashSet<String> refSet, Header left, Header right) {
36+
protected Optional<ChangedHeader> computeDiff(HashSet<String> refSet, Header left, Header right, DiffContext context) {
3437
left = refPointer.resolveRef(leftComponents, left, left.get$ref());
3538
right = refPointer.resolveRef(rightComponents, right, right.get$ref());
3639

37-
ChangedHeader changedHeader = new ChangedHeader(left, right);
40+
ChangedHeader changedHeader = new ChangedHeader(left, right, context);
3841

3942
changedHeader.setChangeDescription(!Objects.equals(left.getDescription(), right.getDescription()));
4043
changedHeader.setChangeRequired(getBooleanDiff(left.getRequired(), right.getRequired()));
4144
changedHeader.setChangeDeprecated(!Boolean.TRUE.equals(left.getDeprecated()) && Boolean.TRUE.equals(right.getDeprecated()));
4245
changedHeader.setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle()));
4346
changedHeader.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode()));
44-
openApiDiff.getSchemaDiff().diff(new HashSet<>(), left.getSchema(), right.getSchema()).ifPresent(changedHeader::setChangedSchema);
45-
openApiDiff.getContentDiff().diff(left.getContent(), right.getContent()).ifPresent(changedHeader::setChangedContent);
47+
openApiDiff.getSchemaDiff().diff(new HashSet<>(), left.getSchema(), right.getSchema(), context).ifPresent(changedHeader::setChangedSchema);
48+
openApiDiff.getContentDiff().diff(left.getContent(), right.getContent(), context).ifPresent(changedHeader::setChangedContent);
4649

47-
return changedHeader.isDiff() ? Optional.of(changedHeader) : Optional.empty();
50+
return isChanged(changedHeader);
4851
}
4952

5053
private boolean getBooleanDiff(Boolean left, Boolean right) {

src/main/java/com/qdesrame/openapi/diff/compare/HeadersDiff.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import com.qdesrame.openapi.diff.model.ChangedHeader;
44
import com.qdesrame.openapi.diff.model.ChangedHeaders;
5+
import com.qdesrame.openapi.diff.model.DiffContext;
56
import io.swagger.v3.oas.models.headers.Header;
67

78
import java.util.HashMap;
89
import java.util.List;
910
import java.util.Map;
1011
import java.util.Optional;
1112

13+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
14+
1215
/**
1316
* Created by adarsh.sharma on 28/12/17.
1417
*/
@@ -19,8 +22,8 @@ public HeadersDiff(OpenApiDiff openApiDiff) {
1922
this.openApiDiff = openApiDiff;
2023
}
2124

22-
public Optional<ChangedHeaders> diff(Map<String, Header> left, Map<String, Header> right) {
23-
ChangedHeaders changedHeaders = new ChangedHeaders(left, right);
25+
public Optional<ChangedHeaders> diff(Map<String, Header> left, Map<String, Header> right, DiffContext context) {
26+
ChangedHeaders changedHeaders = new ChangedHeaders(left, right, context);
2427
MapKeyDiff<String, Header> headerMapDiff = MapKeyDiff.diff(left, right);
2528
changedHeaders.setIncreased(headerMapDiff.getIncreased());
2629
changedHeaders.setMissing(headerMapDiff.getMissing());
@@ -30,11 +33,11 @@ public Optional<ChangedHeaders> diff(Map<String, Header> left, Map<String, Heade
3033
for (String headerKey : sharedHeaderKeys) {
3134
Header oldHeader = left.get(headerKey);
3235
Header newHeader = right.get(headerKey);
33-
openApiDiff.getHeaderDiff().diff(oldHeader, newHeader)
36+
openApiDiff.getHeaderDiff().diff(oldHeader, newHeader, context)
3437
.ifPresent(changedHeader -> changed.put(headerKey, changedHeader));
3538
}
3639
changedHeaders.setChanged(changed);
3740

38-
return changedHeaders.isDiff() ? Optional.of(changedHeaders) : Optional.empty();
41+
return isChanged(changedHeaders);
3942
}
4043
}

src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.util.Objects;
77
import java.util.Optional;
88

9+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
10+
911
/**
1012
* Created by adarsh.sharma on 12/01/18.
1113
*/
@@ -24,6 +26,6 @@ public Optional<ChangedOAuthFlow> diff(OAuthFlow left, OAuthFlow right) {
2426
changedOAuthFlow.setChangedRefreshUrl(!Objects.equals(left.getRefreshUrl(), right.getRefreshUrl()));
2527
}
2628

27-
return changedOAuthFlow.isDiff() ? Optional.of(changedOAuthFlow) : Optional.empty();
29+
return isChanged(changedOAuthFlow);
2830
}
2931
}

src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
import java.util.Optional;
77

8+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
9+
810
/**
911
* Created by adarsh.sharma on 12/01/18.
1012
*/
@@ -23,6 +25,6 @@ public Optional<ChangedOAuthFlows> diff(OAuthFlows left, OAuthFlows right) {
2325
openApiDiff.getoAuthFlowDiff().diff(left.getClientCredentials(), right.getClientCredentials()).ifPresent(changedOAuthFlows::setChangedClientCredentialOAuthFlow);
2426
openApiDiff.getoAuthFlowDiff().diff(left.getAuthorizationCode(), right.getAuthorizationCode()).ifPresent(changedOAuthFlows::setChangedAuthorizationCodeOAuthFlow);
2527
}
26-
return changedOAuthFlows.isDiff() ? Optional.of(changedOAuthFlows) : Optional.empty();
28+
return isChanged(changedOAuthFlows);
2729
}
2830
}

src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22

33
import com.qdesrame.openapi.diff.model.ChangedOperation;
44
import com.qdesrame.openapi.diff.model.ChangedParameters;
5+
import com.qdesrame.openapi.diff.model.DiffContext;
56
import io.swagger.v3.oas.models.Operation;
6-
import io.swagger.v3.oas.models.PathItem;
77
import io.swagger.v3.oas.models.parameters.Parameter;
88

99
import java.util.List;
1010
import java.util.Map;
1111
import java.util.Optional;
1212

13+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
14+
1315
/**
1416
* Created by adarsh.sharma on 04/01/18.
1517
*/
@@ -20,34 +22,34 @@ public OperationDiff(OpenApiDiff openApiDiff) {
2022
this.openApiDiff = openApiDiff;
2123
}
2224

23-
public Optional<ChangedOperation> diff(String pathUrl, PathItem.HttpMethod method, Map<String, String> pathParameters, Operation oldOperation, Operation newOperation) {
24-
ChangedOperation changedOperation = new ChangedOperation(pathUrl, method, oldOperation, newOperation);
25+
public Optional<ChangedOperation> diff(Operation oldOperation, Operation newOperation, DiffContext context) {
26+
ChangedOperation changedOperation = new ChangedOperation(context.getUrl(), context.getMethod(), oldOperation, newOperation);
2527

2628
changedOperation.setSummary(newOperation.getSummary());
2729
changedOperation.setDeprecated(!Boolean.TRUE.equals(oldOperation.getDeprecated()) && Boolean.TRUE.equals(newOperation.getDeprecated()));
2830

2931
if (oldOperation.getRequestBody() != null || newOperation.getRequestBody() != null) {
30-
openApiDiff.getRequestBodyDiff().diff(oldOperation.getRequestBody(), newOperation.getRequestBody())
32+
openApiDiff.getRequestBodyDiff().diff(oldOperation.getRequestBody(), newOperation.getRequestBody(), context.copyAsRequest())
3133
.ifPresent(changedOperation::setChangedRequestBody);
3234
}
3335

34-
openApiDiff.getParametersDiff().diff(oldOperation.getParameters(), newOperation.getParameters())
36+
openApiDiff.getParametersDiff().diff(oldOperation.getParameters(), newOperation.getParameters(), context)
3537
.ifPresent(params -> {
36-
removePathParameters(pathParameters, params);
38+
removePathParameters(context.getParameters(), params);
3739
changedOperation.setChangedParameters(params);
3840
});
3941

4042
if (oldOperation.getResponses() != null || newOperation.getResponses() != null) {
41-
openApiDiff.getApiResponseDiff().diff(oldOperation.getResponses(), newOperation.getResponses())
43+
openApiDiff.getApiResponseDiff().diff(oldOperation.getResponses(), newOperation.getResponses(), context.copyAsResponse())
4244
.ifPresent(changedOperation::setChangedApiResponse);
4345
}
4446

4547
if (oldOperation.getSecurity() != null || newOperation.getSecurity() != null) {
46-
openApiDiff.getSecurityRequirementsDiff().diff(oldOperation.getSecurity(), newOperation.getSecurity())
48+
openApiDiff.getSecurityRequirementsDiff().diff(oldOperation.getSecurity(), newOperation.getSecurity(), context)
4749
.ifPresent(changedOperation::setChangedSecurityRequirements);
4850
}
4951

50-
return changedOperation.isDiff() ? Optional.of(changedOperation) : Optional.empty();
52+
return isChanged(changedOperation);
5153
}
5254

5355
public void removePathParameters(Map<String, String> pathParameters, ChangedParameters params) {

src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java

+10-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.qdesrame.openapi.diff.model.ChangedParameter;
44
import com.qdesrame.openapi.diff.model.ChangedSchema;
5+
import com.qdesrame.openapi.diff.model.DiffContext;
56
import com.qdesrame.openapi.diff.utils.RefPointer;
67
import com.qdesrame.openapi.diff.utils.RefType;
78
import io.swagger.v3.oas.models.Components;
@@ -11,6 +12,8 @@
1112
import java.util.Objects;
1213
import java.util.Optional;
1314

15+
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
16+
1417
public class ParameterDiff extends ReferenceDiffCache<Parameter, ChangedParameter> {
1518

1619
private Components leftComponents;
@@ -24,13 +27,13 @@ public ParameterDiff(OpenApiDiff openApiDiff) {
2427
this.rightComponents = openApiDiff.getNewSpecOpenApi() != null ? openApiDiff.getNewSpecOpenApi().getComponents() : null;
2528
}
2629

27-
public Optional<ChangedParameter> diff(Parameter left, Parameter right) {
28-
return cachedDiff(new HashSet<>(), left, right, left.get$ref(), right.get$ref());
30+
public Optional<ChangedParameter> diff(Parameter left, Parameter right, DiffContext context) {
31+
return cachedDiff(new HashSet<>(), left, right, left.get$ref(), right.get$ref(), context);
2932
}
3033

3134
@Override
32-
protected Optional<ChangedParameter> computeDiff(HashSet<String> refSet, Parameter left, Parameter right) {
33-
ChangedParameter changedParameter = new ChangedParameter(right.getName(), right.getIn());
35+
protected Optional<ChangedParameter> computeDiff(HashSet<String> refSet, Parameter left, Parameter right, DiffContext context) {
36+
ChangedParameter changedParameter = new ChangedParameter(right.getName(), right.getIn(), context);
3437
left = refPointer.resolveRef(this.leftComponents, left, left.get$ref());
3538
right = refPointer.resolveRef(this.rightComponents, right, right.get$ref());
3639

@@ -43,14 +46,14 @@ protected Optional<ChangedParameter> computeDiff(HashSet<String> refSet, Paramet
4346
changedParameter.setChangeAllowEmptyValue(getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue()));
4447
changedParameter.setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle()));
4548
changedParameter.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode()));
46-
Optional<ChangedSchema> changedSchema = openApiDiff.getSchemaDiff().diff(refSet, left.getSchema(), right.getSchema());
49+
Optional<ChangedSchema> changedSchema = openApiDiff.getSchemaDiff().diff(refSet, left.getSchema(), right.getSchema(), context);
4750
if (changedSchema.isPresent()) {
4851
changedParameter.setChangedSchema(changedSchema.get());
4952
}
50-
openApiDiff.getContentDiff().diff(left.getContent(), right.getContent())
53+
openApiDiff.getContentDiff().diff(left.getContent(), right.getContent(), context)
5154
.ifPresent(changedParameter::setChangedContent);
5255

53-
return changedParameter.isDiff() ? Optional.of(changedParameter) : Optional.empty();
56+
return isChanged(changedParameter);
5457
}
5558

5659
private boolean getBooleanDiff(Boolean left, Boolean right) {

0 commit comments

Comments
 (0)