From 5c95b34e144dfe1629e9c85417498583c188d12b Mon Sep 17 00:00:00 2001 From: Quentin Desrame Date: Wed, 11 Jul 2018 17:16:51 +0200 Subject: [PATCH 1/3] Fix extensions problems and improve api --- .../openapi/diff/compare/ExtensionDiff.java | 8 +++- .../openapi/diff/compare/ExtensionsDiff.java | 48 +++++++++++++++---- .../schemadiffresult/SchemaDiffResult.java | 24 +++++++--- .../qdesrame/openapi/diff/model/Change.java | 34 +++++++++++++ .../openapi/diff/model/CompatibleChanged.java | 22 +++++++++ .../diff/model/schema/ChangedExtensions.java | 4 +- .../openapi/diff/output/MarkdownRender.java | 22 ++++----- 7 files changed, 132 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/qdesrame/openapi/diff/model/Change.java create mode 100644 src/main/java/com/qdesrame/openapi/diff/model/CompatibleChanged.java diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java index 7c2c7005f..615e1d263 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionDiff.java @@ -1,5 +1,6 @@ package com.qdesrame.openapi.diff.compare; +import com.qdesrame.openapi.diff.model.Change; import com.qdesrame.openapi.diff.model.Changed; import com.qdesrame.openapi.diff.model.DiffContext; @@ -11,5 +12,10 @@ public interface ExtensionDiff { String getName(); - Optional diff(Object left, Object right, DiffContext context); + Optional diff(Change extension, DiffContext context); + + default boolean isParentApplicable(Change.Type type, Object object, Object extension, DiffContext context) { + return true; + } + } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java index 91c251c92..9ce50d628 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java @@ -1,9 +1,13 @@ package com.qdesrame.openapi.diff.compare; +import com.qdesrame.openapi.diff.model.Change; +import com.qdesrame.openapi.diff.model.Changed; +import com.qdesrame.openapi.diff.model.CompatibleChanged; import com.qdesrame.openapi.diff.model.DiffContext; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; import java.util.*; +import java.util.function.Function; import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; @@ -21,23 +25,49 @@ public ExtensionsDiff(OpenApiDiff openApiDiff) { } } + public boolean isParentApplicable(Change.Type type, Object parent, Map extensions, DiffContext context) { + if (extensions.size() == 0) { + return true; + } + return extensions.entrySet().stream() + .map(entry -> executeExtension(entry.getKey(), extensionDiff -> extensionDiff.isParentApplicable(type, parent, entry.getValue(), context))) + .allMatch(aBoolean -> aBoolean.orElse(true)); + } + + public Optional getExtensionDiff(String name) { + return extensionsDiff.stream() + .filter(diff -> ("x-" + diff.getName()).equals(name)) + .findFirst(); + } + + public Optional executeExtension(String name, Function predicate) { + return getExtensionDiff(name) + .map(extensionDiff -> extensionDiff.setOpenApiDiff(openApiDiff)) + .map(predicate); + } + public Optional diff(Map left, Map right, DiffContext context) { if (null == left) left = new LinkedHashMap<>(); if (null == right) right = new LinkedHashMap<>(); ChangedExtensions changedExtensions = new ChangedExtensions(left, new LinkedHashMap<>(right), context); - changedExtensions.getIncreased().putAll(right); for (String key : left.keySet()) { - if (changedExtensions.getIncreased().containsKey(key)) { - Optional extensionDiff = extensionsDiff.stream() - .filter(diff -> ("x-" + diff.getName()).equals(key)).findFirst(); - Object leftValue = left.get(key); - Object rightValue = changedExtensions.getIncreased().remove(key); - extensionDiff.ifPresent(diff -> diff.setOpenApiDiff(openApiDiff).diff(leftValue, rightValue, context) - .ifPresent(changed -> changedExtensions.getChanged().put(key, changed))); + Object leftValue = left.get(key); + if (right.containsKey(key)) { + Object rightValue = right.remove(key); + executeExtensionDiff(key, Change.changed(leftValue, rightValue), context) + .ifPresent(changed -> changedExtensions.getChanged().put(key, changed)); } else { - changedExtensions.getMissing().put(key, left.get(key)); + executeExtensionDiff(key, Change.removed(leftValue), context) + .ifPresent(changed -> changedExtensions.getMissing().put(key, changed)); } } + right.forEach((key, value) -> executeExtensionDiff(key, Change.added(value), context) + .ifPresent(changed -> changedExtensions.getIncreased().put(key, changed))); return isChanged(changedExtensions); } + + private Optional executeExtensionDiff(String name, Change change, DiffContext context) { + return executeExtension(name, diff -> diff.setOpenApiDiff(openApiDiff).diff(change, context)) + .orElse(Optional.of(CompatibleChanged.compatible(change))); + } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java index 31834fd04..77b06eb35 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java @@ -2,6 +2,7 @@ import com.qdesrame.openapi.diff.compare.MapKeyDiff; import com.qdesrame.openapi.diff.compare.OpenApiDiff; +import com.qdesrame.openapi.diff.model.Change; import com.qdesrame.openapi.diff.model.ChangedSchema; import com.qdesrame.openapi.diff.model.DiffContext; import com.qdesrame.openapi.diff.model.ListDiff; @@ -13,9 +14,9 @@ import lombok.Getter; import java.util.*; -import java.util.stream.Collectors; import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; +import static java.util.Optional.ofNullable; @Getter public class SchemaDiffResult { @@ -60,8 +61,8 @@ public Optional diff(HashSet refSet, Components leftCompo compareAdditionalProperties(refSet, left, right, context); - changedSchema.getIncreasedProperties().putAll(filterProperties(propertyDiff.getIncreased(), context)); - changedSchema.getMissingProperties().putAll(filterProperties(propertyDiff.getMissing(), context)); + changedSchema.getIncreasedProperties().putAll(filterProperties(Change.Type.ADDED, propertyDiff.getIncreased(), context)); + changedSchema.getMissingProperties().putAll(filterProperties(Change.Type.REMOVED, propertyDiff.getMissing(), context)); return isApplicable(context); } @@ -73,10 +74,19 @@ protected Optional isApplicable(DiffContext context) { return isChanged(changedSchema); } - private Map filterProperties(Map properties, DiffContext context) { - return properties.entrySet().stream() - .filter(entry -> isPropertyApplicable(entry.getValue(), context)) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + private Map filterProperties(Change.Type type, Map properties, DiffContext context) { + Map result = new LinkedHashMap<>(); + for (Map.Entry entry : properties.entrySet()) { + if (isPropertyApplicable(entry.getValue(), context) + && openApiDiff.getExtensionsDiff() + .isParentApplicable( + type, + entry.getValue(), + ofNullable(entry.getValue().getExtensions()).orElse(new LinkedHashMap()), context)) { + result.put(entry.getKey(), entry.getValue()); + } + } + return result; } private boolean isPropertyApplicable(Schema schema, DiffContext context) { diff --git a/src/main/java/com/qdesrame/openapi/diff/model/Change.java b/src/main/java/com/qdesrame/openapi/diff/model/Change.java new file mode 100644 index 000000000..9ef8330ed --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/model/Change.java @@ -0,0 +1,34 @@ +package com.qdesrame.openapi.diff.model; + +import lombok.Getter; + +@Getter +public class Change { + private final T oldValue; + private final T newValue; + private final Type type; + + private Change(T oldValue, T newValue, Type type) { + this.oldValue = oldValue; + this.newValue = newValue; + this.type = type; + } + + public static Change changed(T oldValue, T newValue) { + return new Change<>(oldValue, newValue, Type.CHANGED); + } + + public static Change added(T newValue) { + return new Change<>(null, newValue, Type.ADDED); + } + + public static Change removed(T oldValue) { + return new Change<>(oldValue, null, Type.REMOVED); + } + + public enum Type { + ADDED, + CHANGED, + REMOVED + } +} diff --git a/src/main/java/com/qdesrame/openapi/diff/model/CompatibleChanged.java b/src/main/java/com/qdesrame/openapi/diff/model/CompatibleChanged.java new file mode 100644 index 000000000..94fbee72e --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/model/CompatibleChanged.java @@ -0,0 +1,22 @@ +package com.qdesrame.openapi.diff.model; + +public class CompatibleChanged implements Changed { + private final Object value; + + private CompatibleChanged(Object value) { + this.value = value; + } + + public static CompatibleChanged compatible(Change change) { + return new CompatibleChanged(change); + } + + @Override + public DiffResult isChanged() { + return DiffResult.COMPATIBLE; + } + + public Object getValue() { + return value; + } +} diff --git a/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java b/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java index 94174c690..7aadcdaa4 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java @@ -16,8 +16,8 @@ public class ChangedExtensions implements Changed { private final Map newExtensions; private final DiffContext context; - private Map increased; - private Map missing; + private Map increased; + private Map missing; private Map changed; public ChangedExtensions(Map oldExtensions, Map newExtensions, DiffContext context) { diff --git a/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java b/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java index 33cf45a4d..16c000046 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java @@ -117,7 +117,7 @@ protected String itemResponse(String code, ChangedResponse response) { } protected String itemResponse(String title, String code, String description) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); String status = ""; if (!code.equals("default")) { status = HttpStatus.getStatusText(Integer.parseInt(code)); @@ -128,7 +128,7 @@ protected String itemResponse(String title, String code, String description) { } protected String headers(ChangedHeaders headers) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); if (headers != null) { sb.append(listHeader("New header", headers.getIncreased())); sb.append(listHeader("Deleted header", headers.getMissing())); @@ -197,7 +197,7 @@ protected String schema(ChangedSchema schema) { } protected String oneOfSchema(int deepness, ChangedOneOfSchema schema, String discriminator) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); schema.getMissingMapping().keySet() .forEach(key -> sb.append(format("%sDeleted '%s' %s\n", indent(deepness), key, discriminator))); schema.getIncreasedMapping().forEach((key, sub) -> @@ -210,7 +210,7 @@ protected String oneOfSchema(int deepness, ChangedOneOfSchema schema, String dis } protected String required(int deepness, String title, List required) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); if (required.size() > 0) { sb.append(format("%s%s:\n", indent(deepness), title)); required.forEach(s -> sb.append(format("%s- `%s`\n", indent(deepness), s))); @@ -220,7 +220,7 @@ protected String required(int deepness, String title, List required) { } protected String schema(int deepness, ChangedSchema schema) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); if (schema.isDiscriminatorPropertyChanged()) { LOGGER.debug("Discriminator property changed"); } @@ -244,7 +244,7 @@ protected String schema(int deepness, ChangedSchema schema) { } protected String schema(int deepness, ComposedSchema schema, DiffContext context) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); if (schema.getAllOf() != null && schema.getAllOf() != null) { LOGGER.debug("All of schema"); schema.getAllOf().stream() @@ -262,7 +262,7 @@ protected String schema(int deepness, ComposedSchema schema, DiffContext context } protected String schema(int deepness, Schema schema, DiffContext context) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); sb.append(listItem(deepness, "Enum", schema.getEnum())); sb.append(properties(deepness, "Property", schema.getProperties(), true, context)); if (schema instanceof ComposedSchema) { @@ -274,7 +274,7 @@ protected String schema(int deepness, Schema schema, DiffContext context) { } protected String items(int deepness, ChangedSchema schema) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); String type = type(schema.getNewSchema()); if (schema.isChangedType()) { type = type(schema.getOldSchema()) + " -> " + type(schema.getNewSchema()); @@ -295,7 +295,7 @@ protected String items(int deepness, String title, String type, String descripti } protected String properties(final int deepness, String title, Map properties, boolean showContent, DiffContext context) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); if (properties != null) { properties.forEach((key, value) -> { sb.append(property(deepness, title, key, resolve(value))); @@ -335,7 +335,7 @@ protected String listDiff(int deepness, String name, ListDiff listDiff) { } protected String listItem(int deepness, String name, List list) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); if (list != null && list.size() > 0) { sb.append(format("%s%s value%s:\n\n", indent(deepness), name, list.size() > 1 ? "s" : "")); list.forEach(p -> sb.append(format("%s* `%s`\n", indent(deepness), p))); @@ -353,7 +353,7 @@ protected String parameters(ChangedParameters changedParameters) { } protected String listParameter(String title, List parameters) { - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); parameters.stream().map(p -> itemParameter(title, p)).forEach(sb::append); return sb.toString(); } From 9d39253e712e7fcc9d35069ce72948ec824d91de Mon Sep 17 00:00:00 2001 From: Quentin Desrame Date: Thu, 12 Jul 2018 14:53:37 +0200 Subject: [PATCH 2/3] Extension are now supported by PathItem, Operation, Parameter & Request Body --- .../openapi/diff/compare/OperationDiff.java | 3 +++ .../openapi/diff/compare/ParameterDiff.java | 3 ++- .../com/qdesrame/openapi/diff/compare/PathDiff.java | 2 ++ .../openapi/diff/compare/RequestBodyDiff.java | 8 ++++++++ .../openapi/diff/model/ChangedOperation.java | 9 +++++++-- .../openapi/diff/model/ChangedParameter.java | 13 +++++++++---- .../qdesrame/openapi/diff/model/ChangedPath.java | 8 ++++++-- .../openapi/diff/model/ChangedRequestBody.java | 11 +++++++++-- 8 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java index 5e17ecc05..c51900837 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java @@ -49,6 +49,9 @@ public Optional diff(Operation oldOperation, Operation newOper .ifPresent(changedOperation::setChangedSecurityRequirements); } + openApiDiff.getExtensionsDiff().diff(oldOperation.getExtensions(), newOperation.getExtensions(), context) + .ifPresent(changedOperation::setChangedExtensions); + return isChanged(changedOperation); } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java index 82e2e316c..a4b1df2ad 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java @@ -52,7 +52,8 @@ protected Optional computeDiff(HashSet refSet, Paramet } openApiDiff.getContentDiff().diff(left.getContent(), right.getContent(), context) .ifPresent(changedParameter::setChangedContent); - + openApiDiff.getExtensionsDiff().diff(left.getExtensions(), right.getExtensions(), context) + .ifPresent(changedParameter::setChangedExtensions); return isChanged(changedParameter); } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java index 883a43611..ea2f842d6 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java @@ -33,6 +33,8 @@ public Optional diff(PathItem left, PathItem right, DiffContext con Operation newOperation = newOperationMap.get(method); openApiDiff.getOperationDiff().diff(oldOperation, newOperation, context.copyWithMethod(method)).ifPresent(changedPath.getChanged()::add); } + openApiDiff.getExtensionsDiff().diff(left.getExtensions(), right.getExtensions(), context) + .ifPresent(changedPath::setChangedExtensions); return isChanged(changedPath); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java index 9a0a48098..fd3fec58c 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java @@ -8,10 +8,12 @@ import io.swagger.v3.oas.models.parameters.RequestBody; import java.util.HashSet; +import java.util.Map; import java.util.Objects; import java.util.Optional; import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; +import static java.util.Optional.ofNullable; /** * Created by adarsh.sharma on 28/12/17. @@ -30,6 +32,10 @@ public Optional diff(RequestBody left, RequestBody right, Di return cachedDiff(new HashSet<>(), left, right, leftRef, rightRef, context); } + private static Map getExtensions(RequestBody body) { + return ofNullable(body).map(RequestBody::getExtensions).orElse(null); + } + @Override protected Optional computeDiff(HashSet refSet, RequestBody left, RequestBody right, DiffContext context) { Content oldRequestContent = new Content(); @@ -59,6 +65,8 @@ protected Optional computeDiff(HashSet refSet, Reque changedRequestBody.setChangeDescription(!Objects.equals(leftDescription, rightDescription)); openApiDiff.getContentDiff().diff(oldRequestContent, newRequestContent, context).ifPresent(changedRequestBody::setChangedContent); + openApiDiff.getExtensionsDiff().diff(getExtensions(left), getExtensions(right), context) + .ifPresent(changedRequestBody::setChangedExtensions); return isChanged(changedRequestBody); } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java index a5d7d4fd2..b8260c69e 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import lombok.Getter; @@ -18,6 +20,7 @@ public class ChangedOperation implements Changed { private ChangedRequestBody changedRequestBody; private ChangedApiResponse changedApiResponse; private ChangedSecurityRequirements changedSecurityRequirements; + private ChangedExtensions changedExtensions; public ChangedOperation(String pathUrl, PathItem.HttpMethod httpMethod, Operation oldOperation, Operation newOperation) { this.httpMethod = httpMethod; @@ -30,11 +33,13 @@ public ChangedOperation(String pathUrl, PathItem.HttpMethod httpMethod, Operatio public DiffResult isChanged() { //TODO BETTER HANDLING FOR DEPRECIATION if (!deprecated && isChangedParam().isUnchanged() && isChangedRequest().isUnchanged() - && isChangedResponse().isUnchanged() && isChangedSecurity().isUnchanged()) { + && isChangedResponse().isUnchanged() && isChangedSecurity().isUnchanged() + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } if (isChangedParam().isCompatible() && isChangedRequest().isCompatible() - && isChangedResponse().isCompatible() && isChangedSecurity().isCompatible()) { + && isChangedResponse().isCompatible() && isChangedSecurity().isCompatible() + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java index 72303d1e0..471043ec0 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.parameters.Parameter; import lombok.Getter; import lombok.Setter; @@ -22,6 +24,7 @@ public class ChangedParameter implements Changed { private boolean changeAllowEmptyValue; private ChangedSchema changedSchema; private ChangedContent changedContent; + private ChangedExtensions changedExtensions; public ChangedParameter(String name, String in, DiffContext context) { this.name = name; @@ -37,16 +40,18 @@ public DiffResult isChanged() { && !changeAllowEmptyValue && !changeStyle && !changeExplode - && (changedSchema == null || changedSchema.isUnchanged()) - && (changedContent == null || changedContent.isUnchanged())) { + && ChangedUtils.isUnchanged(changedSchema) + && ChangedUtils.isUnchanged(changedContent) + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } if ((!changeRequired || Boolean.TRUE.equals(oldParameter.getRequired())) && (!changeAllowEmptyValue || Boolean.TRUE.equals(newParameter.getAllowEmptyValue())) && !changeStyle && !changeExplode - && (changedSchema == null || changedSchema.isCompatible()) - && (changedContent == null || changedContent.isCompatible())) { + && ChangedUtils.isCompatible(changedSchema) + && ChangedUtils.isCompatible(changedContent) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java index fd1fc0c82..274f75efb 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import lombok.Getter; @@ -21,6 +23,7 @@ public class ChangedPath implements Changed { Map increased; Map missing; List changed; + private ChangedExtensions changedExtensions; public ChangedPath(String pathUrl, PathItem oldPath, PathItem newPath, DiffContext context) { this.pathUrl = pathUrl; @@ -34,10 +37,11 @@ public ChangedPath(String pathUrl, PathItem oldPath, PathItem newPath, DiffConte @Override public DiffResult isChanged() { - if (increased.isEmpty() && missing.isEmpty() && changed.isEmpty()) { + if (increased.isEmpty() && missing.isEmpty() && changed.isEmpty() && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } - if (missing.isEmpty() && changed.stream().allMatch(Changed::isCompatible)) { + if (missing.isEmpty() && changed.stream().allMatch(Changed::isCompatible) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java index cf481cd72..be559c8bf 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.parameters.RequestBody; import lombok.Getter; import lombok.Setter; @@ -17,6 +19,7 @@ public class ChangedRequestBody implements Changed { private boolean changeDescription; private boolean changeRequired; private ChangedContent changedContent; + private ChangedExtensions changedExtensions; public ChangedRequestBody(RequestBody oldRequestBody, RequestBody newRequestBody, DiffContext context) { this.oldRequestBody = oldRequestBody; @@ -26,10 +29,14 @@ public ChangedRequestBody(RequestBody oldRequestBody, RequestBody newRequestBody @Override public DiffResult isChanged() { - if (!changeDescription && !changeRequired && (changedContent == null || changedContent.isUnchanged())) { + if (!changeDescription && !changeRequired + && ChangedUtils.isUnchanged(changedContent) + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } - if (!changeRequired && (changedContent == null || changedContent.isCompatible())) { + if (!changeRequired + && ChangedUtils.isCompatible(changedContent) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; From 816f4e22442d8e74354f1174d38daa9c9c331c5b Mon Sep 17 00:00:00 2001 From: Quentin Desrame Date: Thu, 12 Jul 2018 18:00:18 +0200 Subject: [PATCH 3/3] Extension are now supported by all compatible objects --- .../openapi/diff/compare/ApiResponseDiff.java | 2 ++ .../openapi/diff/compare/ExtensionsDiff.java | 4 ++++ .../openapi/diff/compare/HeaderDiff.java | 3 ++- .../openapi/diff/compare/OAuthFlowDiff.java | 10 +++++++++- .../openapi/diff/compare/OAuthFlowsDiff.java | 9 +++++++++ .../openapi/diff/compare/OpenApiDiff.java | 10 ++++++++++ .../openapi/diff/compare/ResponseDiff.java | 3 ++- .../diff/compare/SecuritySchemeDiff.java | 2 ++ .../openapi/diff/model/ChangedApiResponse.java | 9 +++++++-- .../openapi/diff/model/ChangedHeader.java | 13 +++++++++---- .../openapi/diff/model/ChangedOAuthFlow.java | 12 +++++++++--- .../openapi/diff/model/ChangedOAuthFlows.java | 17 +++++++++++------ .../openapi/diff/model/ChangedOpenApi.java | 9 +++++++-- .../openapi/diff/model/ChangedResponse.java | 11 +++++++++-- .../diff/model/ChangedSecurityScheme.java | 8 ++++++-- 15 files changed, 98 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java index 474b6bef5..0f5596e10 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java @@ -35,6 +35,8 @@ public Optional diff(ApiResponses left, ApiResponses right, .ifPresent(changedResponse -> resps.put(responseCode, changedResponse)); } changedApiResponse.setChangedResponses(resps); + openApiDiff.getExtensionsDiff().diff(left.getExtensions(), right.getExtensions(), context) + .ifPresent(changedApiResponse::setChangedExtensions); return isChanged(changedApiResponse); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java index 9ce50d628..b3ef468a8 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ExtensionsDiff.java @@ -46,6 +46,10 @@ public Optional executeExtension(String name, Function .map(predicate); } + public Optional diff(Map left, Map right) { + return this.diff(left, right, null); + } + public Optional diff(Map left, Map right, DiffContext context) { if (null == left) left = new LinkedHashMap<>(); if (null == right) right = new LinkedHashMap<>(); diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java index 3bd8fb991..08434b160 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java @@ -46,7 +46,8 @@ protected Optional computeDiff(HashSet refSet, Header lef changedHeader.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode())); openApiDiff.getSchemaDiff().diff(new HashSet<>(), left.getSchema(), right.getSchema(), context.copyWithRequired(true)).ifPresent(changedHeader::setChangedSchema); openApiDiff.getContentDiff().diff(left.getContent(), right.getContent(), context).ifPresent(changedHeader::setChangedContent); - + openApiDiff.getExtensionsDiff().diff(left.getExtensions(), right.getExtensions(), context) + .ifPresent(changedHeader::setChangedExtensions); return isChanged(changedHeader); } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java index 68d5d2cc0..654581405 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java @@ -3,10 +3,12 @@ import com.qdesrame.openapi.diff.model.ChangedOAuthFlow; import io.swagger.v3.oas.models.security.OAuthFlow; +import java.util.Map; import java.util.Objects; import java.util.Optional; import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; +import static java.util.Optional.ofNullable; /** * Created by adarsh.sharma on 12/01/18. @@ -18,6 +20,10 @@ public OAuthFlowDiff(OpenApiDiff openApiDiff) { this.openApiDiff = openApiDiff; } + private static Map getExtensions(OAuthFlow oAuthFlow) { + return ofNullable(oAuthFlow).map(OAuthFlow::getExtensions).orElse(null); + } + public Optional diff(OAuthFlow left, OAuthFlow right) { ChangedOAuthFlow changedOAuthFlow = new ChangedOAuthFlow(left, right); if (left != null && right != null) { @@ -25,7 +31,9 @@ public Optional diff(OAuthFlow left, OAuthFlow right) { changedOAuthFlow.setChangedTokenUrl(!Objects.equals(left.getTokenUrl(), right.getTokenUrl())); changedOAuthFlow.setChangedRefreshUrl(!Objects.equals(left.getRefreshUrl(), right.getRefreshUrl())); } - + openApiDiff.getExtensionsDiff().diff(getExtensions(left), getExtensions(right)) + .ifPresent(changedOAuthFlow::setChangedExtensions); return isChanged(changedOAuthFlow); } + } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java index ae3235a11..d9a0b941e 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java @@ -3,9 +3,11 @@ import com.qdesrame.openapi.diff.model.ChangedOAuthFlows; import io.swagger.v3.oas.models.security.OAuthFlows; +import java.util.Map; import java.util.Optional; import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; +import static java.util.Optional.ofNullable; /** * Created by adarsh.sharma on 12/01/18. @@ -17,6 +19,10 @@ public OAuthFlowsDiff(OpenApiDiff openApiDiff) { this.openApiDiff = openApiDiff; } + private static Map getExtensions(OAuthFlows oAuthFlow) { + return ofNullable(oAuthFlow).map(OAuthFlows::getExtensions).orElse(null); + } + public Optional diff(OAuthFlows left, OAuthFlows right) { ChangedOAuthFlows changedOAuthFlows = new ChangedOAuthFlows(left, right); if (left != null && right != null) { @@ -25,6 +31,9 @@ public Optional diff(OAuthFlows left, OAuthFlows right) { openApiDiff.getoAuthFlowDiff().diff(left.getClientCredentials(), right.getClientCredentials()).ifPresent(changedOAuthFlows::setChangedClientCredentialOAuthFlow); openApiDiff.getoAuthFlowDiff().diff(left.getAuthorizationCode(), right.getAuthorizationCode()).ifPresent(changedOAuthFlows::setChangedAuthorizationCodeOAuthFlow); } + openApiDiff.getExtensionsDiff().diff(getExtensions(left), getExtensions(right)) + .ifPresent(changedOAuthFlows::setChangedExtensions); return isChanged(changedOAuthFlows); } + } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java index 06275124f..23f08a972 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java @@ -1,6 +1,7 @@ package com.qdesrame.openapi.diff.compare; import com.qdesrame.openapi.diff.model.*; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; import com.qdesrame.openapi.diff.utils.EndpointUtils; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.PathItem; @@ -47,6 +48,8 @@ public class OpenApiDiff { private List newEndpoints; private List missingEndpoints; private List changedOperations; + private ChangedExtensions changedExtensions; + /* * @param oldSpecOpenApi @@ -105,9 +108,15 @@ private ChangedOpenApi compare() { changedOperations.addAll(changedPath.getChanged()); }); }); + getExtensionsDiff().diff(oldSpecOpenApi.getExtensions(), newSpecOpenApi.getExtensions()) + .ifPresent(this::setChangedExtension); return getChangedOpenApi(); } + private void setChangedExtension(ChangedExtensions changedExtension) { + this.changedExtensions = changedExtension; + } + private void preProcess(OpenAPI openApi) { List securityRequirements = openApi.getSecurity(); @@ -132,6 +141,7 @@ private ChangedOpenApi getChangedOpenApi() { changedOpenApi.setNewSpecOpenApi(newSpecOpenApi); changedOpenApi.setOldSpecOpenApi(oldSpecOpenApi); changedOpenApi.setChangedOperations(changedOperations); + changedOpenApi.setChangedExtensions(changedExtensions); return changedOpenApi; } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java index eec3520c7..681c82d25 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java @@ -42,7 +42,8 @@ protected Optional computeDiff(HashSet refSet, ApiRespo openApiDiff.getContentDiff().diff(left.getContent(), right.getContent(), context).ifPresent(changedResponse::setChangedContent); openApiDiff.getHeadersDiff().diff(left.getHeaders(), right.getHeaders(), context).ifPresent(changedResponse::setChangedHeaders); changedResponse.setChangeDescription(!Objects.equals(left.getDescription(), right.getDescription())); - + openApiDiff.getExtensionsDiff().diff(left.getExtensions(), right.getExtensions(), context) + .ifPresent(changedResponse::setChangedExtensions); return isChanged(changedResponse); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java index 57b09a33a..60a782ac3 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java @@ -70,6 +70,8 @@ protected Optional computeDiff(HashSet refSet, Se .getOpenIdConnectUrl())); break; } + openApiDiff.getExtensionsDiff().diff(leftSecurityScheme.getExtensions(), rightSecurityScheme.getExtensions(), context) + .ifPresent(changedSecurityScheme::setChangedExtensions); return Optional.of(changedSecurityScheme); } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java index d038e7640..3982c671c 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import lombok.Getter; @@ -20,6 +22,7 @@ public class ChangedApiResponse implements Changed { private Map missingResponses; private Map addResponses; private Map changedResponses; + private ChangedExtensions changedExtensions; public ChangedApiResponse(ApiResponses oldApiResponses, ApiResponses newApiResponses, DiffContext context) { this.oldApiResponses = oldApiResponses; @@ -32,10 +35,12 @@ public ChangedApiResponse(ApiResponses oldApiResponses, ApiResponses newApiRespo @Override public DiffResult isChanged() { - if (addResponses.size() == 0 && missingResponses.size() == 0 && changedResponses.size() == 0) { + if (addResponses.size() == 0 && missingResponses.size() == 0 && changedResponses.size() == 0 + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } - if (missingResponses.size() == 0 && changedResponses.values().stream().allMatch(Changed::isCompatible)) { + if (missingResponses.size() == 0 && changedResponses.values().stream().allMatch(Changed::isCompatible) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java index 09ebf99de..3fc11c9de 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.headers.Header; import lombok.Getter; import lombok.Setter; @@ -21,6 +23,7 @@ public class ChangedHeader implements Changed { private boolean changeExplode; private ChangedSchema changedSchema; private ChangedContent changedContent; + private ChangedExtensions changedExtensions; public ChangedHeader(Header oldHeader, Header newHeader, DiffContext context) { this.oldHeader = oldHeader; @@ -31,13 +34,15 @@ public ChangedHeader(Header oldHeader, Header newHeader, DiffContext context) { @Override public DiffResult isChanged() { if (!changeDescription && !changeRequired && !changeDeprecated && !changeStyle && !changeExplode - && (changedSchema == null || changedSchema.isUnchanged()) - && (changedContent == null || changedContent.isUnchanged())) { + && ChangedUtils.isUnchanged(changedSchema) + && ChangedUtils.isUnchanged(changedContent) + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } if (!changeRequired && !changeStyle && !changeExplode - && (changedSchema == null || changedSchema.isCompatible()) - && (changedContent == null || changedContent.isCompatible())) { + && ChangedUtils.isCompatible(changedSchema) + && ChangedUtils.isCompatible(changedContent) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java index 9c8c15acb..b292dc7aa 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.security.OAuthFlow; import lombok.Getter; import lombok.Setter; @@ -16,6 +18,7 @@ public class ChangedOAuthFlow implements Changed { private boolean changedAuthorizationUrl; private boolean changedTokenUrl; private boolean changedRefreshUrl; + private ChangedExtensions changedExtensions; public ChangedOAuthFlow(OAuthFlow oldOAuthFlow, OAuthFlow newOAuthFlow) { this.oldOAuthFlow = oldOAuthFlow; @@ -25,9 +28,12 @@ public ChangedOAuthFlow(OAuthFlow oldOAuthFlow, OAuthFlow newOAuthFlow) { @Override public DiffResult isChanged() { if (!changedAuthorizationUrl && !changedTokenUrl && !changedRefreshUrl) { - return DiffResult.NO_CHANGES; - } else { - return DiffResult.INCOMPATIBLE; + if (ChangedUtils.isUnchanged(changedExtensions)) { + return DiffResult.NO_CHANGES; + } else if (ChangedUtils.isCompatible(changedExtensions)) { + return DiffResult.COMPATIBLE; + } } + return DiffResult.INCOMPATIBLE; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java index 2c6a8a2b8..e4dffa5a0 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.security.OAuthFlows; import lombok.Getter; import lombok.Setter; @@ -17,6 +19,7 @@ public class ChangedOAuthFlows implements Changed { private ChangedOAuthFlow changedPasswordOAuthFlow; private ChangedOAuthFlow changedClientCredentialOAuthFlow; private ChangedOAuthFlow changedAuthorizationCodeOAuthFlow; + private ChangedExtensions changedExtensions; public ChangedOAuthFlows(OAuthFlows oldOAuthFlows, OAuthFlows newOAuthFlows) { this.oldOAuthFlows = oldOAuthFlows; @@ -26,15 +29,17 @@ public ChangedOAuthFlows(OAuthFlows oldOAuthFlows, OAuthFlows newOAuthFlows) { @Override public DiffResult isChanged() { if ((changedImplicitOAuthFlow == null || changedImplicitOAuthFlow.isUnchanged()) - && (changedPasswordOAuthFlow == null || changedPasswordOAuthFlow.isUnchanged()) - && (changedClientCredentialOAuthFlow == null || changedClientCredentialOAuthFlow.isUnchanged()) - && (changedAuthorizationCodeOAuthFlow == null || changedAuthorizationCodeOAuthFlow.isUnchanged())) { + && ChangedUtils.isUnchanged(changedPasswordOAuthFlow) + && ChangedUtils.isUnchanged(changedClientCredentialOAuthFlow) + && ChangedUtils.isUnchanged(changedAuthorizationCodeOAuthFlow) + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } if ((changedImplicitOAuthFlow == null || changedImplicitOAuthFlow.isCompatible()) - && (changedPasswordOAuthFlow == null || changedPasswordOAuthFlow.isCompatible()) - && (changedClientCredentialOAuthFlow == null || changedClientCredentialOAuthFlow.isCompatible()) - && (changedAuthorizationCodeOAuthFlow == null || changedAuthorizationCodeOAuthFlow.isCompatible())) { + && ChangedUtils.isCompatible(changedPasswordOAuthFlow) + && ChangedUtils.isCompatible(changedClientCredentialOAuthFlow) + && ChangedUtils.isCompatible(changedAuthorizationCodeOAuthFlow) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java index 14f00d9c0..3eaba7ad0 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; +import com.qdesrame.openapi.diff.utils.ChangedUtils; import com.qdesrame.openapi.diff.utils.EndpointUtils; import io.swagger.v3.oas.models.OpenAPI; import lombok.Getter; @@ -20,6 +22,7 @@ public class ChangedOpenApi implements Changed { private List newEndpoints; private List missingEndpoints; private List changedOperations; + private ChangedExtensions changedExtensions; public List getDeprecatedEndpoints() { return changedOperations.stream() @@ -30,10 +33,12 @@ public List getDeprecatedEndpoints() { @Override public DiffResult isChanged() { - if (newEndpoints.size() == 0 && missingEndpoints.size() == 0 && changedOperations.size() == 0) { + if (newEndpoints.size() == 0 && missingEndpoints.size() == 0 && changedOperations.size() == 0 + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } - if (missingEndpoints.size() == 0 && changedOperations.stream().allMatch(Changed::isCompatible)) { + if (missingEndpoints.size() == 0 && changedOperations.stream().allMatch(Changed::isCompatible) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java index f4805d1b6..19f5a3a46 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java @@ -1,5 +1,6 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.responses.ApiResponse; import lombok.Getter; @@ -15,6 +16,7 @@ public class ChangedResponse implements Changed { private boolean changeDescription; private ChangedHeaders changedHeaders; private ChangedContent changedContent; + private ChangedExtensions changedExtensions; public ChangedResponse(ApiResponse oldApiResponse, ApiResponse newApiResponse, DiffContext context) { this.oldApiResponse = oldApiResponse; @@ -24,10 +26,15 @@ public ChangedResponse(ApiResponse oldApiResponse, ApiResponse newApiResponse, D @Override public DiffResult isChanged() { - if (!changeDescription && ChangedUtils.isUnchanged(changedContent) && ChangedUtils.isUnchanged(changedHeaders)) { + if (!changeDescription + && ChangedUtils.isUnchanged(changedContent) + && ChangedUtils.isUnchanged(changedHeaders) + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } - if (ChangedUtils.isCompatible(changedContent) && ChangedUtils.isCompatible(changedHeaders)) { + if (ChangedUtils.isCompatible(changedContent) + && ChangedUtils.isCompatible(changedHeaders) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java index 068430866..043de000e 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java @@ -1,5 +1,6 @@ package com.qdesrame.openapi.diff.model; +import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.security.SecurityScheme; import lombok.Getter; @@ -21,6 +22,7 @@ public class ChangedSecurityScheme implements Changed { private ChangedOAuthFlows changedOAuthFlows; private boolean changedOpenIdConnectUrl; private ListDiff changedScopes; + private ChangedExtensions changedExtensions; public ChangedSecurityScheme(SecurityScheme oldSecurityScheme, SecurityScheme newSecurityScheme) { this.oldSecurityScheme = oldSecurityScheme; @@ -31,12 +33,14 @@ public ChangedSecurityScheme(SecurityScheme oldSecurityScheme, SecurityScheme ne public DiffResult isChanged() { if (!changedType && !changedDescription && !changedIn && !changedScheme && !changedBearerFormat && ChangedUtils.isUnchanged(changedOAuthFlows) && !changedOpenIdConnectUrl - && (changedScopes == null || changedScopes.isUnchanged())) { + && (changedScopes == null || changedScopes.isUnchanged()) + && ChangedUtils.isUnchanged(changedExtensions)) { return DiffResult.NO_CHANGES; } if (!changedType && !changedIn && !changedScheme && !changedBearerFormat && ChangedUtils.isCompatible(changedOAuthFlows) && !changedOpenIdConnectUrl - && (changedScopes == null || changedScopes.getIncreased().isEmpty())) { + && (changedScopes == null || changedScopes.getIncreased().isEmpty()) + && ChangedUtils.isCompatible(changedExtensions)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE;