From c8aefbd226e84397b05e6bb08fcb80e94dec1969 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Dec 2021 14:09:08 +0000 Subject: [PATCH 001/313] build(deps): bump fmt-maven-plugin from 2.9.1 to 2.13 Bumps [fmt-maven-plugin](https://github.com/coveooss/fmt-maven-plugin) from 2.9.1 to 2.13. - [Release notes](https://github.com/coveooss/fmt-maven-plugin/releases) - [Commits](https://github.com/coveooss/fmt-maven-plugin/compare/2.9.1...2.13.0) --- updated-dependencies: - dependency-name: com.coveo:fmt-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 06f6bfd4b..18ec5ad6f 100644 --- a/pom.xml +++ b/pom.xml @@ -292,7 +292,7 @@ <plugin> <groupId>com.coveo</groupId> <artifactId>fmt-maven-plugin</artifactId> - <version>2.9.1</version> + <version>2.13</version> </plugin> <plugin> <groupId>io.github.phillipuniverse</groupId> From ef6c3f29187450d12d262c44129ed5ce15faa151 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Mon, 27 Dec 2021 02:04:58 +0100 Subject: [PATCH 002/313] Migrate from Log4j 1.2.x to Logback (#307) Log4j 1.x has been EOL for several years. --- cli/pom.xml | 4 ++-- .../java/org/openapitools/openapidiff/cli/Main.java | 7 ++++--- cli/src/main/resources/log4j.properties | 5 ----- cli/src/main/resources/logback.xml | 11 +++++++++++ pom.xml | 6 +++--- 5 files changed, 20 insertions(+), 13 deletions(-) delete mode 100644 cli/src/main/resources/log4j.properties create mode 100644 cli/src/main/resources/logback.xml diff --git a/cli/pom.xml b/cli/pom.xml index 66c18fb22..b67f7336c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -31,8 +31,8 @@ <artifactId>slf4j-api</artifactId> </dependency> <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> </dependency> </dependencies> <build> diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index 8da0fea16..8fb2ff000 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -1,5 +1,6 @@ package org.openapitools.openapidiff.cli; +import ch.qos.logback.classic.Level; import io.swagger.v3.parser.core.models.AuthorizationValue; import java.io.File; import java.io.IOException; @@ -15,8 +16,6 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.log4j.Level; -import org.apache.log4j.LogManager; import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.ConsoleRender; @@ -157,7 +156,9 @@ public static void main(String... args) { if (line.hasOption("state")) { logLevel = "OFF"; } - LogManager.getRootLogger().setLevel(Level.toLevel(logLevel)); + ch.qos.logback.classic.Logger root = + (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + root.setLevel(Level.toLevel(logLevel)); if (line.getArgList().size() < 2) { throw new ParseException("Missing arguments"); diff --git a/cli/src/main/resources/log4j.properties b/cli/src/main/resources/log4j.properties deleted file mode 100644 index 1f7d27e30..000000000 --- a/cli/src/main/resources/log4j.properties +++ /dev/null @@ -1,5 +0,0 @@ -log4j.rootLogger=DEBUG, STDOUT -log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender -log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout -log4j.appender.STDOUT.layout.ConversionPattern=%-5p [%c] - %m%n -#log4j.appender.STDOUT.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %-5p [%c] - %m%n \ No newline at end of file diff --git a/cli/src/main/resources/logback.xml b/cli/src/main/resources/logback.xml new file mode 100644 index 000000000..018a4277c --- /dev/null +++ b/cli/src/main/resources/logback.xml @@ -0,0 +1,11 @@ +<configuration> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>[%thread] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <root level="debug"> + <appender-ref ref="STDOUT"/> + </root> +</configuration> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 06f6bfd4b..127d77709 100644 --- a/pom.xml +++ b/pom.xml @@ -142,9 +142,9 @@ <version>${slf4j.version}</version> </dependency> <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>${slf4j.version}</version> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>1.2.10</version> </dependency> <dependency> <groupId>commons-httpclient</groupId> From 566649451f70971fc29532c198b46e45997532e7 Mon Sep 17 00:00:00 2001 From: Michael Gloegl <m.gloegl@gmail.com> Date: Mon, 27 Dec 2021 02:06:11 +0100 Subject: [PATCH 003/313] Exclude null poperties when rendering JSON (#302) The generated JSON diff file is already fairly large for larger API specs, but is made especially large because a lot of unused properties in the objects are serialised as null properties. --- .../org/openapitools/openapidiff/core/output/JsonRender.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java index b0518d000..e1cf5ee49 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java @@ -1,11 +1,13 @@ package org.openapitools.openapidiff.core.output; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.openapitools.openapidiff.core.model.ChangedOpenApi; public class JsonRender implements Render { - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = + new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); @Override public String render(ChangedOpenApi diff) { From b2885c6dc1c2cd940720e888edee9ed2d9e45ad1 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Mon, 27 Dec 2021 02:12:48 +0100 Subject: [PATCH 004/313] Remove dependency on commons-httpclient (#308) `commons-httpclient:commons-httpclient` is only used for the `HttpStatus` class. --- core/pom.xml | 4 - .../core/output/ConsoleRender.java | 3 +- .../openapidiff/core/output/HttpStatus.java | 112 ++++++++++++++++++ .../core/output/MarkdownRender.java | 3 +- pom.xml | 5 - 5 files changed, 114 insertions(+), 13 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/output/HttpStatus.java diff --git a/core/pom.xml b/core/pom.xml index 261e92e8c..25f4ab93a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -38,10 +38,6 @@ <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> - <dependency> - <groupId>commons-httpclient</groupId> - <artifactId>commons-httpclient</artifactId> - </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java index 7ca4acc44..204f814ab 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java @@ -10,7 +10,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; -import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.lang3.StringUtils; import org.openapitools.openapidiff.core.model.*; import org.openapitools.openapidiff.core.utils.RefPointer; @@ -120,7 +119,7 @@ private String itemResponse(String title, String code) { StringBuilder sb = new StringBuilder(); String status = ""; if (!code.equals("default")) { - status = HttpStatus.getStatusText(Integer.parseInt(code)); + status = HttpStatus.getReasonPhrase(Integer.parseInt(code)); } sb.append(StringUtils.repeat(' ', 4)) .append("- ") diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/HttpStatus.java b/core/src/main/java/org/openapitools/openapidiff/core/output/HttpStatus.java new file mode 100644 index 000000000..13a81c324 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/HttpStatus.java @@ -0,0 +1,112 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/HttpStatus.java,v 1.18 2004/05/02 11:21:13 olegk Exp $ + * $Revision: 480424 $ + * $Date: 2006-11-29 06:56:49 +0100 (Wed, 29 Nov 2006) $ + * + * ==================================================================== + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + */ +package org.openapitools.openapidiff.core.output; + +import java.util.HashMap; +import java.util.Map; + +/** + * Constants enumerating the HTTP status codes. All status codes defined in RFC1945 (HTTP/1.0, + * RFC2616 (HTTP/1.1), and RFC2518 (WebDAV) are supported. + */ +public final class HttpStatus { + + private static final Map<Integer, String> REASON_PHRASES = new HashMap<>(); + + static { + REASON_PHRASES.put(100, "Continue"); + REASON_PHRASES.put(101, "Switching Protocols"); + REASON_PHRASES.put(102, "Processing"); + REASON_PHRASES.put(200, "OK"); + REASON_PHRASES.put(201, "Created"); + REASON_PHRASES.put(202, "Accepted"); + REASON_PHRASES.put(203, "Non Authoritative Information"); + REASON_PHRASES.put(204, "No Content"); + REASON_PHRASES.put(205, "Reset Content"); + REASON_PHRASES.put(206, "Partial Content"); + REASON_PHRASES.put(207, "Multi-Status"); + REASON_PHRASES.put(300, "Multiple Choices"); + REASON_PHRASES.put(301, "Moved Permanently"); + REASON_PHRASES.put(302, "Moved Temporarily"); + REASON_PHRASES.put(303, "See Other"); + REASON_PHRASES.put(304, "Not Modified"); + REASON_PHRASES.put(305, "Use Proxy"); + REASON_PHRASES.put(307, "Temporary Redirect"); + REASON_PHRASES.put(400, "Bad Request"); + REASON_PHRASES.put(401, "Unauthorized"); + REASON_PHRASES.put(402, "Payment Required"); + REASON_PHRASES.put(403, "Forbidden"); + REASON_PHRASES.put(404, "Not Found"); + REASON_PHRASES.put(405, "Method Not Allowed"); + REASON_PHRASES.put(406, "Not Acceptable"); + REASON_PHRASES.put(407, "Proxy Authentication Required"); + REASON_PHRASES.put(408, "Request Timeout"); + REASON_PHRASES.put(409, "Conflict"); + REASON_PHRASES.put(410, "Gone"); + REASON_PHRASES.put(411, "Length Required"); + REASON_PHRASES.put(412, "Precondition Failed"); + REASON_PHRASES.put(413, "Request Too Long"); + REASON_PHRASES.put(414, "Request-URI Too Long"); + REASON_PHRASES.put(415, "Unsupported Media Type"); + REASON_PHRASES.put(416, "Requested Range Not Satisfiable"); + REASON_PHRASES.put(417, "Expectation Failed"); + REASON_PHRASES.put(419, "Insufficient Space On Resource"); + REASON_PHRASES.put(420, "Method Failure"); + REASON_PHRASES.put(422, "Unprocessable Entity"); + REASON_PHRASES.put(423, "Locked"); + REASON_PHRASES.put(424, "Failed Dependency"); + REASON_PHRASES.put(500, "Internal Server Error"); + REASON_PHRASES.put(501, "Not Implemented"); + REASON_PHRASES.put(502, "Bad Gateway"); + REASON_PHRASES.put(503, "Service Unavailable"); + REASON_PHRASES.put(504, "Gateway Timeout"); + REASON_PHRASES.put(505, "Http Version Not Supported"); + REASON_PHRASES.put(507, "Insufficient Storage"); + } + + /** + * Get the reason phrase for a particular status code. + * + * <p>This method always returns the English text as specified in the relevant RFCs and is not + * internationalized. + * + * @param statusCode the numeric status code + * @return the reason phrase associated with the given status code or null if the status code is + * not recognized. + */ + public static String getReasonPhrase(int statusCode) { + if (statusCode < 0) { + throw new IllegalArgumentException("status code may not be negative"); + } + return REASON_PHRASES.get(statusCode); + } + + private HttpStatus() {} +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java index fd6726615..0ba345175 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java @@ -13,7 +13,6 @@ import io.swagger.v3.oas.models.responses.ApiResponse; import java.util.List; import java.util.Map; -import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.lang3.StringUtils; import org.openapitools.openapidiff.core.model.*; import org.openapitools.openapidiff.core.utils.RefPointer; @@ -156,7 +155,7 @@ protected String itemResponse(String title, String code, String description) { StringBuilder sb = new StringBuilder(); String status = ""; if (!code.equals("default")) { - status = HttpStatus.getStatusText(Integer.parseInt(code)); + status = HttpStatus.getReasonPhrase(Integer.parseInt(code)); } sb.append(format("%s : **%s %s**\n", title, code, status)); sb.append(metadata(description)); diff --git a/pom.xml b/pom.xml index 127d77709..34dc19cbd 100644 --- a/pom.xml +++ b/pom.xml @@ -146,11 +146,6 @@ <artifactId>logback-classic</artifactId> <version>1.2.10</version> </dependency> - <dependency> - <groupId>commons-httpclient</groupId> - <artifactId>commons-httpclient</artifactId> - <version>3.1</version> - </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> From b7c77a4379daeb69ba4a376b33b1904ecac10e60 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Mon, 27 Dec 2021 02:36:34 +0100 Subject: [PATCH 005/313] Use SLF4J commons-logging bridge (#311) https://www.slf4j.org/legacy.html#jclOverSLF4J --- core/pom.xml | 10 ++++++++++ pom.xml | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index 25f4ab93a..914ffcf29 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -25,6 +25,12 @@ <dependency> <groupId>io.swagger.parser.v3</groupId> <artifactId>swagger-parser-v2-converter</artifactId> + <exclusions> + <exclusion> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>com.j2html</groupId> @@ -38,6 +44,10 @@ <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> diff --git a/pom.xml b/pom.xml index 34dc19cbd..be5f77b15 100644 --- a/pom.xml +++ b/pom.xml @@ -141,6 +141,11 @@ <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <version>${slf4j.version}</version> + </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> From 9b0e2a90c853fd1d18ba689267f9e64883b4bbde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Dec 2021 11:51:05 +0100 Subject: [PATCH 006/313] build(deps): bump maven-site-plugin from 3.9.1 to 3.10.0 (#313) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index ed52e83c0..032d97a48 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -56,7 +56,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> - <version>3.9.1</version> + <version>3.10.0</version> </plugin> </plugins> </pluginManagement> From 9d8087cbbb0de0f9c9a0528b35f6068cb0b6b22e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jan 2022 20:06:46 +0100 Subject: [PATCH 007/313] build(deps): bump assertj-core from 3.21.0 to 3.22.0 (#315) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index be5f77b15..ffe56ef53 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.21.0</version> + <version>3.22.0</version> <scope>test</scope> </dependency> <dependency> From 9949e4c733fc4a8ed9043fbf9309c05a1ceefbcd Mon Sep 17 00:00:00 2001 From: Marco Seguri <75306670+seguri-doodle@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:41:55 +0100 Subject: [PATCH 008/313] Fix POM markup in README (#324) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 95648473e..ceda5991d 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ Add openapi-diff to your POM to show diffs when you test your Maven project. You <!-- Fail only if API changes broke backward compatibility (default: false) --> <failOnIncompatible>true</failOnIncompatible> <!-- Fail if API changed (default: false) --> - <failOnChanged>true</failOnIncompatible> + <failOnChanged>true</failOnChanged> </configuration> </execution> </executions> From ee24b2a6f3f4965d41527fa64abeec1c7b2b9762 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:32:45 +0100 Subject: [PATCH 009/313] build(deps): bump maven-compiler-plugin from 3.8.1 to 3.10.0 (#333) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ffe56ef53..fc235ff69 100644 --- a/pom.xml +++ b/pom.xml @@ -262,7 +262,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.8.1</version> + <version>3.10.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 9e2c21a33513be0372f21ed55ced539a78538dc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:32:52 +0100 Subject: [PATCH 010/313] build(deps): bump slf4j.version from 1.7.32 to 1.7.33 (#323) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fc235ff69..b5b94c49a 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.0.28</swagger-parser.version> - <slf4j.version>1.7.32</slf4j.version> + <slf4j.version>1.7.33</slf4j.version> </properties> <dependencyManagement> From 58138c31fd336e6cee5b38980a9e428a5994e63c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:33:01 +0100 Subject: [PATCH 011/313] build(deps): bump maven-jar-plugin from 3.2.0 to 3.2.2 (#322) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b5b94c49a..0c142a43a 100644 --- a/pom.xml +++ b/pom.xml @@ -272,7 +272,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> - <version>3.2.0</version> + <version>3.2.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From cd28ff48a4c6415d155da3bd69b19a730c3d8383 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:34:42 +0100 Subject: [PATCH 012/313] build(deps): bump maven-plugin-plugin from 3.6.2 to 3.6.4 (#340) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index 032d97a48..f027efcbd 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -51,7 +51,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> - <version>3.6.2</version> + <version>3.6.4</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 4b22988d1420b75d7454658019463df1f557f4e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:34:53 +0100 Subject: [PATCH 013/313] build(deps): bump nexus-staging-maven-plugin from 1.6.8 to 1.6.12 (#339) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0c142a43a..b33be3595 100644 --- a/pom.xml +++ b/pom.xml @@ -317,7 +317,7 @@ <plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> - <version>1.6.8</version> + <version>1.6.12</version> <extensions>true</extensions> </plugin> <plugin> From d8ced86e2b0776d2c3bb5ebd77d4d3d77da42436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:36:36 +0100 Subject: [PATCH 014/313] build(deps): bump maven-javadoc-plugin from 3.3.1 to 3.3.2 (#341) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b33be3595..d0280cdae 100644 --- a/pom.xml +++ b/pom.xml @@ -282,7 +282,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.3.1</version> + <version>3.3.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From cc7de262921d27971357464b21f7ab7aeb6f9a0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:36:44 +0100 Subject: [PATCH 015/313] build(deps): bump maven-site-plugin from 3.10.0 to 3.11.0 (#342) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index f027efcbd..e667362b5 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -56,7 +56,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> - <version>3.10.0</version> + <version>3.11.0</version> </plugin> </plugins> </pluginManagement> From b5103fd9fcb555b16ee1cffdbc785c8708740820 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:36:49 +0100 Subject: [PATCH 016/313] build(deps): bump slf4j.version from 1.7.33 to 1.7.36 (#338) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d0280cdae..52d86a136 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.0.28</swagger-parser.version> - <slf4j.version>1.7.33</slf4j.version> + <slf4j.version>1.7.36</slf4j.version> </properties> <dependencyManagement> From b424f21c7a8ecd40a842c0a684d0bb880b9e024a Mon Sep 17 00:00:00 2001 From: kaschula <48677342+kaschula@users.noreply.github.com> Date: Mon, 28 Feb 2022 10:39:16 +0000 Subject: [PATCH 017/313] Build Linux/ARM64 Docker image (#336) Update the docker/build-push-action@v2 to include the `platforms: linux/amd64,linux/arm64` argument. This will ensure the Docker release step builds for the arm64 as well as amd64 platforms. --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d5f5c4c6..f9c9136bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,6 +61,7 @@ jobs: with: context: . push: true + platforms: linux/amd64,linux/arm64 tags: | openapitools/openapi-diff:${{ github.event.inputs.releaseVersion }} openapitools/openapi-diff:latest From 4faa09b2ffab20986ae762b827d033992849a1c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:39:29 +0100 Subject: [PATCH 018/313] build(deps): bump swagger-parser.version from 2.0.28 to 2.0.30 (#337) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52d86a136..581554a38 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.0.28</swagger-parser.version> + <swagger-parser.version>2.0.30</swagger-parser.version> <slf4j.version>1.7.36</slf4j.version> </properties> From 8d804d447355c8cdfe5b4599ad8264f627039aba Mon Sep 17 00:00:00 2001 From: Sven Linstaedt <sven.linstaedt@gmail.com> Date: Mon, 28 Feb 2022 13:12:21 +0100 Subject: [PATCH 019/313] fix: Adding response media type is breaking change (#328) Adding a response media type is a non-breaking change, as long as preexisting ones are still compatible. Clients still can requests all existing media type via `Accept` header as they have done before. Removing an existing media type on the over hand is a breaking change, because existing client's requesting this response representation (again via `Accept` header) will probably get a `406 Not Acceptable`. --- .../openapitools/openapidiff/core/model/ChangedContent.java | 2 +- .../org/openapitools/openapidiff/core/ContentDiffTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java index 5bc6ddf2a..192b49e66 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java @@ -31,7 +31,7 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (context.isRequest() && missing.isEmpty() || context.isResponse() && increased.isEmpty()) { + if (context.isRequest() && missing.isEmpty() || context.isResponse() && missing.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ContentDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ContentDiffTest.java index 190b5a32f..e3cf03534 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ContentDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ContentDiffTest.java @@ -33,7 +33,7 @@ public void testAddedResponseContentTypeDiff() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations( "content_type_response_add_1.yaml", "content_type_response_add_2.yaml"); - assertThat(changedOpenApi.isCompatible()).isFalse(); + assertThat(changedOpenApi.isCompatible()).isTrue(); } @Test @@ -41,7 +41,7 @@ public void testRemovedResponseContentTypeDiff() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations( "content_type_response_add_2.yaml", "content_type_response_add_1.yaml"); - assertThat(changedOpenApi.isCompatible()).isTrue(); + assertThat(changedOpenApi.isCompatible()).isFalse(); } @Test From 46c7f238a316c71b41e278b95b22772c6dc156b3 Mon Sep 17 00:00:00 2001 From: Bogdan Ilchyshyn <orange-buffalo@users.noreply.github.com> Date: Mon, 28 Feb 2022 23:15:46 +1100 Subject: [PATCH 020/313] Fix: False positive breaking change when removing optional field from response (#327) --- .../openapitools/openapidiff/core/model/ChangedSchema.java | 7 ++++++- .../org/openapitools/openapidiff/core/AddPropDiffTest.java | 4 ++-- core/src/test/resources/recursive_model_1.yaml | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index c6289f17d..22e5a8f08 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -137,8 +137,13 @@ private DiffResult calculateCoreChanged() { && !discriminatorPropertyChanged) { return DiffResult.NO_CHANGES; } + boolean missingRequiredProperties = + oldSchema != null + && oldSchema.getRequired() != null + && missingProperties.keySet().stream() + .anyMatch(missingProperty -> oldSchema.getRequired().contains(missingProperty)); boolean compatibleForResponse = - missingProperties.isEmpty() && (oldSchema == null || newSchema != null); + !missingRequiredProperties && (oldSchema == null || newSchema != null); if ((context.isRequest() && compatibleForRequest() || context.isResponse() && compatibleForResponse) && !changedType diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java index b71d8f039..6d668c115 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java @@ -1,7 +1,7 @@ package org.openapitools.openapidiff.core; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; import org.junit.jupiter.api.Test; @@ -16,6 +16,6 @@ public void testDiffSame() { @Test public void testDiffDifferent() { - assertOpenApiBackwardIncompatible(OPENAPI_DOC1, OPENAPI_DOC2); + assertOpenApiBackwardCompatible(OPENAPI_DOC1, OPENAPI_DOC2, true); } } diff --git a/core/src/test/resources/recursive_model_1.yaml b/core/src/test/resources/recursive_model_1.yaml index 6a05ab0ad..24f545186 100644 --- a/core/src/test/resources/recursive_model_1.yaml +++ b/core/src/test/resources/recursive_model_1.yaml @@ -19,6 +19,7 @@ components: schemas: B: type: object + required: ["message2"] properties: message: type: string @@ -27,4 +28,4 @@ components: details: type: array items: - $ref: '#/components/schemas/B' \ No newline at end of file + $ref: '#/components/schemas/B' From 199e30a22be4bae4a6548671c934731f30f77ef9 Mon Sep 17 00:00:00 2001 From: Julien Richard-Foy <julien@richard-foy.fr> Date: Mon, 28 Feb 2022 13:18:08 +0100 Subject: [PATCH 021/313] Support `allOf` schemas referring to `oneOf` schemas (#318) Fixes #317 --- .../openapidiff/core/compare/SchemaDiff.java | 39 ++++++-- .../openapidiff/core/AllOfOneOfDiffTest.java | 14 +++ core/src/test/resources/issue-317_1.json | 84 +++++++++++++++++ core/src/test/resources/issue-317_2.json | 91 +++++++++++++++++++ 4 files changed, 219 insertions(+), 9 deletions(-) create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/AllOfOneOfDiffTest.java create mode 100644 core/src/test/resources/issue-317_1.json create mode 100644 core/src/test/resources/issue-317_2.json diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java index 822160ede..1d1961bf7 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java @@ -10,11 +10,13 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.media.XML; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import org.openapitools.openapidiff.core.compare.schemadiffresult.ArraySchemaDiffResult; import org.openapitools.openapidiff.core.compare.schemadiffresult.ComposedSchemaDiffResult; import org.openapitools.openapidiff.core.compare.schemadiffresult.SchemaDiffResult; @@ -79,17 +81,26 @@ public static SchemaDiffResult getSchemaDiffResult( } } - protected static Schema<?> resolveComposedSchema(Components components, Schema<?> schema) { + protected static Schema<?> resolveComposedSchema( + Components components, Schema<?> schema, Set<String> visitedRefs) { if (schema instanceof ComposedSchema) { ComposedSchema composedSchema = (ComposedSchema) schema; - List<Schema> allOfSchemaList = composedSchema.getAllOf(); - if (allOfSchemaList != null) { - for (Schema<?> allOfSchema : allOfSchemaList) { - allOfSchema = refPointer.resolveRef(components, allOfSchema, allOfSchema.get$ref()); - allOfSchema = resolveComposedSchema(components, allOfSchema); - schema = addSchema(schema, allOfSchema); + List<Schema> composedSchemas = new ArrayList<>(); + Optional.ofNullable(composedSchema.getAllOf()).ifPresent(composedSchemas::addAll); + Optional.ofNullable(composedSchema.getAnyOf()).ifPresent(composedSchemas::addAll); + + if (!composedSchemas.isEmpty()) { + for (Schema<?> composed : composedSchemas) { + if (composed.get$ref() == null || !visitedRefs.contains(composed.get$ref())) { + Set<String> updatedVisitedRefs = new HashSet<>(visitedRefs); + updatedVisitedRefs.add(composed.get$ref()); + composed = refPointer.resolveRef(components, composed, composed.get$ref()); + composed = resolveComposedSchema(components, composed, updatedVisitedRefs); + schema = addSchema(schema, composed); + } } composedSchema.setAllOf(null); + composedSchema.setAnyOf(null); } } return schema; @@ -154,6 +165,16 @@ protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) { } schema.getExtensions().putAll(fromSchema.getExtensions()); } + if (fromSchema instanceof ComposedSchema && schema instanceof ComposedSchema) { + ComposedSchema composedFromSchema = (ComposedSchema) fromSchema; + ComposedSchema composedSchema = (ComposedSchema) schema; + if (composedFromSchema.getOneOf() != null) { + if (composedSchema.getOneOf() == null) { + composedSchema.setOneOf(new ArrayList<>()); + } + composedSchema.getOneOf().addAll(composedFromSchema.getOneOf()); + } + } if (fromSchema.getDiscriminator() != null) { if (schema.getDiscriminator() == null) { schema.setDiscriminator(new Discriminator()); @@ -316,8 +337,8 @@ public DeferredChanged<ChangedSchema> computeDiffForReal( left = refPointer.resolveRef(this.leftComponents, left, getSchemaRef(left)); right = refPointer.resolveRef(this.rightComponents, right, getSchemaRef(right)); - left = resolveComposedSchema(leftComponents, left); - right = resolveComposedSchema(rightComponents, right); + left = resolveComposedSchema(leftComponents, left, new HashSet<>()); + right = resolveComposedSchema(rightComponents, right, new HashSet<>()); // If type of schemas are different, just set old & new schema, set changedType to true in // SchemaDiffResult and diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AllOfOneOfDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AllOfOneOfDiffTest.java new file mode 100644 index 000000000..ec1bcfc53 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/AllOfOneOfDiffTest.java @@ -0,0 +1,14 @@ +package org.openapitools.openapidiff.core; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; + +public class AllOfOneOfDiffTest { + @Test + void allOfReferringToOneOfSchemasAreSupported() { + ChangedOpenApi diff = OpenApiCompare.fromLocations("issue-317_1.json", "issue-317_2.json"); + assertThat(diff.isCoreChanged().isUnchanged()); + } +} diff --git a/core/src/test/resources/issue-317_1.json b/core/src/test/resources/issue-317_1.json new file mode 100644 index 000000000..ab6f7357b --- /dev/null +++ b/core/src/test/resources/issue-317_1.json @@ -0,0 +1,84 @@ +{ + "openapi":"3.0.0", + "info":{ + "title":"API", + "version":"0.1.0" + }, + "paths":{ + "/resource":{ + "post":{ + "responses":{ + "200":{ + "description":"Created resource", + "content":{ + "application/json":{ + "schema":{ + "type":"string" + } + } + } + } + }, + "summary":"Create resource", + "requestBody":{ + "content":{ + "application/json":{ + "schema":{ + "$ref":"#/components/schemas/Resource" + } + } + }, + "description":"Definition of the resource" + } + } + } + }, + "components":{ + "schemas":{ + "Resource":{ + "type":"object", + "properties":{ + "assignment":{ + "$ref":"#/components/schemas/Foo" + } + } + }, + "Foo":{ + "oneOf":[ + { + "$ref":"#/components/schemas/Foo.Bar" + }, + { + "$ref":"#/components/schemas/Foo.Baz" + } + ], + "discriminator":{ + "propertyName":"type", + "mapping":{ + "Bar":"#/components/schemas/Foo.Bar", + "Baz":"#/components/schemas/Foo.Baz" + } + } + }, + "Foo.Bar":{ + "type":"object", + "properties":{ + "type":{ + "type":"string" + } + } + }, + "Foo.Baz":{ + "type":"object", + "properties":{ + "type":{ + "type":"string" + } + } + } + }, + "securitySchemes":{ + + } + } +} diff --git a/core/src/test/resources/issue-317_2.json b/core/src/test/resources/issue-317_2.json new file mode 100644 index 000000000..b3d35cde4 --- /dev/null +++ b/core/src/test/resources/issue-317_2.json @@ -0,0 +1,91 @@ +{ + "openapi":"3.0.0", + "info":{ + "title":"API", + "version":"0.1.0" + }, + "paths":{ + "/resource":{ + "post":{ + "responses":{ + "200":{ + "description":"Created resource", + "content":{ + "application/json":{ + "schema":{ + "type":"string" + } + } + } + } + }, + "summary":"Create resource", + "requestBody":{ + "content":{ + "application/json":{ + "schema":{ + "$ref":"#/components/schemas/Resource" + } + } + }, + "description":"Definition of the resource" + } + } + } + }, + "components":{ + "schemas":{ + "Resource":{ + "type":"object", + "properties":{ + "assignment":{ + "default":{ + "type":"Bar" + }, + "allOf":[ + { + "$ref":"#/components/schemas/Foo" + } + ] + } + } + }, + "Foo":{ + "oneOf":[ + { + "$ref":"#/components/schemas/Foo.Bar" + }, + { + "$ref":"#/components/schemas/Foo.Baz" + } + ], + "discriminator":{ + "propertyName":"type", + "mapping":{ + "Bar":"#/components/schemas/Foo.Bar", + "Baz":"#/components/schemas/Foo.Baz" + } + } + }, + "Foo.Bar":{ + "type":"object", + "properties":{ + "type":{ + "type":"string" + } + } + }, + "Foo.Baz":{ + "type":"object", + "properties":{ + "type":{ + "type":"string" + } + } + } + }, + "securitySchemes":{ + + } + } +} From 64c976c24f66c24d881c81d39edca4b13a7f17f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Mar 2022 11:01:47 +0100 Subject: [PATCH 022/313] build(deps): bump actions/checkout from 2.4.0 to 3 (#343) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/maven.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6d94e58c1..5a1c2c0f4 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -24,7 +24,7 @@ jobs: env: JAVA_OPTS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up JDK diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 9b68efe15..da7d416d6 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -21,7 +21,7 @@ jobs: env: JAVA_OPTS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 - name: Set up JDK uses: actions/setup-java@v2 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f9c9136bc..e1c0b6e83 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 - name: Set up JDK 11 uses: actions/setup-java@v2 with: @@ -46,7 +46,7 @@ jobs: needs: release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.releaseVersion }} - name: Set up Docker Buildx From e9e848fb8ccaf25e321278bb8fb829a3ea2b19ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= <herve.boutemy@free.fr> Date: Thu, 3 Mar 2022 10:14:45 +0100 Subject: [PATCH 023/313] Bump maven-release-plugin to version 3.0.0-M5 (#314) This adds support for automatically updating the `outputTimestamp` property when running `release:prepare`. https://issues.apache.org/jira/browse/MRELEASE-1029 Co-authored-by: Jochen Schalanda <jochen@schalanda.name> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 581554a38..b1ea9c354 100644 --- a/pom.xml +++ b/pom.xml @@ -277,7 +277,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>2.5.3</version> + <version>3.0.0-M5</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 37004ef6584623c2c399b3ac25f6dae4a243ed19 Mon Sep 17 00:00:00 2001 From: Timur Karimov <timur.karimow.95@gmail.com> Date: Thu, 3 Mar 2022 11:26:04 +0100 Subject: [PATCH 024/313] Equivalent paths with overloaded parameters are supported (#306) Co-authored-by: Jochen Schalanda <jochen@schalanda.name> --- .../openapidiff/core/compare/PathsDiff.java | 36 +++++++++++-- .../core/ParametersOverloadingTest.java | 26 ++++++++++ .../resources/parameters_overloading.yaml | 52 +++++++++++++++++++ .../resources/parameters_overloading_2.yaml | 52 +++++++++++++++++++ 4 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java create mode 100644 core/src/test/resources/parameters_overloading.yaml create mode 100644 core/src/test/resources/parameters_overloading_2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index 0b978cdff..e09a4557b 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.compare; +import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.Paths; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.IntStream; +import io.swagger.v3.oas.models.parameters.Parameter; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedPaths; import org.openapitools.openapidiff.core.model.DiffContext; @@ -50,7 +53,7 @@ public DeferredChanged<ChangedPaths> diff( .filter(item -> normalizePath(item.getKey()).equals(template)) .min( (a, b) -> { - if (methodsIntersect(a.getValue(), b.getValue())) { + if (methodsAndParametersIntersect(a.getValue(), b.getValue())) { throw new IllegalArgumentException( "Two path items have the same signature: " + template); } @@ -99,13 +102,40 @@ public static Paths valOrEmpty(Paths path) { return path; } - private static boolean methodsIntersect(PathItem a, PathItem b) { + /** + * + * @param a a path form the open api spec + * @param b another path from the same open api spec + * @return <code>true</code> in case both paths are of the same method AND their templated parameters are of the same type; + * <code>false</code> otherwise + * + */ + private static boolean methodsAndParametersIntersect(PathItem a, PathItem b) { Set<PathItem.HttpMethod> methodsA = a.readOperationsMap().keySet(); for (PathItem.HttpMethod method : b.readOperationsMap().keySet()) { if (methodsA.contains(method)) { - return true; + Operation left = a.readOperationsMap().get(method); + Operation right = b.readOperationsMap().get(method); + if (left.getParameters().size() == right.getParameters().size()) { + return parametersIntersect(left.getParameters(), right.getParameters()); + } + return false; } } return false; } + + /** + * + * @param left parameters from the first compared method + * @param right parameters from the second compared method + * @return <code>true</code> in case each parameter pair is of the same type; <code>false</code> otherwise + */ + private static boolean parametersIntersect(List<Parameter> left, List<Parameter> right) {; + int parametersSize = left.size(); + long intersectedParameters = IntStream.range(0, left.size()) + .filter(i -> left.get(i).getSchema().getType().equals(right.get(i).getSchema().getType())) + .count(); + return parametersSize == intersectedParameters; + } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java new file mode 100644 index 000000000..e3c4bb53a --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java @@ -0,0 +1,26 @@ +package org.openapitools.openapidiff.core; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; + +class ParametersOverloadingTest { + + private final String OVERLOADED_PARAMETERS = "parameters_overloading.yaml"; + private final String DUPLICATED_PARAMETER_TYPES = "parameters_overloading_2.yaml"; + + @Test + void testDiffWithOverloadedParameterTypes() { + assertDoesNotThrow(() -> OpenApiCompare.fromLocations(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS)); + assertOpenApiAreEquals(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS); + } + + @Test + void testDiffWithDuplicatedParameterTypes() { + assertThrows( + IllegalArgumentException.class, + () -> OpenApiCompare.fromLocations(DUPLICATED_PARAMETER_TYPES, DUPLICATED_PARAMETER_TYPES), + "Two path items have the same signature: /projects/{}"); + } +} \ No newline at end of file diff --git a/core/src/test/resources/parameters_overloading.yaml b/core/src/test/resources/parameters_overloading.yaml new file mode 100644 index 000000000..bd3bee96c --- /dev/null +++ b/core/src/test/resources/parameters_overloading.yaml @@ -0,0 +1,52 @@ +openapi: 3.0.2 +info: + title: Projects API + version: 1.0.0 +paths: + /projects/{id}: + get: + parameters: + - in: path + name: id + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: 'Success' + content: + application/json: + schema: + $ref: '#/components/schemas/SampleResponse' + /projects/{uid}: + get: + parameters: + - in: path + name: uid + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Success' + content: + application/json: + schema: + $ref: '#/components/schemas/SampleResponse' +components: + schemas: + SampleResponse: + type: object + properties: + id: + type: integer + uid: + type: string + name: + type: string + required: + - id + - uid + - name \ No newline at end of file diff --git a/core/src/test/resources/parameters_overloading_2.yaml b/core/src/test/resources/parameters_overloading_2.yaml new file mode 100644 index 000000000..d91b7a0f6 --- /dev/null +++ b/core/src/test/resources/parameters_overloading_2.yaml @@ -0,0 +1,52 @@ +openapi: 3.0.2 +info: + title: Projects API + version: 1.0.0 +paths: + /projects/{id}: + get: + parameters: + - in: path + name: id + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: 'Success' + content: + application/json: + schema: + $ref: '#/components/schemas/SampleResponse' + /projects/{uid}: + get: + parameters: + - in: path + name: uid + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: 'Success' + content: + application/json: + schema: + $ref: '#/components/schemas/SampleResponse' +components: + schemas: + SampleResponse: + type: object + properties: + id: + type: integer + uid: + type: string + name: + type: string + required: + - id + - uid + - name \ No newline at end of file From 72517cc8de89fa442344591e39891604f36526b4 Mon Sep 17 00:00:00 2001 From: Mikkel Arentoft <mikkel@mikadocs.com> Date: Thu, 3 Mar 2022 11:28:55 +0100 Subject: [PATCH 025/313] Fix stack overflow in recursive definitions (#331) Co-authored-by: Mikkel Arentoft <mikkel@festinafinance.com> --- .../core/output/MarkdownRender.java | 6 ++++ .../openapidiff/core/MarkdownRenderTest.java | 7 +++++ core/src/test/resources/recursive_new.yaml | 29 +++++++++++++++++++ core/src/test/resources/recursive_old.yaml | 29 +++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 core/src/test/resources/recursive_new.yaml create mode 100644 core/src/test/resources/recursive_old.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java index 0ba345175..ad74bd610 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java @@ -11,8 +11,10 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.openapitools.openapidiff.core.model.*; import org.openapitools.openapidiff.core.utils.RefPointer; @@ -35,6 +37,7 @@ public class MarkdownRender implements Render { protected RefPointer<Schema<?>> refPointer = new RefPointer<>(RefType.SCHEMAS); protected ChangedOpenApi diff; + protected Set<Schema<?>> handledSchemas = new HashSet<>(); /** * A parameter which indicates whether or not metadata (summary and metadata) changes should be * logged in the changelog file. @@ -43,6 +46,7 @@ public class MarkdownRender implements Render { public String render(ChangedOpenApi diff) { this.diff = diff; + this.handledSchemas.clear(); return listEndpoints("What's New", diff.getNewEndpoints()) + listEndpoints("What's Deleted", diff.getMissingEndpoints()) + listEndpoints("What's Deprecated", diff.getDeprecatedEndpoints()) @@ -335,6 +339,8 @@ protected String schema(int deepness, ComposedSchema schema, DiffContext context } protected String schema(int deepness, Schema schema, DiffContext context) { + if (handledSchemas.contains(schema)) return ""; + handledSchemas.add(schema); StringBuilder sb = new StringBuilder(); sb.append(listItem(deepness, "Enum", schema.getEnum())); sb.append(properties(deepness, "Property", schema.getProperties(), true, context)); diff --git a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java index c92a1cd8c..154fef127 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java @@ -14,4 +14,11 @@ public void renderDoesNotFailWhenPropertyHasBeenRemoved() { OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); assertThat(render.render(diff)).isNotBlank(); } + + @Test + public void renderDoesNotCauseStackOverflowWithRecursiveDefinitions() { + MarkdownRender render = new MarkdownRender(); + ChangedOpenApi diff = OpenApiCompare.fromLocations("recursive_old.yaml", "recursive_new.yaml"); + assertThat(render.render(diff)).isNotBlank(); + } } diff --git a/core/src/test/resources/recursive_new.yaml b/core/src/test/resources/recursive_new.yaml new file mode 100644 index 000000000..be1688ebc --- /dev/null +++ b/core/src/test/resources/recursive_new.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.1 +info: + title: recursive test + version: "1.0" +servers: + - url: "http://localhost:8000/" +paths: + /ping: + get: + operationId: ping + responses: + "200": + description: OK + content: + text/plain: + schema: + $ref: "#/components/schemas/A" +components: + schemas: + A: + type: object + properties: + propname2: + $ref: "#/components/schemas/B" + B: + type: object + properties: + propname2: + $ref: "#/components/schemas/A" \ No newline at end of file diff --git a/core/src/test/resources/recursive_old.yaml b/core/src/test/resources/recursive_old.yaml new file mode 100644 index 000000000..83788675c --- /dev/null +++ b/core/src/test/resources/recursive_old.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.1 +info: + title: recursive test + version: "1.0" +servers: + - url: "http://localhost:8000/" +paths: + /ping: + get: + operationId: ping + responses: + "200": + description: OK + content: + text/plain: + schema: + $ref: "#/components/schemas/A" +components: + schemas: + A: + type: object + properties: + propname: + $ref: "#/components/schemas/B" + B: + type: object + properties: + propname: + $ref: "#/components/schemas/A" \ No newline at end of file From d91c98c0fa3e0d4360b200e5b884254ea7c50c89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Mar 2022 16:45:52 +0100 Subject: [PATCH 026/313] build(deps): bump logback-classic from 1.2.10 to 1.2.11 (#347) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b1ea9c354..4ce134d23 100644 --- a/pom.xml +++ b/pom.xml @@ -149,7 +149,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.2.10</version> + <version>1.2.11</version> </dependency> <dependency> <groupId>org.assertj</groupId> From 6baedba1fdcaf70ff21d78738971011a4504120d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Mar 2022 09:04:32 +0100 Subject: [PATCH 027/313] build(deps): bump maven-compiler-plugin from 3.10.0 to 3.10.1 (#350) Bumps [maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.10.0 to 3.10.1. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.10.0...maven-compiler-plugin-3.10.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4ce134d23..5ba79141e 100644 --- a/pom.xml +++ b/pom.xml @@ -262,7 +262,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.10.0</version> + <version>3.10.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From fd29e3ed0dde25055c7a360fe84e32107ae75ccf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Mar 2022 09:19:40 +0100 Subject: [PATCH 028/313] build(deps): bump swagger-parser.version from 2.0.30 to 2.0.31 (#354) Bumps `swagger-parser.version` from 2.0.30 to 2.0.31. Updates `swagger-parser-v3` from 2.0.30 to 2.0.31 Updates `swagger-parser` from 2.0.30 to 2.0.31 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.0.30...v2.0.31) Updates `swagger-parser-v2-converter` from 2.0.30 to 2.0.31 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5ba79141e..72cdb639a 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.0.30</swagger-parser.version> + <swagger-parser.version>2.0.31</swagger-parser.version> <slf4j.version>1.7.36</slf4j.version> </properties> From 0b709eb68cca76d01150aa0123e6953df93f2cca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 09:56:07 +0100 Subject: [PATCH 029/313] build(deps): bump actions/cache from 2.1.7 to 3 (#356) Bumps [actions/cache](https://github.com/actions/cache) from 2.1.7 to 3. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.7...v3) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/maven.yml | 2 +- .github/workflows/pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 5a1c2c0f4..89db7e302 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -38,7 +38,7 @@ jobs: server-username: OSS_USERNAME server-password: OSS_PASSWORD - name: Cache SonarCloud packages - uses: actions/cache@v2.1.7 + uses: actions/cache@v3 if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '11' }} env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index da7d416d6..1a1fbf56f 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -29,7 +29,7 @@ jobs: java-version: ${{ matrix.java_version }} cache: 'maven' - name: Cache SonarCloud packages - uses: actions/cache@v2.1.7 + uses: actions/cache@v3 if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '11' }} env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 49ee210d067629108cebcd7b501604891357a50c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 14:36:52 +0200 Subject: [PATCH 030/313] build(deps): bump maven-shade-plugin from 3.2.4 to 3.3.0 (#360) Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.4 to 3.3.0. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.4...maven-shade-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 72cdb639a..62ea373a3 100644 --- a/pom.xml +++ b/pom.xml @@ -312,7 +312,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.2.4</version> + <version>3.3.0</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From 02b1a3481ceb0ac5db01465bd6400e931c0d274f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 12:00:06 +0200 Subject: [PATCH 031/313] build(deps): bump swagger-parser.version from 2.0.31 to 2.0.32 (#363) Bumps `swagger-parser.version` from 2.0.31 to 2.0.32. Updates `swagger-parser-v3` from 2.0.31 to 2.0.32 Updates `swagger-parser` from 2.0.31 to 2.0.32 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.0.31...v2.0.32) Updates `swagger-parser-v2-converter` from 2.0.31 to 2.0.32 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 62ea373a3..18b295482 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.0.31</swagger-parser.version> + <swagger-parser.version>2.0.32</swagger-parser.version> <slf4j.version>1.7.36</slf4j.version> </properties> From b96cfe11a9b27d7efd11d62a5b16cd99b0481d6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 10:52:24 +0200 Subject: [PATCH 032/313] build(deps): bump jacoco-maven-plugin from 0.8.7 to 0.8.8 (#365) Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.7 to 0.8.8. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.7...v0.8.8) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 18b295482..cf0b4b409 100644 --- a/pom.xml +++ b/pom.xml @@ -323,7 +323,7 @@ <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> - <version>0.8.7</version> + <version>0.8.8</version> </plugin> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> From 8ca622f83cfc44fa7a87fe314232f57db51f2ceb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 10:35:40 +0200 Subject: [PATCH 033/313] build(deps): bump actions/setup-java from 2 to 3 (#367) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2 to 3. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/maven.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 89db7e302..912aca76b 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,7 +28,7 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up JDK - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: ${{ matrix.java_version }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1a1fbf56f..91724f1f2 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Set up JDK - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: ${{ matrix.java_version }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e1c0b6e83..f55155624 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Set up JDK 11 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 11 From 59b0295f8350edfeaad7a518c088da7e91e5a4a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Apr 2022 11:55:26 +0200 Subject: [PATCH 034/313] build(deps): bump maven-site-plugin from 3.11.0 to 3.12.0 (#368) Bumps [maven-site-plugin](https://github.com/apache/maven-site-plugin) from 3.11.0 to 3.12.0. - [Release notes](https://github.com/apache/maven-site-plugin/releases) - [Commits](https://github.com/apache/maven-site-plugin/compare/maven-site-plugin-3.11.0...maven-site-plugin-3.12.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-site-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index e667362b5..eb464874b 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -56,7 +56,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> - <version>3.11.0</version> + <version>3.12.0</version> </plugin> </plugins> </pluginManagement> From 323a7f3630bd8a839c0ba72f9a27ffd4527a7c51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Apr 2022 11:55:32 +0200 Subject: [PATCH 035/313] build(deps): bump maven-javadoc-plugin from 3.3.2 to 3.4.0 (#369) Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.3.2 to 3.4.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.3.2...maven-javadoc-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf0b4b409..e77437a5d 100644 --- a/pom.xml +++ b/pom.xml @@ -282,7 +282,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.3.2</version> + <version>3.4.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From ca4c76ced6a58ccd3c41b5e52dc1a328e8164dfa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 24 Apr 2022 20:12:49 +0200 Subject: [PATCH 036/313] build(deps): bump nexus-staging-maven-plugin from 1.6.12 to 1.6.13 (#370) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e77437a5d..a33501149 100644 --- a/pom.xml +++ b/pom.xml @@ -317,7 +317,7 @@ <plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> - <version>1.6.12</version> + <version>1.6.13</version> <extensions>true</extensions> </plugin> <plugin> From 2e2e8558607d48f843c3bb65ac5ac2de61272a42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 11:35:07 +0200 Subject: [PATCH 037/313] build(deps): bump docker/login-action from 1 to 2 (#374) Bumps [docker/login-action](https://github.com/docker/login-action) from 1 to 2. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v1...v2) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f55155624..065dfb687 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,7 +52,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} From 94b06b87104a0a895e56c0f492e7d42d5069ef43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 11:35:15 +0200 Subject: [PATCH 038/313] build(deps): bump docker/setup-buildx-action from 1 to 2 (#373) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 1 to 2. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v1...v2) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 065dfb687..346a4e530 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,7 +50,7 @@ jobs: with: ref: ${{ github.event.inputs.releaseVersion }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Login to DockerHub uses: docker/login-action@v2 with: From 1e39957272b864f7019ec09424e88c3c5884d90b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 11:35:34 +0200 Subject: [PATCH 039/313] build(deps): bump docker/build-push-action from 2 to 3 (#372) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2 to 3. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 346a4e530..7ff627ea8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -57,7 +57,7 @@ jobs: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} - name: Build & Push Docker image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . push: true From c9eeb56b68a753c4dd105690c19cf1f60d3c50e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 May 2022 10:59:04 +0200 Subject: [PATCH 040/313] build(deps): bump swagger-parser.version from 2.0.32 to 2.0.33 (#376) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a33501149..e5c6f94f8 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.0.32</swagger-parser.version> + <swagger-parser.version>2.0.33</swagger-parser.version> <slf4j.version>1.7.36</slf4j.version> </properties> From e32946037bbcb9022f82d70e0db4f51060358c2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 May 2022 11:58:20 +0200 Subject: [PATCH 041/313] build(deps): bump assertj-core from 3.22.0 to 3.23.0 (#377) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e5c6f94f8..cb2f89346 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.22.0</version> + <version>3.23.0</version> <scope>test</scope> </dependency> <dependency> From 4a7f7a9a31bf6c17d1a407088abcddd98f39d294 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jun 2022 12:52:07 +0200 Subject: [PATCH 042/313] build(deps): bump assertj-core from 3.23.0 to 3.23.1 (#378) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cb2f89346..8e321ea4a 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.23.0</version> + <version>3.23.1</version> <scope>test</scope> </dependency> <dependency> From f2b39e6bed453a67e89455b55af770ec1cf32b52 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Wed, 1 Jun 2022 21:44:18 +0200 Subject: [PATCH 043/313] Add support for remote development with Gitpod (#379) --- .gitpod.yml | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 + 2 files changed, 139 insertions(+) create mode 100644 .gitpod.yml diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..1dd7933ef --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,137 @@ +## Learn more about this file at 'https://www.gitpod.io/docs/references/gitpod-yml' +## +## This '.gitpod.yml' file when placed at the root of a project instructs +## Gitpod how to prepare & build the project, start development environments +## and configure continuous prebuilds. Prebuilds when enabled builds a project +## like a CI server so you can start coding right away - no more waiting for +## dependencies to download and builds to finish when reviewing pull-requests +## or hacking on something new. +## +## With Gitpod you can develop software from any device (even iPads) via +## desktop or browser based versions of VS Code or any JetBrains IDE and +## customise it to your individual needs - from themes to extensions, you +## have full control. +## +## The easiest way to try out Gitpod is install the browser extenion: +## 'https://www.gitpod.io/docs/browser-extension' or by prefixing +## 'https://gitpod.io#' to the source control URL of any project. +## +## For example: 'https://gitpod.io#https://github.com/gitpod-io/gitpod' + + +## The 'image' section defines which Docker image Gitpod should use. +## By default, Gitpod uses a standard Docker Image called 'workspace-full' +## which can be found at 'https://github.com/gitpod-io/workspace-images' +## +## Workspaces started based on this default image come pre-installed with +## Docker, Go, Java, Node.js, C/C++, Python, Ruby, Rust, PHP as well as +## tools such as Homebrew, Tailscale, Nginx and several more. +## +## If this image does not include the tools needed for your project then +## a public Docker image or your own Docker file can be configured. +## +## Learn more about images at 'https://www.gitpod.io/docs/config-docker' + +#image: node:buster # use 'https://hub.docker.com/_/node' +# +#image: # leave image undefined if using a Dockerfile +# file: .gitpod.Dockerfile # relative path to the Dockerfile from the +# # root of the project + +## The 'tasks' section defines how Gitpod prepares and builds this project +## or how Gitpod can start development servers. With Gitpod, there are three +## types of tasks: +## +## - before: Use this for tasks that need to run before init and before command. +## - init: Use this to configure prebuilds of heavy-lifting tasks such as +## downloading dependencies or compiling source code. +## - command: Use this to start your database or application when the workspace starts. +## +## Learn more about these tasks at 'https://www.gitpod.io/docs/config-start-tasks' + +#tasks: +# - before: | +# # commands to execute... +# +# - init: | +# # sudo apt-get install python3 # can be used to install operating system +# # dependencies but these are not kept after the +# # prebuild completes thus Gitpod recommends moving +# # operating system dependency installation steps +# # to a custom Dockerfile to make prebuilds faster +# # and to keep your codebase DRY. +# # 'https://www.gitpod.io/docs/config-docker' +# +# # pip install -r requirements.txt # install codebase dependencies +# # cmake # precompile codebase +# +# - name: Web Server +# openMode: split-left +# env: +# WEBSERVER_PORT: 8080 +# command: | +# python3 -m http.server $WEBSERVER_PORT +# +# - name: Web Browser +# openMode: split-right +# env: +# WEBSERVER_PORT: 8080 +# command: | +# gp await-port $WEBSERVER_PORT +# lynx `gp url` + +tasks: + - init: ./mvnw package -DskipTests + +## The 'ports' section defines various ports your may listen on are +## configured in Gitpod on an authenticated URL. By default, all ports +## are in private visibility state. +## +## Learn more about ports at 'https://www.gitpod.io/docs/config-ports' + +#ports: +# - port: 8080 # alternatively configure entire ranges via '8080-8090' +# visibility: private # either 'public' or 'private' (default) +# onOpen: open-browser # either 'open-browser', 'open-preview' or 'ignore' + + +## The 'vscode' section defines a list of Visual Studio Code extensions from +## the OpenVSX.org registry to be installed upon workspace startup. OpenVSX +## is an open alternative to the proprietary Visual Studio Code Marketplace +## and extensions can be added by sending a pull-request with the extension +## identifier to https://github.com/open-vsx/publish-extensions +## +## The identifier of an extension is always ${publisher}.${name}. +## +## For example: 'vscodevim.vim' +## +## Learn more at 'https://www.gitpod.io/docs/ides-and-editors/vscode' + +vscode: + extensions: + - redhat.java + - vscjava.vscode-java-pack + +## The 'github' section defines configuration of continuous prebuilds +## for GitHub repositories when the GitHub application +## 'https://github.com/apps/gitpod-io' is installed in GitHub and granted +## permissions to access the repository. +## +## Learn more at 'https://www.gitpod.io/docs/prebuilds' + +github: + prebuilds: + # enable for the default branch + master: true + # enable for all branches in this repo + branches: true + # enable for pull requests coming from this repo + pullRequests: true + # enable for pull requests coming from forks + pullRequestsFromForks: true + # add a check to pull requests + addCheck: true + # add a "Review in Gitpod" button as a comment to pull requests + addComment: true + # add a "Review in Gitpod" button to the pull request's description + addBadge: false diff --git a/README.md b/README.md index ceda5991d..c9cf9f78c 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ Compare two OpenAPI specifications (3.x) and render the difference to HTML plain [](https://github.com/OpenAPITools/openapi-diff/actions?query=branch%3Amaster+workflow%3A"Main+Build") [](https://sonarcloud.io/dashboard?id=OpenAPITools_openapi-diff) [](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core) + +[](https://gitpod.io/#https://github.com/OpenAPITools/openapi-diff) [](https://join.slack.com/t/openapi-generator/shared_invite/enQtNzAyNDMyOTU0OTE1LTY5ZDBiNDI5NzI5ZjQ1Y2E5OWVjMjZkYzY1ZGM2MWQ4YWFjMzcyNDY5MGI4NjQxNDBiMTlmZTc5NjY2ZTQ5MGM) [](https://hub.docker.com/r/openapitools/openapi-diff) From 50a8542be026e43a399d3473d2f8a3083c05967c Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Tue, 7 Jun 2022 23:56:22 +0200 Subject: [PATCH 044/313] Generate SBOM using CycloneDX Maven plugin (#382) https://cyclonedx.org/ https://github.com/CycloneDX/cyclonedx-maven-plugin --- pom.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pom.xml b/pom.xml index 8e321ea4a..56d33b16e 100644 --- a/pom.xml +++ b/pom.xml @@ -252,6 +252,18 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.cyclonedx</groupId> + <artifactId>cyclonedx-maven-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>makeAggregateBom</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> </profile> @@ -330,6 +342,11 @@ <artifactId>sonar-maven-plugin</artifactId> <version>3.9.1.2184</version> </plugin> + <plugin> + <groupId>org.cyclonedx</groupId> + <artifactId>cyclonedx-maven-plugin</artifactId> + <version>2.7.0</version> + </plugin> </plugins> </pluginManagement> <plugins> From f9b7af72f9e437abe3b79281266ce4f6858dc721 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Tue, 7 Jun 2022 23:59:54 +0200 Subject: [PATCH 045/313] Bump Maven to version 3.8.5 and Maven wrapper to version 3.1.1 (#383) --- .mvn/wrapper/maven-wrapper.jar | Bin 49519 -> 59925 bytes .mvn/wrapper/maven-wrapper.properties | 19 ++- mvnw | 229 ++++++++++++++++---------- mvnw.cmd | 76 +++++++-- 4 files changed, 218 insertions(+), 106 deletions(-) diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar index c6feb8bb6f76f2553e266ff8bf8867105154237e..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 100644 GIT binary patch literal 59925 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�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 VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 49519 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%0A$pwhjXzyA0ZzErH{1@M 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 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 31158c7a0..687668b39 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1 +1,18 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip \ No newline at end of file +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/mvnw b/mvnw index fc7efd17d..b7f064624 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script +# Apache Maven Wrapper startup batch script, version 3.1.1 # # Required ENV vars: # ------------------ @@ -27,7 +27,6 @@ # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir # MAVEN_OPTS - parameters passed to the Java VM when running Maven # e.g. to debug Maven itself, use # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -36,6 +35,10 @@ if [ -z "$MAVEN_SKIP_RC" ] ; then + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + if [ -f /etc/mavenrc ] ; then . /etc/mavenrc fi @@ -54,38 +57,16 @@ case "`uname`" in CYGWIN*) cygwin=true ;; MINGW*) mingw=true;; Darwin*) darwin=true - # - # Look for the Apple JDKs first to preserve the existing behaviour, and then look - # for the new JDKs provided by Oracle. - # - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then - # - # Oracle JDKs - # - export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then - # - # Apple JDKs - # - export JAVA_HOME=`/usr/libexec/java_home` - fi - ;; + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; esac if [ -z "$JAVA_HOME" ] ; then @@ -94,49 +75,18 @@ if [ -z "$JAVA_HOME" ] ; then fi fi -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` fi -# For Migwn, ensure paths are in UNIX format before anything is touched +# For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" [ -n "$JAVA_HOME" ] && JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? fi if [ -z "$JAVA_HOME" ]; then @@ -168,7 +118,7 @@ if [ -z "$JAVACMD" ] ; then JAVACMD="$JAVA_HOME/bin/java" fi else - JAVACMD="`which java`" + JAVACMD="`\\unset -f command; \\command -v java`" fi fi @@ -182,31 +132,29 @@ if [ -z "$JAVA_HOME" ] ; then echo "Warning: JAVA_HOME environment variable is not set." fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` -fi - # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { - local basedir=$(pwd) - local wdir=$(pwd) + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" while [ "$wdir" != '/' ] ; do if [ -d "$wdir"/.mvn ] ; then basedir=$wdir break fi - wdir=$(cd "$wdir/.."; pwd) + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround done - echo "${basedir}" + printf '%s' "$(cd "$basedir"; pwd)" } # concatenates all lines of a file @@ -216,10 +164,115 @@ concat_lines() { fi } -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" -# Provide a "standardized" way to retrieve the CLI args that will +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will # work with both Windows and non-Windows executions. MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" export MAVEN_CMD_LINE_ARGS @@ -228,7 +281,7 @@ WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain exec "$JAVACMD" \ $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CMD_LINE_ARGS - + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 001048081..474c9d6b7 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -18,15 +18,14 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script +@REM Apache Maven Wrapper startup batch script, version 3.1.1 @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @REM @REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -35,7 +34,9 @@ @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME @@ -44,8 +45,8 @@ if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") @REM Execute a user defined script before this one if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre @REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* :skipRcPre @setlocal @@ -80,8 +81,6 @@ goto error :init -set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* - @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". @REM Fallback to current working directory if not found. @@ -117,11 +116,54 @@ for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do s :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end @@ -131,15 +173,15 @@ set ERROR_CODE=1 :end @endlocal & set ERROR_CODE=%ERROR_CODE% -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost @REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" :skipRcPost @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause +if "%MAVEN_BATCH_PAUSE%"=="on" pause -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% -exit /B %ERROR_CODE% +cmd /C exit /B %ERROR_CODE% From c60890fe2532aa9d1c92848591c874ae7d7f8478 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Wed, 8 Jun 2022 00:13:27 +0200 Subject: [PATCH 046/313] Format code --- .../openapidiff/core/compare/PathsDiff.java | 20 +++++------ .../core/ParametersOverloadingTest.java | 35 ++++++++++--------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index e09a4557b..1da540f3f 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -3,11 +3,11 @@ import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.parameters.Parameter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.IntStream; -import io.swagger.v3.oas.models.parameters.Parameter; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedPaths; import org.openapitools.openapidiff.core.model.DiffContext; @@ -103,12 +103,10 @@ public static Paths valOrEmpty(Paths path) { } /** - * * @param a a path form the open api spec * @param b another path from the same open api spec - * @return <code>true</code> in case both paths are of the same method AND their templated parameters are of the same type; - * <code>false</code> otherwise - * + * @return <code>true</code> in case both paths are of the same method AND their templated + * parameters are of the same type; <code>false</code> otherwise */ private static boolean methodsAndParametersIntersect(PathItem a, PathItem b) { Set<PathItem.HttpMethod> methodsA = a.readOperationsMap().keySet(); @@ -126,15 +124,17 @@ private static boolean methodsAndParametersIntersect(PathItem a, PathItem b) { } /** - * * @param left parameters from the first compared method * @param right parameters from the second compared method - * @return <code>true</code> in case each parameter pair is of the same type; <code>false</code> otherwise + * @return <code>true</code> in case each parameter pair is of the same type; <code>false</code> + * otherwise */ - private static boolean parametersIntersect(List<Parameter> left, List<Parameter> right) {; + private static boolean parametersIntersect(List<Parameter> left, List<Parameter> right) { int parametersSize = left.size(); - long intersectedParameters = IntStream.range(0, left.size()) - .filter(i -> left.get(i).getSchema().getType().equals(right.get(i).getSchema().getType())) + long intersectedParameters = + IntStream.range(0, left.size()) + .filter( + i -> left.get(i).getSchema().getType().equals(right.get(i).getSchema().getType())) .count(); return parametersSize == intersectedParameters; } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java index e3c4bb53a..bc779be56 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java @@ -1,26 +1,27 @@ package org.openapitools.openapidiff.core; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.*; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; +import org.junit.jupiter.api.Test; + class ParametersOverloadingTest { - private final String OVERLOADED_PARAMETERS = "parameters_overloading.yaml"; - private final String DUPLICATED_PARAMETER_TYPES = "parameters_overloading_2.yaml"; + private final String OVERLOADED_PARAMETERS = "parameters_overloading.yaml"; + private final String DUPLICATED_PARAMETER_TYPES = "parameters_overloading_2.yaml"; - @Test - void testDiffWithOverloadedParameterTypes() { - assertDoesNotThrow(() -> OpenApiCompare.fromLocations(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS)); - assertOpenApiAreEquals(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS); - } + @Test + void testDiffWithOverloadedParameterTypes() { + assertDoesNotThrow( + () -> OpenApiCompare.fromLocations(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS)); + assertOpenApiAreEquals(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS); + } - @Test - void testDiffWithDuplicatedParameterTypes() { - assertThrows( - IllegalArgumentException.class, - () -> OpenApiCompare.fromLocations(DUPLICATED_PARAMETER_TYPES, DUPLICATED_PARAMETER_TYPES), - "Two path items have the same signature: /projects/{}"); - } -} \ No newline at end of file + @Test + void testDiffWithDuplicatedParameterTypes() { + assertThrows( + IllegalArgumentException.class, + () -> OpenApiCompare.fromLocations(DUPLICATED_PARAMETER_TYPES, DUPLICATED_PARAMETER_TYPES), + "Two path items have the same signature: /projects/{}"); + } +} From 2d6f430718a889990471cfbdfb28b356a436872b Mon Sep 17 00:00:00 2001 From: David DE CARVALHO <dedece35@gmail.com> Date: Wed, 8 Jun 2022 00:16:43 +0200 Subject: [PATCH 047/313] Support multiple placeholders in resource path (#359) Fixes #358 Co-authored-by: David DE CARVALHO <ddecarvalho@solocal.com> --- .../openapidiff/core/compare/PathsDiff.java | 2 +- .../openapidiff/core/PathDiffTest.java | 16 ++++ core/src/test/resources/path_5.yaml | 92 +++++++++++++++++++ core/src/test/resources/path_6.yaml | 92 +++++++++++++++++++ 4 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 core/src/test/resources/path_5.yaml create mode 100644 core/src/test/resources/path_6.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index 1da540f3f..0f501bf99 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -15,7 +15,7 @@ import org.openapitools.openapidiff.core.model.deferred.DeferredChanged; public class PathsDiff { - private static final String REGEX_PATH = "\\{([^/]+)}"; + private static final String REGEX_PATH = "\\{([^/{}]+)}"; private final OpenApiDiff openApiDiff; public PathsDiff(OpenApiDiff openApiDiff) { diff --git a/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java index 1c8168c41..a20d20f64 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; import org.junit.jupiter.api.Test; @@ -13,6 +14,8 @@ public class PathDiffTest { private final String OPENAPI_PATH2 = "path_2.yaml"; private final String OPENAPI_PATH3 = "path_3.yaml"; private final String OPENAPI_PATH4 = "path_4.yaml"; + private final String OPENAPI_PATH5 = "path_5.yaml"; + private final String OPENAPI_PATH6 = "path_6.yaml"; @Test public void testEqual() { @@ -35,4 +38,17 @@ public void testSameTemplateDifferentMethods() { assertThat(endpoint.getOperation().getOperationId()).isEqualTo("deletePet")); assertThat(changedOpenApi.isCompatible()).isTrue(); } + + @Test + public void testDiffWithSimilarBeginningPaths() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_PATH5, OPENAPI_PATH6); + try { + ChangedOpenApi diff = + OpenApiCompare.fromSpecifications( + changedOpenApi.getOldSpecOpenApi(), changedOpenApi.getNewSpecOpenApi()); + assertThat(diff.getChangedOperations()).hasSize(4); + } catch (IllegalArgumentException e) { + fail(e.getMessage()); + } + } } diff --git a/core/src/test/resources/path_5.yaml b/core/src/test/resources/path_5.yaml new file mode 100644 index 000000000..9e44371c3 --- /dev/null +++ b/core/src/test/resources/path_5.yaml @@ -0,0 +1,92 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + post: + tags: + - pet + summary: deletes a pet + description: '' + operationId: deletePet + parameters: + - name: petId2 + in: path + description: Pet ID to delete + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}: + get: + tags: + - pet + summary: gets a pet by its owner id + description: '' + operationId: getPetFromOwner + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}_name-{petName}: + get: + tags: + - pet + summary: gets a pet by its owner id and its name + description: '' + operationId: getPetFromOwnerAndPetName + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + - name: petName + in: path + description: Name of pet that needs to be get + required: true + schema: + type: string + responses: + '405': + description: Invalid input diff --git a/core/src/test/resources/path_6.yaml b/core/src/test/resources/path_6.yaml new file mode 100644 index 000000000..9e44371c3 --- /dev/null +++ b/core/src/test/resources/path_6.yaml @@ -0,0 +1,92 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + post: + tags: + - pet + summary: deletes a pet + description: '' + operationId: deletePet + parameters: + - name: petId2 + in: path + description: Pet ID to delete + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}: + get: + tags: + - pet + summary: gets a pet by its owner id + description: '' + operationId: getPetFromOwner + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/by_owner-{ownerId}_name-{petName}: + get: + tags: + - pet + summary: gets a pet by its owner id and its name + description: '' + operationId: getPetFromOwnerAndPetName + parameters: + - ownerid: ownerId + in: path + description: Owner id of pet that needs to be get + required: true + schema: + type: integer + - name: petName + in: path + description: Name of pet that needs to be get + required: true + schema: + type: string + responses: + '405': + description: Invalid input From 371be2c726c0fb198f10f7adff266ce4a6214b42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Jun 2022 20:08:13 +0200 Subject: [PATCH 048/313] build(deps): bump maven-release-plugin from 3.0.0-M5 to 3.0.0-M6 (#385) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56d33b16e..d0882af86 100644 --- a/pom.xml +++ b/pom.xml @@ -289,7 +289,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>3.0.0-M5</version> + <version>3.0.0-M6</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 5537490ed3a47222b5c1c551123d95a7dc6542c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Jun 2022 14:50:32 +0200 Subject: [PATCH 049/313] build(deps): bump swagger-parser.version from 2.0.33 to 2.1.0 (#386) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d0882af86..df5c49e8b 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.0.33</swagger-parser.version> + <swagger-parser.version>2.1.0</swagger-parser.version> <slf4j.version>1.7.36</slf4j.version> </properties> From 07949f1fe2cb658e41ee1533890bb822bdb44bae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 10:06:36 +0200 Subject: [PATCH 050/313] build(deps): bump swagger-parser.version from 2.1.0 to 2.1.1 (#387) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index df5c49e8b..aa9d961d0 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.0</swagger-parser.version> + <swagger-parser.version>2.1.1</swagger-parser.version> <slf4j.version>1.7.36</slf4j.version> </properties> From 31c4f0925b3bd2776f30ec7e9274fc98de718fd3 Mon Sep 17 00:00:00 2001 From: Eduardo Colina <eacolina@uwaterloo.ca> Date: Wed, 22 Jun 2022 15:21:11 -0400 Subject: [PATCH 051/313] feat: Support writing directly into file in JsonRenderer (#388) Previously, openapi-diff rendered the JSON output into a string and wrote the string representation into the designated output file. This failed with an `OutOfMemoryError` for very large outputs. This change set introduces a method in `JsonRenderer` to write the JSON output directly into a file and removes the verbatim copy of the old and new OpenAPI specs (`oldSpecOpenApi` and `newSpecOpenApi`) from the JSON output. --- .../java/org/openapitools/openapidiff/cli/Main.java | 3 +-- .../openapidiff/core/model/ChangedOpenApi.java | 5 +++-- .../openapidiff/core/output/JsonRender.java | 12 ++++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index 8fb2ff000..21503e08a 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -196,9 +196,8 @@ public static void main(String... args) { } if (line.hasOption("json")) { JsonRender jsonRender = new JsonRender(); - String output = jsonRender.render(result); String outputFile = line.getOptionValue("json"); - writeOutput(output, outputFile); + jsonRender.renderToFile(result, outputFile); } if (line.hasOption("state")) { System.out.println(result.isChanged().getValue()); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java index a1c796ac5..e1bdd20bd 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java @@ -1,5 +1,6 @@ package org.openapitools.openapidiff.core.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.models.OpenAPI; import java.util.List; import java.util.Objects; @@ -8,8 +9,8 @@ import org.openapitools.openapidiff.core.utils.EndpointUtils; public class ChangedOpenApi implements ComposedChanged { - private OpenAPI oldSpecOpenApi; - private OpenAPI newSpecOpenApi; + @JsonIgnore private OpenAPI oldSpecOpenApi; + @JsonIgnore private OpenAPI newSpecOpenApi; private List<Endpoint> newEndpoints; private List<Endpoint> missingEndpoints; private List<ChangedOperation> changedOperations; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java index e1cf5ee49..465268f94 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.nio.file.Paths; import org.openapitools.openapidiff.core.model.ChangedOpenApi; public class JsonRender implements Render { @@ -17,4 +19,14 @@ public String render(ChangedOpenApi diff) { throw new RuntimeException("Could not serialize diff as JSON", e); } } + + public void renderToFile(ChangedOpenApi diff, String file) { + try { + objectMapper.writeValue(Paths.get(file).toFile(), diff); + } catch (JsonProcessingException e) { + throw new RuntimeException("Could not serialize diff as JSON", e); + } catch (IOException e) { + throw new RuntimeException("Could not write to JSON file", e); + } + } } From 1cf16b8beea796e4549d0f6d13bd2ac60f75dc68 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Sun, 26 Jun 2022 21:02:39 +0000 Subject: [PATCH 052/313] [maven-release-plugin] prepare release 2.1.0-beta.1 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index b67f7336c..edfd77308 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.0.1-SNAPSHOT</version> + <version>2.1.0-beta.1</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 914ffcf29..c8c3a11d9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.0.1-SNAPSHOT</version> + <version>2.1.0-beta.1</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 7ec2fcc2d..747e92658 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.0.1-SNAPSHOT</version> + <version>2.1.0-beta.1</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.0.1-SNAPSHOT</version> + <version>2.1.0-beta.1</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index eb464874b..4ed82a0ea 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.0.1-SNAPSHOT</version> + <version>2.1.0-beta.1</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index aa9d961d0..37747cd17 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.0.1-SNAPSHOT</version> + <version>2.1.0-beta.1</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.1</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2017-12-12T00:39:30Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-06-26T21:01:24Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.0.1-SNAPSHOT</version> + <version>2.1.0-beta.1</version> </dependency> <dependency> <groupId>org.junit</groupId> From 93556416a4b6e7f6f3b1bad38e43c2d19d24aa45 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Sun, 26 Jun 2022 21:02:45 +0000 Subject: [PATCH 053/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index edfd77308..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.1</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index c8c3a11d9..50b8ce87d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.1</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 747e92658..46d9dda3b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.1</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.1</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 4ed82a0ea..19f9a32c6 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.1</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 37747cd17..f9645e301 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.1</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.1</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-06-26T21:01:24Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-06-26T21:02:45Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.1</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From 4ce75ff53067e6e1774961de846ca313b794d162 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Jul 2022 20:25:19 +0200 Subject: [PATCH 054/313] build(deps): bump j2html from 1.5.0 to 1.6.0 (#391) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f9645e301..f251fb922 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ <dependency> <groupId>com.j2html</groupId> <artifactId>j2html</artifactId> - <version>1.5.0</version> + <version>1.6.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> From fd5fb72d0a0c33c9ab607e46ce45dbfc742d2e07 Mon Sep 17 00:00:00 2001 From: Jamie Cuthill <jamiecuthill@flyt.io> Date: Thu, 7 Jul 2022 19:29:39 +0100 Subject: [PATCH 055/313] Fix missing architecture on release (#393) The `linux/arm64` architecture is not an available platform without first enabling docker QEMU. Refs #336 --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ff627ea8..1d94fe489 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,6 +49,8 @@ jobs: - uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.releaseVersion }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to DockerHub From 40b8c441ea5e61d50f582a85e3264641dd359161 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Thu, 7 Jul 2022 18:32:14 +0000 Subject: [PATCH 056/313] [maven-release-plugin] prepare release 2.1.0-beta.2 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..cd817158e 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.2</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 50b8ce87d..c8ff1706d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.2</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 46d9dda3b..0461a5796 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.2</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.2</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 19f9a32c6..310026509 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.2</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index f251fb922..12be50480 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.2</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.2</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-06-26T21:02:45Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-07-07T18:31:10Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.2</version> </dependency> <dependency> <groupId>org.junit</groupId> From f268d1e552404cd7f2b9f9b0ac7d2bc702f1acb2 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Thu, 7 Jul 2022 18:32:19 +0000 Subject: [PATCH 057/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index cd817158e..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.2</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index c8ff1706d..50b8ce87d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.2</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 0461a5796..46d9dda3b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.2</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.2</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 310026509..19f9a32c6 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.2</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 12be50480..745637d48 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.2</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.2</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-07-07T18:31:10Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-07-07T18:32:19Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.2</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From 7e78e23aa7e3b4386ee0e689111d2a50401084fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Jul 2022 13:57:47 +0200 Subject: [PATCH 058/313] build(deps): bump cyclonedx-maven-plugin from 2.7.0 to 2.7.1 (#396) Bumps [cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.0 to 2.7.1. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.0...cyclonedx-maven-plugin-2.7.1) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 745637d48..d584ac4c1 100644 --- a/pom.xml +++ b/pom.xml @@ -345,7 +345,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.0</version> + <version>2.7.1</version> </plugin> </plugins> </pluginManagement> From f96f35d194c463bf7f330ecdb5dbf2832e4632d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Jul 2022 18:12:00 +0200 Subject: [PATCH 059/313] build(deps): bump maven-deploy-plugin from 2.8.2 to 3.0.0 (#395) Bumps [maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 2.8.2 to 3.0.0. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-2.8.2...maven-deploy-plugin-3.0.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d584ac4c1..cd8c09e20 100644 --- a/pom.xml +++ b/pom.xml @@ -319,7 +319,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> - <version>2.8.2</version> + <version>3.0.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From da18a85db890560705bc9e9cf38eff9dd6fac38f Mon Sep 17 00:00:00 2001 From: TimoBehrendt <87525740+TimoBehrendt@users.noreply.github.com> Date: Mon, 25 Jul 2022 12:08:05 +0200 Subject: [PATCH 060/313] Fix: Renderers fail when processing range HTTP status code such as '2XX' (#397) Both Markdown and Console renderer fail when trying to process a range HTTP status code, e. g. '2XX'. So any diff that results in an output including such a status code fails to render for markdown and console. The error occurs when trying to parse the String HTTP status code into an Integer right here (both in Markdown and Console renderer): ```java if (!code.equals("default")) { // Integer.parseInt(code) fails when passing e. g. '2XX' status = HttpStatus.getReasonPhrase(Integer.parseInt(code)); } ``` JSON and HTML renderer are not affected, since they do not try to display the 'reason phrase'. Everything else, the actual diff process etc. is also not affected. # Expected behavior Expected ranges of HTTP status codes, like '2XX' covering all codes between 200-299, to be treated like any other HTTP status code, since they have been part of the OpenAPI specification since version [3.0.0](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#patterned-fields-1). --- .../openapidiff/core/output/ConsoleRender.java | 2 +- .../openapidiff/core/output/MarkdownRender.java | 2 +- .../openapidiff/core/ConsoleRenderTest.java | 8 ++++++++ .../openapidiff/core/MarkdownRenderTest.java | 8 ++++++++ core/src/test/resources/range_statuscode_1.yaml | 10 ++++++++++ core/src/test/resources/range_statuscode_2.yaml | 10 ++++++++++ 6 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 core/src/test/resources/range_statuscode_1.yaml create mode 100644 core/src/test/resources/range_statuscode_2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java index 204f814ab..72597ad91 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java @@ -118,7 +118,7 @@ private String ul_response(ChangedApiResponse changedApiResponse) { private String itemResponse(String title, String code) { StringBuilder sb = new StringBuilder(); String status = ""; - if (!code.equals("default")) { + if (!code.equals("default") && !code.matches("[1-5]XX")) { status = HttpStatus.getReasonPhrase(Integer.parseInt(code)); } sb.append(StringUtils.repeat(' ', 4)) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java index ad74bd610..a0d2c5448 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java @@ -158,7 +158,7 @@ protected String itemResponse(String code, ChangedResponse response) { protected String itemResponse(String title, String code, String description) { StringBuilder sb = new StringBuilder(); String status = ""; - if (!code.equals("default")) { + if (!code.equals("default") && !code.matches("[1-5]XX")) { status = HttpStatus.getReasonPhrase(Integer.parseInt(code)); } sb.append(format("%s : **%s %s**\n", title, code, status)); diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java index 329fea054..455631700 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java @@ -14,4 +14,12 @@ public void renderDoesNotFailWhenPropertyHasBeenRemoved() { OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); assertThat(render.render(diff)).isNotBlank(); } + + @Test + public void renderDoesNotFailWhenHTTPStatusCodeIsRange() { + ConsoleRender render = new ConsoleRender(); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("range_statuscode_1.yaml", "range_statuscode_2.yaml"); + assertThat(render.render(diff)).isNotBlank(); + } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java index 154fef127..36e007a8c 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java @@ -21,4 +21,12 @@ public void renderDoesNotCauseStackOverflowWithRecursiveDefinitions() { ChangedOpenApi diff = OpenApiCompare.fromLocations("recursive_old.yaml", "recursive_new.yaml"); assertThat(render.render(diff)).isNotBlank(); } + + @Test + public void renderDoesNotFailWhenHTTPStatusCodeIsRange() { + MarkdownRender render = new MarkdownRender(); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("range_statuscode_1.yaml", "range_statuscode_2.yaml"); + assertThat(render.render(diff)).isNotBlank(); + } } diff --git a/core/src/test/resources/range_statuscode_1.yaml b/core/src/test/resources/range_statuscode_1.yaml new file mode 100644 index 000000000..4653a70fc --- /dev/null +++ b/core/src/test/resources/range_statuscode_1.yaml @@ -0,0 +1,10 @@ +openapi: 3.0.0 +info: + title: Projects API + version: 1.0.0 +paths: + /pet/: + get: + responses: + "405": + description: "Invalid input" diff --git a/core/src/test/resources/range_statuscode_2.yaml b/core/src/test/resources/range_statuscode_2.yaml new file mode 100644 index 000000000..d0ecbeb75 --- /dev/null +++ b/core/src/test/resources/range_statuscode_2.yaml @@ -0,0 +1,10 @@ +openapi: 3.0.0 +info: + title: Projects API + version: 1.0.0 +paths: + /pet/: + get: + responses: + "4XX": + description: "Invalid input" From 16616c6ff8541e422be2820d9469b21d867ac3fe Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Mon, 25 Jul 2022 10:13:46 +0000 Subject: [PATCH 061/313] [maven-release-plugin] prepare release 2.1.0-beta.3 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..286908599 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.3</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 50b8ce87d..b9bd9ca44 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.3</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 46d9dda3b..65563b8d8 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.3</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.3</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 19f9a32c6..babec3226 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.3</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index cd8c09e20..74bda384a 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.3</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.3</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-07-07T18:32:19Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-07-25T10:12:36Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.3</version> </dependency> <dependency> <groupId>org.junit</groupId> From 4a6c279616fde6c17583c9657b26ffcdfd148848 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Mon, 25 Jul 2022 10:13:53 +0000 Subject: [PATCH 062/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 286908599..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.3</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index b9bd9ca44..50b8ce87d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.3</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 65563b8d8..46d9dda3b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.3</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.3</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index babec3226..19f9a32c6 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.3</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 74bda384a..66f8b62f2 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.3</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.3</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-07-25T10:12:36Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-07-25T10:13:53Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.3</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From bcf06160f47dc2b742ad58324c58704648c4b96e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Jul 2022 14:28:55 +0200 Subject: [PATCH 063/313] build(deps): bump junit-bom from 5.8.2 to 5.9.0 (#399) Bumps [junit-bom](https://github.com/junit-team/junit5) from 5.8.2 to 5.9.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.2...r5.9.0) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 66f8b62f2..846d2ddad 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.8.2</version> + <version>5.9.0</version> <type>pom</type> <scope>import</scope> </dependency> From c0e5ea0bbf03aa1db2e47951f1c2ced5d2c615fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Aug 2022 11:05:09 +0200 Subject: [PATCH 064/313] build(deps): bump maven-site-plugin from 3.12.0 to 3.12.1 (#400) Bumps [maven-site-plugin](https://github.com/apache/maven-site-plugin) from 3.12.0 to 3.12.1. - [Release notes](https://github.com/apache/maven-site-plugin/releases) - [Commits](https://github.com/apache/maven-site-plugin/compare/maven-site-plugin-3.12.0...maven-site-plugin-3.12.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-site-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index 19f9a32c6..d03308683 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -56,7 +56,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> - <version>3.12.0</version> + <version>3.12.1</version> </plugin> </plugins> </pluginManagement> From a71740e9d346c7fbeffdbee28bcb9a1f2807a84b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Aug 2022 11:02:57 +0200 Subject: [PATCH 065/313] build(deps): bump maven-javadoc-plugin from 3.4.0 to 3.4.1 (#401) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 846d2ddad..6bcf451d7 100644 --- a/pom.xml +++ b/pom.xml @@ -294,7 +294,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.4.0</version> + <version>3.4.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 2fdcefabaf77720018642ccad1fed99511464926 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Aug 2022 15:36:52 +0200 Subject: [PATCH 066/313] build(deps): bump swagger-parser.version from 2.1.1 to 2.1.2 (#402) Bumps `swagger-parser.version` from 2.1.1 to 2.1.2. Updates `swagger-parser-v3` from 2.1.1 to 2.1.2 Updates `swagger-parser` from 2.1.1 to 2.1.2 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.1...v2.1.2) Updates `swagger-parser-v2-converter` from 2.1.1 to 2.1.2 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6bcf451d7..1591b02f9 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.1</swagger-parser.version> + <swagger-parser.version>2.1.2</swagger-parser.version> <slf4j.version>1.7.36</slf4j.version> </properties> From 8ac5284f8dea6db2628b7428ae069d9811307d13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:01:58 +0200 Subject: [PATCH 067/313] build(deps): bump slf4j.version from 1.7.36 to 2.0.0 (#403) Bumps `slf4j.version` from 1.7.36 to 2.0.0. Updates `slf4j-api` from 1.7.36 to 2.0.0 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.36...v_2.0.0) Updates `jcl-over-slf4j` from 1.7.36 to 2.0.0 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.36...v_2.0.0) Updates `slf4j-simple` from 1.7.36 to 2.0.0 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_1.7.36...v_2.0.0) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-major - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-major - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1591b02f9..a8fa23cf8 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.2</swagger-parser.version> - <slf4j.version>1.7.36</slf4j.version> + <slf4j.version>2.0.0</slf4j.version> </properties> <dependencyManagement> From 33b630cc59c8554c682f13f6b0e2e813ddfce24e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:11:13 +0200 Subject: [PATCH 068/313] build(deps): bump logback-classic from 1.2.11 to 1.3.0 (#404) * build(deps): bump logback-classic from 1.2.11 to 1.3.0 http://mailman.qos.ch/pipermail/announce/2022/000177.html Bumps [logback-classic](https://github.com/qos-ch/logback) from 1.2.11 to 1.3.0. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.2.11...v_1.3.0) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jochen Schalanda <jochen@schalanda.name> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a8fa23cf8..aae1aae4c 100644 --- a/pom.xml +++ b/pom.xml @@ -149,7 +149,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.2.11</version> + <version>1.3.0</version> </dependency> <dependency> <groupId>org.assertj</groupId> From 0966de6b2c0e8392cc6e70692662f60b52e8e297 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Sep 2022 09:59:20 +0200 Subject: [PATCH 069/313] build(deps): bump slf4j.version from 2.0.0 to 2.0.1 (#411) Bumps `slf4j.version` from 2.0.0 to 2.0.1. Updates `slf4j-api` from 2.0.0 to 2.0.1 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.0...v_2.0.1) Updates `jcl-over-slf4j` from 2.0.0 to 2.0.1 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.0...v_2.0.1) Updates `slf4j-simple` from 2.0.0 to 2.0.1 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.0...v_2.0.1) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aae1aae4c..c343d4e49 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.2</swagger-parser.version> - <slf4j.version>2.0.0</slf4j.version> + <slf4j.version>2.0.1</slf4j.version> </properties> <dependencyManagement> From b872dfdf002764190f1bc1d268e5e89017062fc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Sep 2022 09:59:31 +0200 Subject: [PATCH 070/313] build(deps): bump maven-shade-plugin from 3.3.0 to 3.4.0 (#409) Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.3.0...maven-shade-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c343d4e49..109f9887a 100644 --- a/pom.xml +++ b/pom.xml @@ -324,7 +324,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.3.0</version> + <version>3.4.0</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From 322be4c850812fd41452a29979b87c94d8b6203b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Sep 2022 17:07:28 +0200 Subject: [PATCH 071/313] build(deps): bump maven-jar-plugin from 3.2.2 to 3.3.0 (#413) Bumps [maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.2.2 to 3.3.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.2.2...maven-jar-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 109f9887a..266e2b178 100644 --- a/pom.xml +++ b/pom.xml @@ -284,7 +284,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> - <version>3.2.2</version> + <version>3.3.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 33b936ab719f187ab6ff630e95ebbdce161c218c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Sep 2022 20:34:58 +0200 Subject: [PATCH 072/313] build(deps): bump slf4j.version from 2.0.1 to 2.0.2 (#417) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 266e2b178..841177b97 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.2</swagger-parser.version> - <slf4j.version>2.0.1</slf4j.version> + <slf4j.version>2.0.2</slf4j.version> </properties> <dependencyManagement> From b1519debbd916092646632c29263018f3af117e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Sep 2022 20:35:08 +0200 Subject: [PATCH 073/313] build(deps): bump junit-bom from 5.9.0 to 5.9.1 (#416) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 841177b97..7e4dc2ff4 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.9.0</version> + <version>5.9.1</version> <type>pom</type> <scope>import</scope> </dependency> From d190758b360950af07aa01fef321dae16f0ef67b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 21:48:22 +0200 Subject: [PATCH 074/313] build(deps): bump slf4j.version from 2.0.2 to 2.0.3 (#421) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7e4dc2ff4..976b6205d 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.2</swagger-parser.version> - <slf4j.version>2.0.2</slf4j.version> + <slf4j.version>2.0.3</slf4j.version> </properties> <dependencyManagement> From c707de671121e4ee727619caa54280c905b2bc62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 21:51:01 +0200 Subject: [PATCH 075/313] build(deps): bump swagger-parser.version from 2.1.2 to 2.1.3 (#420) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 976b6205d..887561dda 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.2</swagger-parser.version> + <swagger-parser.version>2.1.3</swagger-parser.version> <slf4j.version>2.0.3</slf4j.version> </properties> From 64f9e24a3faea2520712181408c1af77f334741d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 10:39:45 +0200 Subject: [PATCH 076/313] build(deps): bump cyclonedx-maven-plugin from 2.7.1 to 2.7.2 (#426) Bumps [cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.1 to 2.7.2. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.1...cyclonedx-maven-plugin-2.7.2) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 887561dda..e2d55392c 100644 --- a/pom.xml +++ b/pom.xml @@ -345,7 +345,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.1</version> + <version>2.7.2</version> </plugin> </plugins> </pluginManagement> From a2206283ef744204ec995367ac54fb8affe9c25a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Oct 2022 10:48:49 +0200 Subject: [PATCH 077/313] build(deps): bump swagger-parser.version from 2.1.3 to 2.1.5 (#428) Bumps `swagger-parser.version` from 2.1.3 to 2.1.5. Updates `swagger-parser-v3` from 2.1.3 to 2.1.5 Updates `swagger-parser` from 2.1.3 to 2.1.5 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.3...v2.1.5) Updates `swagger-parser-v2-converter` from 2.1.3 to 2.1.5 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2d55392c..eab974878 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.3</swagger-parser.version> + <swagger-parser.version>2.1.5</swagger-parser.version> <slf4j.version>2.0.3</slf4j.version> </properties> From d57a8c78977e5e67df62e50423625e514dc06f6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Oct 2022 10:25:25 +0200 Subject: [PATCH 078/313] build(deps): bump swagger-parser.version from 2.1.5 to 2.1.6 (#429) Bumps `swagger-parser.version` from 2.1.5 to 2.1.6. Updates `swagger-parser-v3` from 2.1.5 to 2.1.6 Updates `swagger-parser` from 2.1.5 to 2.1.6 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.5...v2.1.6) Updates `swagger-parser-v2-converter` from 2.1.5 to 2.1.6 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eab974878..5e6f5a6b1 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.5</swagger-parser.version> + <swagger-parser.version>2.1.6</swagger-parser.version> <slf4j.version>2.0.3</slf4j.version> </properties> From 65d0acd1b0274c0395255def41e269883ed8dc99 Mon Sep 17 00:00:00 2001 From: Baptist BENOIST <2091902+bbenoist@users.noreply.github.com> Date: Mon, 24 Oct 2022 22:06:18 +0200 Subject: [PATCH 079/313] Add 2 LF at the end of Markdown blockquotes (#427) When they weren't headers, the lines following a bloquote are considered as if they were part of the blockquote --- .../openapitools/openapidiff/core/output/MarkdownRender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java index a0d2c5448..595b97cf5 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java @@ -528,7 +528,7 @@ protected String blockquote(String beginning) { protected String blockquote(String beginning, String text) { String blockquote = blockquote(beginning); - return blockquote + text.trim().replace("\n", "\n" + blockquote) + '\n'; + return blockquote + text.trim().replace("\n", "\n" + blockquote) + "\n\n"; } protected String type(Schema<?> schema) { From 22eb95fdf9b3328fa779f84dda7fab0a5c784654 Mon Sep 17 00:00:00 2001 From: Jasper Vandemalle <jasper.vandemalle@gmail.com> Date: Mon, 24 Oct 2022 22:25:05 +0200 Subject: [PATCH 080/313] Register ObjectMapper modules (#419) Finding and registering modules can avoid exceptions like the following: ``` Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.OffsetDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: org.openapitools.openapidiff.core.model.ChangedOpenApi["changedOperations"]->java.util.ArrayList[0]->org.openapitools.openapidiff.core.model.ChangedOperation["oldOperation"]->io.swagger.v3.oas.models.Operation["responses"]->io.swagger.v3.oas.models.responses.ApiResponses["default"]->io.swagger.v3.oas.models.responses.ApiResponse["content"]->io.swagger.v3.oas.models.media.Content["application/json"]->io.swagger.v3.oas.models.media.MediaType["schema"]->io.swagger.v3.oas.models.media.Schema["properties"]->java.util.LinkedHashMap["someDateTime"]->io.swagger.v3.oas.models.media.DateTimeSchema["example"]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300) at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35) ... at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3821) at org.openapitools.openapidiff.core.output.JsonRender.render(JsonRender.java:22) ``` --- .../openapidiff/core/output/JsonRender.java | 9 ++++++-- .../openapidiff/core/JsonRenderTest.java | 8 +++++++ .../src/test/resources/jsr310_property_1.yaml | 23 +++++++++++++++++++ .../src/test/resources/jsr310_property_2.yaml | 22 ++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 core/src/test/resources/jsr310_property_1.yaml create mode 100644 core/src/test/resources/jsr310_property_2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java index 465268f94..a0dfa09fb 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java @@ -8,8 +8,13 @@ import org.openapitools.openapidiff.core.model.ChangedOpenApi; public class JsonRender implements Render { - private final ObjectMapper objectMapper = - new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); + private final ObjectMapper objectMapper; + + public JsonRender() { + objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + objectMapper.findAndRegisterModules(); + } @Override public String render(ChangedOpenApi diff) { diff --git a/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java index 547ced027..aba54ea41 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java @@ -14,4 +14,12 @@ public void renderDoesNotFailWhenPropertyHasBeenRemoved() { OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); assertThat(render.render(diff)).isNotBlank(); } + + @Test + public void renderDoesNotFailForJsr310Types() { + JsonRender render = new JsonRender(); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("jsr310_property_1.yaml", "jsr310_property_2.yaml"); + assertThat(render.render(diff)).isNotBlank(); + } } diff --git a/core/src/test/resources/jsr310_property_1.yaml b/core/src/test/resources/jsr310_property_1.yaml new file mode 100644 index 000000000..7257579ce --- /dev/null +++ b/core/src/test/resources/jsr310_property_1.yaml @@ -0,0 +1,23 @@ +openapi: 3.0.1 +info: + title: Title + version: 1.0.0 + description: Description +paths: + /: + get: + summary: Simple GET + operationId: simpleGet + responses: + default: + description: Default response + content: + application/json: + schema: + properties: + someDateTime: + description: Date time + example: 2021-11-03T13:50:47Z + type: string + format: date-time + description: Simple GET \ No newline at end of file diff --git a/core/src/test/resources/jsr310_property_2.yaml b/core/src/test/resources/jsr310_property_2.yaml new file mode 100644 index 000000000..a51d7abc4 --- /dev/null +++ b/core/src/test/resources/jsr310_property_2.yaml @@ -0,0 +1,22 @@ +openapi: 3.0.1 +info: + title: Title + version: 1.0.0 + description: Description +paths: + /: + get: + summary: Simple GET + operationId: simpleGet + responses: + default: + description: Default response + content: + application/json: + schema: + properties: + someDateTime: + description: Date time + example: 2021-11-03T13:50:47Z + type: string + description: Simple GET \ No newline at end of file From d97efb0d9dd8a552ef5e3102d3a4fa12ffdc9c39 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Mon, 24 Oct 2022 20:29:07 +0000 Subject: [PATCH 081/313] [maven-release-plugin] prepare release 2.1.0-beta.4 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..b4b6e38e9 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.4</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 50b8ce87d..bc2187a7f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.4</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 46d9dda3b..6a095d41b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.4</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.4</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index d03308683..c2aa58e12 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.4</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 5e6f5a6b1..1b8677710 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.4</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.4</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-07-25T10:13:53Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-10-24T20:28:07Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.4</version> </dependency> <dependency> <groupId>org.junit</groupId> From 60d0b97489f83ec5d2d8b759f8fe025539a4cd91 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Mon, 24 Oct 2022 20:29:12 +0000 Subject: [PATCH 082/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index b4b6e38e9..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.4</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index bc2187a7f..50b8ce87d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.4</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 6a095d41b..46d9dda3b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.4</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.4</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index c2aa58e12..d03308683 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.4</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 1b8677710..5827fe293 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.4</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.4</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-10-24T20:28:07Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2022-10-24T20:29:12Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.4</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From 7b862a52d95ac044bd51eb23a6ed8d763796e5e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Oct 2022 10:36:30 +0200 Subject: [PATCH 083/313] build(deps): bump swagger-parser.version from 2.1.6 to 2.1.7 (#432) Bumps `swagger-parser.version` from 2.1.6 to 2.1.7. Updates `swagger-parser-v3` from 2.1.6 to 2.1.7 Updates `swagger-parser` from 2.1.6 to 2.1.7 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.6...v2.1.7) Updates `swagger-parser-v2-converter` from 2.1.6 to 2.1.7 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5827fe293..f2d8e15d9 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.6</swagger-parser.version> + <swagger-parser.version>2.1.7</swagger-parser.version> <slf4j.version>2.0.3</slf4j.version> </properties> From c577edb064c1c625055e7ff1ded3789c543164eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Oct 2022 10:36:51 +0200 Subject: [PATCH 084/313] build(deps): bump maven-shade-plugin from 3.4.0 to 3.4.1 (#431) Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.4.0...maven-shade-plugin-3.4.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f2d8e15d9..210db74ec 100644 --- a/pom.xml +++ b/pom.xml @@ -324,7 +324,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.4.0</version> + <version>3.4.1</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From 97860a32e6fec4c9224736dd2e2abc42ff7b70b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 09:52:08 +0100 Subject: [PATCH 085/313] build(deps): bump maven-release-plugin from 3.0.0-M6 to 3.0.0-M7 (#434) Bumps [maven-release-plugin](https://github.com/apache/maven-release) from 3.0.0-M6 to 3.0.0-M7. - [Release notes](https://github.com/apache/maven-release/releases) - [Commits](https://github.com/apache/maven-release/compare/maven-release-3.0.0-M6...maven-release-3.0.0-M7) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-release-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 210db74ec..92fb490e6 100644 --- a/pom.xml +++ b/pom.xml @@ -289,7 +289,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>3.0.0-M6</version> + <version>3.0.0-M7</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 807622f7f755f02d1ae4c0be9b52e769ef105c70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 09:52:24 +0100 Subject: [PATCH 086/313] build(deps): bump swagger-parser.version from 2.1.7 to 2.1.8 (#433) Bumps `swagger-parser.version` from 2.1.7 to 2.1.8. Updates `swagger-parser-v3` from 2.1.7 to 2.1.8 Updates `swagger-parser` from 2.1.7 to 2.1.8 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.7...v2.1.8) Updates `swagger-parser-v2-converter` from 2.1.7 to 2.1.8 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 92fb490e6..b689db04c 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.7</swagger-parser.version> + <swagger-parser.version>2.1.8</swagger-parser.version> <slf4j.version>2.0.3</slf4j.version> </properties> From e5a341494c159d6fda9e2b19569ea1a6dc293bb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 09:04:39 +0100 Subject: [PATCH 087/313] build(deps): bump maven-plugin-plugin from 3.6.4 to 3.7.0 (#435) Bumps [maven-plugin-plugin](https://github.com/apache/maven-plugin-tools) from 3.6.4 to 3.7.0. - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.6.4...maven-plugin-tools-3.7.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-plugin-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index d03308683..dd6ff3f69 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -51,7 +51,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> - <version>3.6.4</version> + <version>3.7.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From bbaa9a81aed04852495941702c5269e9fb4b7e51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Nov 2022 09:07:15 +0100 Subject: [PATCH 088/313] build(deps): bump cyclonedx-maven-plugin from 2.7.2 to 2.7.3 (#436) Bumps [cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.2 to 2.7.3. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.2...cyclonedx-maven-plugin-2.7.3) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b689db04c..e52c7e383 100644 --- a/pom.xml +++ b/pom.xml @@ -345,7 +345,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.2</version> + <version>2.7.3</version> </plugin> </plugins> </pluginManagement> From 3a0d6f04a14bd136dde4796d77072f22941d69c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 09:07:18 +0100 Subject: [PATCH 089/313] build(deps): bump swagger-parser.version from 2.1.8 to 2.1.9 (#437) Bumps `swagger-parser.version` from 2.1.8 to 2.1.9. Updates `swagger-parser-v3` from 2.1.8 to 2.1.9 Updates `swagger-parser` from 2.1.8 to 2.1.9 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.8...v2.1.9) Updates `swagger-parser-v2-converter` from 2.1.8 to 2.1.9 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e52c7e383..cddb13a04 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.8</swagger-parser.version> + <swagger-parser.version>2.1.9</swagger-parser.version> <slf4j.version>2.0.3</slf4j.version> </properties> From f50a458aba5f56ba218c98d036619747ea1dc883 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Nov 2022 10:00:36 +0100 Subject: [PATCH 090/313] build(deps): bump slf4j.version from 2.0.3 to 2.0.4 (#438) Bumps `slf4j.version` from 2.0.3 to 2.0.4. Updates `slf4j-api` from 2.0.3 to 2.0.4 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.3...v_2.0.4) Updates `jcl-over-slf4j` from 2.0.3 to 2.0.4 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.3...v_2.0.4) Updates `slf4j-simple` from 2.0.3 to 2.0.4 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.3...v_2.0.4) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cddb13a04..1a5d858d8 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.9</swagger-parser.version> - <slf4j.version>2.0.3</slf4j.version> + <slf4j.version>2.0.4</slf4j.version> </properties> <dependencyManagement> From b565df6dca737fbf58c711d60966dc81b5e5e6e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 17:20:56 +0100 Subject: [PATCH 091/313] build(deps): bump slf4j.version from 2.0.4 to 2.0.5 (#442) Bumps `slf4j.version` from 2.0.4 to 2.0.5. Updates `slf4j-api` from 2.0.4 to 2.0.5 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.4...v_2.0.5) Updates `jcl-over-slf4j` from 2.0.4 to 2.0.5 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.4...v_2.0.5) Updates `slf4j-simple` from 2.0.4 to 2.0.5 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.4...v_2.0.5) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1a5d858d8..23bc2e052 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.9</swagger-parser.version> - <slf4j.version>2.0.4</slf4j.version> + <slf4j.version>2.0.5</slf4j.version> </properties> <dependencyManagement> From c7b68484e4c633dfe5eb2be4292c9cbad7596857 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Dec 2022 09:48:11 +0100 Subject: [PATCH 092/313] build(deps): bump slf4j.version from 2.0.5 to 2.0.6 (#444) Bumps `slf4j.version` from 2.0.5 to 2.0.6. Updates `slf4j-api` from 2.0.5 to 2.0.6 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.5...v_2.0.6) Updates `jcl-over-slf4j` from 2.0.5 to 2.0.6 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.5...v_2.0.6) Updates `slf4j-simple` from 2.0.5 to 2.0.6 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/compare/v_2.0.5...v_2.0.6) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 23bc2e052..bffcaea0f 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.9</swagger-parser.version> - <slf4j.version>2.0.5</slf4j.version> + <slf4j.version>2.0.6</slf4j.version> </properties> <dependencyManagement> From 6521549bdc050d1ef27a795fee5f96c726a716d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 22:22:53 +0100 Subject: [PATCH 093/313] build(deps): bump cyclonedx-maven-plugin from 2.7.3 to 2.7.4 (#446) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bffcaea0f..e4b663120 100644 --- a/pom.xml +++ b/pom.xml @@ -345,7 +345,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.3</version> + <version>2.7.4</version> </plugin> </plugins> </pluginManagement> From 6c03ef7b1fabb944f637f8c496bdd62185a4ffcc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Jan 2023 22:00:19 +0100 Subject: [PATCH 094/313] build(deps): bump assertj-core from 3.23.1 to 3.24.0 (#447) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e4b663120..c1cc92a43 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.23.1</version> + <version>3.24.0</version> <scope>test</scope> </dependency> <dependency> From 41307c9815ee169978728f0172bed457963f6dfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 11:31:59 +0100 Subject: [PATCH 095/313] build(deps): bump assertj-core from 3.24.0 to 3.24.1 (#451) Bumps assertj-core from 3.24.0 to 3.24.1. --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c1cc92a43..c1fbe345a 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.24.0</version> + <version>3.24.1</version> <scope>test</scope> </dependency> <dependency> From d9a16f03676d63ee5124acaa2ac5ed1398453a4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 11:32:20 +0100 Subject: [PATCH 096/313] build(deps): bump swagger-parser.version from 2.1.9 to 2.1.10 (#450) Bumps `swagger-parser.version` from 2.1.9 to 2.1.10. Updates `swagger-parser-v3` from 2.1.9 to 2.1.10 Updates `swagger-parser` from 2.1.9 to 2.1.10 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.9...v2.1.10) Updates `swagger-parser-v2-converter` from 2.1.9 to 2.1.10 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c1fbe345a..72569864e 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.9</swagger-parser.version> + <swagger-parser.version>2.1.10</swagger-parser.version> <slf4j.version>2.0.6</slf4j.version> </properties> From 2eff54b08be333daac34c1ae5eed215d4fd88870 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 09:24:09 +0100 Subject: [PATCH 097/313] build(deps): bump junit-bom from 5.9.1 to 5.9.2 (#452) Bumps [junit-bom](https://github.com/junit-team/junit5) from 5.9.1 to 5.9.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.9.1...r5.9.2) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 72569864e..f20117f46 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.9.1</version> + <version>5.9.2</version> <type>pom</type> <scope>import</scope> </dependency> From 7f7970e9b01348c4cd0195d871ada8a6ebcb3b0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jan 2023 14:38:59 +0100 Subject: [PATCH 098/313] build(deps): bump maven-plugin-plugin from 3.7.0 to 3.7.1 (#455) Bumps [maven-plugin-plugin](https://github.com/apache/maven-plugin-tools) from 3.7.0 to 3.7.1. - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.7.0...maven-plugin-tools-3.7.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-plugin-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index dd6ff3f69..d9ebcaa32 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -51,7 +51,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> - <version>3.7.0</version> + <version>3.7.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From ac689fe0370cb2c74176168cfcfd1bd24b6b9987 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jan 2023 14:39:20 +0100 Subject: [PATCH 099/313] build(deps): bump assertj-core from 3.24.1 to 3.24.2 (#456) Bumps assertj-core from 3.24.1 to 3.24.2. --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f20117f46..ab241ecae 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.24.1</version> + <version>3.24.2</version> <scope>test</scope> </dependency> <dependency> From 625716273b5ea9eed951c1941fc6be476c633708 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jan 2023 10:01:06 +0100 Subject: [PATCH 100/313] build(deps): bump swagger-parser.version from 2.1.10 to 2.1.11 (#457) Bumps `swagger-parser.version` from 2.1.10 to 2.1.11. Updates `swagger-parser-v3` from 2.1.10 to 2.1.11 Updates `swagger-parser` from 2.1.10 to 2.1.11 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.10...v2.1.11) Updates `swagger-parser-v2-converter` from 2.1.10 to 2.1.11 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ab241ecae..e1741911d 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.10</swagger-parser.version> + <swagger-parser.version>2.1.11</swagger-parser.version> <slf4j.version>2.0.6</slf4j.version> </properties> From ca0af0713de5fb5a68ac9e9c62eaa86341f89134 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Jan 2023 13:40:52 +0100 Subject: [PATCH 101/313] build(deps): bump docker/build-push-action from 3 to 4 (#459) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3 to 4. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1d94fe489..a99689b5f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -59,7 +59,7 @@ jobs: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} - name: Build & Push Docker image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . push: true From 25ec1e176f9a902c54f9eaa64bce85aa5e997f80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 11:35:45 +0100 Subject: [PATCH 102/313] build(deps): bump maven-deploy-plugin from 3.0.0 to 3.1.0 (#462) Bumps [maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.0.0...maven-deploy-plugin-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e1741911d..9328e9eec 100644 --- a/pom.xml +++ b/pom.xml @@ -319,7 +319,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> - <version>3.0.0</version> + <version>3.1.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From cda571cec7867c54c449d8a269db960a47552ce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:11:10 +0100 Subject: [PATCH 103/313] build(deps): bump swagger-parser.version from 2.1.11 to 2.1.12 (#467) Bumps `swagger-parser.version` from 2.1.11 to 2.1.12. Updates `swagger-parser-v3` from 2.1.11 to 2.1.12 Updates `swagger-parser` from 2.1.11 to 2.1.12 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.11...v2.1.12) Updates `swagger-parser-v2-converter` from 2.1.11 to 2.1.12 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9328e9eec..97d42eb10 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.11</swagger-parser.version> + <swagger-parser.version>2.1.12</swagger-parser.version> <slf4j.version>2.0.6</slf4j.version> </properties> From cfcf6ef6f6cb794c74eb1a68b82bfedf8fe73e07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:11:21 +0100 Subject: [PATCH 104/313] build(deps): bump maven-javadoc-plugin from 3.4.1 to 3.5.0 (#466) Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.4.1 to 3.5.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.4.1...maven-javadoc-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 97d42eb10..885deab46 100644 --- a/pom.xml +++ b/pom.xml @@ -294,7 +294,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.4.1</version> + <version>3.5.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 17c814249a6a7ba5124822861f5633bcffcd0e99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:11:29 +0100 Subject: [PATCH 105/313] build(deps): bump cyclonedx-maven-plugin from 2.7.4 to 2.7.5 (#465) Bumps [cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.4 to 2.7.5. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.4...cyclonedx-maven-plugin-2.7.5) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 885deab46..d96c54b66 100644 --- a/pom.xml +++ b/pom.xml @@ -345,7 +345,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.4</version> + <version>2.7.5</version> </plugin> </plugins> </pluginManagement> From 5105f0b43360e3587fc3e0d57659d0bbe6fbb6d1 Mon Sep 17 00:00:00 2001 From: Mishuk Dutta <mishuk.dutta@toasttab.com> Date: Sat, 25 Feb 2023 15:27:21 -0600 Subject: [PATCH 106/313] Parameter data detection fix when PathParams changed (#353) Fixes #353 --- .../core/compare/OperationDiff.java | 11 +-- .../core/compare/ParametersDiff.java | 69 +++++++++++++++++-- .../openapidiff/core/compare/PathDiff.java | 9 ++- .../openapidiff/core/compare/PathsDiff.java | 1 + .../openapidiff/core/model/DiffContext.java | 18 +++++ .../core/PathParameterSchemaDiffTest.java | 53 ++++++++++++++ ...th_parameter_diff_param_name_diff_new.yaml | 48 +++++++++++++ ...th_parameter_diff_param_name_diff_old.yaml | 48 +++++++++++++ ..._parameter_diff_param_schema_diff_new.yaml | 48 +++++++++++++ ..._parameter_diff_param_schema_diff_old.yaml | 48 +++++++++++++ 10 files changed, 342 insertions(+), 11 deletions(-) create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java create mode 100644 core/src/test/resources/path_parameter_diff_param_name_diff_new.yaml create mode 100644 core/src/test/resources/path_parameter_diff_param_name_diff_old.yaml create mode 100644 core/src/test/resources/path_parameter_diff_param_schema_diff_new.yaml create mode 100644 core/src/test/resources/path_parameter_diff_param_schema_diff_old.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java index a2bc17244..e226043f3 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java @@ -72,14 +72,15 @@ public DeferredChanged<ChangedOperation> diff( .ifPresent(changedOperation::setRequestBody); } + ParametersDiffResult parametersDiffResult = + openApiDiff.getParametersDiff().diff(oldOperation.getParameters(), newOperation.getParameters(), context); builder - .with( - openApiDiff - .getParametersDiff() - .diff(oldOperation.getParameters(), newOperation.getParameters(), context)) + .with(parametersDiffResult.deferredChanged) .ifPresent( params -> { - removePathParameters(context.getParameters(), params); + if (!parametersDiffResult.sameOperationsDiffSchema) { + removePathParameters(context.getParameters(), params); + } changedOperation.setParameters(params); }); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java index c7fb99b08..c6bf420e8 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java @@ -6,6 +6,8 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedParameters; import org.openapitools.openapidiff.core.model.DiffContext; @@ -14,6 +16,15 @@ import org.openapitools.openapidiff.core.utils.RefPointer; import org.openapitools.openapidiff.core.utils.RefType; +class ParametersDiffResult { + protected DeferredChanged<ChangedParameters> deferredChanged; + protected boolean sameOperationsDiffSchema; + + public ParametersDiffResult(DeferredChanged<ChangedParameters> deferredChanged, boolean sameOperationsDiffSchema) { + this.deferredChanged = deferredChanged; + this.sameOperationsDiffSchema = sameOperationsDiffSchema; + } +} /** compare two parameter */ public class ParametersDiff { private static final RefPointer<Parameter> refPointer = new RefPointer<>(RefType.PARAMETERS); @@ -46,9 +57,7 @@ public static boolean same(Parameter left, Parameter right) { && Objects.equals(left.getIn(), right.getIn()); } - public DeferredChanged<ChangedParameters> diff( - List<Parameter> left, List<Parameter> right, DiffContext context) { - + public ParametersDiffResult diff(List<Parameter> left, List<Parameter> right, DiffContext context) { DeferredBuilder<Changed> builder = new DeferredBuilder<>(); ChangedParameters changedParameters = new ChangedParameters(left, right != null ? new ArrayList<>(right) : null, context); @@ -70,7 +79,59 @@ public DeferredChanged<ChangedParameters> diff( } } changedParameters.getIncreased().addAll(right); + return new ParametersDiffResult( + builder.buildIsChanged(changedParameters), + pathUnchangedParametersChanged(changedParameters, context) + ); + } + + public boolean pathUnchangedParametersChanged( + ChangedParameters changedParameters, DiffContext context) { + if (!pathUnchanged(changedParameters, context)) return false; + // If missing and increased parameter count is different, it's a new endpoint + if (changedParameters.getMissing().size() != changedParameters.getIncreased().size()) + return false; + // Go through each missing Parameter and compare it to newly added Parameters + for (Parameter parameter : changedParameters.getMissing()) { + // Speedy Check. Use the map already created in changedParameters to check if missing param is linked to newParam + String newParameterName = context.getParameters().get(parameter.getName()); + if (newParameterName.isEmpty()) return false; + + Optional<Parameter> newParameter = + changedParameters.getIncreased().stream() + .filter(p -> p.getName().equals(newParameterName)) + .findFirst(); + if (!newParameter.isPresent()) return false; - return builder.buildIsChanged(changedParameters); + // Check if the old and new Parameters match . IF so, return TRUE + Parameter newParameterRealized = newParameter.get(); + newParameterRealized.setName(parameter.getName()); // Make names similar + boolean samePathDifferentParameter = !newParameterRealized.equals(parameter); + newParameterRealized.setName(newParameterName); // Important:: MUST Reset the name as this is not a copy + return samePathDifferentParameter; + } + return false; + } + + public boolean pathUnchanged(ChangedParameters changedParameters, DiffContext context) { + final String REGEX_PATH = "\\{([^/]+)}"; + String oldUrl = context.getLeftUrl(); + String newUrl = context.getRightUrl(); + ArrayList<String> oldUrlPathParams = matchedItems(oldUrl, REGEX_PATH); + ArrayList<String> newUrlPathParams = matchedItems(newUrl, REGEX_PATH); + // Path Param count doesn't match or param-less path doesn't match or param is changed --> It's a new endpoint + return oldUrlPathParams.size() == newUrlPathParams.size() + && changedParameters.getChanged().isEmpty() + && oldUrl.replaceAll(REGEX_PATH, "").equals(newUrl.replaceAll(REGEX_PATH, "")); + } + + public ArrayList<String> matchedItems(String string, String regex) { + Matcher matcher = Pattern.compile(regex).matcher(string); + ArrayList<String> matchedItems = new ArrayList<>(); + while (matcher.find()) { + String item = matcher.group(); + matchedItems.add(item.substring(0, matcher.group().length() - 1).replaceFirst("\\{", "")); + } + return matchedItems; } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java index 0537907a0..7d8e8baa8 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java @@ -36,8 +36,13 @@ public DeferredChanged<ChangedPath> diff(PathItem left, PathItem right, DiffCont .with( openApiDiff .getOperationDiff() - .diff(oldOperation, newOperation, context.copyWithMethod(method))) - .ifPresent(changedPath.getChanged()::add); + .diff(oldOperation, newOperation, + context.copyWithMethod(method).copyWithLeftRightUrls( + context.getLeftUrl(), + context.getRightUrl() + ) + ) + ).ifPresent(changedPath.getChanged()::add); } builder .with( diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index 0f501bf99..cb969f4fa 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -85,6 +85,7 @@ public DeferredChanged<ChangedPaths> diff( DiffContext context = new DiffContext(); context.setUrl(url); context.setParameters(params); + context.setLeftAndRightUrls(url, rightUrl); builder .with(openApiDiff.getPathDiff().diff(leftPath, rightPath, context)) .ifPresent(path -> changedPaths.getChanged().put(rightUrl, path)); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java b/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java index 7c8716ed4..718cb60f8 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java @@ -14,6 +14,8 @@ public class DiffContext { private boolean response; private boolean request; private Boolean required; + private String leftUrl; + private String rightUrl; public DiffContext() { parameters = new HashMap<>(); @@ -37,6 +39,10 @@ public DiffContext copyAsResponse() { return copy().setResponse(); } + public DiffContext copyWithLeftRightUrls(String leftUrl, String rightUrl) { + return copy().setLeftAndRightUrls(leftUrl, rightUrl); + } + private DiffContext setRequest() { this.request = true; this.response = false; @@ -104,6 +110,16 @@ private DiffContext setRequired(boolean required) { return this; } + public DiffContext setLeftAndRightUrls(String leftUrl, String rightUrl) { + this.leftUrl = leftUrl; + this.rightUrl = rightUrl; + return this; + } + + public String getLeftUrl() { return this.leftUrl; } + + public String getRightUrl() { return this.rightUrl; } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -131,6 +147,8 @@ public int hashCode() { .append(response) .append(request) .append(required) + .append(leftUrl) + .append(rightUrl) .toHashCode(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java new file mode 100644 index 000000000..1c4065ed9 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java @@ -0,0 +1,53 @@ +package org.openapitools.openapidiff.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PathParameterSchemaDiffTest { + final String TEST_MSG_1 = + "Testing: \n" + + "1. Same path but different pathParameters\n" + + "2. different parameters in the parameters: section\n" + + "3. Parameters have different schema\n" + + "eg:\n" + + "old path -- students/{id}\n" + + "old schema -- id: integer\n" + + "new path -- students/{username}\n" + + "new schema -- username: string"; + + final String TEST_MSG_2 = + "Testing: \n" + + "1. Same path but different pathParameters\n" + + "2. different parameters in the parameters: section\n" + + "3. Parameters have same schema\n"; + + @Test + @DisplayName( + "Same Path, different PathParams, Params in the `Parameters`: match pathParam, Different Schema") + public void pathSamePathParamsDiffParamSameAsInPathButSchemaDiff() { + final Logger logger = LoggerFactory.getLogger(PathParameterSchemaDiffTest.class); + logger.info(TEST_MSG_1); + String OPENAPI_DOC1 = "path_parameter_diff_param_schema_diff_old.yaml"; + String OPENAPI_DOC2 = "path_parameter_diff_param_schema_diff_new.yaml"; + ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + Assertions.assertTrue(diff.isDifferent()); + Assertions.assertFalse(diff.isCompatible()); + } + + @Test + @DisplayName( + "Same Path, different PathParams, Params in the `Parameters`: match pathParam, same Schema") + public void pathSamePathParamsDiffParamNameDiffSchemaSame() { + final Logger logger = LoggerFactory.getLogger(PathParameterSchemaDiffTest.class); + logger.info(TEST_MSG_2); + String OPENAPI_DOC1 = "path_parameter_diff_param_name_diff_old.yaml"; + String OPENAPI_DOC2 = "path_parameter_diff_param_name_diff_new.yaml"; + ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + Assertions.assertFalse(diff.isDifferent()); + Assertions.assertTrue(diff.isCompatible()); + } +} diff --git a/core/src/test/resources/path_parameter_diff_param_name_diff_new.yaml b/core/src/test/resources/path_parameter_diff_param_name_diff_new.yaml new file mode 100644 index 000000000..8faa0730e --- /dev/null +++ b/core/src/test/resources/path_parameter_diff_param_name_diff_new.yaml @@ -0,0 +1,48 @@ +openapi: 3.0.0 +info: + title: Sample API + description: Optional multiline or single-line description in [CommonMark](http://commonmark.org/help/) or HTML. + version: 0.1.9 +servers: + - url: http://api.example.com/v1 + description: Example api server + +paths: + + /student/{username}: + get: + parameters: + - in: path + name: username # Note the name is the same as in the path + required: true + schema: + type: string + minimum: 1 + + + summary: Returns data about a student + responses: + '200': # status code + description: A JSON Object student data + content: + application/json: + schema: + type: object + items: + $ref: '#/components/schemas/Student' + +components: + schemas: + Student: + type: object + properties: + id: + type: integer + example: "1" + username: + type: string + example: "alloy_horizon" + pattern: A..Z a..z 0..9 . _ - + name: + type: string + example: "Alloy Horizon" diff --git a/core/src/test/resources/path_parameter_diff_param_name_diff_old.yaml b/core/src/test/resources/path_parameter_diff_param_name_diff_old.yaml new file mode 100644 index 000000000..7ced291d1 --- /dev/null +++ b/core/src/test/resources/path_parameter_diff_param_name_diff_old.yaml @@ -0,0 +1,48 @@ +openapi: 3.0.0 +info: + title: Sample API + description: Optional multiline or single-line description in [CommonMark](http://commonmark.org/help/) or HTML. + version: 0.1.9 +servers: + - url: http://api.example.com/v1 + description: Example api server + +paths: + + /student/{id}: + get: + parameters: + - in: path + name: id # Note the name is the same as in the path + required: true + schema: + type: string + minimum: 1 + + + summary: Returns data about a student + responses: + '200': # status code + description: A JSON Object student data + content: + application/json: + schema: + type: object + items: + $ref: '#/components/schemas/Student' + +components: + schemas: + Student: + type: object + properties: + id: + type: integer + example: "1" + username: + type: string + example: "alloy_horizon" + pattern: A..Z a..z 0..9 . _ - + name: + type: string + example: "Alloy Horizon" diff --git a/core/src/test/resources/path_parameter_diff_param_schema_diff_new.yaml b/core/src/test/resources/path_parameter_diff_param_schema_diff_new.yaml new file mode 100644 index 000000000..8faa0730e --- /dev/null +++ b/core/src/test/resources/path_parameter_diff_param_schema_diff_new.yaml @@ -0,0 +1,48 @@ +openapi: 3.0.0 +info: + title: Sample API + description: Optional multiline or single-line description in [CommonMark](http://commonmark.org/help/) or HTML. + version: 0.1.9 +servers: + - url: http://api.example.com/v1 + description: Example api server + +paths: + + /student/{username}: + get: + parameters: + - in: path + name: username # Note the name is the same as in the path + required: true + schema: + type: string + minimum: 1 + + + summary: Returns data about a student + responses: + '200': # status code + description: A JSON Object student data + content: + application/json: + schema: + type: object + items: + $ref: '#/components/schemas/Student' + +components: + schemas: + Student: + type: object + properties: + id: + type: integer + example: "1" + username: + type: string + example: "alloy_horizon" + pattern: A..Z a..z 0..9 . _ - + name: + type: string + example: "Alloy Horizon" diff --git a/core/src/test/resources/path_parameter_diff_param_schema_diff_old.yaml b/core/src/test/resources/path_parameter_diff_param_schema_diff_old.yaml new file mode 100644 index 000000000..96be9b9b2 --- /dev/null +++ b/core/src/test/resources/path_parameter_diff_param_schema_diff_old.yaml @@ -0,0 +1,48 @@ +openapi: 3.0.0 +info: + title: Sample API + description: Optional multiline or single-line description in [CommonMark](http://commonmark.org/help/) or HTML. + version: 0.1.9 +servers: + - url: http://api.example.com/v1 + description: Example api server + +paths: + + /student/{id}: + get: + parameters: + - in: path + name: id # Note the name is the same as in the path + required: true + schema: + type: integer + minimum: 1 + + + summary: Returns data about a student + responses: + '200': # status code + description: A JSON Object student data + content: + application/json: + schema: + type: object + items: + $ref: '#/components/schemas/Student' + +components: + schemas: + Student: + type: object + properties: + id: + type: integer + example: "1" + username: + type: string + example: "alloy_horizon" + pattern: A..Z a..z 0..9 . _ - + name: + type: string + example: "Alloy Horizon" From e39ad8c6fb3f8674d0e3f33bebbdde9057de1651 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Sun, 26 Feb 2023 00:06:00 +0100 Subject: [PATCH 107/313] Detect changed numeric ranges (#469) https://swagger.io/docs/specification/data-models/data-types/#range Fixes #458 --- .../core/compare/OperationDiff.java | 4 +- .../core/compare/ParametersDiff.java | 24 +-- .../openapidiff/core/compare/PathDiff.java | 14 +- .../schemadiffresult/SchemaDiffResult.java | 13 +- .../openapidiff/core/model/ChangedSchema.java | 11 ++ .../openapidiff/core/model/DiffContext.java | 8 +- .../model/schema/ChangedNumericRange.java | 165 ++++++++++++++++++ .../openapidiff/core/ParameterDiffTest.java | 82 ++++++++- .../resources/issue-458-integer-limits_1.yaml | 34 ++++ .../issue-458-integer-limits_10.yaml | 33 ++++ .../issue-458-integer-limits_11.yaml | 34 ++++ .../issue-458-integer-limits_12.yaml | 34 ++++ .../issue-458-integer-limits_13.yaml | 34 ++++ .../issue-458-integer-limits_14.yaml | 33 ++++ .../issue-458-integer-limits_15.yaml | 33 ++++ .../resources/issue-458-integer-limits_2.yaml | 34 ++++ .../resources/issue-458-integer-limits_3.yaml | 34 ++++ .../resources/issue-458-integer-limits_4.yaml | 34 ++++ .../resources/issue-458-integer-limits_5.yaml | 34 ++++ .../resources/issue-458-integer-limits_6.yaml | 34 ++++ .../resources/issue-458-integer-limits_7.yaml | 34 ++++ .../resources/issue-458-integer-limits_8.yaml | 34 ++++ .../resources/issue-458-integer-limits_9.yaml | 33 ++++ 23 files changed, 803 insertions(+), 24 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java create mode 100644 core/src/test/resources/issue-458-integer-limits_1.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_10.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_11.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_12.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_13.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_14.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_15.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_2.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_3.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_4.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_5.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_6.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_7.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_8.yaml create mode 100644 core/src/test/resources/issue-458-integer-limits_9.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java index e226043f3..8d960ba31 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java @@ -73,7 +73,9 @@ public DeferredChanged<ChangedOperation> diff( } ParametersDiffResult parametersDiffResult = - openApiDiff.getParametersDiff().diff(oldOperation.getParameters(), newOperation.getParameters(), context); + openApiDiff + .getParametersDiff() + .diff(oldOperation.getParameters(), newOperation.getParameters(), context); builder .with(parametersDiffResult.deferredChanged) .ifPresent( diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java index c6bf420e8..d01a555b9 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java @@ -20,7 +20,8 @@ class ParametersDiffResult { protected DeferredChanged<ChangedParameters> deferredChanged; protected boolean sameOperationsDiffSchema; - public ParametersDiffResult(DeferredChanged<ChangedParameters> deferredChanged, boolean sameOperationsDiffSchema) { + public ParametersDiffResult( + DeferredChanged<ChangedParameters> deferredChanged, boolean sameOperationsDiffSchema) { this.deferredChanged = deferredChanged; this.sameOperationsDiffSchema = sameOperationsDiffSchema; } @@ -57,7 +58,8 @@ public static boolean same(Parameter left, Parameter right) { && Objects.equals(left.getIn(), right.getIn()); } - public ParametersDiffResult diff(List<Parameter> left, List<Parameter> right, DiffContext context) { + public ParametersDiffResult diff( + List<Parameter> left, List<Parameter> right, DiffContext context) { DeferredBuilder<Changed> builder = new DeferredBuilder<>(); ChangedParameters changedParameters = new ChangedParameters(left, right != null ? new ArrayList<>(right) : null, context); @@ -80,9 +82,8 @@ public ParametersDiffResult diff(List<Parameter> left, List<Parameter> right, Di } changedParameters.getIncreased().addAll(right); return new ParametersDiffResult( - builder.buildIsChanged(changedParameters), - pathUnchangedParametersChanged(changedParameters, context) - ); + builder.buildIsChanged(changedParameters), + pathUnchangedParametersChanged(changedParameters, context)); } public boolean pathUnchangedParametersChanged( @@ -93,7 +94,8 @@ public boolean pathUnchangedParametersChanged( return false; // Go through each missing Parameter and compare it to newly added Parameters for (Parameter parameter : changedParameters.getMissing()) { - // Speedy Check. Use the map already created in changedParameters to check if missing param is linked to newParam + // Speedy Check. Use the map already created in changedParameters to check if missing param is + // linked to newParam String newParameterName = context.getParameters().get(parameter.getName()); if (newParameterName.isEmpty()) return false; @@ -107,7 +109,8 @@ public boolean pathUnchangedParametersChanged( Parameter newParameterRealized = newParameter.get(); newParameterRealized.setName(parameter.getName()); // Make names similar boolean samePathDifferentParameter = !newParameterRealized.equals(parameter); - newParameterRealized.setName(newParameterName); // Important:: MUST Reset the name as this is not a copy + newParameterRealized.setName( + newParameterName); // Important:: MUST Reset the name as this is not a copy return samePathDifferentParameter; } return false; @@ -119,10 +122,11 @@ public boolean pathUnchanged(ChangedParameters changedParameters, DiffContext co String newUrl = context.getRightUrl(); ArrayList<String> oldUrlPathParams = matchedItems(oldUrl, REGEX_PATH); ArrayList<String> newUrlPathParams = matchedItems(newUrl, REGEX_PATH); - // Path Param count doesn't match or param-less path doesn't match or param is changed --> It's a new endpoint + // Path Param count doesn't match or param-less path doesn't match or param is changed --> It's + // a new endpoint return oldUrlPathParams.size() == newUrlPathParams.size() - && changedParameters.getChanged().isEmpty() - && oldUrl.replaceAll(REGEX_PATH, "").equals(newUrl.replaceAll(REGEX_PATH, "")); + && changedParameters.getChanged().isEmpty() + && oldUrl.replaceAll(REGEX_PATH, "").equals(newUrl.replaceAll(REGEX_PATH, "")); } public ArrayList<String> matchedItems(String string, String regex) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java index 7d8e8baa8..f695ef083 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathDiff.java @@ -36,13 +36,13 @@ public DeferredChanged<ChangedPath> diff(PathItem left, PathItem right, DiffCont .with( openApiDiff .getOperationDiff() - .diff(oldOperation, newOperation, - context.copyWithMethod(method).copyWithLeftRightUrls( - context.getLeftUrl(), - context.getRightUrl() - ) - ) - ).ifPresent(changedPath.getChanged()::add); + .diff( + oldOperation, + newOperation, + context + .copyWithMethod(method) + .copyWithLeftRightUrls(context.getLeftUrl(), context.getRightUrl()))) + .ifPresent(changedPath.getChanged()::add); } builder .with( diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index 540188ecb..6886f8c54 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -59,7 +59,18 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( .setChangeFormat(!Objects.equals(left.getFormat(), right.getFormat())) .setReadOnly(new ChangedReadOnly(left.getReadOnly(), right.getReadOnly(), context)) .setWriteOnly(new ChangedWriteOnly(left.getWriteOnly(), right.getWriteOnly(), context)) - .setMaxLength(new ChangedMaxLength(left.getMaxLength(), right.getMaxLength(), context)); + .setMaxLength(new ChangedMaxLength(left.getMaxLength(), right.getMaxLength(), context)) + .setNumericRange( + new ChangedNumericRange( + left.getMinimum(), + right.getMinimum(), + left.getMaximum(), + right.getMaximum(), + left.getExclusiveMinimum(), + right.getExclusiveMinimum(), + left.getExclusiveMaximum(), + right.getExclusiveMaximum(), + context)); builder .with( openApiDiff diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index 22e5a8f08..80d980079 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -7,6 +7,7 @@ import java.util.stream.Stream; import org.openapitools.openapidiff.core.model.schema.ChangedEnum; import org.openapitools.openapidiff.core.model.schema.ChangedMaxLength; +import org.openapitools.openapidiff.core.model.schema.ChangedNumericRange; import org.openapitools.openapidiff.core.model.schema.ChangedReadOnly; import org.openapitools.openapidiff.core.model.schema.ChangedRequired; import org.openapitools.openapidiff.core.model.schema.ChangedWriteOnly; @@ -30,6 +31,7 @@ public class ChangedSchema implements ComposedChanged { protected ChangedWriteOnly writeOnly; protected boolean changedType; protected ChangedMaxLength maxLength; + protected ChangedNumericRange numericRange; protected boolean discriminatorPropertyChanged; protected ChangedSchema items; protected ChangedOneOfSchema oneOfSchema; @@ -109,6 +111,7 @@ public List<Changed> getChangedElements() { enumeration, required, maxLength, + numericRange, extensions)) .collect(Collectors.toList()); } @@ -356,6 +359,12 @@ public ChangedSchema setMaxLength(final ChangedMaxLength maxLength) { return this; } + public ChangedSchema setNumericRange(final ChangedNumericRange numericRange) { + clearChangedCache(); + this.numericRange = numericRange; + return this; + } + public ChangedSchema setDiscriminatorPropertyChanged(final boolean discriminatorPropertyChanged) { clearChangedCache(); this.discriminatorPropertyChanged = discriminatorPropertyChanged; @@ -410,6 +419,7 @@ public boolean equals(Object o) { && Objects.equals(readOnly, that.readOnly) && Objects.equals(writeOnly, that.writeOnly) && Objects.equals(maxLength, that.maxLength) + && Objects.equals(numericRange, that.numericRange) && Objects.equals(items, that.items) && Objects.equals(oneOfSchema, that.oneOfSchema) && Objects.equals(addProp, that.addProp) @@ -437,6 +447,7 @@ public int hashCode() { writeOnly, changedType, maxLength, + numericRange, discriminatorPropertyChanged, items, oneOfSchema, diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java b/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java index 718cb60f8..485c3518b 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java @@ -116,9 +116,13 @@ public DiffContext setLeftAndRightUrls(String leftUrl, String rightUrl) { return this; } - public String getLeftUrl() { return this.leftUrl; } + public String getLeftUrl() { + return this.leftUrl; + } - public String getRightUrl() { return this.rightUrl; } + public String getRightUrl() { + return this.rightUrl; + } @Override public boolean equals(Object o) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java new file mode 100644 index 000000000..537496cd9 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java @@ -0,0 +1,165 @@ +package org.openapitools.openapidiff.core.model.schema; + +import java.math.BigDecimal; +import java.util.Objects; +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffContext; +import org.openapitools.openapidiff.core.model.DiffResult; + +public final class ChangedNumericRange implements Changed { + private final BigDecimal oldMinimumValue; + private final BigDecimal newMinimumValue; + private final BigDecimal oldMaximumValue; + private final BigDecimal newMaximumValue; + private final Boolean oldMinimumExclusiveValue; + private final Boolean newMinimumExclusiveValue; + private final Boolean oldMaximumExclusiveValue; + private final Boolean newMaximumExclusiveValue; + private final DiffContext context; + + @Override + public DiffResult isChanged() { + if (Objects.equals(oldMinimumValue, newMinimumValue) + && Objects.equals(oldMaximumValue, newMaximumValue) + && Objects.equals(oldMinimumExclusiveValue, newMinimumExclusiveValue) + && Objects.equals(oldMaximumExclusiveValue, newMaximumExclusiveValue)) { + return DiffResult.NO_CHANGES; + } + if (context.isRequest() + && (newMinimumValue == null + || oldMinimumValue != null + && oldMinimumValue.unscaledValue().compareTo(newMinimumValue.unscaledValue()) + >= 0) + && (newMaximumValue == null + || oldMaximumValue != null + && oldMaximumValue.unscaledValue().compareTo(newMaximumValue.unscaledValue()) + <= 0) + && (newMinimumExclusiveValue == null + || oldMinimumExclusiveValue != null && newMinimumExclusiveValue == true) + && (newMaximumExclusiveValue == null + || oldMaximumExclusiveValue != null && newMaximumExclusiveValue == true) + || context.isResponse() + && (newMinimumValue == null + || oldMinimumValue != null + && oldMinimumValue.unscaledValue().compareTo(newMinimumValue.unscaledValue()) + >= 0) + && (newMaximumValue == null + || oldMaximumValue != null + && oldMaximumValue.unscaledValue().compareTo(newMaximumValue.unscaledValue()) + <= 0) + && (newMinimumExclusiveValue == null + || oldMinimumExclusiveValue != null && newMinimumExclusiveValue == true) + && (newMaximumExclusiveValue == null + || oldMaximumExclusiveValue != null && newMaximumExclusiveValue == true)) { + return DiffResult.COMPATIBLE; + } + return DiffResult.INCOMPATIBLE; + } + + public ChangedNumericRange( + final BigDecimal oldMinimumValue, + final BigDecimal newMinimumValue, + final BigDecimal oldMaximumValue, + final BigDecimal newMaximumValue, + final Boolean oldMinimumExclusiveValue, + final Boolean newMinimumExclusiveValue, + final Boolean oldMaximumExclusiveValue, + final Boolean newMaximumExclusiveValue, + final DiffContext context) { + this.oldMinimumValue = oldMinimumValue; + this.newMinimumValue = newMinimumValue; + this.oldMaximumValue = oldMaximumValue; + this.newMaximumValue = newMaximumValue; + this.oldMinimumExclusiveValue = oldMinimumExclusiveValue; + this.newMinimumExclusiveValue = newMinimumExclusiveValue; + this.oldMaximumExclusiveValue = oldMaximumExclusiveValue; + this.newMaximumExclusiveValue = newMaximumExclusiveValue; + this.context = context; + } + + public BigDecimal getOldMinimumValue() { + return oldMinimumValue; + } + + public BigDecimal getNewMinimumValue() { + return newMinimumValue; + } + + public BigDecimal getOldMaximumValue() { + return oldMaximumValue; + } + + public BigDecimal getNewMaximumValue() { + return newMaximumValue; + } + + public Boolean getOldMinimumExclusiveValue() { + return oldMinimumExclusiveValue; + } + + public Boolean getNewMinimumExclusiveValue() { + return newMinimumExclusiveValue; + } + + public Boolean getOldMaximumExclusiveValue() { + return oldMaximumExclusiveValue; + } + + public Boolean getNewMaximumExclusiveValue() { + return newMaximumExclusiveValue; + } + + public DiffContext getContext() { + return this.context; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ChangedNumericRange that = (ChangedNumericRange) o; + return Objects.equals(oldMinimumValue, newMinimumValue) + && Objects.equals(oldMaximumValue, newMaximumValue) + && Objects.equals(oldMinimumExclusiveValue, newMinimumExclusiveValue) + && Objects.equals(oldMaximumExclusiveValue, newMaximumExclusiveValue) + && Objects.equals(context, that.context); + } + + @Override + public int hashCode() { + return Objects.hash( + oldMinimumValue, + newMinimumValue, + oldMaximumValue, + newMaximumValue, + oldMinimumExclusiveValue, + newMinimumExclusiveValue, + oldMaximumExclusiveValue, + newMaximumExclusiveValue, + context); + } + + @Override + public String toString() { + return "ChangedNumericRange(" + + "oldMinimumValue=" + + oldMinimumValue + + ", newMinimumValue=" + + newMinimumValue + + ", oldMaximumValue=" + + oldMaximumValue + + ", newMaximumValue=" + + newMaximumValue + + ", oldMinimumExclusiveValue=" + + oldMinimumExclusiveValue + + ", newMinimumExclusiveValue=" + + newMinimumExclusiveValue + + ", oldMaximumExclusiveValue=" + + oldMaximumExclusiveValue + + ", newMaximumExclusiveValue=" + + newMaximumExclusiveValue + + ", context=" + + context + + ')'; + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java index ce233ed8b..6e4cd9303 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java @@ -5,11 +5,87 @@ import org.junit.jupiter.api.Test; public class ParameterDiffTest { - private final String OPENAPI_DOC1 = "parameters_diff_1.yaml"; - private final String OPENAPI_DOC2 = "parameters_diff_2.yaml"; @Test public void testDiffDifferent() { - assertOpenApiChangedEndpoints(OPENAPI_DOC1, OPENAPI_DOC2); + assertOpenApiChangedEndpoints("parameters_diff_1.yaml", "parameters_diff_2.yaml"); + } + + @Test + public void issue458MaximumDecreased() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_2.yaml"); + } + + @Test + public void issue458MaximumIncreased() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_3.yaml"); + } + + @Test + public void issue458MinimumDecreased() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_4.yaml"); + } + + @Test + public void issue458MinimumIncreased() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_5.yaml"); + } + + @Test + public void issue458IntegerFormatChanged() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_6.yaml"); + } + + @Test + public void issue458ExclusiveMinimumChanged() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_7.yaml"); + } + + @Test + public void issue458ExclusiveMaximumChanged() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_8.yaml"); + } + + @Test + public void issue458ExclusiveMinimumRemoved() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_9.yaml"); + } + + @Test + public void issue458ExclusiveMaximumRemoved() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_10.yaml"); + } + + @Test + public void issue458ExclusiveMaximumTrueToFalse() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_12.yaml"); + } + + @Test + public void issue458ExclusiveMinimumTrueToFalse() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_13.yaml"); + } + + @Test + public void issue458ExclusiveMaximumTrueRemoved() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_12.yaml"); + } + + @Test + public void issue458ExclusiveMinimumTrueRemoved() { + assertOpenApiChangedEndpoints( + "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_13.yaml"); } } diff --git a/core/src/test/resources/issue-458-integer-limits_1.yaml b/core/src/test/resources/issue-458-integer-limits_1.yaml new file mode 100644 index 000000000..16b769d5b --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_1.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: false + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_10.yaml b/core/src/test/resources/issue-458-integer-limits_10.yaml new file mode 100644 index 000000000..e704c4f9c --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_10.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_11.yaml b/core/src/test/resources/issue-458-integer-limits_11.yaml new file mode 100644 index 000000000..ea16b71a9 --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_11.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_12.yaml b/core/src/test/resources/issue-458-integer-limits_12.yaml new file mode 100644 index 000000000..1c410a34d --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_12.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: true + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_13.yaml b/core/src/test/resources/issue-458-integer-limits_13.yaml new file mode 100644 index 000000000..896a9c32e --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_13.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: false + exclusiveMaximum: true + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_14.yaml b/core/src/test/resources/issue-458-integer-limits_14.yaml new file mode 100644 index 000000000..7fa4e1f50 --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_14.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: true + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_15.yaml b/core/src/test/resources/issue-458-integer-limits_15.yaml new file mode 100644 index 000000000..9bd90be6f --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_15.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMaximum: true + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_2.yaml b/core/src/test/resources/issue-458-integer-limits_2.yaml new file mode 100644 index 000000000..55c1c1983 --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_2.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 99 + exclusiveMinimum: false + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_3.yaml b/core/src/test/resources/issue-458-integer-limits_3.yaml new file mode 100644 index 000000000..f30ef6501 --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_3.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 101 + exclusiveMinimum: false + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_4.yaml b/core/src/test/resources/issue-458-integer-limits_4.yaml new file mode 100644 index 000000000..91cc048c2 --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_4.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 9 + maximum: 100 + exclusiveMinimum: false + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_5.yaml b/core/src/test/resources/issue-458-integer-limits_5.yaml new file mode 100644 index 000000000..4881d7fd9 --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_5.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 11 + maximum: 100 + exclusiveMinimum: false + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_6.yaml b/core/src/test/resources/issue-458-integer-limits_6.yaml new file mode 100644 index 000000000..dbcaa9bed --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_6.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int64 + minimum: 10 + maximum: 100 + exclusiveMinimum: false + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_7.yaml b/core/src/test/resources/issue-458-integer-limits_7.yaml new file mode 100644 index 000000000..1c410a34d --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_7.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: true + exclusiveMaximum: false + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_8.yaml b/core/src/test/resources/issue-458-integer-limits_8.yaml new file mode 100644 index 000000000..896a9c32e --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_8.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: false + exclusiveMaximum: true + responses: + '200': + description: OK diff --git a/core/src/test/resources/issue-458-integer-limits_9.yaml b/core/src/test/resources/issue-458-integer-limits_9.yaml new file mode 100644 index 000000000..8dbf0cd3e --- /dev/null +++ b/core/src/test/resources/issue-458-integer-limits_9.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + Description + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /int-limits: + get: + summary: get int + description: 'description' + operationId: getInt + parameters: + - name: int + in: query + required: true + schema: + type: integer + format: int32 + minimum: 10 + maximum: 100 + exclusiveMinimum: false + responses: + '200': + description: OK From 7673a1622bc78756b71da3ca14c693b9d00b2c01 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Sun, 26 Feb 2023 11:36:37 +0100 Subject: [PATCH 108/313] Add Maven `skip` property to skip execution (#471) Closes #445 --- maven/pom.xml | 5 +++++ .../openapidiff/maven/OpenApiDiffMojo.java | 8 ++++++++ .../openapidiff/maven/OpenApiDiffMojoTest.java | 11 +++++++++++ pom.xml | 5 +++++ 4 files changed, 29 insertions(+) diff --git a/maven/pom.xml b/maven/pom.xml index d9ebcaa32..12b2b729d 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -43,6 +43,11 @@ <artifactId>junit-jupiter</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java index 900410420..04d127889 100644 --- a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java +++ b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java @@ -25,8 +25,16 @@ public class OpenApiDiffMojo extends AbstractMojo { @Parameter(property = "failOnChanged", defaultValue = "false") Boolean failOnChanged = false; + @Parameter(property = "skip", defaultValue = "false") + Boolean skip = false; + @Override public void execute() throws MojoExecutionException, MojoFailureException { + if(Boolean.TRUE.equals(skip)) { + getLog().info("Skipping openapi-diff execution"); + return; + } + try { final ChangedOpenApi diff = OpenApiCompare.fromLocations(oldSpec, newSpec); getLog().info(new ConsoleRender().render(diff)); diff --git a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java index 5ecc457e5..7deae4233 100644 --- a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java +++ b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java @@ -75,4 +75,15 @@ void Should_BackwardIncompatibilityException_When_WantsExceptionAndSpecIsIncompa assertThrows(BackwardIncompatibilityException.class, mojo::execute); } + + @Test + void Should_Skip_Mojo_WhenSkipIsTrue() { + final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); + mojo.oldSpec = new File("src/test/resources/newspec.yaml").getAbsolutePath(); + mojo.newSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); + mojo.failOnIncompatible = true; + mojo.skip = true; + + assertDoesNotThrow(mojo::execute); + } } diff --git a/pom.xml b/pom.xml index d96c54b66..07d0e721f 100644 --- a/pom.xml +++ b/pom.xml @@ -146,6 +146,11 @@ <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <version>${slf4j.version}</version> + </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> From bbac5969ecca7f908fd0626d4ade3797010afbe0 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Sun, 26 Feb 2023 11:40:40 +0100 Subject: [PATCH 109/313] Remove duplicate declaration of slf4j-simple --- pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pom.xml b/pom.xml index 07d0e721f..71ee7c3b5 100644 --- a/pom.xml +++ b/pom.xml @@ -162,12 +162,6 @@ <version>3.24.2</version> <scope>test</scope> </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-simple</artifactId> - <version>${slf4j.version}</version> - <scope>test</scope> - </dependency> </dependencies> </dependencyManagement> From 6bba31e019bc73b7a10a773aba5e3cc1d5ba6801 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Sun, 26 Feb 2023 11:41:06 +0100 Subject: [PATCH 110/313] Code format --- .../org/openapitools/openapidiff/maven/OpenApiDiffMojo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java index 04d127889..7b1e679d4 100644 --- a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java +++ b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java @@ -30,7 +30,7 @@ public class OpenApiDiffMojo extends AbstractMojo { @Override public void execute() throws MojoExecutionException, MojoFailureException { - if(Boolean.TRUE.equals(skip)) { + if (Boolean.TRUE.equals(skip)) { getLog().info("Skipping openapi-diff execution"); return; } From d6383f3a70423c7abbcdb5b50a05619c9ea6fba7 Mon Sep 17 00:00:00 2001 From: Justinas Bardauskas <39775336+justinasbardauskas@users.noreply.github.com> Date: Sun, 26 Feb 2023 12:46:21 +0200 Subject: [PATCH 111/313] After specs comparison, all parameters are removed (#454) Co-authored-by: justinas.bardauskas <justinas.bardauskas@multitude.com> Co-authored-by: Jochen Schalanda <jochen@schalanda.name> --- .../core/compare/ParametersDiff.java | 36 ++++++++------- .../openapidiff/core/OpenApiDiffTest.java | 44 +++++++++++++++++++ .../openapidiff/core/PathDiffTest.java | 13 ++---- 3 files changed, 67 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java index d01a555b9..c12eeaf94 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java @@ -3,6 +3,7 @@ import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.parameters.Parameter; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -28,6 +29,7 @@ public ParametersDiffResult( } /** compare two parameter */ public class ParametersDiff { + private static final RefPointer<Parameter> refPointer = new RefPointer<>(RefType.PARAMETERS); private final Components leftComponents; @@ -59,28 +61,28 @@ public static boolean same(Parameter left, Parameter right) { } public ParametersDiffResult diff( - List<Parameter> left, List<Parameter> right, DiffContext context) { - DeferredBuilder<Changed> builder = new DeferredBuilder<>(); - ChangedParameters changedParameters = - new ChangedParameters(left, right != null ? new ArrayList<>(right) : null, context); - if (null == left) left = new ArrayList<>(); - if (null == right) right = new ArrayList<>(); - - for (Parameter leftPara : left) { - leftPara = refPointer.resolveRef(leftComponents, leftPara, leftPara.get$ref()); - - Optional<Parameter> rightParam = contains(rightComponents, right, leftPara); - if (!rightParam.isPresent()) { - changedParameters.getMissing().add(leftPara); + final List<Parameter> left, final List<Parameter> right, final DiffContext context) { + final DeferredBuilder<Changed> builder = new DeferredBuilder<>(); + final List<Parameter> wLeft = Optional.ofNullable(left).orElseGet(Collections::emptyList); + final List<Parameter> wRight = + Optional.ofNullable(right).map(ArrayList::new).orElseGet(ArrayList::new); + + final ChangedParameters changedParameters = new ChangedParameters(wLeft, wRight, context); + + for (Parameter leftParam : wLeft) { + leftParam = refPointer.resolveRef(leftComponents, leftParam, leftParam.get$ref()); + Optional<Parameter> rightParamOpt = contains(rightComponents, wRight, leftParam); + if (!rightParamOpt.isPresent()) { + changedParameters.getMissing().add(leftParam); } else { - Parameter rightPara = rightParam.get(); - right.remove(rightPara); + Parameter rightParam = rightParamOpt.get(); + wRight.remove(rightParam); builder - .with(openApiDiff.getParameterDiff().diff(leftPara, rightPara, context)) + .with(openApiDiff.getParameterDiff().diff(leftParam, rightParam, context)) .ifPresent(changedParameters.getChanged()::add); } } - changedParameters.getIncreased().addAll(right); + changedParameters.getIncreased().addAll(wRight); return new ParametersDiffResult( builder.buildIsChanged(changedParameters), pathUnchangedParametersChanged(changedParameters, context)); diff --git a/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java index 88ac57b11..2d52392fe 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java @@ -3,6 +3,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; +import io.swagger.parser.OpenAPIParser; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.parser.core.models.ParseOptions; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Path; @@ -11,6 +14,7 @@ import org.junit.jupiter.api.io.TempDir; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.model.ChangedOperation; +import org.openapitools.openapidiff.core.model.DiffResult; import org.openapitools.openapidiff.core.model.Endpoint; import org.openapitools.openapidiff.core.output.HtmlRender; import org.openapitools.openapidiff.core.output.JsonRender; @@ -21,6 +25,9 @@ public class OpenApiDiffTest { private final String OPENAPI_DOC1 = "petstore_v2_1.yaml"; private final String OPENAPI_DOC2 = "petstore_v2_2.yaml"; private final String OPENAPI_EMPTY_DOC = "petstore_v2_empty.yaml"; + private final String OPENAPI_DOC3 = "petstore_openapi3.yaml"; + + private static final OpenAPIParser PARSER = new OpenAPIParser(); @Test public void testEqual() { @@ -104,4 +111,41 @@ public void testDiffAndJson(@TempDir Path tempDir) throws IOException { } assertThat(path).isNotEmptyFile(); } + + /** Testing that repetitive specs comparisons has to produce consistent result. */ + @Test + public void testComparisonConsistency() { + final OpenAPI oldSpec = loadSpecFromFile(OPENAPI_DOC3); + final OpenAPI newSpec = loadSpecFromFile(OPENAPI_DOC3); + + final ChangedOpenApi diff1 = OpenApiCompare.fromSpecifications(oldSpec, newSpec); + assertThat(diff1.isChanged()).isEqualTo(DiffResult.NO_CHANGES); + assertThat(diff1.getNewEndpoints()).isEmpty(); + assertThat(diff1.getMissingEndpoints()).isEmpty(); + assertThat(diff1.getChangedOperations()).isEmpty(); + + final ChangedOpenApi diff2 = OpenApiCompare.fromSpecifications(oldSpec, newSpec); + assertThat(diff2.isChanged()).isEqualTo(DiffResult.NO_CHANGES); + assertThat(diff2.getNewEndpoints()).isEmpty(); + assertThat(diff2.getMissingEndpoints()).isEmpty(); + assertThat(diff2.getChangedOperations()).isEmpty(); + } + + @Test + public void testSpecObjectsAreNotChangesAfterComparison() { + final OpenAPI oldSpec = loadSpecFromFile(OPENAPI_DOC3); + final OpenAPI newSpec = loadSpecFromFile(OPENAPI_DOC3); + + OpenApiCompare.fromSpecifications(oldSpec, newSpec); + OpenApiCompare.fromSpecifications(oldSpec, newSpec); + + final OpenAPI expectedOldSpec = loadSpecFromFile(OPENAPI_DOC3); + final OpenAPI expectedNewSpec = loadSpecFromFile(OPENAPI_DOC3); + assertThat(oldSpec).isEqualTo(expectedOldSpec); + assertThat(newSpec).isEqualTo(expectedNewSpec); + } + + private static OpenAPI loadSpecFromFile(String specFile) { + return PARSER.readLocation(specFile, null, new ParseOptions()).getOpenAPI(); + } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java index a20d20f64..858ef520e 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/PathDiffTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.fail; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; import org.junit.jupiter.api.Test; @@ -42,13 +41,9 @@ public void testSameTemplateDifferentMethods() { @Test public void testDiffWithSimilarBeginningPaths() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_PATH5, OPENAPI_PATH6); - try { - ChangedOpenApi diff = - OpenApiCompare.fromSpecifications( - changedOpenApi.getOldSpecOpenApi(), changedOpenApi.getNewSpecOpenApi()); - assertThat(diff.getChangedOperations()).hasSize(4); - } catch (IllegalArgumentException e) { - fail(e.getMessage()); - } + ChangedOpenApi diff = + OpenApiCompare.fromSpecifications( + changedOpenApi.getOldSpecOpenApi(), changedOpenApi.getNewSpecOpenApi()); + assertThat(diff.getChangedOperations()).isEmpty(); } } From d06bc4450354ba1797a490d1b13ed5964d4de28b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:10:27 +0100 Subject: [PATCH 112/313] build(deps): bump maven-plugin-plugin from 3.7.1 to 3.8.1 (#473) Bumps [maven-plugin-plugin](https://github.com/apache/maven-plugin-tools) from 3.7.1 to 3.8.1. - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.7.1...maven-plugin-tools-3.8.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-plugin-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index 12b2b729d..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -56,7 +56,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> - <version>3.7.1</version> + <version>3.8.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 8b5afa6a4343db6117060e7ddd1933bafd9afb51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:10:42 +0100 Subject: [PATCH 113/313] build(deps): bump maven-compiler-plugin from 3.10.1 to 3.11.0 (#472) Bumps [maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.10.1 to 3.11.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.10.1...maven-compiler-plugin-3.11.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 71ee7c3b5..9343b8f7c 100644 --- a/pom.xml +++ b/pom.xml @@ -273,7 +273,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.10.1</version> + <version>3.11.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 8fe1b8c84faf336f17ff699828134dfb5fabad1f Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Tue, 28 Feb 2023 20:47:38 +0000 Subject: [PATCH 114/313] [maven-release-plugin] prepare release 2.1.0-beta.5 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..299858a60 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.5</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 50b8ce87d..2e66be212 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.5</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 46d9dda3b..bca0bfcad 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.5</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.5</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..c0fcd3a95 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.5</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 9343b8f7c..716a374db 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.5</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.5</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2022-10-24T20:29:12Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-02-28T20:46:47Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.5</version> </dependency> <dependency> <groupId>org.junit</groupId> From 413664fe5281378d0ca8f553e61573189a08fd97 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Tue, 28 Feb 2023 20:47:43 +0000 Subject: [PATCH 115/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 299858a60..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.5</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 2e66be212..50b8ce87d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.5</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index bca0bfcad..46d9dda3b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.5</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.5</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index c0fcd3a95..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.5</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 716a374db..22c9a92bf 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.5</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.5</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-02-28T20:46:47Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-02-28T20:47:43Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.5</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From 1b47f6c2606357d7edb029014dfa7507be533961 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 11:10:48 +0100 Subject: [PATCH 116/313] build(deps): bump maven-surefire-plugin from 2.22.2 to 3.0.0 (#491) Bumps [maven-surefire-plugin](https://github.com/apache/maven-surefire) from 2.22.2 to 3.0.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-2.22.2...surefire-3.0.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 22c9a92bf..9c1c8aabe 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>2.22.2</version> + <version>3.0.0</version> </plugin> <plugin> <groupId>com.coveo</groupId> From eadb601a671f317d0207be3c2172afa2b8a946b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 11:03:09 +0100 Subject: [PATCH 117/313] build(deps): bump slf4j.version from 2.0.6 to 2.0.7 (#494) Bumps `slf4j.version` from 2.0.6 to 2.0.7. Updates `slf4j-api` from 2.0.6 to 2.0.7 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/commits) Updates `jcl-over-slf4j` from 2.0.6 to 2.0.7 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/commits) Updates `slf4j-simple` from 2.0.6 to 2.0.7 - [Release notes](https://github.com/qos-ch/slf4j/releases) - [Commits](https://github.com/qos-ch/slf4j/commits) --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9c1c8aabe..5755f4b3d 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.12</swagger-parser.version> - <slf4j.version>2.0.6</slf4j.version> + <slf4j.version>2.0.7</slf4j.version> </properties> <dependencyManagement> From 6d505f140a50db029e6398c64c5c1793a4c401a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 11:03:19 +0100 Subject: [PATCH 118/313] build(deps): bump maven-release-plugin from 3.0.0-M7 to 3.0.0 (#493) Bumps [maven-release-plugin](https://github.com/apache/maven-release) from 3.0.0-M7 to 3.0.0. - [Release notes](https://github.com/apache/maven-release/releases) - [Commits](https://github.com/apache/maven-release/compare/maven-release-3.0.0-M7...maven-release-3.0.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-release-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5755f4b3d..a9a17e22e 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>3.0.0-M7</version> + <version>3.0.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 054228d2586f43a79011a66a2427a28ccbb7f53f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 22:03:44 +0100 Subject: [PATCH 119/313] build(deps): bump maven-deploy-plugin from 3.1.0 to 3.1.1 (#496) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a9a17e22e..74d26b46a 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> - <version>3.1.0</version> + <version>3.1.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From ee94c6523efeae4f3946155ce617c0f328b5c9ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:09:44 +0200 Subject: [PATCH 120/313] build(deps): bump swagger-parser.version from 2.1.12 to 2.1.13 (#499) Bumps `swagger-parser.version` from 2.1.12 to 2.1.13. Updates `swagger-parser-v3` from 2.1.12 to 2.1.13 Updates `swagger-parser` from 2.1.12 to 2.1.13 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.12...v2.1.13) Updates `swagger-parser-v2-converter` from 2.1.12 to 2.1.13 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 74d26b46a..16add1e94 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.12</swagger-parser.version> + <swagger-parser.version>2.1.13</swagger-parser.version> <slf4j.version>2.0.7</slf4j.version> </properties> From 86479ed0ce3429b3c6f980c22a16429353653b76 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Mon, 27 Mar 2023 21:16:22 +0000 Subject: [PATCH 121/313] [maven-release-plugin] prepare release 2.1.0-beta.6 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..e34815a83 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.6</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 50b8ce87d..7283ac345 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.6</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 46d9dda3b..0e68cbe1b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.6</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.6</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..5577b21a9 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.6</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 16add1e94..d64d402f3 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.6</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.6</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-02-28T20:47:43Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-03-27T21:15:30Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.6</version> </dependency> <dependency> <groupId>org.junit</groupId> From 71b53ae8a35ef6e813c96cb0b03ab09ada676b7b Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Mon, 27 Mar 2023 21:16:27 +0000 Subject: [PATCH 122/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index e34815a83..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.6</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 7283ac345..50b8ce87d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.6</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 0e68cbe1b..46d9dda3b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.6</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.6</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 5577b21a9..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.6</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index d64d402f3..12b1b063d 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.6</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.6</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-03-27T21:15:30Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-03-27T21:16:27Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.6</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From 2e3853adc68a2a0bab7029eb924bb03cb32c5315 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:12:09 +0200 Subject: [PATCH 123/313] build(deps): bump cyclonedx-maven-plugin from 2.7.5 to 2.7.6 (#505) Bumps [cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.5 to 2.7.6. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.5...cyclonedx-maven-plugin-2.7.6) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 12b1b063d..e02cfc34e 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.5</version> + <version>2.7.6</version> </plugin> </plugins> </pluginManagement> From 1de574d3ca447bc463740bc10c37851702974a00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:12:17 +0200 Subject: [PATCH 124/313] build(deps): bump jacoco-maven-plugin from 0.8.8 to 0.8.9 (#504) Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.8 to 0.8.9. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.8...v0.8.9) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e02cfc34e..8feb003a0 100644 --- a/pom.xml +++ b/pom.xml @@ -334,7 +334,7 @@ <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> - <version>0.8.8</version> + <version>0.8.9</version> </plugin> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> From 24ce7c17edafae080d56cef585693d1d3cbb728b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Apr 2023 20:56:37 +0200 Subject: [PATCH 125/313] build(deps): bump logback-classic from 1.3.0 to 1.3.7 (#509) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jochen Schalanda <jochen@schalanda.name> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8feb003a0..56c0b1375 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.3.0</version> + <version>1.3.7</version> </dependency> <dependency> <groupId>org.assertj</groupId> From 40643d0ecb811123ae33d90bf52b3db8ba557758 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Apr 2023 20:56:54 +0200 Subject: [PATCH 126/313] build(deps): bump cyclonedx-maven-plugin from 2.7.6 to 2.7.7 (#507) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56c0b1375..b68759ee4 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.6</version> + <version>2.7.7</version> </plugin> </plugins> </pluginManagement> From bcaadb8a2a2c682fe164b97485323b0b34b9f77e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 16:11:37 +0200 Subject: [PATCH 127/313] build(deps): bump jacoco-maven-plugin from 0.8.9 to 0.8.10 (#513) Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.9 to 0.8.10. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.9...v0.8.10) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b68759ee4..b3df58b0e 100644 --- a/pom.xml +++ b/pom.xml @@ -334,7 +334,7 @@ <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> - <version>0.8.9</version> + <version>0.8.10</version> </plugin> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> From fa8ee3fc7e64733ecf5bc6ad8ab8c1776fd6c796 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 16:11:42 +0200 Subject: [PATCH 128/313] build(deps): bump junit-bom from 5.9.2 to 5.9.3 (#514) Bumps [junit-bom](https://github.com/junit-team/junit5) from 5.9.2 to 5.9.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.9.2...r5.9.3) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b3df58b0e..4e0d82ef5 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.9.2</version> + <version>5.9.3</version> <type>pom</type> <scope>import</scope> </dependency> From ac77ac9cf4fc1b04cda99a5737b909cfeb622d84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 16:11:52 +0200 Subject: [PATCH 129/313] build(deps): bump cyclonedx-maven-plugin from 2.7.7 to 2.7.8 (#515) Bumps [cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.7 to 2.7.8. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.7...cyclonedx-maven-plugin-2.7.8) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4e0d82ef5..cab269441 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.7</version> + <version>2.7.8</version> </plugin> </plugins> </pluginManagement> From bca0885246ce8bbfa5eed00da67154a541a6e46a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 12:05:00 +0200 Subject: [PATCH 130/313] build(deps): bump maven-gpg-plugin from 3.0.1 to 3.1.0 (#518) Bumps [maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.0.1 to 3.1.0. - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.0.1...maven-gpg-plugin-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cab269441..6a8b22245 100644 --- a/pom.xml +++ b/pom.xml @@ -313,7 +313,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.0.1</version> + <version>3.1.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 12e44553c253b18b9981db0f335ecc291e5724f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 12:05:07 +0200 Subject: [PATCH 131/313] build(deps): bump maven-surefire-plugin from 3.0.0 to 3.1.0 (#519) Bumps [maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.0.0...surefire-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a8b22245..9e09e1c3a 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.0.0</version> + <version>3.1.0</version> </plugin> <plugin> <groupId>com.coveo</groupId> From 9f6bd3f9717072f293164cc54b0985cce2e4b432 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:59:34 +0200 Subject: [PATCH 132/313] build(deps): bump cyclonedx-maven-plugin from 2.7.8 to 2.7.9 (#524) Bumps [cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.8 to 2.7.9. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.8...cyclonedx-maven-plugin-2.7.9) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9e09e1c3a..76f2d173e 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.8</version> + <version>2.7.9</version> </plugin> </plugins> </pluginManagement> From 84c8b2f92ee7e7aef915a92f1a459ff93ebbd2d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 13:59:44 +0200 Subject: [PATCH 133/313] build(deps): bump swagger-parser.version from 2.1.13 to 2.1.14 (#521) Bumps `swagger-parser.version` from 2.1.13 to 2.1.14. Updates `swagger-parser-v3` from 2.1.13 to 2.1.14 Updates `swagger-parser` from 2.1.13 to 2.1.14 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.13...v2.1.14) Updates `swagger-parser-v2-converter` from 2.1.13 to 2.1.14 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 76f2d173e..28254fb3a 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.13</swagger-parser.version> + <swagger-parser.version>2.1.14</swagger-parser.version> <slf4j.version>2.0.7</slf4j.version> </properties> From df52a1e9db740321224d4a84bd9fa4affb912807 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 21:37:39 +0200 Subject: [PATCH 134/313] build(deps): bump maven-source-plugin from 3.2.1 to 3.3.0 (#526) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 28254fb3a..4aa428a5a 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> - <version>3.2.1</version> + <version>3.3.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 364d806f093398ddb56fbf70f1244e73556d1e3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 16:34:00 +0200 Subject: [PATCH 135/313] build(deps): bump swagger-parser.version from 2.1.14 to 2.1.15 (#527) Bumps `swagger-parser.version` from 2.1.14 to 2.1.15. Updates `swagger-parser-v3` from 2.1.14 to 2.1.15 Updates `swagger-parser` from 2.1.14 to 2.1.15 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.14...v2.1.15) Updates `swagger-parser-v2-converter` from 2.1.14 to 2.1.15 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4aa428a5a..85b029703 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.14</swagger-parser.version> + <swagger-parser.version>2.1.15</swagger-parser.version> <slf4j.version>2.0.7</slf4j.version> </properties> From c9aeb7baea34fbaa12e32c387c6f871d7fa10d03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 15:00:06 +0200 Subject: [PATCH 136/313] build(deps): bump maven-release-plugin from 3.0.0 to 3.0.1 (#529) Bumps [maven-release-plugin](https://github.com/apache/maven-release) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/apache/maven-release/releases) - [Commits](https://github.com/apache/maven-release/compare/maven-release-3.0.0...maven-release-3.0.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-release-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 85b029703..5be6bc614 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>3.0.0</version> + <version>3.0.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From e1d436a1b12b469643708d86eb0c835f39d81baa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jun 2023 23:17:54 +0200 Subject: [PATCH 137/313] build(deps): bump maven-surefire-plugin from 3.1.0 to 3.1.2 (#530) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5be6bc614..df6ddd93b 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.1.0</version> + <version>3.1.2</version> </plugin> <plugin> <groupId>com.coveo</groupId> From c36e47bc9b5885716a6ad889715fb788e93c27e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 07:27:44 +0200 Subject: [PATCH 138/313] build(deps): bump logback-classic from 1.3.7 to 1.3.8 (#531) * build(deps): bump logback-classic from 1.3.7 to 1.4.8 Bumps [logback-classic](https://github.com/qos-ch/logback) from 1.3.7 to 1.4.8. - [Commits](https://github.com/qos-ch/logback/compare/v_1.3.7...v_1.4.8) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Upgrade to Logback 1.3.8 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jochen Schalanda <jochen@schalanda.name> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index df6ddd93b..f0613534e 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.3.7</version> + <version>1.3.8</version> </dependency> <dependency> <groupId>org.assertj</groupId> From 431b81dd047f2346f5a3f04137bd9cad9e4798e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 09:22:21 +0200 Subject: [PATCH 139/313] build(deps): bump maven-shade-plugin from 3.4.1 to 3.5.0 (#533) Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.4.1 to 3.5.0. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.4.1...maven-shade-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f0613534e..a25365466 100644 --- a/pom.xml +++ b/pom.xml @@ -323,7 +323,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.4.1</version> + <version>3.5.0</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From fa2b18f5e9e033bbd525dfc516cc16be153f1d94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 14:19:51 +0200 Subject: [PATCH 140/313] build(deps): bump swagger-parser.version from 2.1.15 to 2.1.16 (#536) Bumps `swagger-parser.version` from 2.1.15 to 2.1.16. Updates `swagger-parser-v3` from 2.1.15 to 2.1.16 Updates `swagger-parser` from 2.1.15 to 2.1.16 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.15...v2.1.16) Updates `swagger-parser-v2-converter` from 2.1.15 to 2.1.16 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a25365466..290c81f22 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.15</swagger-parser.version> + <swagger-parser.version>2.1.16</swagger-parser.version> <slf4j.version>2.0.7</slf4j.version> </properties> From e3cedbdf192debb02aeb7f36894eb3f32044c7c9 Mon Sep 17 00:00:00 2001 From: westse <10818305+westse@users.noreply.github.com> Date: Fri, 30 Jun 2023 08:58:12 -0600 Subject: [PATCH 141/313] Use Maven wrapper in pre-commit hook (#540) Closes #539 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 290c81f22..04879e4e2 100644 --- a/pom.xml +++ b/pom.xml @@ -381,7 +381,7 @@ <skipRepositoryCheck>true</skipRepositoryCheck> <hooks> <pre-commit> - mvn com.coveo:fmt-maven-plugin:format + ./mvnw com.coveo:fmt-maven-plugin:format </pre-commit> </hooks> </configuration> From c0fa0fe6ff1400ccd5cd04c89fb425919b8d4252 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jul 2023 11:34:27 +0200 Subject: [PATCH 142/313] build(deps): bump org.junit:junit-bom from 5.9.3 to 5.10.0 (#548) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.9.3 to 5.10.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.9.3...r5.10.0) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 04879e4e2..f25d729fa 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.9.3</version> + <version>5.10.0</version> <type>pom</type> <scope>import</scope> </dependency> From 5a54a6a98897795d7d5efb2031d35fec1e29250a Mon Sep 17 00:00:00 2001 From: westse <10818305+westse@users.noreply.github.com> Date: Tue, 25 Jul 2023 13:39:48 -0600 Subject: [PATCH 143/313] Improve backward-compatibility testing (#546) - Attempts to be exhaustive on backward-compatibility coverage to raise confidence that future refactors will not introduce unintended regressions. - Each incompatible condition is tested separately by comparing two spec files where the only difference is that fine-grained incompatible condition. - In some cases the current behavior appears incorrect. Tests are still added for these to avoid unintended regression, but are given TODO comments for later follow-up. - Pre-existing tests have been removed if they are redundant to avoid confusion and to follow the convention. Closes #545 --- .../core/model/ChangedSecurityScheme.java | 7 + .../core/BackwardCompatibilityTest.java | 49 ------ .../openapidiff/core/TestUtils.java | 15 ++ .../core/backcompat/ApiResponseBCTest.java | 26 +++ .../core/backcompat/ContentBCTest.java | 31 ++++ .../core/backcompat/EnumBCTest.java | 31 ++++ .../core/backcompat/HeaderBCTest.java | 37 ++++ .../core/backcompat/HeadersBCTest.java | 26 +++ .../core/backcompat/MaxLengthBCTest.java | 25 +++ .../core/backcompat/NumericRangeBCTest.java | 114 ++++++++++++ .../core/backcompat/OAuthFlowBCTest.java | 30 ++++ .../core/backcompat/OneOfBCTest.java | 31 ++++ .../core/backcompat/OpenApiBCTest.java | 26 +++ .../core/backcompat/OperationBCTest.java | 20 +++ .../core/backcompat/ParameterBCTest.java | 41 +++++ .../core/backcompat/ParametersBCTest.java | 31 ++++ .../core/backcompat/PathBCTest.java | 26 +++ .../core/backcompat/PathsBCTest.java | 26 +++ .../core/backcompat/ReadOnlyBCTest.java | 32 ++++ .../core/backcompat/RequestBodyBCTest.java | 20 +++ .../core/backcompat/RequiredBCTest.java | 32 ++++ .../core/backcompat/SchemaBCTest.java | 65 +++++++ .../backcompat/SecurityRequirementBCTest.java | 24 +++ .../SecurityRequirementsBCTest.java | 38 ++++ .../core/backcompat/SecuritySchemeBCTest.java | 51 ++++++ .../core/backcompat/WriteOnlyBCTest.java | 32 ++++ .../core/compare/ApiResponseDiffTest.java | 27 --- .../apiResponse_diff_1.yaml | 7 - .../apiResponse_diff_2.yaml | 15 -- .../resources/backwardCompatibility/bc_1.yaml | 132 -------------- .../resources/backwardCompatibility/bc_2.yaml | 150 ---------------- .../resources/backwardCompatibility/bc_3.yaml | 163 ------------------ .../resources/backwardCompatibility/bc_4.yaml | 155 ----------------- .../resources/backwardCompatibility/bc_5.yaml | 131 -------------- core/src/test/resources/bc_content_base.yaml | 29 ++++ .../bc_content_changed_but_compatible.yaml | 35 ++++ core/src/test/resources/bc_enum_base.yaml | 33 ++++ .../bc_enum_changed_but_compatible.yaml | 33 ++++ .../src/test/resources/bc_maxlength_base.yaml | 29 ++++ .../test/resources/bc_numericrange_base.yaml | 55 ++++++ ...c_numericrange_changed_but_compatible.yaml | 57 ++++++ ...c_oauthflow_authorization_url_changed.yaml | 28 +++ .../src/test/resources/bc_oauthflow_base.yaml | 28 +++ .../bc_oauthflow_refresh_url_changed.yaml | 28 +++ .../bc_oauthflow_token_url_changed.yaml | 28 +++ core/src/test/resources/bc_oneof_base.yaml | 48 ++++++ .../bc_oneof_changed_but_compatible.yaml | 48 ++++++ core/src/test/resources/bc_openapi_base.yaml | 25 +++ .../bc_openapi_changed_but_compatible.yaml | 35 ++++ .../bc_openapi_endpoints_decreased.yaml | 16 ++ .../src/test/resources/bc_operation_base.yaml | 16 ++ .../bc_operation_changed_but_compatible.yaml | 17 ++ core/src/test/resources/bc_path_base.yaml | 25 +++ .../bc_path_changed_but_compatible.yaml | 34 ++++ .../test/resources/bc_path_ops_decreased.yaml | 16 ++ core/src/test/resources/bc_paths_base.yaml | 26 +++ .../bc_paths_changed_but_compatible.yaml | 36 ++++ .../test/resources/bc_paths_decreased.yaml | 16 ++ core/src/test/resources/bc_readonly_base.yaml | 33 ++++ .../bc_readonly_changed_but_compatible.yaml | 32 ++++ .../test/resources/bc_request_body_base.yaml | 21 +++ .../bc_request_body_required_changed.yaml | 22 +++ .../bc_request_content_decreased.yaml | 26 +++ .../resources/bc_request_enum_decreased.yaml | 32 ++++ .../bc_request_maxlength_decreased.yaml | 30 ++++ ...st_numericrange_exclusive_max_created.yaml | 56 ++++++ ...equest_numericrange_exclusive_max_set.yaml | 55 ++++++ ...st_numericrange_exclusive_min_created.yaml | 56 ++++++ ...equest_numericrange_exclusive_min_set.yaml | 55 ++++++ .../bc_request_numericrange_max_added.yaml | 56 ++++++ ...bc_request_numericrange_max_decreased.yaml | 55 ++++++ .../bc_request_numericrange_min_added.yaml | 56 ++++++ ...bc_request_numericrange_min_increased.yaml | 55 ++++++ .../resources/bc_request_oneof_decreased.yaml | 47 +++++ ...quest_param_allowemptyvalue_decreased.yaml | 28 +++ .../test/resources/bc_request_param_base.yaml | 29 ++++ ..._request_param_changed_but_compatible.yaml | 30 ++++ .../bc_request_param_explode_changed.yaml | 30 ++++ .../bc_request_param_required_increased.yaml | 30 ++++ .../bc_request_param_style_changed.yaml | 30 ++++ .../resources/bc_request_params_base.yaml | 26 +++ ...request_params_changed_but_compatible.yaml | 30 ++++ .../bc_request_params_decreased.yaml | 22 +++ .../bc_request_params_required_increased.yaml | 31 ++++ .../bc_request_readonly_increased.yaml | 34 ++++ ...c_request_readonly_required_decreased.yaml | 32 ++++ .../bc_request_required_increased.yaml | 42 +++++ .../bc_request_schema_format_decreased.yaml | 115 ++++++++++++ .../bc_request_schema_format_increased.yaml | 115 ++++++++++++ ...bc_request_schema_props_put_increased.yaml | 117 +++++++++++++ core/src/test/resources/bc_required_base.yaml | 41 +++++ .../bc_required_changed_but_compatible.yaml | 41 +++++ .../bc_response_apiresponse_base.yaml | 18 ++ ...se_apiresponse_changed_but_compatible.yaml | 22 +++ .../bc_response_apiresponse_decreased.yaml | 16 ++ .../bc_response_content_decreased.yaml | 26 +++ .../resources/bc_response_enum_increased.yaml | 34 ++++ .../resources/bc_response_header_base.yaml | 21 +++ .../bc_response_header_deprecated.yaml | 22 +++ .../resources/bc_response_header_explode.yaml | 22 +++ .../bc_response_header_required_added.yaml | 22 +++ .../bc_response_header_required_deleted.yaml | 20 +++ .../resources/bc_response_headers_base.yaml | 21 +++ .../bc_response_headers_increased.yaml | 24 +++ .../bc_response_headers_missing.yaml | 18 ++ .../bc_response_maxlength_increased.yaml | 30 ++++ ...se_numericrange_exclusive_max_deleted.yaml | 54 ++++++ ...onse_numericrange_exclusive_max_unset.yaml | 55 ++++++ ...se_numericrange_exclusive_min_deleted.yaml | 54 ++++++ ...onse_numericrange_exclusive_min_unset.yaml | 55 ++++++ .../bc_response_numericrange_max_deleted.yaml | 53 ++++++ ...c_response_numericrange_max_increased.yaml | 55 ++++++ ...c_response_numericrange_min_decreased.yaml | 55 ++++++ .../bc_response_numericrange_min_deleted.yaml | 53 ++++++ .../bc_response_oneof_increased.yaml | 49 ++++++ .../bc_response_required_decreased.yaml | 40 +++++ .../bc_response_schema_format_decreased.yaml | 115 ++++++++++++ .../bc_response_schema_format_increased.yaml | 115 ++++++++++++ ...ponse_schema_props_required_decreased.yaml | 112 ++++++++++++ .../bc_response_writeonly_increased.yaml | 34 ++++ ...response_writeonly_required_decreased.yaml | 32 ++++ core/src/test/resources/bc_schema_base.yaml | 115 ++++++++++++ .../bc_schema_changed_but_compatible.yaml | 114 ++++++++++++ .../bc_schema_discriminator_changed.yaml | 115 ++++++++++++ .../resources/bc_schema_type_changed.yaml | 114 ++++++++++++ .../bc_security_requirement_base.yaml | 30 ++++ ...ty_requirement_changed_but_compatible.yaml | 29 ++++ ...ecurity_requirement_schemes_increased.yaml | 31 ++++ .../bc_security_requirements_base.yaml | 30 ++++ ...y_requirements_changed_but_compatible.yaml | 31 ++++ .../bc_security_requirements_decreased.yaml | 29 ++++ ...rity_requirements_scheme_type_changed.yaml | 31 ++++ .../resources/bc_security_scheme_base.yaml | 42 +++++ ...security_scheme_bearer_format_changed.yaml | 43 +++++ ...ecurity_scheme_changed_but_compatible.yaml | 41 +++++ .../bc_security_scheme_in_changed.yaml | 42 +++++ ...ty_scheme_open_id_connect_url_changed.yaml | 42 +++++ .../bc_security_scheme_scheme_changed.yaml | 43 +++++ .../bc_security_scheme_scopes_increased.yaml | 43 +++++ .../bc_security_scheme_type_changed.yaml | 42 +++++ .../src/test/resources/bc_writeonly_base.yaml | 33 ++++ .../bc_writeonly_changed_but_compatible.yaml | 32 ++++ 142 files changed, 5407 insertions(+), 829 deletions(-) delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/BackwardCompatibilityTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/OperationBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java delete mode 100644 core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml delete mode 100644 core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml delete mode 100644 core/src/test/resources/backwardCompatibility/bc_1.yaml delete mode 100644 core/src/test/resources/backwardCompatibility/bc_2.yaml delete mode 100644 core/src/test/resources/backwardCompatibility/bc_3.yaml delete mode 100644 core/src/test/resources/backwardCompatibility/bc_4.yaml delete mode 100644 core/src/test/resources/backwardCompatibility/bc_5.yaml create mode 100644 core/src/test/resources/bc_content_base.yaml create mode 100644 core/src/test/resources/bc_content_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_enum_base.yaml create mode 100644 core/src/test/resources/bc_enum_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_maxlength_base.yaml create mode 100644 core/src/test/resources/bc_numericrange_base.yaml create mode 100644 core/src/test/resources/bc_numericrange_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_oauthflow_authorization_url_changed.yaml create mode 100644 core/src/test/resources/bc_oauthflow_base.yaml create mode 100644 core/src/test/resources/bc_oauthflow_refresh_url_changed.yaml create mode 100644 core/src/test/resources/bc_oauthflow_token_url_changed.yaml create mode 100644 core/src/test/resources/bc_oneof_base.yaml create mode 100644 core/src/test/resources/bc_oneof_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_openapi_base.yaml create mode 100644 core/src/test/resources/bc_openapi_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_openapi_endpoints_decreased.yaml create mode 100644 core/src/test/resources/bc_operation_base.yaml create mode 100644 core/src/test/resources/bc_operation_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_path_base.yaml create mode 100644 core/src/test/resources/bc_path_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_path_ops_decreased.yaml create mode 100644 core/src/test/resources/bc_paths_base.yaml create mode 100644 core/src/test/resources/bc_paths_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_paths_decreased.yaml create mode 100644 core/src/test/resources/bc_readonly_base.yaml create mode 100644 core/src/test/resources/bc_readonly_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_request_body_base.yaml create mode 100644 core/src/test/resources/bc_request_body_required_changed.yaml create mode 100644 core/src/test/resources/bc_request_content_decreased.yaml create mode 100644 core/src/test/resources/bc_request_enum_decreased.yaml create mode 100644 core/src/test/resources/bc_request_maxlength_decreased.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_exclusive_max_created.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_exclusive_max_set.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_exclusive_min_created.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_exclusive_min_set.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_max_added.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_max_decreased.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_min_added.yaml create mode 100644 core/src/test/resources/bc_request_numericrange_min_increased.yaml create mode 100644 core/src/test/resources/bc_request_oneof_decreased.yaml create mode 100644 core/src/test/resources/bc_request_param_allowemptyvalue_decreased.yaml create mode 100644 core/src/test/resources/bc_request_param_base.yaml create mode 100644 core/src/test/resources/bc_request_param_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_request_param_explode_changed.yaml create mode 100644 core/src/test/resources/bc_request_param_required_increased.yaml create mode 100644 core/src/test/resources/bc_request_param_style_changed.yaml create mode 100644 core/src/test/resources/bc_request_params_base.yaml create mode 100644 core/src/test/resources/bc_request_params_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_request_params_decreased.yaml create mode 100644 core/src/test/resources/bc_request_params_required_increased.yaml create mode 100644 core/src/test/resources/bc_request_readonly_increased.yaml create mode 100644 core/src/test/resources/bc_request_readonly_required_decreased.yaml create mode 100644 core/src/test/resources/bc_request_required_increased.yaml create mode 100644 core/src/test/resources/bc_request_schema_format_decreased.yaml create mode 100644 core/src/test/resources/bc_request_schema_format_increased.yaml create mode 100644 core/src/test/resources/bc_request_schema_props_put_increased.yaml create mode 100644 core/src/test/resources/bc_required_base.yaml create mode 100644 core/src/test/resources/bc_required_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_response_apiresponse_base.yaml create mode 100644 core/src/test/resources/bc_response_apiresponse_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_response_apiresponse_decreased.yaml create mode 100644 core/src/test/resources/bc_response_content_decreased.yaml create mode 100644 core/src/test/resources/bc_response_enum_increased.yaml create mode 100644 core/src/test/resources/bc_response_header_base.yaml create mode 100644 core/src/test/resources/bc_response_header_deprecated.yaml create mode 100644 core/src/test/resources/bc_response_header_explode.yaml create mode 100644 core/src/test/resources/bc_response_header_required_added.yaml create mode 100644 core/src/test/resources/bc_response_header_required_deleted.yaml create mode 100644 core/src/test/resources/bc_response_headers_base.yaml create mode 100644 core/src/test/resources/bc_response_headers_increased.yaml create mode 100644 core/src/test/resources/bc_response_headers_missing.yaml create mode 100644 core/src/test/resources/bc_response_maxlength_increased.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_exclusive_max_deleted.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_exclusive_max_unset.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_exclusive_min_deleted.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_exclusive_min_unset.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_max_deleted.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_max_increased.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_min_decreased.yaml create mode 100644 core/src/test/resources/bc_response_numericrange_min_deleted.yaml create mode 100644 core/src/test/resources/bc_response_oneof_increased.yaml create mode 100644 core/src/test/resources/bc_response_required_decreased.yaml create mode 100644 core/src/test/resources/bc_response_schema_format_decreased.yaml create mode 100644 core/src/test/resources/bc_response_schema_format_increased.yaml create mode 100644 core/src/test/resources/bc_response_schema_props_required_decreased.yaml create mode 100644 core/src/test/resources/bc_response_writeonly_increased.yaml create mode 100644 core/src/test/resources/bc_response_writeonly_required_decreased.yaml create mode 100644 core/src/test/resources/bc_schema_base.yaml create mode 100644 core/src/test/resources/bc_schema_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_schema_discriminator_changed.yaml create mode 100644 core/src/test/resources/bc_schema_type_changed.yaml create mode 100644 core/src/test/resources/bc_security_requirement_base.yaml create mode 100644 core/src/test/resources/bc_security_requirement_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_security_requirement_schemes_increased.yaml create mode 100644 core/src/test/resources/bc_security_requirements_base.yaml create mode 100644 core/src/test/resources/bc_security_requirements_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_security_requirements_decreased.yaml create mode 100644 core/src/test/resources/bc_security_requirements_scheme_type_changed.yaml create mode 100644 core/src/test/resources/bc_security_scheme_base.yaml create mode 100644 core/src/test/resources/bc_security_scheme_bearer_format_changed.yaml create mode 100644 core/src/test/resources/bc_security_scheme_changed_but_compatible.yaml create mode 100644 core/src/test/resources/bc_security_scheme_in_changed.yaml create mode 100644 core/src/test/resources/bc_security_scheme_open_id_connect_url_changed.yaml create mode 100644 core/src/test/resources/bc_security_scheme_scheme_changed.yaml create mode 100644 core/src/test/resources/bc_security_scheme_scopes_increased.yaml create mode 100644 core/src/test/resources/bc_security_scheme_type_changed.yaml create mode 100644 core/src/test/resources/bc_writeonly_base.yaml create mode 100644 core/src/test/resources/bc_writeonly_changed_but_compatible.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java index f4a1682f6..2850e0f17 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java @@ -44,6 +44,13 @@ public DiffResult isCoreChanged() { && !changedBearerFormat && !changedOpenIdConnectUrl && (changedScopes == null || changedScopes.getIncreased().isEmpty())) { + + // TODO: Dead code removal opportunity for changedType and changedIn. It appears that + // SecuritySchemaDiff will never be given the chance to detect differences TYPE and + // IN differences because that case has already been detected and filtered out by + // SecurityRequirementsDiff and recorded as a dropped requirement in + // ChangedSecurityRequirements. + return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/core/src/test/java/org/openapitools/openapidiff/core/BackwardCompatibilityTest.java b/core/src/test/java/org/openapitools/openapidiff/core/BackwardCompatibilityTest.java deleted file mode 100644 index 612700ca7..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/BackwardCompatibilityTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.openapitools.openapidiff.core; - -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; - -import org.junit.jupiter.api.Test; - -public class BackwardCompatibilityTest { - private final String OPENAPI_DOC1 = "backwardCompatibility/bc_1.yaml"; - private final String OPENAPI_DOC2 = "backwardCompatibility/bc_2.yaml"; - private final String OPENAPI_DOC3 = "backwardCompatibility/bc_3.yaml"; - private final String OPENAPI_DOC4 = "backwardCompatibility/bc_4.yaml"; - private final String OPENAPI_DOC5 = "backwardCompatibility/bc_5.yaml"; - - @Test - public void testNoChange() { - assertOpenApiBackwardCompatible(OPENAPI_DOC1, OPENAPI_DOC1, false); - } - - @Test - public void testApiAdded() { - assertOpenApiBackwardCompatible(OPENAPI_DOC1, OPENAPI_DOC2, true); - } - - @Test - public void testApiMissing() { - assertOpenApiBackwardIncompatible(OPENAPI_DOC2, OPENAPI_DOC1); - } - - @Test - public void testApiChangedOperationAdded() { - assertOpenApiBackwardCompatible(OPENAPI_DOC2, OPENAPI_DOC3, true); - } - - @Test - public void testApiChangedOperationMissing() { - assertOpenApiBackwardIncompatible(OPENAPI_DOC3, OPENAPI_DOC2); - } - - @Test - public void testApiOperationChanged() { - assertOpenApiBackwardCompatible(OPENAPI_DOC2, OPENAPI_DOC4, true); - } - - @Test - public void testApiReadWriteOnlyPropertiesChanged() { - assertOpenApiBackwardCompatible(OPENAPI_DOC1, OPENAPI_DOC5, true); - } -} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java b/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java index 1180f2886..5e07d0bcd 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java @@ -4,6 +4,7 @@ import static org.slf4j.LoggerFactory.getLogger; import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.model.DiffResult; import org.slf4j.Logger; public class TestUtils { @@ -25,6 +26,20 @@ public static void assertOpenApiChangedEndpoints(String oldSpec, String newSpec) assertThat(changedOpenApi.getChangedOperations()).isNotEmpty(); } + public static void assertSpecUnchanged(String oldSpec, String newSpec) { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); + LOG.info("Result: {}", changedOpenApi.isChanged().getValue()); + assertThat(changedOpenApi.isUnchanged()).isTrue(); + } + + public static void assertSpecChangedButCompatible(String oldSpec, String newSpec) { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); + DiffResult diffResult = changedOpenApi.isChanged(); + LOG.info("Result: {}", diffResult.getValue()); + assertThat(diffResult.isDifferent()).isTrue(); + assertThat(diffResult.isCompatible()).isTrue(); + } + public static void assertOpenApiBackwardCompatible( String oldSpec, String newSpec, boolean isDiff) { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java new file mode 100644 index 000000000..c93bc5d4a --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java @@ -0,0 +1,26 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class ApiResponseBCTest { + private final String BASE = "bc_response_apiresponse_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_response_apiresponse_changed_but_compatible.yaml"); + } + + @Test + public void decreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_apiresponse_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java new file mode 100644 index 000000000..130255b80 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java @@ -0,0 +1,31 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class ContentBCTest { + private final String BASE = "bc_content_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_content_changed_but_compatible.yaml"); + } + + @Test + public void requestDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_content_decreased.yaml"); + } + + @Test + public void responseDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_content_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java new file mode 100644 index 000000000..3eecfda39 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java @@ -0,0 +1,31 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class EnumBCTest { + private final String BASE = "bc_enum_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_enum_changed_but_compatible.yaml"); + } + + @Test + public void requestDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_enum_decreased.yaml"); + } + + @Test + public void responseIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_enum_increased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java new file mode 100644 index 000000000..d97209d19 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java @@ -0,0 +1,37 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class HeaderBCTest { + private final String BASE = "bc_response_header_base.yaml"; + + @Test + public void responseHeaderUnchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void responseHeaderDeprecated() { + assertSpecChangedButCompatible(BASE, "bc_response_header_deprecated.yaml"); + } + + @Test + public void responseHeaderRequiredAdded() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_header_required_added.yaml"); + } + + @Test + public void responseHeaderRequiredDeleted() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_header_required_deleted.yaml"); + } + + @Test + public void responseHeaderExplode() { + String RESPONSE_HEADER_EXPLODE = "bc_response_header_explode.yaml"; + assertOpenApiBackwardIncompatible(BASE, RESPONSE_HEADER_EXPLODE); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java new file mode 100644 index 000000000..b796a35e6 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java @@ -0,0 +1,26 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class HeadersBCTest { + private final String BASE = "bc_response_headers_base.yaml"; + + @Test + public void responseHeadersUnchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void responseHeadersIncreased() { + assertSpecChangedButCompatible(BASE, "bc_response_headers_increased.yaml"); + } + + @Test + public void responseHeadersMissing() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_headers_missing.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java new file mode 100644 index 000000000..96c019b40 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java @@ -0,0 +1,25 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class MaxLengthBCTest { + private final String BASE = "bc_maxlength_base.yaml"; + + @Test + public void maxLengthUnchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void requestMaxLengthDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_maxlength_decreased.yaml"); + } + + @Test + public void responseMaxLengthIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_maxlength_increased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java new file mode 100644 index 000000000..1f713f98a --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java @@ -0,0 +1,114 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class NumericRangeBCTest { + private final String BASE = "bc_numericrange_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + // TODO: Fix bug where response range-narrowing is deemed incompatible, then test here + assertSpecChangedButCompatible(BASE, "bc_numericrange_changed_but_compatible.yaml"); + } + + @Test + public void requestExclusiveMaxCreated() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_max_created.yaml"); + } + + @Test + public void requestExclusiveMaxSet() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_max_set.yaml"); + } + + @Test + public void requestExclusiveMinCreated() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_min_created.yaml"); + } + + @Test + public void requestExclusiveMinSet() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_min_set.yaml"); + } + + @Test + public void requestMaxAdded() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_max_added.yaml"); + } + + @Test + public void requestMaxDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_max_decreased.yaml"); + } + + @Test + public void requestMinAdded() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_min_added.yaml"); + } + + @Test + public void requestMinIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_min_increased.yaml"); + } + + @Test + public void responseExclusiveMaxDeleted() { + // TODO: Should be incompatible because clients may be unprepared for wider range + // (test added to avoid unintentional regression) + assertSpecChangedButCompatible(BASE, "bc_response_numericrange_exclusive_max_deleted.yaml"); + } + + @Test + public void responseExclusiveMaxUnset() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_numericrange_exclusive_max_unset.yaml"); + } + + @Test + public void responseExclusiveMinDeleted() { + // TODO: Should be incompatible because clients may be unprepared for wider range + // (test added to avoid unintentional regression) + assertSpecChangedButCompatible(BASE, "bc_response_numericrange_exclusive_min_deleted.yaml"); + } + + @Test + public void responseExclusiveMinUnset() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_numericrange_exclusive_min_unset.yaml"); + } + + @Test + public void responseMaxDeleted() { + // TODO: Should be incompatible because clients may be unprepared for wider range + // (test added to avoid unintentional regression) + assertSpecChangedButCompatible(BASE, "bc_response_numericrange_max_deleted.yaml"); + } + + @Test + public void responseMaxIncreased() { + // TODO: Should be incompatible because clients may be unprepared + // (test added to avoid unintentional regression) + assertSpecChangedButCompatible(BASE, "bc_response_numericrange_max_increased.yaml"); + } + + @Test + public void responseMinDecreased() { + // TODO: Should be incompatible because clients may be unprepared for wider range + // (test added to avoid unintentional regression) + assertSpecChangedButCompatible(BASE, "bc_response_numericrange_min_decreased.yaml"); + } + + @Test + public void responseMinDeleted() { + // TODO: Should be incompatible because clients may be unprepared for wider range + // (test added to avoid unintentional regression) + assertSpecChangedButCompatible(BASE, "bc_response_numericrange_min_deleted.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java new file mode 100644 index 000000000..62cf3b9a0 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java @@ -0,0 +1,30 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class OAuthFlowBCTest { + private final String BASE = "bc_oauthflow_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void authorizationUrlChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_oauthflow_authorization_url_changed.yaml"); + } + + @Test + public void refreshUrlChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_oauthflow_refresh_url_changed.yaml"); + } + + @Test + public void tokenUrlChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_oauthflow_token_url_changed.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java new file mode 100644 index 000000000..e42829cca --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java @@ -0,0 +1,31 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class OneOfBCTest { + private final String BASE = "bc_oneof_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_oneof_changed_but_compatible.yaml"); + } + + @Test + public void requestOneOfDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_oneof_decreased.yaml"); + } + + @Test + public void responseOneOfIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_oneof_increased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java new file mode 100644 index 000000000..0cb493aa2 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java @@ -0,0 +1,26 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class OpenApiBCTest { + private final String BASE = "bc_openapi_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_openapi_changed_but_compatible.yaml"); + } + + @Test + public void endpointsDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_openapi_endpoints_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OperationBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OperationBCTest.java new file mode 100644 index 000000000..c95d8c9d2 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OperationBCTest.java @@ -0,0 +1,20 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class OperationBCTest { + private final String BASE = "bc_operation_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_operation_changed_but_compatible.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java new file mode 100644 index 000000000..4f1d30852 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java @@ -0,0 +1,41 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class ParameterBCTest { + private final String BASE = "bc_request_param_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_request_param_changed_but_compatible.yaml"); + } + + @Test + public void allowEmptyValueDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_param_allowemptyvalue_decreased.yaml"); + } + + @Test + public void explodeChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_param_explode_changed.yaml"); + } + + @Test + public void requiredIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_param_required_increased.yaml"); + } + + @Test + public void styleChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_param_style_changed.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java new file mode 100644 index 000000000..1b913115d --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java @@ -0,0 +1,31 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class ParametersBCTest { + private final String BASE = "bc_request_params_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_request_params_changed_but_compatible.yaml"); + } + + @Test + public void decreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_params_decreased.yaml"); + } + + @Test + public void requiredIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_params_required_increased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java new file mode 100644 index 000000000..b0b9ab39c --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java @@ -0,0 +1,26 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class PathBCTest { + private final String BASE = "bc_path_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_path_changed_but_compatible.yaml"); + } + + @Test + public void opsDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_path_ops_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java new file mode 100644 index 000000000..495739d18 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java @@ -0,0 +1,26 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class PathsBCTest { + private final String BASE = "bc_paths_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_paths_changed_but_compatible.yaml"); + } + + @Test + public void decreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_paths_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java new file mode 100644 index 000000000..579a7e178 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java @@ -0,0 +1,32 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class ReadOnlyBCTest { + private final String BASE = "bc_readonly_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_readonly_changed_but_compatible.yaml"); + } + + @Test + public void requestReadOnlyIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_readonly_increased.yaml"); + } + + @Test + public void requestReadOnlyRequiredDecreased() { + // TODO: Document why desired or remove support (test added to avoid unintentional regression) + assertOpenApiBackwardIncompatible(BASE, "bc_request_readonly_required_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java new file mode 100644 index 000000000..b02c0a3e0 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java @@ -0,0 +1,20 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class RequestBodyBCTest { + private final String BASE = "bc_request_body_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void requiredChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_body_required_changed.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java new file mode 100644 index 000000000..bda8b2d8e --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java @@ -0,0 +1,32 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class RequiredBCTest { + + private final String BASE = "bc_required_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_required_changed_but_compatible.yaml"); + } + + @Test + public void requestRequiredIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_required_increased.yaml"); + } + + @Test + public void responseRequiredDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_required_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java new file mode 100644 index 000000000..cec27bc78 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java @@ -0,0 +1,65 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class SchemaBCTest { + private final String BASE = "bc_schema_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_schema_changed_but_compatible.yaml"); + } + + @Test + public void discriminatorChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_schema_discriminator_changed.yaml"); + } + + @Test + public void requestFormatDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_request_schema_format_decreased.yaml"); + } + + @Test + public void requestFormatIncreased() { + // TODO: Document why desired or remove support (test added to avoid unintentional regression) + assertOpenApiBackwardIncompatible(BASE, "bc_request_schema_format_increased.yaml"); + } + + @Test + public void requestPropsPutIncreased() { + // TODO: Document why desired or remove support (test added to avoid unintentional regression) + // See https://github.com/OpenAPITools/openapi-diff/issues/537 + assertOpenApiBackwardIncompatible(BASE, "bc_request_schema_props_put_increased.yaml"); + } + + @Test + public void responseFormatDecreased() { + // TODO: Document why desired or remove support (test added to avoid unintentional regression) + assertOpenApiBackwardIncompatible(BASE, "bc_response_schema_format_decreased.yaml"); + } + + @Test + public void responseFormatIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_schema_format_increased.yaml"); + } + + @Test + public void responsePropsRequiredDecreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_schema_props_required_decreased.yaml"); + } + + @Test + public void typeChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_schema_type_changed.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java new file mode 100644 index 000000000..80c79cec9 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java @@ -0,0 +1,24 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.*; + +import org.junit.jupiter.api.Test; + +public class SecurityRequirementBCTest { + private final String BASE = "bc_security_requirement_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_security_requirement_changed_but_compatible.yaml"); + } + + @Test + public void schemesIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_requirement_schemes_increased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java new file mode 100644 index 000000000..a9df11df0 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java @@ -0,0 +1,38 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class SecurityRequirementsBCTest { + private final String BASE = "bc_security_requirements_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_security_requirements_changed_but_compatible.yaml"); + } + + // TODO: Dropping *all* security requirements should be compatible. Refactor or document + // reasoning. Context: OAS spec is clear that only one of the security requirement objects + // need to be satisfied so it makes sense why dropping one could break a client that may + // not yet support one of the remaining referenced security schemes. But dropping all + // requirements should be compatible. + @Test + public void decreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_requirements_decreased.yaml"); + } + + // TODO: A missing incompatible check seems to be if requirements increase from zero to 1 or more + + @Test + public void schemeTypeChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_requirements_scheme_type_changed.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java new file mode 100644 index 000000000..b275523dd --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java @@ -0,0 +1,51 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class SecuritySchemeBCTest { + private final String BASE = "bc_security_scheme_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_security_scheme_changed_but_compatible.yaml"); + } + + @Test + public void bearerFormatChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_bearer_format_changed.yaml"); + } + + @Test + public void inChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_in_changed.yaml"); + } + + @Test + public void openIdConnectUrlChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_open_id_connect_url_changed.yaml"); + } + + @Test + public void schemeChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_scheme_changed.yaml"); + } + + @Test + public void typeChanged() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_type_changed.yaml"); + } + + @Test + public void scopesIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_scopes_increased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java new file mode 100644 index 000000000..f3ea427f0 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java @@ -0,0 +1,32 @@ +package org.openapitools.openapidiff.core.backcompat; + +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; + +import org.junit.jupiter.api.Test; + +public class WriteOnlyBCTest { + private final String BASE = "bc_writeonly_base.yaml"; + + @Test + public void unchanged() { + assertSpecUnchanged(BASE, BASE); + } + + @Test + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_writeonly_changed_but_compatible.yaml"); + } + + @Test + public void responseWriteOnlyIncreased() { + assertOpenApiBackwardIncompatible(BASE, "bc_response_writeonly_increased.yaml"); + } + + @Test + public void responseWriteOnlyRequiredDecreased() { + // TODO: Document why desired or remove support (test added to avoid unintentional regression) + assertOpenApiBackwardIncompatible(BASE, "bc_response_writeonly_required_decreased.yaml"); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java deleted file mode 100644 index 97b8ab094..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/compare/ApiResponseDiffTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.openapitools.openapidiff.core.compare; - -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -class ApiResponseDiffTest extends Assertions { - /** - * * This is a regression test - when no responses were set, we would get an exception since the - * OpenAPI object has a `null` ApiResponses field. - */ - @Test - public void testNoResponseInPrevious() { - // The previous API had no response, so adding a response shape is still compatible. - assertOpenApiBackwardCompatible( - "backwardCompatibility/apiResponse_diff_1.yaml", - "backwardCompatibility/apiResponse_diff_2.yaml", - true); - - // Removing the response shape is backwards incompatible. - assertOpenApiBackwardIncompatible( - "backwardCompatibility/apiResponse_diff_2.yaml", - "backwardCompatibility/apiResponse_diff_1.yaml"); - } -} diff --git a/core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml b/core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml deleted file mode 100644 index fb1e6047d..000000000 --- a/core/src/test/resources/backwardCompatibility/apiResponse_diff_1.yaml +++ /dev/null @@ -1,7 +0,0 @@ -openapi: 3.0.0 -info: - title: Swagger Petstore -paths: - /store/inventory: - get: - operationId: asdf \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml b/core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml deleted file mode 100644 index 82da7cfd6..000000000 --- a/core/src/test/resources/backwardCompatibility/apiResponse_diff_2.yaml +++ /dev/null @@ -1,15 +0,0 @@ -openapi: 3.0.0 -info: - title: Swagger Petstore -paths: - /store/inventory: - get: - responses: - '200': - content: - application/json: - schema: - type: object - properties: - title: - type: string \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/bc_1.yaml b/core/src/test/resources/backwardCompatibility/bc_1.yaml deleted file mode 100644 index 8247d2fcb..000000000 --- a/core/src/test/resources/backwardCompatibility/bc_1.yaml +++ /dev/null @@ -1,132 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - /pet/findByStatus: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - maxLength: 16 - responses: - '200': - description: successful operation - content: - application/json: - schema: - type: object - properties: - pets: - type: array - items: - $ref: '#/components/schemas/Dog' - '400': - description: Invalid status value - security: - - petstore_auth: - - 'write:pets' - - 'read:pets' -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - securitySchemes: - petstore_auth: - type: oauth2 - flows: - implicit: - authorizationUrl: 'http://petstore.swagger.io/oauth/dialog' - scopes: - 'write:pets': modify pets in your account - 'read:pets': read your pets - api_key: - type: apiKey - name: api_key - in: header - schemas: - Pet: - type: object - required: - - pet_type - properties: - pet_type: - type: string - discriminator: - propertyName: pet_type - mapping: - cachorro: Dog - Cat: - type: object - properties: - name: - type: string - Dog: - type: object - properties: - bark: - type: string - test: - writeOnly: true - type: string - Lizard: - type: object - properties: - lovesRocks: - type: boolean - - MyResponseType: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - $ref: '#/components/schemas/Lizard' - discriminator: - propertyName: pet_type - mapping: - dog: '#/components/schemas/Dog' \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/bc_2.yaml b/core/src/test/resources/backwardCompatibility/bc_2.yaml deleted file mode 100644 index 179f3ca3f..000000000 --- a/core/src/test/resources/backwardCompatibility/bc_2.yaml +++ /dev/null @@ -1,150 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - /pet: - post: - tags: - - pet - summary: Add a new pet to the store - description: '' - operationId: addPet - requestBody: - $ref: '#/components/requestBodies/Pet' - responses: - '200': - description: successful operation - content: - application/json: - schema: - $ref: '#/components/schemas/MyResponseType' - '405': - description: Invalid input - /pet/findByStatus: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - maxLength: 24 - responses: - '200': - description: successful operation - content: - application/json: - schema: - type: object - properties: - pets: - type: array - items: - $ref: '#/components/schemas/Dog' - '400': - description: Invalid status value - security: - - petstore_auth: - - 'write:pets' - - 'read:pets' -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - securitySchemes: - petstore_auth: - type: oauth2 - flows: - implicit: - authorizationUrl: 'http://petstore.swagger.io/oauth/dialog' - scopes: - 'write:pets': modify pets in your account - 'read:pets': read your pets - api_key: - type: apiKey - name: api_key - in: header - schemas: - Pet: - type: object - required: - - pet_type - properties: - pet_type: - type: string - discriminator: - propertyName: pet_type - mapping: - cachorro: Dog - Cat: - type: object - properties: - name: - type: string - Dog: - type: object - properties: - bark: - type: string - test: - writeOnly: true - type: string - Lizard: - type: object - properties: - lovesRocks: - type: boolean - - MyResponseType: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - $ref: '#/components/schemas/Lizard' - discriminator: - propertyName: pet_type - mapping: - dog: '#/components/schemas/Dog' \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/bc_3.yaml b/core/src/test/resources/backwardCompatibility/bc_3.yaml deleted file mode 100644 index 30a68ced7..000000000 --- a/core/src/test/resources/backwardCompatibility/bc_3.yaml +++ /dev/null @@ -1,163 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - /pet: - post: - tags: - - pet - summary: Add a new pet to the store - description: '' - operationId: addPet - requestBody: - $ref: '#/components/requestBodies/Pet' - responses: - '200': - description: successful operation - content: - application/json: - schema: - $ref: '#/components/schemas/MyResponseType' - '405': - description: Invalid input - get: - tags: - - pet - summary: Finds Pets by name - description: name can be provided for the pet - operationId: getPet - parameters: - - name: name - in: query - description: name that need to be considered for filter - required: true - schema: - type: string - /pet/findByStatus: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - maxLength: 36 - responses: - '200': - description: successful operation - content: - application/json: - schema: - type: object - properties: - pets: - type: array - items: - $ref: '#/components/schemas/Dog' - '400': - description: Invalid status value - security: - - petstore_auth: - - 'write:pets' - - 'read:pets' -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - securitySchemes: - petstore_auth: - type: oauth2 - flows: - implicit: - authorizationUrl: 'http://petstore.swagger.io/oauth/dialog' - scopes: - 'write:pets': modify pets in your account - 'read:pets': read your pets - api_key: - type: apiKey - name: api_key - in: header - schemas: - Pet: - type: object - required: - - pet_type - properties: - pet_type: - type: string - discriminator: - propertyName: pet_type - mapping: - cachorro: Dog - Cat: - type: object - properties: - name: - type: string - Dog: - type: object - properties: - bark: - type: string - test: - writeOnly: true - type: string - Lizard: - type: object - properties: - lovesRocks: - type: boolean - - MyResponseType: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - $ref: '#/components/schemas/Lizard' - discriminator: - propertyName: pet_type - mapping: - dog: '#/components/schemas/Dog' \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/bc_4.yaml b/core/src/test/resources/backwardCompatibility/bc_4.yaml deleted file mode 100644 index 4e6ee3e18..000000000 --- a/core/src/test/resources/backwardCompatibility/bc_4.yaml +++ /dev/null @@ -1,155 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - /pet: - post: - tags: - - pet - summary: Add a new pet to the store - description: '' - operationId: addPet - requestBody: - $ref: '#/components/requestBodies/Pet' - responses: - '200': - description: successful operation - content: - application/json: - schema: - $ref: '#/components/schemas/MyResponseType' - '405': - description: Invalid input - /pet/findByStatus: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - enum: - - available - - pending - - sold - default: available - responses: - '200': - description: successful operation - content: - application/json: - schema: - type: object - properties: - pets: - type: array - items: - $ref: '#/components/schemas/Dog' - '400': - description: Invalid status value - security: - - petstore_auth: - - 'write:pets' - - 'read:pets' -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - securitySchemes: - petstore_auth: - type: oauth2 - flows: - implicit: - authorizationUrl: 'http://petstore.swagger.io/oauth/dialog' - scopes: - 'write:pets': modify pets in your account - 'read:pets': read your pets - api_key: - type: apiKey - name: api_key - in: header - schemas: - Pet: - type: object - required: - - pet_type - properties: - pet_type: - type: string - discriminator: - propertyName: pet_type - mapping: - cachorro: Dog - Cat: - type: object - properties: - name: - type: string - deprecated: true - Dog: - type: object - properties: - bark: - type: string - test: - writeOnly: true - type: string - Lizard: - type: object - properties: - lovesRocks: - type: boolean - - MyResponseType: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - $ref: '#/components/schemas/Lizard' - discriminator: - propertyName: pet_type - mapping: - dog: '#/components/schemas/Dog' \ No newline at end of file diff --git a/core/src/test/resources/backwardCompatibility/bc_5.yaml b/core/src/test/resources/backwardCompatibility/bc_5.yaml deleted file mode 100644 index 6b282ba48..000000000 --- a/core/src/test/resources/backwardCompatibility/bc_5.yaml +++ /dev/null @@ -1,131 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - /pet/findByStatus: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - maxLength: 16 - responses: - '200': - description: successful operation - content: - application/json: - schema: - type: object - properties: - pets: - type: array - items: - $ref: '#/components/schemas/Dog' - '400': - description: Invalid status value - security: - - petstore_auth: - - 'write:pets' - - 'read:pets' -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - securitySchemes: - petstore_auth: - type: oauth2 - flows: - implicit: - authorizationUrl: 'http://petstore.swagger.io/oauth/dialog' - scopes: - 'write:pets': modify pets in your account - 'read:pets': read your pets - api_key: - type: apiKey - name: api_key - in: header - schemas: - Pet: - type: object - required: - - pet_type - properties: - pet_type: - type: string - discriminator: - propertyName: pet_type - mapping: - cachorro: Dog - Cat: - type: object - properties: - name: - type: string - Dog: - type: object - properties: - bark: - type: string - test: - type: string - Lizard: - type: object - properties: - lovesRocks: - type: boolean - - MyResponseType: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - $ref: '#/components/schemas/Lizard' - discriminator: - propertyName: pet_type - mapping: - dog: '#/components/schemas/Dog' \ No newline at end of file diff --git a/core/src/test/resources/bc_content_base.yaml b/core/src/test/resources/bc_content_base.yaml new file mode 100644 index 000000000..82634f2a9 --- /dev/null +++ b/core/src/test/resources/bc_content_base.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + application/text: + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + application/text: + schema: + type: string diff --git a/core/src/test/resources/bc_content_changed_but_compatible.yaml b/core/src/test/resources/bc_content_changed_but_compatible.yaml new file mode 100644 index 000000000..8300fbad7 --- /dev/null +++ b/core/src/test/resources/bc_content_changed_but_compatible.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + application/text: + schema: + type: string + application/xml: + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + application/text: + schema: + type: string + application/xml: + schema: + type: string diff --git a/core/src/test/resources/bc_enum_base.yaml b/core/src/test/resources/bc_enum_base.yaml new file mode 100644 index 000000000..fe020824a --- /dev/null +++ b/core/src/test/resources/bc_enum_base.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: param-inline-enum + in: query + required: true + schema: + type: string + enum: + - param-inline-enum-val-1 + - param-inline-enum-val-2 + default: param-inline-enum-val-1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + enum-prop: + type: string + enum: + - enum-prop-val-1 + - enum-prop-val-2 + default: enum-prop-val-1 diff --git a/core/src/test/resources/bc_enum_changed_but_compatible.yaml b/core/src/test/resources/bc_enum_changed_but_compatible.yaml new file mode 100644 index 000000000..7fd9b1da6 --- /dev/null +++ b/core/src/test/resources/bc_enum_changed_but_compatible.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: param-inline-enum + in: query + required: true + schema: + type: string + enum: + - param-inline-enum-val-1 + - param-inline-enum-val-2 + - param-inline-enum-val-3 + default: param-inline-enum-val-1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + enum-prop: + type: string + enum: + - enum-prop-val-1 + default: enum-prop-val-1 diff --git a/core/src/test/resources/bc_maxlength_base.yaml b/core/src/test/resources/bc_maxlength_base.yaml new file mode 100644 index 000000000..583adca5d --- /dev/null +++ b/core/src/test/resources/bc_maxlength_base.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: string + maxLength: 16 + application/xml: + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + maxLength: 16 + application/xml: + schema: + type: string diff --git a/core/src/test/resources/bc_numericrange_base.yaml b/core/src/test/resources/bc_numericrange_base.yaml new file mode 100644 index 000000000..e03c5939e --- /dev/null +++ b/core/src/test/resources/bc_numericrange_base.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_numericrange_changed_but_compatible.yaml b/core/src/test/resources/bc_numericrange_changed_but_compatible.yaml new file mode 100644 index 000000000..b38f2fe9e --- /dev/null +++ b/core/src/test/resources/bc_numericrange_changed_but_compatible.yaml @@ -0,0 +1,57 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 9 + maximum: 21 + application/xml: + schema: + type: integer + format: int32 + minimum: 9 + maximum: 21 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + # TODO: Narrowing response range fails as incompatible, but shouldn't it be ok? + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + # TODO: Narrowing response range fails as incompatible, but shouldn't it be ok? + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_oauthflow_authorization_url_changed.yaml b/core/src/test/resources/bc_oauthflow_authorization_url_changed.yaml new file mode 100644 index 000000000..d14957eea --- /dev/null +++ b/core/src/test/resources/bc_oauthflow_authorization_url_changed.yaml @@ -0,0 +1,28 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - oauth2-scheme-1: [] +components: + securitySchemes: + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/authorization2 + refreshUrl: https://example.com/api/oauth/refresh + tokenUrl: https://example.com/api/oauth/token + scopes: {} diff --git a/core/src/test/resources/bc_oauthflow_base.yaml b/core/src/test/resources/bc_oauthflow_base.yaml new file mode 100644 index 000000000..40c7509b4 --- /dev/null +++ b/core/src/test/resources/bc_oauthflow_base.yaml @@ -0,0 +1,28 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - oauth2-scheme-1: [] +components: + securitySchemes: + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/authorization + refreshUrl: https://example.com/api/oauth/refresh + tokenUrl: https://example.com/api/oauth/token + scopes: {} diff --git a/core/src/test/resources/bc_oauthflow_refresh_url_changed.yaml b/core/src/test/resources/bc_oauthflow_refresh_url_changed.yaml new file mode 100644 index 000000000..bde8f2285 --- /dev/null +++ b/core/src/test/resources/bc_oauthflow_refresh_url_changed.yaml @@ -0,0 +1,28 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - oauth2-scheme-1: [] +components: + securitySchemes: + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/authorization + refreshUrl: https://example.com/api/oauth/refresh2 + tokenUrl: https://example.com/api/oauth/token + scopes: {} diff --git a/core/src/test/resources/bc_oauthflow_token_url_changed.yaml b/core/src/test/resources/bc_oauthflow_token_url_changed.yaml new file mode 100644 index 000000000..6992e3c07 --- /dev/null +++ b/core/src/test/resources/bc_oauthflow_token_url_changed.yaml @@ -0,0 +1,28 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - oauth2-scheme-1: [] +components: + securitySchemes: + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/authorization + refreshUrl: https://example.com/api/oauth/refresh + tokenUrl: https://example.com/api/oauth/token2 + scopes: {} diff --git a/core/src/test/resources/bc_oneof_base.yaml b/core/src/test/resources/bc_oneof_base.yaml new file mode 100644 index 000000000..b5ef92c35 --- /dev/null +++ b/core/src/test/resources/bc_oneof_base.yaml @@ -0,0 +1,48 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' +components: + schemas: + WidgetCreateRequest: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + WidgetCreateResponse: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + Doodad: + type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_oneof_changed_but_compatible.yaml b/core/src/test/resources/bc_oneof_changed_but_compatible.yaml new file mode 100644 index 000000000..78468ebe0 --- /dev/null +++ b/core/src/test/resources/bc_oneof_changed_but_compatible.yaml @@ -0,0 +1,48 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' +components: + schemas: + WidgetCreateRequest: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + - $ref: '#/components/schemas/Gizmo' + WidgetCreateResponse: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + Doodad: + type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_openapi_base.yaml b/core/src/test/resources/bc_openapi_base.yaml new file mode 100644 index 000000000..78e86b943 --- /dev/null +++ b/core/src/test/resources/bc_openapi_base.yaml @@ -0,0 +1,25 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + post: + operationId: widgetCreate + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_openapi_changed_but_compatible.yaml b/core/src/test/resources/bc_openapi_changed_but_compatible.yaml new file mode 100644 index 000000000..5b5dfffc1 --- /dev/null +++ b/core/src/test/resources/bc_openapi_changed_but_compatible.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + post: + operationId: widgetCreate + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + /widgets/{id}: + get: + operationId: getWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_openapi_endpoints_decreased.yaml b/core/src/test/resources/bc_openapi_endpoints_decreased.yaml new file mode 100644 index 000000000..bd33b69dd --- /dev/null +++ b/core/src/test/resources/bc_openapi_endpoints_decreased.yaml @@ -0,0 +1,16 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_operation_base.yaml b/core/src/test/resources/bc_operation_base.yaml new file mode 100644 index 000000000..eb6403307 --- /dev/null +++ b/core/src/test/resources/bc_operation_base.yaml @@ -0,0 +1,16 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_operation_changed_but_compatible.yaml b/core/src/test/resources/bc_operation_changed_but_compatible.yaml new file mode 100644 index 000000000..2d99878b8 --- /dev/null +++ b/core/src/test/resources/bc_operation_changed_but_compatible.yaml @@ -0,0 +1,17 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + deprecated: true + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_path_base.yaml b/core/src/test/resources/bc_path_base.yaml new file mode 100644 index 000000000..78e86b943 --- /dev/null +++ b/core/src/test/resources/bc_path_base.yaml @@ -0,0 +1,25 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + post: + operationId: widgetCreate + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_path_changed_but_compatible.yaml b/core/src/test/resources/bc_path_changed_but_compatible.yaml new file mode 100644 index 000000000..d2ae98018 --- /dev/null +++ b/core/src/test/resources/bc_path_changed_but_compatible.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + post: + operationId: widgetCreate + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + put: + operationId: widgetUpdate + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_path_ops_decreased.yaml b/core/src/test/resources/bc_path_ops_decreased.yaml new file mode 100644 index 000000000..eb6403307 --- /dev/null +++ b/core/src/test/resources/bc_path_ops_decreased.yaml @@ -0,0 +1,16 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_paths_base.yaml b/core/src/test/resources/bc_paths_base.yaml new file mode 100644 index 000000000..451f66310 --- /dev/null +++ b/core/src/test/resources/bc_paths_base.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + /widgets/{id}: + get: + operationId: getWidget + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_paths_changed_but_compatible.yaml b/core/src/test/resources/bc_paths_changed_but_compatible.yaml new file mode 100644 index 000000000..e2b94c228 --- /dev/null +++ b/core/src/test/resources/bc_paths_changed_but_compatible.yaml @@ -0,0 +1,36 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + /widgets/{id}: + get: + operationId: getWidget + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + /widgets/{id}/status: + get: + operationId: getWidgetStatus + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_paths_decreased.yaml b/core/src/test/resources/bc_paths_decreased.yaml new file mode 100644 index 000000000..eb6403307 --- /dev/null +++ b/core/src/test/resources/bc_paths_decreased.yaml @@ -0,0 +1,16 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_readonly_base.yaml b/core/src/test/resources/bc_readonly_base.yaml new file mode 100644 index 000000000..dc4889b1f --- /dev/null +++ b/core/src/test/resources/bc_readonly_base.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + readOnly: true + prop2: + type: string + required: + - prop1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + readOnly: true diff --git a/core/src/test/resources/bc_readonly_changed_but_compatible.yaml b/core/src/test/resources/bc_readonly_changed_but_compatible.yaml new file mode 100644 index 000000000..cc6596ef6 --- /dev/null +++ b/core/src/test/resources/bc_readonly_changed_but_compatible.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + readOnly: true + prop2: + type: string + required: + - prop1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string diff --git a/core/src/test/resources/bc_request_body_base.yaml b/core/src/test/resources/bc_request_body_base.yaml new file mode 100644 index 000000000..fd89553e9 --- /dev/null +++ b/core/src/test/resources/bc_request_body_base.yaml @@ -0,0 +1,21 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_body_required_changed.yaml b/core/src/test/resources/bc_request_body_required_changed.yaml new file mode 100644 index 000000000..859512ca9 --- /dev/null +++ b/core/src/test/resources/bc_request_body_required_changed.yaml @@ -0,0 +1,22 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: string + required: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_content_decreased.yaml b/core/src/test/resources/bc_request_content_decreased.yaml new file mode 100644 index 000000000..d7a5517de --- /dev/null +++ b/core/src/test/resources/bc_request_content_decreased.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + application/text: + schema: + type: string diff --git a/core/src/test/resources/bc_request_enum_decreased.yaml b/core/src/test/resources/bc_request_enum_decreased.yaml new file mode 100644 index 000000000..c131e9aa7 --- /dev/null +++ b/core/src/test/resources/bc_request_enum_decreased.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: param-inline-enum + in: query + required: true + schema: + type: string + enum: + - param-inline-enum-val-1 + default: param-inline-enum-val-1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + enum-prop: + type: string + enum: + - enum-prop-val-1 + - enum-prop-val-2 + default: enum-prop-val-1 diff --git a/core/src/test/resources/bc_request_maxlength_decreased.yaml b/core/src/test/resources/bc_request_maxlength_decreased.yaml new file mode 100644 index 000000000..48d50863c --- /dev/null +++ b/core/src/test/resources/bc_request_maxlength_decreased.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: string + maxLength: 10 + application/xml: + schema: + type: string + maxLength: 10 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + maxLength: 16 + application/xml: + schema: + type: string diff --git a/core/src/test/resources/bc_request_numericrange_exclusive_max_created.yaml b/core/src/test/resources/bc_request_numericrange_exclusive_max_created.yaml new file mode 100644 index 000000000..f893a9545 --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_exclusive_max_created.yaml @@ -0,0 +1,56 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMaximum: true + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_numericrange_exclusive_max_set.yaml b/core/src/test/resources/bc_request_numericrange_exclusive_max_set.yaml new file mode 100644 index 000000000..efa02f990 --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_exclusive_max_set.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: true + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_numericrange_exclusive_min_created.yaml b/core/src/test/resources/bc_request_numericrange_exclusive_min_created.yaml new file mode 100644 index 000000000..649b7f48b --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_exclusive_min_created.yaml @@ -0,0 +1,56 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_numericrange_exclusive_min_set.yaml b/core/src/test/resources/bc_request_numericrange_exclusive_min_set.yaml new file mode 100644 index 000000000..e6d0c81fb --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_exclusive_min_set.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: true + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_numericrange_max_added.yaml b/core/src/test/resources/bc_request_numericrange_max_added.yaml new file mode 100644 index 000000000..f438d9bda --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_max_added.yaml @@ -0,0 +1,56 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + maximum: 20 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_numericrange_max_decreased.yaml b/core/src/test/resources/bc_request_numericrange_max_decreased.yaml new file mode 100644 index 000000000..be0dec2c6 --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_max_decreased.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 19 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 19 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_numericrange_min_added.yaml b/core/src/test/resources/bc_request_numericrange_min_added.yaml new file mode 100644 index 000000000..84a06bbca --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_min_added.yaml @@ -0,0 +1,56 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + minimum: 10 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_numericrange_min_increased.yaml b/core/src/test/resources/bc_request_numericrange_min_increased.yaml new file mode 100644 index 000000000..87df1ba4a --- /dev/null +++ b/core/src/test/resources/bc_request_numericrange_min_increased.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 11 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 11 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_request_oneof_decreased.yaml b/core/src/test/resources/bc_request_oneof_decreased.yaml new file mode 100644 index 000000000..82371aed6 --- /dev/null +++ b/core/src/test/resources/bc_request_oneof_decreased.yaml @@ -0,0 +1,47 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' +components: + schemas: + WidgetCreateRequest: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + WidgetCreateResponse: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + Doodad: + type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_request_param_allowemptyvalue_decreased.yaml b/core/src/test/resources/bc_request_param_allowemptyvalue_decreased.yaml new file mode 100644 index 000000000..cf25dd898 --- /dev/null +++ b/core/src/test/resources/bc_request_param_allowemptyvalue_decreased.yaml @@ -0,0 +1,28 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + style: form + explode: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_param_base.yaml b/core/src/test/resources/bc_request_param_base.yaml new file mode 100644 index 000000000..555015991 --- /dev/null +++ b/core/src/test/resources/bc_request_param_base.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + style: form + explode: true + allowEmptyValue: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_param_changed_but_compatible.yaml b/core/src/test/resources/bc_request_param_changed_but_compatible.yaml new file mode 100644 index 000000000..281fd0514 --- /dev/null +++ b/core/src/test/resources/bc_request_param_changed_but_compatible.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + allowEmptyValue: true + required: false + schema: + type: string + - name: query-param-2 + in: query + style: form + explode: true + allowEmptyValue: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_param_explode_changed.yaml b/core/src/test/resources/bc_request_param_explode_changed.yaml new file mode 100644 index 000000000..3424c5fbe --- /dev/null +++ b/core/src/test/resources/bc_request_param_explode_changed.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + explode: true + required: true + schema: + type: string + - name: query-param-2 + in: query + style: form + explode: false + allowEmptyValue: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_param_required_increased.yaml b/core/src/test/resources/bc_request_param_required_increased.yaml new file mode 100644 index 000000000..6af74a9bc --- /dev/null +++ b/core/src/test/resources/bc_request_param_required_increased.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + style: form + explode: true + allowEmptyValue: true + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_param_style_changed.yaml b/core/src/test/resources/bc_request_param_style_changed.yaml new file mode 100644 index 000000000..ff8cb1dba --- /dev/null +++ b/core/src/test/resources/bc_request_param_style_changed.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + style: form + schema: + type: string + - name: query-param-2 + in: query + style: simple + explode: true + allowEmptyValue: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_params_base.yaml b/core/src/test/resources/bc_request_params_base.yaml new file mode 100644 index 000000000..9d623821f --- /dev/null +++ b/core/src/test/resources/bc_request_params_base.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_params_changed_but_compatible.yaml b/core/src/test/resources/bc_request_params_changed_but_compatible.yaml new file mode 100644 index 000000000..62a26fbb6 --- /dev/null +++ b/core/src/test/resources/bc_request_params_changed_but_compatible.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + schema: + type: string + - name: query-param-3 + in: query + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_params_decreased.yaml b/core/src/test/resources/bc_request_params_decreased.yaml new file mode 100644 index 000000000..2837bcc4d --- /dev/null +++ b/core/src/test/resources/bc_request_params_decreased.yaml @@ -0,0 +1,22 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_params_required_increased.yaml b/core/src/test/resources/bc_request_params_required_increased.yaml new file mode 100644 index 000000000..d1c2e16c3 --- /dev/null +++ b/core/src/test/resources/bc_request_params_required_increased.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + schema: + type: string + - name: query-param-3 + in: query + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/bc_request_readonly_increased.yaml b/core/src/test/resources/bc_request_readonly_increased.yaml new file mode 100644 index 000000000..5de3149d1 --- /dev/null +++ b/core/src/test/resources/bc_request_readonly_increased.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + readOnly: true + prop2: + type: string + readOnly: true + required: + - prop1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + readOnly: true diff --git a/core/src/test/resources/bc_request_readonly_required_decreased.yaml b/core/src/test/resources/bc_request_readonly_required_decreased.yaml new file mode 100644 index 000000000..73f12cae5 --- /dev/null +++ b/core/src/test/resources/bc_request_readonly_required_decreased.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + required: + - prop1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + readOnly: true diff --git a/core/src/test/resources/bc_request_required_increased.yaml b/core/src/test/resources/bc_request_required_increased.yaml new file mode 100644 index 000000000..cd9821ac0 --- /dev/null +++ b/core/src/test/resources/bc_request_required_increased.yaml @@ -0,0 +1,42 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 + - prop2 + - prop3 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 + - prop2 diff --git a/core/src/test/resources/bc_request_schema_format_decreased.yaml b/core/src/test/resources/bc_request_schema_format_decreased.yaml new file mode 100644 index 000000000..3a69caf83 --- /dev/null +++ b/core/src/test/resources/bc_request_schema_format_decreased.yaml @@ -0,0 +1,115 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int32 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_request_schema_format_increased.yaml b/core/src/test/resources/bc_request_schema_format_increased.yaml new file mode 100644 index 000000000..6201e14c9 --- /dev/null +++ b/core/src/test/resources/bc_request_schema_format_increased.yaml @@ -0,0 +1,115 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int64 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_request_schema_props_put_increased.yaml b/core/src/test/resources/bc_request_schema_props_put_increased.yaml new file mode 100644 index 000000000..9ca619a47 --- /dev/null +++ b/core/src/test/resources/bc_request_schema_props_put_increased.yaml @@ -0,0 +1,117 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + put_prop3: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_required_base.yaml b/core/src/test/resources/bc_required_base.yaml new file mode 100644 index 000000000..711cd20a0 --- /dev/null +++ b/core/src/test/resources/bc_required_base.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 + - prop2 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 + - prop2 diff --git a/core/src/test/resources/bc_required_changed_but_compatible.yaml b/core/src/test/resources/bc_required_changed_but_compatible.yaml new file mode 100644 index 000000000..4e352896f --- /dev/null +++ b/core/src/test/resources/bc_required_changed_but_compatible.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 + - prop2 + - prop3 diff --git a/core/src/test/resources/bc_response_apiresponse_base.yaml b/core/src/test/resources/bc_response_apiresponse_base.yaml new file mode 100644 index 000000000..640a7dc1a --- /dev/null +++ b/core/src/test/resources/bc_response_apiresponse_base.yaml @@ -0,0 +1,18 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + '400': + description: Invalid status value + /widgets/index: + post: + operationId: indexWidgets + description: Regression test for https://github.com/OpenAPITools/openapi-diff/pull/206 (handle missing responses) diff --git a/core/src/test/resources/bc_response_apiresponse_changed_but_compatible.yaml b/core/src/test/resources/bc_response_apiresponse_changed_but_compatible.yaml new file mode 100644 index 000000000..6ad621348 --- /dev/null +++ b/core/src/test/resources/bc_response_apiresponse_changed_but_compatible.yaml @@ -0,0 +1,22 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + '201': + description: OK + '400': + description: Invalid status value + /widgets/index: + post: + operationId: indexWidgets + responses: + '200': + description: successful operation diff --git a/core/src/test/resources/bc_response_apiresponse_decreased.yaml b/core/src/test/resources/bc_response_apiresponse_decreased.yaml new file mode 100644 index 000000000..6502cf0ce --- /dev/null +++ b/core/src/test/resources/bc_response_apiresponse_decreased.yaml @@ -0,0 +1,16 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + /widgets/index: + post: + operationId: indexWidgets + description: Regression test for https://github.com/OpenAPITools/openapi-diff/pull/206 (handle missing responses) diff --git a/core/src/test/resources/bc_response_content_decreased.yaml b/core/src/test/resources/bc_response_content_decreased.yaml new file mode 100644 index 000000000..2915db537 --- /dev/null +++ b/core/src/test/resources/bc_response_content_decreased.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + application/text: + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 diff --git a/core/src/test/resources/bc_response_enum_increased.yaml b/core/src/test/resources/bc_response_enum_increased.yaml new file mode 100644 index 000000000..27a0d58d0 --- /dev/null +++ b/core/src/test/resources/bc_response_enum_increased.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: param-inline-enum + in: query + required: true + schema: + type: string + enum: + - param-inline-enum-val-1 + - param-inline-enum-val-2 + default: param-inline-enum-val-1 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + enum-prop: + type: string + enum: + - enum-prop-val-1 + - enum-prop-val-2 + - enum-prop-val-3 + default: enum-prop-val-1 diff --git a/core/src/test/resources/bc_response_header_base.yaml b/core/src/test/resources/bc_response_header_base.yaml new file mode 100644 index 000000000..17716ba06 --- /dev/null +++ b/core/src/test/resources/bc_response_header_base.yaml @@ -0,0 +1,21 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + required: true + schema: + type: integer + format: int32 + X-Header-2: + schema: + type: integer diff --git a/core/src/test/resources/bc_response_header_deprecated.yaml b/core/src/test/resources/bc_response_header_deprecated.yaml new file mode 100644 index 000000000..0c60132bd --- /dev/null +++ b/core/src/test/resources/bc_response_header_deprecated.yaml @@ -0,0 +1,22 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + required: true + schema: + type: integer + format: int32 + X-Header-2: + deprecated: true + schema: + type: integer diff --git a/core/src/test/resources/bc_response_header_explode.yaml b/core/src/test/resources/bc_response_header_explode.yaml new file mode 100644 index 000000000..d48a726a7 --- /dev/null +++ b/core/src/test/resources/bc_response_header_explode.yaml @@ -0,0 +1,22 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + required: true + schema: + type: integer + format: int32 + X-Header-2: + schema: + type: integer + explode: true diff --git a/core/src/test/resources/bc_response_header_required_added.yaml b/core/src/test/resources/bc_response_header_required_added.yaml new file mode 100644 index 000000000..83bceafe8 --- /dev/null +++ b/core/src/test/resources/bc_response_header_required_added.yaml @@ -0,0 +1,22 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + required: true + schema: + type: integer + format: int32 + X-Header-2: + required: true + schema: + type: integer diff --git a/core/src/test/resources/bc_response_header_required_deleted.yaml b/core/src/test/resources/bc_response_header_required_deleted.yaml new file mode 100644 index 000000000..c227a3921 --- /dev/null +++ b/core/src/test/resources/bc_response_header_required_deleted.yaml @@ -0,0 +1,20 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + schema: + type: integer + format: int32 + X-Header-2: + schema: + type: integer diff --git a/core/src/test/resources/bc_response_headers_base.yaml b/core/src/test/resources/bc_response_headers_base.yaml new file mode 100644 index 000000000..17716ba06 --- /dev/null +++ b/core/src/test/resources/bc_response_headers_base.yaml @@ -0,0 +1,21 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + required: true + schema: + type: integer + format: int32 + X-Header-2: + schema: + type: integer diff --git a/core/src/test/resources/bc_response_headers_increased.yaml b/core/src/test/resources/bc_response_headers_increased.yaml new file mode 100644 index 000000000..837b3e222 --- /dev/null +++ b/core/src/test/resources/bc_response_headers_increased.yaml @@ -0,0 +1,24 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + required: true + schema: + type: integer + format: int32 + X-Header-2: + schema: + type: integer + X-Header-3: + schema: + type: integer diff --git a/core/src/test/resources/bc_response_headers_missing.yaml b/core/src/test/resources/bc_response_headers_missing.yaml new file mode 100644 index 000000000..c5166c9c2 --- /dev/null +++ b/core/src/test/resources/bc_response_headers_missing.yaml @@ -0,0 +1,18 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + headers: + X-Header-1: + required: true + schema: + type: integer + format: int32 diff --git a/core/src/test/resources/bc_response_maxlength_increased.yaml b/core/src/test/resources/bc_response_maxlength_increased.yaml new file mode 100644 index 000000000..40dd4309d --- /dev/null +++ b/core/src/test/resources/bc_response_maxlength_increased.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: string + maxLength: 16 + application/xml: + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + maxLength: 20 + application/xml: + schema: + type: string + maxLength: 20 diff --git a/core/src/test/resources/bc_response_numericrange_exclusive_max_deleted.yaml b/core/src/test/resources/bc_response_numericrange_exclusive_max_deleted.yaml new file mode 100644 index 000000000..385b4759d --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_exclusive_max_deleted.yaml @@ -0,0 +1,54 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true diff --git a/core/src/test/resources/bc_response_numericrange_exclusive_max_unset.yaml b/core/src/test/resources/bc_response_numericrange_exclusive_max_unset.yaml new file mode 100644 index 000000000..e6c1448cd --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_exclusive_max_unset.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: false diff --git a/core/src/test/resources/bc_response_numericrange_exclusive_min_deleted.yaml b/core/src/test/resources/bc_response_numericrange_exclusive_min_deleted.yaml new file mode 100644 index 000000000..49881a7f4 --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_exclusive_min_deleted.yaml @@ -0,0 +1,54 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_response_numericrange_exclusive_min_unset.yaml b/core/src/test/resources/bc_response_numericrange_exclusive_min_unset.yaml new file mode 100644 index 000000000..75bb758fa --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_exclusive_min_unset.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: false + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_response_numericrange_max_deleted.yaml b/core/src/test/resources/bc_response_numericrange_max_deleted.yaml new file mode 100644 index 000000000..6edf439f2 --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_max_deleted.yaml @@ -0,0 +1,53 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_response_numericrange_max_increased.yaml b/core/src/test/resources/bc_response_numericrange_max_increased.yaml new file mode 100644 index 000000000..e994bf88c --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_max_increased.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 21 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 21 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_response_numericrange_min_decreased.yaml b/core/src/test/resources/bc_response_numericrange_min_decreased.yaml new file mode 100644 index 000000000..2055a3247 --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_min_decreased.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 9 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 9 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_response_numericrange_min_deleted.yaml b/core/src/test/resources/bc_response_numericrange_min_deleted.yaml new file mode 100644 index 000000000..087245c07 --- /dev/null +++ b/core/src/test/resources/bc_response_numericrange_min_deleted.yaml @@ -0,0 +1,53 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + minimum: 10 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: integer + format: int32 + exclusiveMinimum: false + exclusiveMaximum: false + application/text: + schema: + type: integer + format: int32 + maximum: 20 + application/xml: + schema: + type: integer + format: int32 + maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true diff --git a/core/src/test/resources/bc_response_oneof_increased.yaml b/core/src/test/resources/bc_response_oneof_increased.yaml new file mode 100644 index 000000000..0d6636e0e --- /dev/null +++ b/core/src/test/resources/bc_response_oneof_increased.yaml @@ -0,0 +1,49 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' +components: + schemas: + WidgetCreateRequest: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + WidgetCreateResponse: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + - $ref: '#/components/schemas/Gizmo' + Doodad: + type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_response_required_decreased.yaml b/core/src/test/resources/bc_response_required_decreased.yaml new file mode 100644 index 000000000..e77d73da4 --- /dev/null +++ b/core/src/test/resources/bc_response_required_decreased.yaml @@ -0,0 +1,40 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 + - prop2 + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + prop3: + type: string + required: + - prop1 diff --git a/core/src/test/resources/bc_response_schema_format_decreased.yaml b/core/src/test/resources/bc_response_schema_format_decreased.yaml new file mode 100644 index 000000000..66ad527df --- /dev/null +++ b/core/src/test/resources/bc_response_schema_format_decreased.yaml @@ -0,0 +1,115 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop2: + type: integer + format: int32 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_response_schema_format_increased.yaml b/core/src/test/resources/bc_response_schema_format_increased.yaml new file mode 100644 index 000000000..1ecc86fb6 --- /dev/null +++ b/core/src/test/resources/bc_response_schema_format_increased.yaml @@ -0,0 +1,115 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int64 + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_response_schema_props_required_decreased.yaml b/core/src/test/resources/bc_response_schema_props_required_decreased.yaml new file mode 100644 index 000000000..cbd2c5a44 --- /dev/null +++ b/core/src/test/resources/bc_response_schema_props_required_decreased.yaml @@ -0,0 +1,112 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_response_writeonly_increased.yaml b/core/src/test/resources/bc_response_writeonly_increased.yaml new file mode 100644 index 000000000..a009b8dc6 --- /dev/null +++ b/core/src/test/resources/bc_response_writeonly_increased.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + writeOnly: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + writeOnly: true + prop2: + type: string + writeOnly: true + required: + - prop1 diff --git a/core/src/test/resources/bc_response_writeonly_required_decreased.yaml b/core/src/test/resources/bc_response_writeonly_required_decreased.yaml new file mode 100644 index 000000000..74bf153ef --- /dev/null +++ b/core/src/test/resources/bc_response_writeonly_required_decreased.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + writeOnly: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + required: + - prop1 diff --git a/core/src/test/resources/bc_schema_base.yaml b/core/src/test/resources/bc_schema_base.yaml new file mode 100644 index 000000000..28d8800d8 --- /dev/null +++ b/core/src/test/resources/bc_schema_base.yaml @@ -0,0 +1,115 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_schema_changed_but_compatible.yaml b/core/src/test/resources/bc_schema_changed_but_compatible.yaml new file mode 100644 index 000000000..e8a6e7e94 --- /dev/null +++ b/core/src/test/resources/bc_schema_changed_but_compatible.yaml @@ -0,0 +1,114 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop2: + type: integer + format: int64 + request_prop3: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop3: + type: string + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + deprecated: true + prop2: + type: integer + format: int32 + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_schema_discriminator_changed.yaml b/core/src/test/resources/bc_schema_discriminator_changed.yaml new file mode 100644 index 000000000..fd9569001 --- /dev/null +++ b/core/src/test/resources/bc_schema_discriminator_changed.yaml @@ -0,0 +1,115 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: 'prop1' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_schema_type_changed.yaml b/core/src/test/resources/bc_schema_type_changed.yaml new file mode 100644 index 000000000..946d16890 --- /dev/null +++ b/core/src/test/resources/bc_schema_type_changed.yaml @@ -0,0 +1,114 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: string + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string diff --git a/core/src/test/resources/bc_security_requirement_base.yaml b/core/src/test/resources/bc_security_requirement_base.yaml new file mode 100644 index 000000000..477736519 --- /dev/null +++ b/core/src/test/resources/bc_security_requirement_base.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - my-scheme-1: [] + my-scheme-2: [] +components: + securitySchemes: + my-scheme-1: + type: http + scheme: basic + my-scheme-2: + type: http + scheme: basic + my-scheme-3: + type: http + scheme: basic diff --git a/core/src/test/resources/bc_security_requirement_changed_but_compatible.yaml b/core/src/test/resources/bc_security_requirement_changed_but_compatible.yaml new file mode 100644 index 000000000..9a58c327f --- /dev/null +++ b/core/src/test/resources/bc_security_requirement_changed_but_compatible.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - my-scheme-1: [] +components: + securitySchemes: + my-scheme-1: + type: http + scheme: basic + my-scheme-2: + type: http + scheme: basic + my-scheme-3: + type: http + scheme: basic diff --git a/core/src/test/resources/bc_security_requirement_schemes_increased.yaml b/core/src/test/resources/bc_security_requirement_schemes_increased.yaml new file mode 100644 index 000000000..234aa7a29 --- /dev/null +++ b/core/src/test/resources/bc_security_requirement_schemes_increased.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - my-scheme-1: [] + my-scheme-2: [] + my-scheme-3: [] +components: + securitySchemes: + my-scheme-1: + type: http + scheme: basic + my-scheme-2: + type: http + scheme: basic + my-scheme-3: + type: http + scheme: basic diff --git a/core/src/test/resources/bc_security_requirements_base.yaml b/core/src/test/resources/bc_security_requirements_base.yaml new file mode 100644 index 000000000..9c4c04650 --- /dev/null +++ b/core/src/test/resources/bc_security_requirements_base.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - my-scheme-1: [] + - my-scheme-2: [] +components: + securitySchemes: + my-scheme-1: + type: http + scheme: basic + my-scheme-2: + type: http + scheme: basic + my-scheme-3: + type: http + scheme: basic diff --git a/core/src/test/resources/bc_security_requirements_changed_but_compatible.yaml b/core/src/test/resources/bc_security_requirements_changed_but_compatible.yaml new file mode 100644 index 000000000..ba983bc36 --- /dev/null +++ b/core/src/test/resources/bc_security_requirements_changed_but_compatible.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - my-scheme-1: [] + - my-scheme-2: [] + - my-scheme-3: [] +components: + securitySchemes: + my-scheme-1: + type: http + scheme: basic + my-scheme-2: + type: http + scheme: basic + my-scheme-3: + type: http + scheme: basic diff --git a/core/src/test/resources/bc_security_requirements_decreased.yaml b/core/src/test/resources/bc_security_requirements_decreased.yaml new file mode 100644 index 000000000..9a58c327f --- /dev/null +++ b/core/src/test/resources/bc_security_requirements_decreased.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - my-scheme-1: [] +components: + securitySchemes: + my-scheme-1: + type: http + scheme: basic + my-scheme-2: + type: http + scheme: basic + my-scheme-3: + type: http + scheme: basic diff --git a/core/src/test/resources/bc_security_requirements_scheme_type_changed.yaml b/core/src/test/resources/bc_security_requirements_scheme_type_changed.yaml new file mode 100644 index 000000000..d2e6f1a95 --- /dev/null +++ b/core/src/test/resources/bc_security_requirements_scheme_type_changed.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - my-scheme-1: [] + - my-scheme-2: [] +components: + securitySchemes: + my-scheme-1: + type: apiKey + name: api_key + in: header + my-scheme-2: + type: http + scheme: basic + my-scheme-3: + type: http + scheme: basic diff --git a/core/src/test/resources/bc_security_scheme_base.yaml b/core/src/test/resources/bc_security_scheme_base.yaml new file mode 100644 index 000000000..00caad137 --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_base.yaml @@ -0,0 +1,42 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" + - "scope2" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: header + basic-scheme-1: + type: http + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_security_scheme_bearer_format_changed.yaml b/core/src/test/resources/bc_security_scheme_bearer_format_changed.yaml new file mode 100644 index 000000000..bf7fcca56 --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_bearer_format_changed.yaml @@ -0,0 +1,43 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" + - "scope2" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: header + basic-scheme-1: + type: http + bearerFormat: myBearerFormat + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_security_scheme_changed_but_compatible.yaml b/core/src/test/resources/bc_security_scheme_changed_but_compatible.yaml new file mode 100644 index 000000000..5cf1f26bf --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_changed_but_compatible.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: header + basic-scheme-1: + type: http + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_security_scheme_in_changed.yaml b/core/src/test/resources/bc_security_scheme_in_changed.yaml new file mode 100644 index 000000000..5d937c361 --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_in_changed.yaml @@ -0,0 +1,42 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" + - "scope2" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: query + basic-scheme-1: + type: http + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_security_scheme_open_id_connect_url_changed.yaml b/core/src/test/resources/bc_security_scheme_open_id_connect_url_changed.yaml new file mode 100644 index 000000000..e981a945f --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_open_id_connect_url_changed.yaml @@ -0,0 +1,42 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" + - "scope2" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: header + basic-scheme-1: + type: http + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect2 + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_security_scheme_scheme_changed.yaml b/core/src/test/resources/bc_security_scheme_scheme_changed.yaml new file mode 100644 index 000000000..5b474049d --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_scheme_changed.yaml @@ -0,0 +1,43 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" + - "scope2" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: header + basic-scheme-1: + type: http + scheme: Digest + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_security_scheme_scopes_increased.yaml b/core/src/test/resources/bc_security_scheme_scopes_increased.yaml new file mode 100644 index 000000000..8cfe76833 --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_scopes_increased.yaml @@ -0,0 +1,43 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" + - "scope2" + - "scope3" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: header + basic-scheme-1: + type: http + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_security_scheme_type_changed.yaml b/core/src/test/resources/bc_security_scheme_type_changed.yaml new file mode 100644 index 000000000..985a1a17b --- /dev/null +++ b/core/src/test/resources/bc_security_scheme_type_changed.yaml @@ -0,0 +1,42 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string + security: + - basic-scheme-1: [] + - apikey-scheme-1: [] + - openidconnect-scheme-1: [] + - oauth2-scheme-1: + - "scope1" + - "scope2" +components: + securitySchemes: + apikey-scheme-1: + type: apiKey + name: api_key + in: header + basic-scheme-1: + type: apiKey + openidconnect-scheme-1: + type: openIdConnect + openIdConnectUrl: https://example.com/api/openidconnect + oauth2-scheme-1: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + scope1: scope1 description + scope2: scope2 description diff --git a/core/src/test/resources/bc_writeonly_base.yaml b/core/src/test/resources/bc_writeonly_base.yaml new file mode 100644 index 000000000..ad3c869db --- /dev/null +++ b/core/src/test/resources/bc_writeonly_base.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + writeOnly: true + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + writeOnly: true + prop2: + type: string + required: + - prop1 diff --git a/core/src/test/resources/bc_writeonly_changed_but_compatible.yaml b/core/src/test/resources/bc_writeonly_changed_but_compatible.yaml new file mode 100644 index 000000000..48857215b --- /dev/null +++ b/core/src/test/resources/bc_writeonly_changed_but_compatible.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + writeOnly: true + prop2: + type: string + required: + - prop1 From 37b2d06f686773a5d2df5065fbce90940315889b Mon Sep 17 00:00:00 2001 From: nithintatikonda1 <77759605+nithintatikonda1@users.noreply.github.com> Date: Tue, 25 Jul 2023 12:44:41 -0700 Subject: [PATCH 144/313] Fix old parameter compared with itself in HtmlRender (#547) Co-authored-by: Nithin Tatikonda <nithin.t@versa-networks.com> --- .../org/openapitools/openapidiff/core/output/HtmlRender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java index 0513424cd..31bac91b2 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java @@ -400,7 +400,7 @@ private LiTag li_changedParam(ChangedParameter changeParam) { .map(ChangedMetadata::isDifferent) .orElse(false); Parameter rightParam = changeParam.getNewParameter(); - Parameter leftParam = changeParam.getNewParameter(); + Parameter leftParam = changeParam.getOldParameter(); LiTag li = li().withText(changeParam.getName() + " in " + changeParam.getIn()); if (changeRequired) { li.withText(" change into " + (rightParam.getRequired() ? "required" : "not required")); From 830a887193e2512f7af468ba8204dc5d6f9bc64f Mon Sep 17 00:00:00 2001 From: lsalgo <lsalgo@ohpen.com> Date: Tue, 25 Jul 2023 21:48:38 +0200 Subject: [PATCH 145/313] Fix renderer memory issues by writing to OutputStream (#544) Closes #543 --- .../openapitools/openapidiff/cli/Main.java | 46 ++++---- .../core/exception/RendererException.java | 12 +++ .../core/output/ConsoleRender.java | 100 +++++++++--------- .../openapidiff/core/output/HtmlRender.java | 25 ++++- .../openapidiff/core/output/JsonRender.java | 20 ++-- .../core/output/MarkdownRender.java | 89 ++++++++-------- .../openapidiff/core/output/Render.java | 13 ++- .../core/AdditionalPropertiesTest.java | 7 +- .../openapidiff/core/ConsoleRenderTest.java | 12 ++- .../openapidiff/core/HtmlRenderTest.java | 7 +- .../openapidiff/core/JsonRenderTest.java | 12 ++- .../openapidiff/core/MarkdownRenderTest.java | 17 ++- .../openapidiff/core/OpenApiDiffTest.java | 81 +++++++------- .../core/ResponseAddedContentSchemaTest.java | 23 +++- .../openapidiff/maven/OpenApiDiffMojo.java | 7 +- 15 files changed, 275 insertions(+), 196 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/exception/RendererException.java diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index 21503e08a..f19826a93 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -2,9 +2,9 @@ import ch.qos.logback.classic.Level; import io.swagger.v3.parser.core.models.AuthorizationValue; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; import java.util.Collections; import java.util.List; import org.apache.commons.cli.CommandLine; @@ -14,7 +14,6 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; @@ -175,29 +174,33 @@ public static void main(String... args) { ChangedOpenApi result = OpenApiCompare.fromLocations(oldPath, newPath, auths); ConsoleRender consoleRender = new ConsoleRender(); if (!logLevel.equals("OFF")) { - System.out.println(consoleRender.render(result)); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + consoleRender.render(result, outputStreamWriter); + System.out.println(outputStream); } if (line.hasOption("html")) { HtmlRender htmlRender = new HtmlRender(); - String output = htmlRender.render(result); - String outputFile = line.getOptionValue("html"); - writeOutput(output, outputFile); + FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("html")); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + htmlRender.render(result, outputStreamWriter); } if (line.hasOption("markdown")) { MarkdownRender mdRender = new MarkdownRender(); - String output = mdRender.render(result); - String outputFile = line.getOptionValue("markdown"); - writeOutput(output, outputFile); + FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("markdown")); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + mdRender.render(result, outputStreamWriter); } if (line.hasOption("text")) { - String output = consoleRender.render(result); - String outputFile = line.getOptionValue("text"); - writeOutput(output, outputFile); + FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("text")); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + consoleRender.render(result, outputStreamWriter); } if (line.hasOption("json")) { JsonRender jsonRender = new JsonRender(); - String outputFile = line.getOptionValue("json"); - jsonRender.renderToFile(result, outputFile); + FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("json")); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + jsonRender.render(result, outputStreamWriter); } if (line.hasOption("state")) { System.out.println(result.isChanged().getValue()); @@ -222,17 +225,6 @@ public static void main(String... args) { } } - private static void writeOutput(String output, String outputFile) { - File file = new File(outputFile); - logger.debug("Output file: {}", file.getAbsolutePath()); - try { - FileUtils.writeStringToFile(file, output, StandardCharsets.UTF_8); - } catch (IOException e) { - logger.error("Impossible to write output to file {}", outputFile, e); - System.exit(2); - } - } - public static void printHelp(Options options) { HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("openapi-diff <old> <new>", options); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/exception/RendererException.java b/core/src/main/java/org/openapitools/openapidiff/core/exception/RendererException.java new file mode 100644 index 000000000..d7dc24447 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/exception/RendererException.java @@ -0,0 +1,12 @@ +package org.openapitools.openapidiff.core.exception; + +public class RendererException extends RuntimeException { + + public RendererException(Throwable cause) { + super(cause); + } + + public RendererException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java index 72597ad91..a3e3a31ee 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java @@ -6,11 +6,14 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; +import java.io.IOException; +import java.io.OutputStreamWriter; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import org.apache.commons.lang3.StringUtils; +import org.openapitools.openapidiff.core.exception.RendererException; import org.openapitools.openapidiff.core.model.*; import org.openapitools.openapidiff.core.utils.RefPointer; import org.openapitools.openapidiff.core.utils.RefType; @@ -21,81 +24,78 @@ public class ConsoleRender implements Render { protected ChangedOpenApi diff; @Override - public String render(ChangedOpenApi diff) { + public void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) { this.diff = diff; - StringBuilder output = new StringBuilder(); if (diff.isUnchanged()) { - output.append("No differences. Specifications are equivalents"); + safelyAppend(outputStreamWriter, "No differences. Specifications are equivalents"); } else { - output - .append(bigTitle("Api Change Log")) - .append(StringUtils.center(diff.getNewSpecOpenApi().getInfo().getTitle(), LINE_LENGTH)) - .append(System.lineSeparator()); + safelyAppend(outputStreamWriter, bigTitle("Api Change Log")); + safelyAppend( + outputStreamWriter, + StringUtils.center(diff.getNewSpecOpenApi().getInfo().getTitle(), LINE_LENGTH)); + safelyAppend(outputStreamWriter, System.lineSeparator()); List<Endpoint> newEndpoints = diff.getNewEndpoints(); - String ol_newEndpoint = listEndpoints(newEndpoints, "What's New"); + listEndpoints(newEndpoints, "What's New", outputStreamWriter); List<Endpoint> missingEndpoints = diff.getMissingEndpoints(); - String ol_missingEndpoint = listEndpoints(missingEndpoints, "What's Deleted"); + listEndpoints(missingEndpoints, "What's Deleted", outputStreamWriter); List<Endpoint> deprecatedEndpoints = diff.getDeprecatedEndpoints(); - String ol_deprecatedEndpoint = listEndpoints(deprecatedEndpoints, "What's Deprecated"); + listEndpoints(deprecatedEndpoints, "What's Deprecated", outputStreamWriter); List<ChangedOperation> changedOperations = diff.getChangedOperations(); - String ol_changed = ol_changed(changedOperations); - - output - .append(renderBody(ol_newEndpoint, ol_missingEndpoint, ol_deprecatedEndpoint, ol_changed)) - .append(title("Result")) - .append( - StringUtils.center( - diff.isCompatible() - ? "API changes are backward compatible" - : "API changes broke backward compatibility", - LINE_LENGTH)) - .append(System.lineSeparator()) - .append(separator('-')); + ol_changed(changedOperations, outputStreamWriter); + + safelyAppend( + outputStreamWriter, + StringUtils.center( + diff.isCompatible() + ? "API changes are backward compatible" + : "API changes broke backward compatibility", + LINE_LENGTH)); + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend(outputStreamWriter, separator('-')); + } + try { + outputStreamWriter.close(); + } catch (IOException e) { + throw new RendererException(e); } - return output.toString(); } - private String ol_changed(List<ChangedOperation> operations) { + private void ol_changed( + List<ChangedOperation> operations, OutputStreamWriter outputStreamWriter) { if (null == operations || operations.isEmpty()) { - return ""; + return; } - StringBuilder sb = new StringBuilder(); - sb.append(title("What's Changed")); + safelyAppend(outputStreamWriter, title("What's Changed")); for (ChangedOperation operation : operations) { String pathUrl = operation.getPathUrl(); String method = operation.getHttpMethod().toString(); String desc = Optional.ofNullable(operation.getSummary()).map(ChangedMetadata::getRight).orElse(""); - StringBuilder ul_detail = new StringBuilder(); if (result(operation.getParameters()).isDifferent()) { - ul_detail - .append(StringUtils.repeat(' ', 2)) - .append("Parameter:") - .append(System.lineSeparator()) - .append(ul_param(operation.getParameters())); + safelyAppend(outputStreamWriter, StringUtils.repeat(' ', 2)); + safelyAppend(outputStreamWriter, "Parameter:"); + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend(outputStreamWriter, ul_param(operation.getParameters())); } if (operation.resultRequestBody().isDifferent()) { - ul_detail - .append(StringUtils.repeat(' ', 2)) - .append("Request:") - .append(System.lineSeparator()) - .append(ul_content(operation.getRequestBody().getContent(), true)); + safelyAppend(outputStreamWriter, StringUtils.repeat(' ', 2)); + safelyAppend(outputStreamWriter, "Request:"); + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend(outputStreamWriter, ul_content(operation.getRequestBody().getContent(), true)); } if (operation.resultApiResponses().isDifferent()) { - ul_detail - .append(StringUtils.repeat(' ', 2)) - .append("Return Type:") - .append(System.lineSeparator()) - .append(ul_response(operation.getApiResponses())); + safelyAppend(outputStreamWriter, StringUtils.repeat(' ', 2)); + safelyAppend(outputStreamWriter, "Return Type:"); + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend(outputStreamWriter, ul_response(operation.getApiResponses())); } - sb.append(itemEndpoint(method, pathUrl, desc)).append(ul_detail); + safelyAppend(outputStreamWriter, itemEndpoint(method, pathUrl, desc)); } - return sb.toString(); } private String ul_response(ChangedApiResponse changedApiResponse) { @@ -279,7 +279,8 @@ private String li_changedParam(ChangedParameter changeParam) { } } - private String listEndpoints(List<Endpoint> endpoints, String title) { + private String listEndpoints( + List<Endpoint> endpoints, String title, OutputStreamWriter outputStreamWriter) { if (null == endpoints || endpoints.isEmpty()) { return ""; } @@ -317,8 +318,7 @@ public String title(String title, char ch) { separator(ch), little, StringUtils.center(title, LINE_LENGTH - 4), little, separator(ch)); } - public StringBuilder separator(char ch) { - StringBuilder sb = new StringBuilder(); - return sb.append(StringUtils.repeat(ch, LINE_LENGTH)).append(System.lineSeparator()); + public String separator(char ch) { + return StringUtils.repeat(ch, LINE_LENGTH) + System.lineSeparator(); } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java index 31bac91b2..f84bd79ed 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java @@ -26,16 +26,20 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; +import j2html.rendering.FlatHtml; import j2html.tags.ContainerTag; import j2html.tags.specialized.DivTag; import j2html.tags.specialized.HtmlTag; import j2html.tags.specialized.LiTag; import j2html.tags.specialized.OlTag; import j2html.tags.specialized.UlTag; +import java.io.IOException; +import java.io.OutputStreamWriter; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; +import org.openapitools.openapidiff.core.exception.RendererException; import org.openapitools.openapidiff.core.model.ChangedApiResponse; import org.openapitools.openapidiff.core.model.ChangedContent; import org.openapitools.openapidiff.core.model.ChangedMediaType; @@ -71,7 +75,7 @@ public HtmlRender(String title, String linkCss) { this.linkCss = linkCss; } - public String render(ChangedOpenApi diff) { + public void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) { this.diff = diff; List<Endpoint> newEndpoints = diff.getNewEndpoints(); @@ -86,10 +90,16 @@ public String render(ChangedOpenApi diff) { List<ChangedOperation> changedOperations = diff.getChangedOperations(); OlTag ol_changed = ol_changed(changedOperations); - return renderHtml(ol_newEndpoint, ol_missingEndpoint, ol_deprecatedEndpoint, ol_changed); + renderHtml( + ol_newEndpoint, ol_missingEndpoint, ol_deprecatedEndpoint, ol_changed, outputStreamWriter); } - public String renderHtml(OlTag ol_new, OlTag ol_miss, OlTag ol_deprec, OlTag ol_changed) { + public void renderHtml( + OlTag ol_new, + OlTag ol_miss, + OlTag ol_deprec, + OlTag ol_changed, + OutputStreamWriter outputStreamWriter) { HtmlTag html = html() .attr("lang", "en") @@ -110,7 +120,14 @@ public String renderHtml(OlTag ol_new, OlTag ol_miss, OlTag ol_deprec, OlTag ol_ div().with(h2("What's Deprecated"), hr(), ol_deprec), div().with(h2("What's Changed"), hr(), ol_changed)))); - return document().render() + html.render(); + try { + FlatHtml<OutputStreamWriter> flatHtml = FlatHtml.into(outputStreamWriter); + document().render(flatHtml); + html.render(flatHtml); + outputStreamWriter.close(); + } catch (IOException e) { + throw new RendererException("Problem rendering html document.", e); + } } private OlTag ol_newEndpoint(List<Endpoint> endpoints) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java index a0dfa09fb..b6629d5f9 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/JsonRender.java @@ -4,7 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; -import java.nio.file.Paths; +import java.io.OutputStreamWriter; +import org.openapitools.openapidiff.core.exception.RendererException; import org.openapitools.openapidiff.core.model.ChangedOpenApi; public class JsonRender implements Render { @@ -17,21 +18,14 @@ public JsonRender() { } @Override - public String render(ChangedOpenApi diff) { + public void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) { try { - return objectMapper.writeValueAsString(diff); + objectMapper.writeValue(outputStreamWriter, diff); + outputStreamWriter.close(); } catch (JsonProcessingException e) { - throw new RuntimeException("Could not serialize diff as JSON", e); - } - } - - public void renderToFile(ChangedOpenApi diff, String file) { - try { - objectMapper.writeValue(Paths.get(file).toFile(), diff); - } catch (JsonProcessingException e) { - throw new RuntimeException("Could not serialize diff as JSON", e); + throw new RendererException("Could not serialize diff as JSON", e); } catch (IOException e) { - throw new RuntimeException("Could not write to JSON file", e); + throw new RendererException(e); } } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java index 595b97cf5..5e0d0dd76 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java @@ -11,11 +11,14 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; +import java.io.IOException; +import java.io.OutputStreamWriter; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; +import org.openapitools.openapidiff.core.exception.RendererException; import org.openapitools.openapidiff.core.model.*; import org.openapitools.openapidiff.core.utils.RefPointer; import org.openapitools.openapidiff.core.utils.RefType; @@ -44,28 +47,33 @@ public class MarkdownRender implements Render { */ protected boolean showChangedMetadata; - public String render(ChangedOpenApi diff) { + public void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) { this.diff = diff; this.handledSchemas.clear(); - return listEndpoints("What's New", diff.getNewEndpoints()) - + listEndpoints("What's Deleted", diff.getMissingEndpoints()) - + listEndpoints("What's Deprecated", diff.getDeprecatedEndpoints()) - + listEndpoints(diff.getChangedOperations()); + listEndpoints("What's New", diff.getNewEndpoints(), outputStreamWriter); + listEndpoints("What's Deleted", diff.getMissingEndpoints(), outputStreamWriter); + listEndpoints("What's Deprecated", diff.getDeprecatedEndpoints(), outputStreamWriter); + listEndpoints(diff.getChangedOperations(), outputStreamWriter); + try { + outputStreamWriter.close(); + } catch (IOException e) { + throw new RendererException(e); + } } protected String sectionTitle(String title) { return H4 + title + '\n' + HR + '\n'; } - protected String listEndpoints(String title, List<Endpoint> endpoints) { + protected void listEndpoints( + String title, List<Endpoint> endpoints, OutputStreamWriter outputStreamWriter) { if (null == endpoints || endpoints.isEmpty()) { - return ""; + return; } - StringBuilder sb = new StringBuilder(sectionTitle(title)); + safelyAppend(outputStreamWriter, sectionTitle(title)); endpoints.stream() .map(e -> itemEndpoint(e.getMethod().toString(), e.getPathUrl(), e.getSummary())) - .forEach(sb::append); - return sb.toString(); + .forEach(csq -> safelyAppend(outputStreamWriter, csq)); } protected String itemEndpoint(String method, String path, String summary) { @@ -80,41 +88,36 @@ protected String titleH5(String title) { return H6 + title + '\n'; } - protected String listEndpoints(List<ChangedOperation> changedOperations) { + protected void listEndpoints( + List<ChangedOperation> changedOperations, OutputStreamWriter outputStreamWriter) { if (null == changedOperations || changedOperations.isEmpty()) { - return ""; + return; } - StringBuilder sb = new StringBuilder(sectionTitle("What's Changed")); - changedOperations.stream() - .map( - operation -> { - StringBuilder details = - new StringBuilder() - .append( - itemEndpoint( - operation.getHttpMethod().toString(), - operation.getPathUrl(), - operation.getSummary())); - if (result(operation.getParameters()).isDifferent()) { - details - .append(titleH5("Parameters:")) - .append(parameters(operation.getParameters())); - } - if (operation.resultRequestBody().isDifferent()) { - details - .append(titleH5("Request:")) - .append(metadata("Description", operation.getRequestBody().getDescription())) - .append(bodyContent(operation.getRequestBody().getContent())); - } - if (operation.resultApiResponses().isDifferent()) { - details - .append(titleH5("Return Type:")) - .append(responses(operation.getApiResponses())); - } - return details.toString(); - }) - .forEach(sb::append); - return sb.toString(); + safelyAppend(outputStreamWriter, sectionTitle("What's Changed")); + changedOperations.forEach( + operation -> { + safelyAppend( + outputStreamWriter, + itemEndpoint( + operation.getHttpMethod().toString(), + operation.getPathUrl(), + operation.getSummary())); + if (result(operation.getParameters()).isDifferent()) { + safelyAppend(outputStreamWriter, titleH5("Parameters:")); + safelyAppend(outputStreamWriter, parameters(operation.getParameters())); + } + if (operation.resultRequestBody().isDifferent()) { + safelyAppend(outputStreamWriter, titleH5("Request:")); + safelyAppend( + outputStreamWriter, + metadata("Description", operation.getRequestBody().getDescription())); + safelyAppend(outputStreamWriter, bodyContent(operation.getRequestBody().getContent())); + } + if (operation.resultApiResponses().isDifferent()) { + safelyAppend(outputStreamWriter, titleH5("Return Type:")); + safelyAppend(outputStreamWriter, responses(operation.getApiResponses())); + } + }); } protected String responses(ChangedApiResponse changedApiResponse) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java b/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java index 4a48ebcfa..8169f31cd 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java @@ -1,8 +1,19 @@ package org.openapitools.openapidiff.core.output; +import java.io.IOException; +import java.io.OutputStreamWriter; +import org.openapitools.openapidiff.core.exception.RendererException; import org.openapitools.openapidiff.core.model.ChangedOpenApi; public interface Render { - String render(ChangedOpenApi diff); + void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter); + + default void safelyAppend(OutputStreamWriter outputStreamWriter, String csq) { + try { + outputStreamWriter.append(csq); + } catch (IOException ex) { + throw new RendererException(ex); + } + } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java index df7885e08..7fabd712c 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.ConsoleRender; @@ -9,8 +11,11 @@ class AdditionalPropertiesTest { @Test void booleanAdditionalPropertiesAreSupported() { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("issue-256_1.json", "issue-256_2.json"); ConsoleRender render = new ConsoleRender(); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java index 455631700..f56b4cb95 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.ConsoleRender; @@ -10,16 +12,22 @@ public class ConsoleRenderTest { @Test public void renderDoesNotFailWhenPropertyHasBeenRemoved() { ConsoleRender render = new ConsoleRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test public void renderDoesNotFailWhenHTTPStatusCodeIsRange() { ConsoleRender render = new ConsoleRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("range_statuscode_1.yaml", "range_statuscode_2.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/HtmlRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/HtmlRenderTest.java index 6273ef243..aa44725c4 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/HtmlRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/HtmlRenderTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.HtmlRender; @@ -10,8 +12,11 @@ public class HtmlRenderTest { @Test public void renderDoesNotFailWhenPropertyHasBeenRemoved() { HtmlRender render = new HtmlRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java index aba54ea41..280dce9d0 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.JsonRender; @@ -10,16 +12,22 @@ public class JsonRenderTest { @Test public void renderDoesNotFailWhenPropertyHasBeenRemoved() { JsonRender render = new JsonRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test public void renderDoesNotFailForJsr310Types() { JsonRender render = new JsonRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("jsr310_property_1.yaml", "jsr310_property_2.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java index 36e007a8c..d30c6e0b1 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.MarkdownRender; @@ -10,23 +12,32 @@ public class MarkdownRenderTest { @Test public void renderDoesNotFailWhenPropertyHasBeenRemoved() { MarkdownRender render = new MarkdownRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test public void renderDoesNotCauseStackOverflowWithRecursiveDefinitions() { MarkdownRender render = new MarkdownRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("recursive_old.yaml", "recursive_new.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test public void renderDoesNotFailWhenHTTPStatusCodeIsRange() { MarkdownRender render = new MarkdownRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = OpenApiCompare.fromLocations("range_statuscode_1.yaml", "range_statuscode_2.yaml"); - assertThat(render.render(diff)).isNotBlank(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java index 2d52392fe..ea21bd282 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java @@ -6,12 +6,10 @@ import io.swagger.parser.OpenAPIParser; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.parser.core.models.ParseOptions; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import java.util.List; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.model.ChangedOperation; import org.openapitools.openapidiff.core.model.DiffResult; @@ -19,6 +17,7 @@ import org.openapitools.openapidiff.core.output.HtmlRender; import org.openapitools.openapidiff.core.output.JsonRender; import org.openapitools.openapidiff.core.output.MarkdownRender; +import org.openapitools.openapidiff.core.output.Render; public class OpenApiDiffTest { @@ -35,7 +34,7 @@ public void testEqual() { } @Test - public void testNewApi(@TempDir Path tempDir) throws IOException { + public void testNewApi() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_EMPTY_DOC, OPENAPI_DOC2); List<Endpoint> newEndpoints = changedOpenApi.getNewEndpoints(); List<Endpoint> missingEndpoints = changedOpenApi.getMissingEndpoints(); @@ -44,18 +43,16 @@ public void testNewApi(@TempDir Path tempDir) throws IOException { assertThat(missingEndpoints).isEmpty(); assertThat(changedEndPoints).isEmpty(); - String html = - new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css") - .render(changedOpenApi); - final Path path = tempDir.resolve("testNewApi.html"); - try (FileWriter fw = new FileWriter(path.toFile())) { - fw.write(html); - } - assertThat(path).isNotEmptyFile(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + Render render = + new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css"); + render.render(changedOpenApi, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test - public void testDeprecatedApi(@TempDir Path tempDir) throws IOException { + public void testDeprecatedApi() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_EMPTY_DOC); List<Endpoint> newEndpoints = changedOpenApi.getNewEndpoints(); List<Endpoint> missingEndpoints = changedOpenApi.getMissingEndpoints(); @@ -64,52 +61,46 @@ public void testDeprecatedApi(@TempDir Path tempDir) throws IOException { assertThat(missingEndpoints).isNotEmpty(); assertThat(changedEndPoints).isEmpty(); - String html = - new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css") - .render(changedOpenApi); - final Path path = tempDir.resolve("testDeprecatedApi.html"); - try (FileWriter fw = new FileWriter(path.toFile())) { - fw.write(html); - } - assertThat(path).isNotEmptyFile(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + Render render = + new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css"); + render.render(changedOpenApi, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test - public void testDiff(@TempDir Path tempDir) throws IOException { + public void testDiff() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); List<ChangedOperation> changedEndPoints = changedOpenApi.getChangedOperations(); assertThat(changedEndPoints).isNotEmpty(); - String html = - new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css") - .render(changedOpenApi); - final Path path = tempDir.resolve("testDiff.html"); - try (FileWriter fw = new FileWriter(path.toFile())) { - fw.write(html); - } - assertThat(path).isNotEmptyFile(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + Render render = + new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css"); + render.render(changedOpenApi, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test - public void testDiffAndMarkdown(@TempDir Path tempDir) throws IOException { + public void testDiffAndMarkdown() { ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - String render = new MarkdownRender().render(diff); - final Path path = tempDir.resolve("testDiff.md"); - try (FileWriter fw = new FileWriter(path.toFile())) { - fw.write(render); - } - assertThat(path).isNotEmptyFile(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + Render render = new MarkdownRender(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } @Test - public void testDiffAndJson(@TempDir Path tempDir) throws IOException { + public void testDiffAndJson() { ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - String render = new JsonRender().render(diff); - final Path path = tempDir.resolve("testDiff.json"); - try (FileWriter fw = new FileWriter(path.toFile())) { - fw.write(render); - } - assertThat(path).isNotEmptyFile(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + Render render = new JsonRender(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } /** Testing that repetitive specs comparisons has to produce consistent result. */ diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ResponseAddedContentSchemaTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ResponseAddedContentSchemaTest.java index a4f0cabb0..725c7e0e9 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ResponseAddedContentSchemaTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ResponseAddedContentSchemaTest.java @@ -3,6 +3,8 @@ import static org.assertj.core.api.Assertions.assertThat; import io.swagger.v3.oas.models.media.Content; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import java.util.Map; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; @@ -10,6 +12,7 @@ import org.openapitools.openapidiff.core.output.ConsoleRender; import org.openapitools.openapidiff.core.output.HtmlRender; import org.openapitools.openapidiff.core.output.MarkdownRender; +import org.openapitools.openapidiff.core.output.Render; public class ResponseAddedContentSchemaTest { @@ -39,8 +42,22 @@ public void testDiffDifferent() { public void testDiffCanBeRendered() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - assertThat(new ConsoleRender().render(changedOpenApi)).isNotBlank(); - assertThat(new HtmlRender().render(changedOpenApi)).isNotBlank(); - assertThat(new MarkdownRender().render(changedOpenApi)).isNotBlank(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + Render render = new ConsoleRender(); + render.render(changedOpenApi, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); + + outputStream = new ByteArrayOutputStream(); + outputStreamWriter = new OutputStreamWriter(outputStream); + render = new HtmlRender(); + render.render(changedOpenApi, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); + + outputStream = new ByteArrayOutputStream(); + outputStreamWriter = new OutputStreamWriter(outputStream); + render = new MarkdownRender(); + render.render(changedOpenApi, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); } } diff --git a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java index 7b1e679d4..af402c9f2 100644 --- a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java +++ b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.maven; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -37,7 +39,10 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { final ChangedOpenApi diff = OpenApiCompare.fromLocations(oldSpec, newSpec); - getLog().info(new ConsoleRender().render(diff)); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + new ConsoleRender().render(diff, outputStreamWriter); + getLog().info(outputStream.toString()); if (failOnIncompatible && diff.isIncompatible()) { throw new BackwardIncompatibilityException("The API changes broke backward compatibility"); From 5b5b820a8555b8f503ca64fb9d4518ac179c1348 Mon Sep 17 00:00:00 2001 From: Bhavesh Mistry <bmistry13@users.noreply.github.com> Date: Tue, 25 Jul 2023 12:54:21 -0700 Subject: [PATCH 146/313] Fix potential NPEs in ParametersDiff and HtmlRender (#517) Co-authored-by: Bhavesh Mistry <bhavesh@versa-networks.com> --- .../openapitools/openapidiff/core/compare/ParametersDiff.java | 4 +++- .../org/openapitools/openapidiff/core/output/HtmlRender.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java index c12eeaf94..b5cf4c030 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java @@ -9,6 +9,8 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedParameters; import org.openapitools.openapidiff.core.model.DiffContext; @@ -99,7 +101,7 @@ public boolean pathUnchangedParametersChanged( // Speedy Check. Use the map already created in changedParameters to check if missing param is // linked to newParam String newParameterName = context.getParameters().get(parameter.getName()); - if (newParameterName.isEmpty()) return false; + if (StringUtils.isBlank(newParameterName)) return false; Optional<Parameter> newParameter = changedParameters.getIncreased().stream() diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java index f84bd79ed..99861ab94 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java @@ -420,7 +420,7 @@ private LiTag li_changedParam(ChangedParameter changeParam) { Parameter leftParam = changeParam.getOldParameter(); LiTag li = li().withText(changeParam.getName() + " in " + changeParam.getIn()); if (changeRequired) { - li.withText(" change into " + (rightParam.getRequired() ? "required" : "not required")); + li.withText(" change into " + (rightParam.getRequired() != null && rightParam.getRequired() ? "required" : "not required")); } if (changeDescription) { li.withText(" Notes ") From 3c026ef9c0742bc068a399199996435a725c038d Mon Sep 17 00:00:00 2001 From: westse <10818305+westse@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:09:14 -0600 Subject: [PATCH 147/313] Treat new PUT request properties as compatible again (#538) Effectively reverts change for #136 (and PR #137) which appear invalid in intent, implementation, and test. - Invalid in intent: #136 claims that adding a readOnly property to the request body of a PUT request is a breaking change because clients will begin to omit it and the server will interpret the omission as a directive to delete the property. This is incorrect because the server should expect, [per the OAS spec](https://spec.openapis.org/oas/v3.0.3#fixed-fields-19), that readOnly properties "SHOULD NOT be sent as part of the request". So it would be a bug for the server to delete any data associated with the readOnly property. Regardless, the API is left unbroken if the server simply ignores readOnly properties. - Invalid in implementation: the code treats as incompatible any new PUT request property, not just readOnly properties. - Invalid in test: no readOnly properties are tested. In theory one could argue that some servers might enforce the "SHOULD NOT" language of the spec by returning validation errors where they didn't before, and this would constitute an API breakage. But that should be discussed in a different issue. Fixes #537 Refs #136 Refs #137 --- .../openapidiff/core/model/ChangedSchema.java | 4 ---- .../openapidiff/core/AddPropPutDiffTest.java | 10 +++++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index 80d980079..d62cd7b69 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -1,6 +1,5 @@ package org.openapitools.openapidiff.core.model; -import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.media.Schema; import java.util.*; import java.util.stream.Collectors; @@ -157,9 +156,6 @@ private DiffResult calculateCoreChanged() { } private boolean compatibleForRequest() { - if (PathItem.HttpMethod.PUT.equals(context.getMethod()) && !increasedProperties.isEmpty()) { - return false; - } return (oldSchema != null || newSchema == null); } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java index d73ab6ebe..6ecc1bc22 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java @@ -1,9 +1,10 @@ package org.openapitools.openapidiff.core; +import static org.assertj.core.api.Assertions.assertThat; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; public class AddPropPutDiffTest { private final String OPENAPI_DOC1 = "add-prop-put-1.yaml"; @@ -15,7 +16,10 @@ public void testDiffSame() { } @Test - public void testDiffDifferent() { - assertOpenApiBackwardIncompatible(OPENAPI_DOC1, OPENAPI_DOC2); + public void testFieldAdditionalInPutApiIsCompatible() { + // See https://github.com/OpenAPITools/openapi-diff/pull/537 + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + assertThat(changedOpenApi.isDifferent()).isTrue(); + assertThat(changedOpenApi.isCompatible()).isTrue(); } } From cbb8332c097ab5a32c96c7c8ebaeda35ee118eab Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Tue, 25 Jul 2023 22:53:09 +0200 Subject: [PATCH 148/313] Fix SchemaBCTest Refs #538 --- .../openapidiff/core/backcompat/SchemaBCTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java index cec27bc78..f0e683b79 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java @@ -37,9 +37,7 @@ public void requestFormatIncreased() { @Test public void requestPropsPutIncreased() { - // TODO: Document why desired or remove support (test added to avoid unintentional regression) - // See https://github.com/OpenAPITools/openapi-diff/issues/537 - assertOpenApiBackwardIncompatible(BASE, "bc_request_schema_props_put_increased.yaml"); + assertSpecChangedButCompatible(BASE, "bc_request_schema_props_put_increased.yaml"); } @Test From 85a5265411e3432cb0feec7103de0d5dd9c11dbe Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Tue, 25 Jul 2023 22:53:32 +0200 Subject: [PATCH 149/313] Code formatting --- .../openapidiff/core/compare/ParametersDiff.java | 1 - .../openapitools/openapidiff/core/output/HtmlRender.java | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java index b5cf4c030..352be4bf1 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java @@ -9,7 +9,6 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; - import org.apache.commons.lang3.StringUtils; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedParameters; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java index 99861ab94..4de76c646 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java @@ -420,7 +420,11 @@ private LiTag li_changedParam(ChangedParameter changeParam) { Parameter leftParam = changeParam.getOldParameter(); LiTag li = li().withText(changeParam.getName() + " in " + changeParam.getIn()); if (changeRequired) { - li.withText(" change into " + (rightParam.getRequired() != null && rightParam.getRequired() ? "required" : "not required")); + li.withText( + " change into " + + (rightParam.getRequired() != null && rightParam.getRequired() + ? "required" + : "not required")); } if (changeDescription) { li.withText(" Notes ") From 2bd73511336a86309465d2bd62d4b6cf96ac6ab1 Mon Sep 17 00:00:00 2001 From: Martin Morissette <studur@users.noreply.github.com> Date: Tue, 25 Jul 2023 17:06:14 -0400 Subject: [PATCH 150/313] Add file output parameters to Maven plugin (#502) Co-authored-by: Jochen Schalanda <jochen@schalanda.name> Closes #501 --- README.md | 19 +-- .../openapidiff/core/utils/ChangedUtils.java | 4 +- .../openapidiff/core/utils/Copy.java | 4 +- .../openapidiff/core/utils/EndpointUtils.java | 4 +- .../openapidiff/core/utils/FileUtils.java | 35 ++++++ core/src/main/resources/logback.xml | 11 ++ .../openapidiff/core/utils/FileUtilsTest.java | 58 +++++++++ maven-example/pom.xml | 3 + .../openapidiff/maven/OpenApiDiffMojo.java | 44 ++++++- .../maven/OpenApiDiffMojoTest.java | 119 +++++++++++++++--- maven/src/test/resources/logback.xml | 11 ++ 11 files changed, 282 insertions(+), 30 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/utils/FileUtils.java create mode 100644 core/src/main/resources/logback.xml create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java create mode 100644 maven/src/test/resources/logback.xml diff --git a/README.md b/README.md index c9cf9f78c..60d722e7f 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,12 @@ Add openapi-diff to your POM to show diffs when you test your Maven project. You <failOnIncompatible>true</failOnIncompatible> <!-- Fail if API changed (default: false) --> <failOnChanged>true</failOnChanged> + <!-- Supply file path for console output to file if desired. --> + <consoleOutputFileName>${project.basedir}/../maven/target/diff.txt</consoleOutputFileName> + <!-- Supply file path for json output to file if desired. --> + <jsonOutputFileName>${project.basedir}/../maven/target/diff.json</jsonOutputFileName> + <!-- Supply file path for markdown output to file if desired. --> + <markdownOutputFileName>${project.basedir}/../maven/target/diff.md</markdownOutputFileName> </configuration> </execution> </executions> @@ -167,6 +173,7 @@ public class Main { ``` ### Render difference + --- #### HTML @@ -176,11 +183,9 @@ String html = new HtmlRender("Changelog", .render(diff); try { - FileWriter fw = new FileWriter( - "testNewApi.html"); + FileWriter fw = new FileWriter("testNewApi.html"); fw.write(html); fw.close(); - } catch (IOException e) { e.printStackTrace(); } @@ -191,11 +196,9 @@ try { ```java String render = new MarkdownRender().render(diff); try { - FileWriter fw = new FileWriter( - "testDiff.md"); + FileWriter fw = new FileWriter("testDiff.md"); fw.write(render); fw.close(); - } catch (IOException e) { e.printStackTrace(); } @@ -207,11 +210,9 @@ try { ```java String render = new JsonRender().render(diff); try { - FileWriter fw = new FileWriter( - "testDiff.json"); + FileWriter fw = new FileWriter("testDiff.json"); fw.write(render); fw.close(); - } catch (IOException e) { e.printStackTrace(); } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/utils/ChangedUtils.java b/core/src/main/java/org/openapitools/openapidiff/core/utils/ChangedUtils.java index 27a5e0e20..6da806a96 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/utils/ChangedUtils.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/utils/ChangedUtils.java @@ -5,7 +5,9 @@ public class ChangedUtils { - private ChangedUtils() {} + private ChangedUtils() { + throw new UnsupportedOperationException("Utility class. Do not instantiate"); + } public static boolean isUnchanged(Changed changed) { return changed == null || changed.isUnchanged(); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/utils/Copy.java b/core/src/main/java/org/openapitools/openapidiff/core/utils/Copy.java index 4179fd359..73c9a073b 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/utils/Copy.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/utils/Copy.java @@ -5,7 +5,9 @@ public class Copy { - private Copy() {} + private Copy() { + throw new UnsupportedOperationException("Utility class. Do not instantiate"); + } public static <K, V> Map<K, V> copyMap(Map<K, V> map) { if (map == null) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/utils/EndpointUtils.java b/core/src/main/java/org/openapitools/openapidiff/core/utils/EndpointUtils.java index 749b0bdbd..c749d8a54 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/utils/EndpointUtils.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/utils/EndpointUtils.java @@ -10,7 +10,9 @@ public class EndpointUtils { - private EndpointUtils() {} + private EndpointUtils() { + throw new UnsupportedOperationException("Utility class. Do not instantiate"); + } public static Collection<Endpoint> convert2Endpoints( String pathUrl, Map<PathItem.HttpMethod, Operation> map) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/utils/FileUtils.java b/core/src/main/java/org/openapitools/openapidiff/core/utils/FileUtils.java new file mode 100644 index 000000000..a2c8b147e --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/utils/FileUtils.java @@ -0,0 +1,35 @@ +package org.openapitools.openapidiff.core.utils; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.output.Render; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class FileUtils { + private static final Logger logger = LoggerFactory.getLogger(FileUtils.class); + + private FileUtils() { + throw new UnsupportedOperationException("Utility class. Do not instantiate"); + } + + public static void writeToFile( + final Render render, final ChangedOpenApi diff, final String fileName) { + if (fileName == null || fileName.isEmpty()) { + logger.debug("File name cannot be null or empty."); + return; + } + + final Path filePath = Paths.get(fileName); + try (final FileOutputStream outputStream = new FileOutputStream(filePath.toFile()); + final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream)) { + render.render(diff, outputStreamWriter); + } catch (final IOException e) { + logger.error("Exception while writing to file {}", fileName, e); + } + } +} diff --git a/core/src/main/resources/logback.xml b/core/src/main/resources/logback.xml new file mode 100644 index 000000000..018a4277c --- /dev/null +++ b/core/src/main/resources/logback.xml @@ -0,0 +1,11 @@ +<configuration> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>[%thread] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <root level="debug"> + <appender-ref ref="STDOUT"/> + </root> +</configuration> \ No newline at end of file diff --git a/core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java b/core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java new file mode 100644 index 000000000..5d9b4d79b --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java @@ -0,0 +1,58 @@ +package org.openapitools.openapidiff.core.utils; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.output.ConsoleRender; + +class FileUtilsTest { + private ChangedOpenApi changedOpenApi; + + @BeforeEach + void setup() { + changedOpenApi = new ChangedOpenApi(); + changedOpenApi.setChangedSchemas(Collections.emptyList()); + changedOpenApi.setChangedOperations(Collections.emptyList()); + changedOpenApi.setNewEndpoints(Collections.emptyList()); + changedOpenApi.setMissingEndpoints(Collections.emptyList()); + } + + @Test + void writeToFile_filenameIsNull_doesNothing() { + assertDoesNotThrow(() -> FileUtils.writeToFile(new ConsoleRender(), changedOpenApi, null)); + } + + @Test + void writeToFile_filenameIsEmpty_doesNothing() { + assertDoesNotThrow( + () -> FileUtils.writeToFile(new ConsoleRender(), changedOpenApi, StringUtils.EMPTY)); + } + + @Test + void writeToFile_fileExists_overwrites_file(@TempDir Path tempDir) throws IOException { + final Path path = tempDir.resolve("output.txt"); + Files.write(path, "Test".getBytes(StandardCharsets.UTF_8)); + + assertDoesNotThrow( + () -> FileUtils.writeToFile(new ConsoleRender(), changedOpenApi, path.toString())); + assertThat(path).exists().content().isNotEqualTo("Test"); + } + + @Test + void writeToFile_fileDoesNotExist_createsFile(@TempDir Path tempDir) { + final Path path = tempDir.resolve("output.txt"); + assertDoesNotThrow( + () -> FileUtils.writeToFile(new ConsoleRender(), changedOpenApi, path.toString())); + assertThat(path).exists().content().isNotBlank(); + } +} diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 46d9dda3b..bb3d9c7c5 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -33,6 +33,9 @@ <oldSpec>${project.basedir}/../maven/src/test/resources/oldspec.yaml</oldSpec> <newSpec>${project.basedir}/../maven/src/test/resources/newspec.yaml</newSpec> <failOnIncompatible>true</failOnIncompatible> + <consoleOutputFileName>${project.basedir}/../maven/target/diff.txt</consoleOutputFileName> + <jsonOutputFileName>${project.basedir}/../maven/target/diff.json</jsonOutputFileName> + <markdownOutputFileName>${project.basedir}/../maven/target/diff.md</markdownOutputFileName> </configuration> </execution> </executions> diff --git a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java index af402c9f2..7e0e82fb7 100644 --- a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java +++ b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java @@ -1,7 +1,11 @@ package org.openapitools.openapidiff.maven; +import static org.openapitools.openapidiff.core.utils.FileUtils.writeToFile; + import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.OutputStreamWriter; +import java.io.UncheckedIOException; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -11,10 +15,13 @@ import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.ConsoleRender; +import org.openapitools.openapidiff.core.output.JsonRender; +import org.openapitools.openapidiff.core.output.MarkdownRender; /** A Maven Mojo that diffs two OpenAPI specifications and reports on differences. */ @Mojo(name = "diff", defaultPhase = LifecyclePhase.TEST) public class OpenApiDiffMojo extends AbstractMojo { + @Parameter(property = "oldSpec") String oldSpec; @@ -30,6 +37,15 @@ public class OpenApiDiffMojo extends AbstractMojo { @Parameter(property = "skip", defaultValue = "false") Boolean skip = false; + @Parameter(property = "consoleOutputFileName") + String consoleOutputFileName; + + @Parameter(property = "jsonOutputFileName") + String jsonOutputFileName; + + @Parameter(property = "markdownOutputFileName") + String markdownOutputFileName; + @Override public void execute() throws MojoExecutionException, MojoFailureException { if (Boolean.TRUE.equals(skip)) { @@ -39,10 +55,18 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { final ChangedOpenApi diff = OpenApiCompare.fromLocations(oldSpec, newSpec); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); - new ConsoleRender().render(diff, outputStreamWriter); - getLog().info(outputStream.toString()); + + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream)) { + new ConsoleRender().render(diff, outputStreamWriter); + getLog().info(outputStream.toString()); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + + writeDiffAsTextToFile(diff); + writeDiffAsJsonToFile(diff); + writeDiffAsMarkdownToFile(diff); if (failOnIncompatible && diff.isIncompatible()) { throw new BackwardIncompatibilityException("The API changes broke backward compatibility"); @@ -55,4 +79,16 @@ public void execute() throws MojoExecutionException, MojoFailureException { throw new MojoExecutionException("Unexpected error", e); } } + + private void writeDiffAsTextToFile(final ChangedOpenApi diff) { + writeToFile(new ConsoleRender(), diff, consoleOutputFileName); + } + + private void writeDiffAsJsonToFile(final ChangedOpenApi diff) { + writeToFile(new JsonRender(), diff, jsonOutputFileName); + } + + private void writeDiffAsMarkdownToFile(final ChangedOpenApi diff) { + writeToFile(new MarkdownRender(), diff, markdownOutputFileName); + } } diff --git a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java index 7deae4233..10bd186e5 100644 --- a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java +++ b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java @@ -1,15 +1,44 @@ package org.openapitools.openapidiff.maven; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import org.apache.maven.plugin.MojoExecutionException; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class OpenApiDiffMojoTest { + + private static final Logger logger = LoggerFactory.getLogger(OpenApiDiffMojoTest.class); + + private final File oldSpecFile = new File("src/test/resources/oldspec.yaml"); + private final File newSpecFile = new File("src/test/resources/newspec.yaml"); + + private final File consoleOutputfile = new File("target/diff.txt"); + private final File markdownOutputfile = new File("target/diff.md"); + private final File jsonOutputfile = new File("target/diff.json"); + + @BeforeEach + void setup() { + cleanupGeneratedFiles(); + } + + @AfterEach + void tearDown() { + cleanupGeneratedFiles(); + } + @Test void Should_NotThrow_When_SpecHasNoChanges() { - final String oldSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); + final String oldSpec = oldSpecFile.getAbsolutePath(); final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); mojo.oldSpec = oldSpec; @@ -22,8 +51,8 @@ void Should_NotThrow_When_SpecHasNoChanges() { @Test void Should_NotThrow_When_SpecIsCompatible() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); - mojo.oldSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); - mojo.newSpec = new File("src/test/resources/newspec.yaml").getAbsolutePath(); + mojo.oldSpec = oldSpecFile.getAbsolutePath(); + mojo.newSpec = newSpecFile.getAbsolutePath(); mojo.failOnIncompatible = true; assertDoesNotThrow(mojo::execute); @@ -32,8 +61,8 @@ void Should_NotThrow_When_SpecIsCompatible() { @Test void Should_Throw_When_SpecIsDifferent() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); - mojo.oldSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); - mojo.newSpec = new File("src/test/resources/newspec.yaml").getAbsolutePath(); + mojo.oldSpec = oldSpecFile.getAbsolutePath(); + mojo.newSpec = newSpecFile.getAbsolutePath(); mojo.failOnChanged = true; assertThrows(ApiChangedException.class, mojo::execute); @@ -43,7 +72,7 @@ void Should_Throw_When_SpecIsDifferent() { void Should_MojoExecutionException_When_MissingOldSpec() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); mojo.oldSpec = new File("DOES_NOT_EXIST").getAbsolutePath(); - mojo.newSpec = new File("src/test/resources/newspec.yaml").getAbsolutePath(); + mojo.newSpec = newSpecFile.getAbsolutePath(); assertThrows(MojoExecutionException.class, mojo::execute); } @@ -51,7 +80,7 @@ void Should_MojoExecutionException_When_MissingOldSpec() { @Test void Should_MojoExecutionException_When_MissingNewSpec() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); - mojo.oldSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); + mojo.oldSpec = oldSpecFile.getAbsolutePath(); mojo.newSpec = new File("DOES_NOT_EXIST").getAbsolutePath(); assertThrows(MojoExecutionException.class, mojo::execute); @@ -60,8 +89,8 @@ void Should_MojoExecutionException_When_MissingNewSpec() { @Test void Should_NotThrow_When_DefaultsAndSpecIsIncompatible() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); - mojo.oldSpec = new File("src/test/resources/newspec.yaml").getAbsolutePath(); - mojo.newSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); + mojo.oldSpec = newSpecFile.getAbsolutePath(); + mojo.newSpec = oldSpecFile.getAbsolutePath(); assertDoesNotThrow(mojo::execute); } @@ -69,8 +98,8 @@ void Should_NotThrow_When_DefaultsAndSpecIsIncompatible() { @Test void Should_BackwardIncompatibilityException_When_WantsExceptionAndSpecIsIncompatible() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); - mojo.oldSpec = new File("src/test/resources/newspec.yaml").getAbsolutePath(); - mojo.newSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); + mojo.oldSpec = newSpecFile.getAbsolutePath(); + mojo.newSpec = oldSpecFile.getAbsolutePath(); mojo.failOnIncompatible = true; assertThrows(BackwardIncompatibilityException.class, mojo::execute); @@ -79,11 +108,73 @@ void Should_BackwardIncompatibilityException_When_WantsExceptionAndSpecIsIncompa @Test void Should_Skip_Mojo_WhenSkipIsTrue() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); - mojo.oldSpec = new File("src/test/resources/newspec.yaml").getAbsolutePath(); - mojo.newSpec = new File("src/test/resources/oldspec.yaml").getAbsolutePath(); + mojo.oldSpec = newSpecFile.getAbsolutePath(); + mojo.newSpec = oldSpecFile.getAbsolutePath(); mojo.failOnIncompatible = true; mojo.skip = true; assertDoesNotThrow(mojo::execute); } + + @Test + void Should_outputToTextFile_When_SpecIsDifferent() { + final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); + mojo.oldSpec = oldSpecFile.getAbsolutePath(); + mojo.newSpec = newSpecFile.getAbsolutePath(); + + mojo.consoleOutputFileName = consoleOutputfile.getAbsolutePath(); + mojo.failOnChanged = true; + + assertThrows(ApiChangedException.class, mojo::execute); + + assertTrue(Files.exists(consoleOutputfile.toPath())); + } + + @Test + void Should_outputToMarkdownFile_When_SpecIsDifferent() { + final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); + mojo.oldSpec = oldSpecFile.getAbsolutePath(); + mojo.newSpec = newSpecFile.getAbsolutePath(); + + mojo.markdownOutputFileName = markdownOutputfile.getAbsolutePath(); + mojo.failOnChanged = true; + + assertThrows(ApiChangedException.class, mojo::execute); + + assertTrue(Files.exists(markdownOutputfile.toPath())); + } + + @Test + void Should_outputToJsonFile_When_SpecIsDifferent() { + final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); + mojo.oldSpec = oldSpecFile.getAbsolutePath(); + mojo.newSpec = newSpecFile.getAbsolutePath(); + + mojo.jsonOutputFileName = jsonOutputfile.getAbsolutePath(); + mojo.failOnChanged = true; + + assertThrows(ApiChangedException.class, mojo::execute); + + assertTrue(Files.exists(jsonOutputfile.toPath())); + } + + private void cleanupGeneratedFiles() { + try { + Files.deleteIfExists(Paths.get(consoleOutputfile.getPath())); + } catch (IOException ioException) { + logger.warn("Exception while trying to delete file {}", consoleOutputfile.getAbsolutePath()); + } + + try { + Files.deleteIfExists(Paths.get(markdownOutputfile.getPath())); + } catch (IOException ioException) { + logger.warn("Exception while trying to delete file {}", markdownOutputfile.getAbsolutePath()); + } + + try { + Files.deleteIfExists(Paths.get(jsonOutputfile.getPath())); + } catch (IOException ioException) { + logger.warn("Exception while trying to delete file {}", jsonOutputfile.getAbsolutePath()); + } + } } diff --git a/maven/src/test/resources/logback.xml b/maven/src/test/resources/logback.xml new file mode 100644 index 000000000..018a4277c --- /dev/null +++ b/maven/src/test/resources/logback.xml @@ -0,0 +1,11 @@ +<configuration> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>[%thread] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <root level="debug"> + <appender-ref ref="STDOUT"/> + </root> +</configuration> \ No newline at end of file From 98618defd19fd29043b90e8f6d523aea3af7264a Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Tue, 25 Jul 2023 21:46:35 +0000 Subject: [PATCH 151/313] [maven-release-plugin] prepare release 2.1.0-beta.7 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..7776b6f40 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.7</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 50b8ce87d..12fbe661f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.7</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index bb3d9c7c5..87114bfef 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.7</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.7</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..02189e5d4 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.7</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index f25d729fa..49c0ffddf 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.7</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.7</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-03-27T21:16:27Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-07-25T21:45:45Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.7</version> </dependency> <dependency> <groupId>org.junit</groupId> From d26a063b422a324e37eee0168d7db915d039232c Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Tue, 25 Jul 2023 21:46:40 +0000 Subject: [PATCH 152/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 7776b6f40..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.7</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 12fbe661f..50b8ce87d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.7</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 87114bfef..bb3d9c7c5 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.7</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.7</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 02189e5d4..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.7</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 49c0ffddf..67adc694d 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.7</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.7</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-07-25T21:45:45Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-07-25T21:46:40Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.7</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From a859215f67cfa230124e2d79416a873e2e5ea27f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 15:42:09 +0200 Subject: [PATCH 153/313] build(deps): bump org.apache.commons:commons-lang3 from 3.12.0 to 3.13.0 (#554) Bumps org.apache.commons:commons-lang3 from 3.12.0 to 3.13.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 67adc694d..946e788a5 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> - <version>3.12.0</version> + <version>3.13.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> From 13ced20e1265440f5e13858a525e78e7a49871d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 11:00:40 +0200 Subject: [PATCH 154/313] build(deps): bump ch.qos.logback:logback-classic from 1.3.8 to 1.3.9 (#556) Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.3.8 to 1.3.9. - [Commits](https://github.com/qos-ch/logback/compare/v_1.3.8...v_1.3.9) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 946e788a5..22777abd3 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.3.8</version> + <version>1.3.9</version> </dependency> <dependency> <groupId>org.assertj</groupId> From 72a4a10149e3be29ed3bf4b7dd64605a5735e97b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Aug 2023 16:41:17 +0200 Subject: [PATCH 155/313] build(deps): bump ch.qos.logback:logback-classic from 1.3.9 to 1.3.11 (#557) Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.3.9 to 1.3.11. - [Commits](https://github.com/qos-ch/logback/compare/v_1.3.9...v_1.3.11) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 22777abd3..4da18e5bc 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.3.9</version> + <version>1.3.11</version> </dependency> <dependency> <groupId>org.assertj</groupId> From 171b48a8c78bd898c053c2c0a74e030c469799fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Sep 2023 22:18:10 +0200 Subject: [PATCH 156/313] build(deps): bump slf4j.version from 2.0.7 to 2.0.9 (#560) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4da18e5bc..849df370b 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.16</swagger-parser.version> - <slf4j.version>2.0.7</slf4j.version> + <slf4j.version>2.0.9</slf4j.version> </properties> <dependencyManagement> From 801d1a21cd2ab0c77559ebc56bf907d9e139bb06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Sep 2023 22:18:17 +0200 Subject: [PATCH 157/313] build(deps): bump actions/checkout from 3 to 4 (#561) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/maven.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 912aca76b..7c3b50eef 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -24,7 +24,7 @@ jobs: env: JAVA_OPTS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up JDK diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 91724f1f2..80e5fda87 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -21,7 +21,7 @@ jobs: env: JAVA_OPTS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK uses: actions/setup-java@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a99689b5f..1fb7bbf1b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 11 uses: actions/setup-java@v3 with: @@ -46,7 +46,7 @@ jobs: needs: release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.releaseVersion }} - name: Set up QEMU From 14952a010d79277a5374d96730bbdbaa324da2f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 14:24:41 +0200 Subject: [PATCH 158/313] build(deps): bump docker/login-action from 2 to 3 (#563) Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1fb7bbf1b..bf36f869c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,7 +54,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} From b69b7e448c12fce3f4f7452e8b79ba2f338e62cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 14:24:50 +0200 Subject: [PATCH 159/313] build(deps): bump docker/setup-buildx-action from 2 to 3 (#564) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf36f869c..b729ba763 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,7 +52,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub uses: docker/login-action@v3 with: From 99ad435f9dfc3551eeaaae42a28c2b723c0f06fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 14:25:11 +0200 Subject: [PATCH 160/313] build(deps): bump docker/build-push-action from 4 to 5 (#565) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4...v5) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b729ba763..f429b4733 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -59,7 +59,7 @@ jobs: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} - name: Build & Push Docker image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . push: true From 204adeefe71f94308a7c8131eb276ceda266d065 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:25:14 +0200 Subject: [PATCH 161/313] build(deps): bump docker/setup-qemu-action from 2 to 3 (#566) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f429b4733..af3f60860 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,7 +50,7 @@ jobs: with: ref: ${{ github.event.inputs.releaseVersion }} - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to DockerHub From 99778a682dad5fa3ba5e8bef04883f1f44b33bca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 13:56:43 +0200 Subject: [PATCH 162/313] build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#567) Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 3.9.1.2184 to 3.10.0.2594. - [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases) - [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/3.9.1.2184...3.10.0.2594) --- updated-dependencies: - dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 849df370b..070609fdf 100644 --- a/pom.xml +++ b/pom.xml @@ -339,7 +339,7 @@ <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> - <version>3.9.1.2184</version> + <version>3.10.0.2594</version> </plugin> <plugin> <groupId>org.cyclonedx</groupId> From 4b7f1029eab77a88b5625dce4a4f2104c3d2bee3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:58:05 +0200 Subject: [PATCH 163/313] build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin (#568) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 070609fdf..dd46adf65 100644 --- a/pom.xml +++ b/pom.xml @@ -293,7 +293,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.5.0</version> + <version>3.6.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 797ead7b4b76a3d22f5dfb0e2f9c131c932a433d Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Wed, 20 Sep 2023 22:05:49 +0200 Subject: [PATCH 164/313] Build with Java 21 (#570) --- .github/workflows/maven.yml | 6 +++--- .github/workflows/pr.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 7c3b50eef..d3df44755 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - java_version: ['8', '11', '17'] + java_version: ['8', '11', '17', '21'] env: JAVA_OPTS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" steps: @@ -39,7 +39,7 @@ jobs: server-password: OSS_PASSWORD - name: Cache SonarCloud packages uses: actions/cache@v3 - if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '11' }} + if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '17' }} env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: @@ -49,7 +49,7 @@ jobs: - name: Run tests run: ./mvnw -V -B -ntp -ff verify jacoco:report - name: Static Analysis (Sonar) - if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '11' }} + if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '17' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 80e5fda87..092d38d66 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - java_version: ['8', '11', '17'] + java_version: ['8', '11', '17', '21'] env: JAVA_OPTS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" steps: @@ -30,7 +30,7 @@ jobs: cache: 'maven' - name: Cache SonarCloud packages uses: actions/cache@v3 - if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '11' }} + if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '17' }} env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: @@ -40,7 +40,7 @@ jobs: - name: Run tests run: ./mvnw -V -B -ntp -ff verify - name: Static Analysis (Sonar) - if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '11' }} + if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '17' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 3e62fd778a18f8845a96e82c99a7a520aec5af4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 11:12:54 +0200 Subject: [PATCH 165/313] build(deps): bump org.apache.maven.plugins:maven-shade-plugin (#572) Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.5.0 to 3.5.1. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.0...maven-shade-plugin-3.5.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dd46adf65..5cee4b1a5 100644 --- a/pom.xml +++ b/pom.xml @@ -323,7 +323,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.5.0</version> + <version>3.5.1</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From ab24cbdcf79eac2cedfe3591ddeb57a76a922cc6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 09:02:54 +0200 Subject: [PATCH 166/313] build(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.10 to 0.8.11 (#574) Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.10 to 0.8.11. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.10...v0.8.11) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5cee4b1a5..dd3515650 100644 --- a/pom.xml +++ b/pom.xml @@ -334,7 +334,7 @@ <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> - <version>0.8.10</version> + <version>0.8.11</version> </plugin> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> From 79ec68061a9794d827683b81702759cca1ab2d9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 10:44:27 +0200 Subject: [PATCH 167/313] build(deps): bump swagger-parser.version from 2.1.16 to 2.1.18 (#575) Bumps `swagger-parser.version` from 2.1.16 to 2.1.18. Updates `io.swagger.parser.v3:swagger-parser-v3` from 2.1.16 to 2.1.18 Updates `io.swagger.parser.v3:swagger-parser` from 2.1.16 to 2.1.18 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.16...v2.1.18) Updates `io.swagger.parser.v3:swagger-parser-v2-converter` from 2.1.16 to 2.1.18 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dd3515650..106bd5e54 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.16</swagger-parser.version> + <swagger-parser.version>2.1.18</swagger-parser.version> <slf4j.version>2.0.9</slf4j.version> </properties> From 448997bc9bebbbfafa1bb400c56239407f4734cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 10:58:57 +0200 Subject: [PATCH 168/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#577) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.1.2 to 3.2.1. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.2...surefire-3.2.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 106bd5e54..bc8e8f9e2 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.1.2</version> + <version>3.2.1</version> </plugin> <plugin> <groupId>com.coveo</groupId> From 9731d7fba0dca458fe26c1d82373a0be764a2195 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 22:58:24 +0200 Subject: [PATCH 169/313] build(deps): bump commons-cli:commons-cli from 1.5.0 to 1.6.0 (#578) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bc8e8f9e2..8d6427bb1 100644 --- a/pom.xml +++ b/pom.xml @@ -129,7 +129,7 @@ <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> - <version>1.5.0</version> + <version>1.6.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> From 2d60ff76a9badc4bbc354630a53225fdd62f8fb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 22:30:53 +0100 Subject: [PATCH 170/313] build(deps): bump org.cyclonedx:cyclonedx-maven-plugin (#579) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8d6427bb1..0d49e5fff 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.9</version> + <version>2.7.10</version> </plugin> </plugins> </pluginManagement> From 4b78f1c90b043b2f9d0e3cba5a2d0ed266a9c28d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:52:00 +0100 Subject: [PATCH 171/313] build(deps): bump org.junit:junit-bom from 5.10.0 to 5.10.1 (#581) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.10.0 to 5.10.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0d49e5fff..1f204df1c 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.10.0</version> + <version>5.10.1</version> <type>pom</type> <scope>import</scope> </dependency> From 944265819a335dd9f81034e684bafbdeea2a893d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:59:25 +0100 Subject: [PATCH 172/313] build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin (#584) Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.6.0 to 3.6.2. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.6.0...maven-javadoc-plugin-3.6.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1f204df1c..aefed9c4a 100644 --- a/pom.xml +++ b/pom.xml @@ -293,7 +293,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.6.0</version> + <version>3.6.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 05a36bc6895dd44ceb9eb835e2b40d1d8f77aca2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:59:31 +0100 Subject: [PATCH 173/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#582) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.1...surefire-3.2.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aefed9c4a..8c0446e75 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.2.1</version> + <version>3.2.2</version> </plugin> <plugin> <groupId>com.coveo</groupId> From e43a0a21157c35ed89cd5c17a563c58d97bf84ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:26:48 +0100 Subject: [PATCH 174/313] build(deps): bump org.apache.commons:commons-lang3 from 3.13.0 to 3.14.0 (#587) Bumps org.apache.commons:commons-lang3 from 3.13.0 to 3.14.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8c0446e75..1d3aef082 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> - <version>3.13.0</version> + <version>3.14.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> From f2d5df98687bf3535d87ae91c7ddff47d909512d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:26:56 +0100 Subject: [PATCH 175/313] build(deps): bump swagger-parser.version from 2.1.18 to 2.1.19 (#586) Bumps `swagger-parser.version` from 2.1.18 to 2.1.19. Updates `io.swagger.parser.v3:swagger-parser-v3` from 2.1.18 to 2.1.19 Updates `io.swagger.parser.v3:swagger-parser` from 2.1.18 to 2.1.19 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.18...v2.1.19) Updates `io.swagger.parser.v3:swagger-parser-v2-converter` from 2.1.18 to 2.1.19 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d3aef082..644d976f0 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.18</swagger-parser.version> + <swagger-parser.version>2.1.19</swagger-parser.version> <slf4j.version>2.0.9</slf4j.version> </properties> From fa5a48b728ae242ef26c5091c068a637a2038329 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:15:14 +0100 Subject: [PATCH 176/313] build(deps): bump ch.qos.logback:logback-classic from 1.3.11 to 1.3.12 (#588) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 644d976f0..440684697 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.3.11</version> + <version>1.3.12</version> </dependency> <dependency> <groupId>org.assertj</groupId> From 36eb4d0327c278fa11ee9f1e0e653dfccc5ebb4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:13:40 +0100 Subject: [PATCH 177/313] build(deps): bump ch.qos.logback:logback-classic from 1.3.12 to 1.3.13 (#589) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 440684697..0ae80fb25 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.3.12</version> + <version>1.3.13</version> </dependency> <dependency> <groupId>org.assertj</groupId> From fc58a0e22801e86e4a0756ff31d446581c9fc5ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Nov 2023 23:10:24 +0100 Subject: [PATCH 178/313] build(deps): bump actions/setup-java from 3 to 4 (#591) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/maven.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index d3df44755..14e42bac9 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,7 +28,7 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: ${{ matrix.java_version }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 092d38d66..bdb76839f 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: ${{ matrix.java_version }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index af3f60860..58eb8973c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: 11 From 962a286209a0159c9971966605c8ca77f699aa61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:02:00 +0100 Subject: [PATCH 179/313] build(deps): bump ch.qos.logback:logback-classic from 1.3.13 to 1.3.14 (#593) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0ae80fb25..bf153b1d1 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,7 @@ <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> - <version>1.3.13</version> + <version>1.3.14</version> </dependency> <dependency> <groupId>org.assertj</groupId> From c8ccecf31a9606a68bfe0685cadb0f14e72152b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:02:12 +0100 Subject: [PATCH 180/313] build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin (#592) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bf153b1d1..7db6b41a3 100644 --- a/pom.xml +++ b/pom.xml @@ -293,7 +293,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.6.2</version> + <version>3.6.3</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 9c92fbb82d24eac0dfc9f46cc3ff8dd390f24f40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:32:09 +0100 Subject: [PATCH 181/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#596) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7db6b41a3..4524eca12 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.2.2</version> + <version>3.2.3</version> </plugin> <plugin> <groupId>com.coveo</groupId> From e40b07b56c1dde49854242101064f5bbc2937ac5 Mon Sep 17 00:00:00 2001 From: Maxim Kuznetsov <maksoh88@gmail.com> Date: Sun, 17 Dec 2023 01:24:32 +0300 Subject: [PATCH 182/313] Fix console rendering (#595) This fixes console rendering: - absence of "What's New", "What's Deleted", "What's Deprecated" sections - Incorrect formatting in "What's Changed" section - absence of "Result" title Closes #594 Refs #544 Co-authored-by: Maksim Kuznetsov <mkuznetsov@natera.com> --- .../core/output/ConsoleRender.java | 11 ++-- .../openapidiff/core/ConsoleRenderTest.java | 49 ++++++++++++++++- core/src/test/resources/add_endpoint_1.yaml | 35 ++++++++++++ core/src/test/resources/add_endpoint_2.yaml | 53 +++++++++++++++++++ .../src/test/resources/change_endpoint_1.yaml | 29 ++++++++++ .../src/test/resources/change_endpoint_2.yaml | 30 +++++++++++ .../src/test/resources/delete_endpoint_1.yaml | 52 ++++++++++++++++++ .../src/test/resources/delete_endpoint_2.yaml | 35 ++++++++++++ .../test/resources/deprecate_endpoint_1.yaml | 52 ++++++++++++++++++ .../test/resources/deprecate_endpoint_2.yaml | 53 +++++++++++++++++++ 10 files changed, 393 insertions(+), 6 deletions(-) create mode 100644 core/src/test/resources/add_endpoint_1.yaml create mode 100644 core/src/test/resources/add_endpoint_2.yaml create mode 100644 core/src/test/resources/change_endpoint_1.yaml create mode 100644 core/src/test/resources/change_endpoint_2.yaml create mode 100644 core/src/test/resources/delete_endpoint_1.yaml create mode 100644 core/src/test/resources/delete_endpoint_2.yaml create mode 100644 core/src/test/resources/deprecate_endpoint_1.yaml create mode 100644 core/src/test/resources/deprecate_endpoint_2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java index a3e3a31ee..4f8e10fc9 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/ConsoleRender.java @@ -47,6 +47,7 @@ public void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) { List<ChangedOperation> changedOperations = diff.getChangedOperations(); ol_changed(changedOperations, outputStreamWriter); + safelyAppend(outputStreamWriter, title("Result")); safelyAppend( outputStreamWriter, StringUtils.center( @@ -76,6 +77,8 @@ private void ol_changed( String desc = Optional.ofNullable(operation.getSummary()).map(ChangedMetadata::getRight).orElse(""); + safelyAppend(outputStreamWriter, itemEndpoint(method, pathUrl, desc)); + if (result(operation.getParameters()).isDifferent()) { safelyAppend(outputStreamWriter, StringUtils.repeat(' ', 2)); safelyAppend(outputStreamWriter, "Parameter:"); @@ -94,7 +97,6 @@ private void ol_changed( safelyAppend(outputStreamWriter, System.lineSeparator()); safelyAppend(outputStreamWriter, ul_response(operation.getApiResponses())); } - safelyAppend(outputStreamWriter, itemEndpoint(method, pathUrl, desc)); } } @@ -279,10 +281,10 @@ private String li_changedParam(ChangedParameter changeParam) { } } - private String listEndpoints( + private void listEndpoints( List<Endpoint> endpoints, String title, OutputStreamWriter outputStreamWriter) { if (null == endpoints || endpoints.isEmpty()) { - return ""; + return; } StringBuilder sb = new StringBuilder(); sb.append(title(title)); @@ -291,7 +293,8 @@ private String listEndpoints( itemEndpoint( endpoint.getMethod().toString(), endpoint.getPathUrl(), endpoint.getSummary())); } - return sb.append(System.lineSeparator()).toString(); + + safelyAppend(outputStreamWriter, sb.append(System.lineSeparator()).toString()); } private String itemEndpoint(String method, String path, String desc) { diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java index f56b4cb95..6d9bdd33e 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java @@ -14,8 +14,7 @@ public void renderDoesNotFailWhenPropertyHasBeenRemoved() { ConsoleRender render = new ConsoleRender(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); - ChangedOpenApi diff = - OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); + ChangedOpenApi diff = OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); render.render(diff, outputStreamWriter); assertThat(outputStream.toString()).isNotBlank(); } @@ -30,4 +29,50 @@ public void renderDoesNotFailWhenHTTPStatusCodeIsRange() { render.render(diff, outputStreamWriter); assertThat(outputStream.toString()).isNotBlank(); } + + @Test + public void renderShowsWhatsDeletedSectionWhenEndpointIsDeleted() { + ConsoleRender render = new ConsoleRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("delete_endpoint_1.yaml", "delete_endpoint_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).contains("What's Deleted"); + } + + @Test + public void renderShowsWhatsNewSectionWhenEndpointIsAdded() { + ConsoleRender render = new ConsoleRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("add_endpoint_1.yaml", "add_endpoint_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).contains("What's New"); + } + + @Test + public void renderShowsWhatsDeprecatedSectionWhenEndpointIsDeprecated() { + ConsoleRender render = new ConsoleRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("deprecate_endpoint_1.yaml", "deprecate_endpoint_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).contains("What's Deprecated"); + } + + @Test + public void renderShowsWhatsChangedSectionWithCorrectFormattingWhenEndpointIsChanged() { + ConsoleRender render = new ConsoleRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("change_endpoint_1.yaml", "change_endpoint_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()) + .contains("What's Changed") + .containsSubsequence("- GET /widgets", "Parameter:", "- Changed query-param-1 in query"); + } } diff --git a/core/src/test/resources/add_endpoint_1.yaml b/core/src/test/resources/add_endpoint_1.yaml new file mode 100644 index 000000000..0c544c7b4 --- /dev/null +++ b/core/src/test/resources/add_endpoint_1.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input diff --git a/core/src/test/resources/add_endpoint_2.yaml b/core/src/test/resources/add_endpoint_2.yaml new file mode 100644 index 000000000..95906047e --- /dev/null +++ b/core/src/test/resources/add_endpoint_2.yaml @@ -0,0 +1,53 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + post: + tags: + - pet + summary: deletes a pet + description: '' + operationId: deletePet + deprecated: true + parameters: + - name: petId2 + in: path + description: Pet ID to delete + required: true + schema: + type: integer + responses: + '405': + description: Invalid input diff --git a/core/src/test/resources/change_endpoint_1.yaml b/core/src/test/resources/change_endpoint_1.yaml new file mode 100644 index 000000000..555015991 --- /dev/null +++ b/core/src/test/resources/change_endpoint_1.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + style: form + explode: true + allowEmptyValue: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/change_endpoint_2.yaml b/core/src/test/resources/change_endpoint_2.yaml new file mode 100644 index 000000000..281fd0514 --- /dev/null +++ b/core/src/test/resources/change_endpoint_2.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + allowEmptyValue: true + required: false + schema: + type: string + - name: query-param-2 + in: query + style: form + explode: true + allowEmptyValue: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string diff --git a/core/src/test/resources/delete_endpoint_1.yaml b/core/src/test/resources/delete_endpoint_1.yaml new file mode 100644 index 000000000..59a315cd0 --- /dev/null +++ b/core/src/test/resources/delete_endpoint_1.yaml @@ -0,0 +1,52 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId2 + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input diff --git a/core/src/test/resources/delete_endpoint_2.yaml b/core/src/test/resources/delete_endpoint_2.yaml new file mode 100644 index 000000000..0c544c7b4 --- /dev/null +++ b/core/src/test/resources/delete_endpoint_2.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input diff --git a/core/src/test/resources/deprecate_endpoint_1.yaml b/core/src/test/resources/deprecate_endpoint_1.yaml new file mode 100644 index 000000000..6d08cb721 --- /dev/null +++ b/core/src/test/resources/deprecate_endpoint_1.yaml @@ -0,0 +1,52 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + post: + tags: + - pet + summary: deletes a pet + description: '' + operationId: deletePet + parameters: + - name: petId2 + in: path + description: Pet ID to delete + required: true + schema: + type: integer + responses: + '405': + description: Invalid input diff --git a/core/src/test/resources/deprecate_endpoint_2.yaml b/core/src/test/resources/deprecate_endpoint_2.yaml new file mode 100644 index 000000000..95906047e --- /dev/null +++ b/core/src/test/resources/deprecate_endpoint_2.yaml @@ -0,0 +1,53 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. You can find out more about + Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, + #swagger](http://swagger.io/irc/). For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: Swagger Petstore + termsOfService: 'http://swagger.io/terms/' + contact: + email: apiteam@swagger.io + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +paths: + /pet/{petId}: + get: + tags: + - pet + summary: gets a pet by id + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + responses: + '405': + description: Invalid input + /pet/{petId2}: + post: + tags: + - pet + summary: deletes a pet + description: '' + operationId: deletePet + deprecated: true + parameters: + - name: petId2 + in: path + description: Pet ID to delete + required: true + schema: + type: integer + responses: + '405': + description: Invalid input From a3cb2c319d20af54a89763e4138af6653ce447a2 Mon Sep 17 00:00:00 2001 From: "L. Wagner" <lion.wagner@freenet.de> Date: Sat, 16 Dec 2023 23:25:33 +0100 Subject: [PATCH 183/313] Docs: Add JSON output format to inital introduction sentence (#580) Co-authored-by: L. Wagner <LitschiW@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 60d722e7f..cdea800bc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OpenAPI-diff -Compare two OpenAPI specifications (3.x) and render the difference to HTML plaintext, or Markdown files. +Compare two OpenAPI specifications (3.x) and render the difference to HTML plaintext, Markdown files, or JSON files. [](https://github.com/OpenAPITools/openapi-diff/actions?query=branch%3Amaster+workflow%3A"Main+Build") [](https://sonarcloud.io/dashboard?id=OpenAPITools_openapi-diff) From 6f79b10a7014cd5995c7d615acfce7bce8aec988 Mon Sep 17 00:00:00 2001 From: nbiastaunton <97731210+nbiastaunton@users.noreply.github.com> Date: Sat, 16 Dec 2023 22:29:12 +0000 Subject: [PATCH 184/313] Add support for AsciiDoc Renderer (#569) Co-authored-by: Jochen Schalanda <jochen@schalanda.name> --- README.md | 16 +- .../openapitools/openapidiff/cli/Main.java | 14 + .../core/output/AsciidocRender.java | 311 ++++++++++++++++++ .../openapidiff/core/AsciidocRenderTest.java | 96 ++++++ .../openapidiff/maven/OpenApiDiffMojo.java | 9 + .../maven/OpenApiDiffMojoTest.java | 15 + 6 files changed, 460 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/output/AsciidocRender.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/AsciidocRenderTest.java diff --git a/README.md b/README.md index cdea800bc..d558d321c 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Compare two OpenAPI specifications (3.x) and render the difference to HTML plain * Depth comparison of parameters, responses, endpoint, http method (GET,POST,PUT,DELETE...) * Supports swagger api Authorization * Render difference of property with Expression Language -* HTML, Markdown & JSON render +* HTML, Markdown, Asciidoc & JSON render # Maven @@ -44,6 +44,7 @@ Available on [Docker Hub](https://hub.docker.com/r/openapitools/openapi-diff/) a ```bash # docker run openapitools/openapi-diff:latest usage: openapi-diff <old> <new> + --asciidoc <file> export diff as asciidoc in given file --debug Print debugging information --error Print error information --fail-on-changed Fail if API changed but is backward @@ -101,6 +102,7 @@ openapi-diff can read OpenAPI specs from JSON files or HTTP URLs. ```bash $ openapi-diff --help usage: openapi-diff <old> <new> + --asciidoc <file> export diff as asciidoc in given file --debug Print debugging information --error Print error information -h,--help print this message @@ -204,6 +206,18 @@ try { } ``` +#### Asciidoc + +```java +String render = new AsciidocRender().render(diff); +try { + FileWriter fw = new FileWriter("testDiff.adoc"); + fw.write(render); + fw.close(); +} catch (IOException e) { + e.printStackTrace(); +} +``` #### JSON diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index f19826a93..4970efcc7 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -17,6 +17,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.output.AsciidocRender; import org.openapitools.openapidiff.core.output.ConsoleRender; import org.openapitools.openapidiff.core.output.HtmlRender; import org.openapitools.openapidiff.core.output.JsonRender; @@ -88,6 +89,13 @@ public static void main(String... args) { .argName("file") .desc("export diff as markdown in given file") .build()); + options.addOption( + Option.builder() + .longOpt("asciidoc") + .hasArg() + .argName("file") + .desc("export diff as asciidoc in given file") + .build()); options.addOption( Option.builder() .longOpt("html") @@ -191,6 +199,12 @@ public static void main(String... args) { OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); mdRender.render(result, outputStreamWriter); } + if (line.hasOption("asciidoc")) { + AsciidocRender adocRender = new AsciidocRender(); + FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("asciidoc")); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + adocRender.render(result, outputStreamWriter); + } if (line.hasOption("text")) { FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("text")); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/AsciidocRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/AsciidocRender.java new file mode 100644 index 000000000..997241dc2 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/AsciidocRender.java @@ -0,0 +1,311 @@ +package org.openapitools.openapidiff.core.output; + +import static org.openapitools.openapidiff.core.model.Changed.result; + +import io.swagger.v3.oas.models.media.ArraySchema; +import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.responses.ApiResponse; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import org.apache.commons.lang3.StringUtils; +import org.openapitools.openapidiff.core.exception.RendererException; +import org.openapitools.openapidiff.core.model.*; +import org.openapitools.openapidiff.core.utils.RefPointer; +import org.openapitools.openapidiff.core.utils.RefType; + +public class AsciidocRender implements Render { + private static final int LINE_LENGTH = 74; + protected static RefPointer<Schema<?>> refPointer = new RefPointer<>(RefType.SCHEMAS); + protected ChangedOpenApi diff; + + @Override + public void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) { + this.diff = diff; + if (diff.isUnchanged()) { + safelyAppend( + outputStreamWriter, + bigTitle( + diff.getNewSpecOpenApi().getInfo().getTitle(), + diff.getNewSpecOpenApi().getInfo().getVersion())); + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend(outputStreamWriter, "NOTE: No differences. Specifications are equivalents"); + } else { + safelyAppend( + outputStreamWriter, + bigTitle( + diff.getNewSpecOpenApi().getInfo().getTitle(), + diff.getNewSpecOpenApi().getInfo().getVersion())); + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend(outputStreamWriter, ":reproducible:\n:sectlinks:\n:toc:\n"); + safelyAppend(outputStreamWriter, System.lineSeparator()); + + List<Endpoint> newEndpoints = diff.getNewEndpoints(); + listEndpoints(newEndpoints, "What's New", outputStreamWriter); + + List<Endpoint> missingEndpoints = diff.getMissingEndpoints(); + listEndpoints(missingEndpoints, "What's Deleted", outputStreamWriter); + + List<Endpoint> deprecatedEndpoints = diff.getDeprecatedEndpoints(); + listEndpoints(deprecatedEndpoints, "What's Deprecated", outputStreamWriter); + + List<ChangedOperation> changedOperations = diff.getChangedOperations(); + ol_changed(changedOperations, outputStreamWriter); + + safelyAppend(outputStreamWriter, System.lineSeparator()); + safelyAppend( + outputStreamWriter, + diff.isCompatible() + ? "NOTE: API changes are backward compatible" + : "WARNING: API changes broke backward compatibility"); + safelyAppend(outputStreamWriter, System.lineSeparator()); + } + try { + outputStreamWriter.close(); + } catch (IOException e) { + throw new RendererException(e); + } + } + + private void ol_changed( + List<ChangedOperation> operations, OutputStreamWriter outputStreamWriter) { + if (null == operations || operations.isEmpty()) { + return; + } + safelyAppend(outputStreamWriter, title("What's Changed", 2)); + safelyAppend(outputStreamWriter, System.lineSeparator()); + for (ChangedOperation operation : operations) { + String pathUrl = operation.getPathUrl(); + String method = operation.getHttpMethod().toString(); + String desc = + Optional.ofNullable(operation.getSummary()).map(ChangedMetadata::getRight).orElse(""); + + safelyAppend(outputStreamWriter, itemEndpoint(method, pathUrl, desc)); + if (result(operation.getParameters()).isDifferent()) { + safelyAppend(outputStreamWriter, "* Parameter:\n"); + safelyAppend(outputStreamWriter, ul_param(operation.getParameters())); + safelyAppend(outputStreamWriter, System.lineSeparator()); + } + if (operation.resultRequestBody().isDifferent()) { + safelyAppend(outputStreamWriter, "* Request:\n"); + safelyAppend( + outputStreamWriter, ul_content(operation.getRequestBody().getContent(), true, 2)); + safelyAppend(outputStreamWriter, System.lineSeparator()); + } + if (operation.resultApiResponses().isDifferent()) { + safelyAppend(outputStreamWriter, "* Return Type:\n"); + safelyAppend(outputStreamWriter, ul_response(operation.getApiResponses())); + safelyAppend(outputStreamWriter, System.lineSeparator()); + } + } + } + + private String ul_response(ChangedApiResponse changedApiResponse) { + Map<String, ApiResponse> addResponses = changedApiResponse.getIncreased(); + Map<String, ApiResponse> delResponses = changedApiResponse.getMissing(); + Map<String, ChangedResponse> changedResponses = changedApiResponse.getChanged(); + StringBuilder sb = new StringBuilder(); + for (String propName : addResponses.keySet()) { + sb.append(itemResponse("** Add ", propName)); + } + for (String propName : delResponses.keySet()) { + sb.append(itemResponse("** Deleted ", propName)); + } + for (Entry<String, ChangedResponse> entry : changedResponses.entrySet()) { + sb.append(itemChangedResponse("** Changed ", entry.getKey(), entry.getValue())); + } + return sb.toString(); + } + + private String itemResponse(String title, String code) { + StringBuilder sb = new StringBuilder(); + String status = ""; + if (!code.equals("default") && !code.matches("[1-5]XX")) { + status = HttpStatus.getReasonPhrase(Integer.parseInt(code)); + } + sb.append(title).append(code).append(' ').append(status).append("\n"); + return sb.toString(); + } + + private String itemChangedResponse(String title, String contentType, ChangedResponse response) { + return itemResponse(title, contentType) + + "** Media types:\n" + + ul_content(response.getContent(), false, 3); + } + + private String ul_content(ChangedContent changedContent, boolean isRequest, int indent) { + StringBuilder sb = new StringBuilder(); + if (changedContent == null) { + return sb.toString(); + } + for (String propName : changedContent.getIncreased().keySet()) { + sb.append(itemContent("Added ", propName, indent)); + } + for (String propName : changedContent.getMissing().keySet()) { + sb.append(itemContent("Deleted ", propName, indent)); + } + for (String propName : changedContent.getChanged().keySet()) { + sb.append( + itemContent( + "Changed ", propName, indent, changedContent.getChanged().get(propName), isRequest)); + } + return sb.toString(); + } + + private String itemContent(String title, String contentType, int indent) { + return StringUtils.repeat('*', indent) + " " + title + contentType + "\n"; + } + + private String itemContent( + String title, + String contentType, + int indent, + ChangedMediaType changedMediaType, + boolean isRequest) { + StringBuilder sb = new StringBuilder(); + sb.append(itemContent(title, contentType, indent)) + .append(itemContent("Schema:", "", indent)) + .append(changedMediaType.isCompatible() ? "Backward compatible" : "Broken compatibility") + .append("\n"); + if (!changedMediaType.isCompatible()) { + sb.append(incompatibilities(changedMediaType.getSchema())); + } + return sb.toString(); + } + + private String incompatibilities(final ChangedSchema schema) { + return incompatibilities("", schema); + } + + private String incompatibilities(String propName, final ChangedSchema schema) { + StringBuilder sb = new StringBuilder(); + if (schema.getItems() != null) { + sb.append(items(propName, schema.getItems())); + } + if (schema.isCoreChanged() == DiffResult.INCOMPATIBLE && schema.isChangedType()) { + String type = type(schema.getOldSchema()) + " -> " + type(schema.getNewSchema()); + sb.append(property(propName, "Changed property type", type)); + } + String prefix = propName.isEmpty() ? "" : propName + "."; + sb.append( + properties(prefix, "Missing property", schema.getMissingProperties(), schema.getContext())); + schema + .getChangedProperties() + .forEach((name, property) -> sb.append(incompatibilities(prefix + name, property))); + return sb.toString(); + } + + private String items(String propName, ChangedSchema schema) { + return incompatibilities(propName + "[n]", schema); + } + + private String properties( + String propPrefix, String title, Map<String, Schema<?>> properties, DiffContext context) { + StringBuilder sb = new StringBuilder(); + if (properties != null) { + properties.forEach((key, value) -> sb.append(resolveProperty(propPrefix, value, key, title))); + } + return sb.toString(); + } + + private String resolveProperty(String propPrefix, Schema<?> value, String key, String title) { + try { + return property(propPrefix + key, title, resolve(value)); + } catch (Exception e) { + return property(propPrefix + key, title, type(value)); + } + } + + protected String property(String name, String title, Schema<?> schema) { + return property(name, title, type(schema)); + } + + protected String property(String name, String title, String type) { + return String.format("*** %s: %s (%s)%n\n", title, name, type); + } + + protected Schema<?> resolve(Schema<?> schema) { + return refPointer.resolveRef( + diff.getNewSpecOpenApi().getComponents(), schema, schema.get$ref()); + } + + protected String type(Schema<?> schema) { + String result = "object"; + if (schema == null) { + result = "no schema"; + } else if (schema instanceof ArraySchema) { + result = "array"; + } else if (schema.getType() != null) { + result = schema.getType(); + } + return result; + } + + private String ul_param(ChangedParameters changedParameters) { + List<Parameter> addParameters = changedParameters.getIncreased(); + List<Parameter> delParameters = changedParameters.getMissing(); + List<ChangedParameter> changed = changedParameters.getChanged(); + StringBuilder sb = new StringBuilder(); + for (Parameter param : addParameters) { + sb.append(itemParam("** Add ", param)); + } + for (ChangedParameter param : changed) { + sb.append(li_changedParam(param)); + } + for (Parameter param : delParameters) { + sb.append(itemParam("** Delete ", param)); + } + return sb.toString(); + } + + private String itemParam(String title, Parameter param) { + return title + param.getName() + " in " + param.getIn() + System.lineSeparator(); + } + + private String li_changedParam(ChangedParameter changeParam) { + if (changeParam.isDeprecated()) { + return itemParam("** Deprecated ", changeParam.getNewParameter()); + } else { + return itemParam("** Changed ", changeParam.getNewParameter()); + } + } + + private String listEndpoints( + List<Endpoint> endpoints, String title, OutputStreamWriter outputStreamWriter) { + if (null == endpoints || endpoints.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder(); + sb.append(title(title)); + for (Endpoint endpoint : endpoints) { + sb.append( + itemEndpoint( + endpoint.getMethod().toString(), endpoint.getPathUrl(), endpoint.getSummary())); + } + return sb.append(System.lineSeparator()).toString(); + } + + private String itemEndpoint(String method, String path, String desc) { + return String.format("=== %s%s%n", StringUtils.rightPad(method, 6), path); + } + + public String bigTitle(String title, String version) { + char ch = '='; + + return String.format("= %s (v %s)", title.toUpperCase(), version); + } + + public String title(String title) { + return this.title(title, '-'); + } + + public String title(String title, int level) { + String little = StringUtils.repeat("=", level); + return String.format("%s %s", little, title); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AsciidocRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AsciidocRenderTest.java new file mode 100644 index 000000000..dae2440eb --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/AsciidocRenderTest.java @@ -0,0 +1,96 @@ +package org.openapitools.openapidiff.core; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.output.AsciidocRender; + +public class AsciidocRenderTest { + @Test + public void renderDoesNotFailWhenPropertyHasBeenRemoved() { + AsciidocRender render = new AsciidocRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); + } + + @Test + public void renderDoesNotCauseStackOverflowWithRecursiveDefinitions() { + AsciidocRender render = new AsciidocRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = OpenApiCompare.fromLocations("recursive_old.yaml", "recursive_new.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); + } + + @Test + public void renderDoesNotFailWhenHTTPStatusCodeIsRange() { + AsciidocRender render = new AsciidocRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("range_statuscode_1.yaml", "range_statuscode_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); + } + + @Test + public void validateAsciiDocChangeFile() { + AsciidocRender render = new AsciidocRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()) + .isEqualTo( + "= TITLE (v 1.0.0)\n" + + ":reproducible:\n" + + ":sectlinks:\n" + + ":toc:\n" + + "\n" + + "== What's Changed\n" + + "=== GET /\n" + + "* Return Type:\n" + + "** Changed default \n" + + "** Media types:\n" + + "*** Changed application/json\n" + + "*** Schema:\n" + + "Backward compatible\n" + + "\n" + + "\n" + + "NOTE: API changes are backward compatible\n"); + } + + @Test + public void validateAsciiDocRangeStatus() { + AsciidocRender render = new AsciidocRender(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("range_statuscode_1.yaml", "range_statuscode_2.yaml"); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()) + .isEqualTo( + "= PROJECTS API (v 1.0.0)\n" + + ":reproducible:\n" + + ":sectlinks:\n" + + ":toc:\n" + + "\n" + + "== What's Changed\n" + + "=== GET /pet/\n" + + "* Return Type:\n" + + "** Add 4XX \n" + + "** Deleted 405 Method Not Allowed\n" + + "\n" + + "\n" + + "WARNING: API changes broke backward compatibility\n"); + } +} diff --git a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java index 7e0e82fb7..c9aec95d1 100644 --- a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java +++ b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java @@ -14,6 +14,7 @@ import org.apache.maven.plugins.annotations.Parameter; import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.output.AsciidocRender; import org.openapitools.openapidiff.core.output.ConsoleRender; import org.openapitools.openapidiff.core.output.JsonRender; import org.openapitools.openapidiff.core.output.MarkdownRender; @@ -46,6 +47,9 @@ public class OpenApiDiffMojo extends AbstractMojo { @Parameter(property = "markdownOutputFileName") String markdownOutputFileName; + @Parameter(property = "asciidocOutputFileName") + String asciidocOutputFileName; + @Override public void execute() throws MojoExecutionException, MojoFailureException { if (Boolean.TRUE.equals(skip)) { @@ -67,6 +71,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { writeDiffAsTextToFile(diff); writeDiffAsJsonToFile(diff); writeDiffAsMarkdownToFile(diff); + writeDiffAsAsciidocToFile(diff); if (failOnIncompatible && diff.isIncompatible()) { throw new BackwardIncompatibilityException("The API changes broke backward compatibility"); @@ -91,4 +96,8 @@ private void writeDiffAsJsonToFile(final ChangedOpenApi diff) { private void writeDiffAsMarkdownToFile(final ChangedOpenApi diff) { writeToFile(new MarkdownRender(), diff, markdownOutputFileName); } + + private void writeDiffAsAsciidocToFile(final ChangedOpenApi diff) { + writeToFile(new AsciidocRender(), diff, asciidocOutputFileName); + } } diff --git a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java index 10bd186e5..01f166fe4 100644 --- a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java +++ b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java @@ -25,6 +25,7 @@ class OpenApiDiffMojoTest { private final File consoleOutputfile = new File("target/diff.txt"); private final File markdownOutputfile = new File("target/diff.md"); private final File jsonOutputfile = new File("target/diff.json"); + private final File asciidocOutputfile = new File("target/diff.adoc"); @BeforeEach void setup() { @@ -158,6 +159,20 @@ void Should_outputToJsonFile_When_SpecIsDifferent() { assertTrue(Files.exists(jsonOutputfile.toPath())); } + @Test + void Should_outputToAsccidocFile_When_SpecIsDifferent() { + final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); + mojo.oldSpec = oldSpecFile.getAbsolutePath(); + mojo.newSpec = newSpecFile.getAbsolutePath(); + + mojo.asciidocOutputFileName = asciidocOutputfile.getAbsolutePath(); + mojo.failOnChanged = true; + + assertThrows(ApiChangedException.class, mojo::execute); + + assertTrue(Files.exists(asciidocOutputfile.toPath())); + } + private void cleanupGeneratedFiles() { try { Files.deleteIfExists(Paths.get(consoleOutputfile.getPath())); From d4c9198008f7454c55f118c09e00288d4dc28b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=20St=C3=B6ckmann?= <1172044+stoeren@users.noreply.github.com> Date: Sat, 16 Dec 2023 23:33:16 +0100 Subject: [PATCH 185/313] Add test for fixed NPE in rename of parameter (#555) Closes #488 Closes #516 --- .../openapidiff/core/ParameterDiffTest.java | 6 ++ core/src/test/resources/issue-488-1.json | 98 +++++++++++++++++++ core/src/test/resources/issue-488-2.json | 98 +++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 core/src/test/resources/issue-488-1.json create mode 100644 core/src/test/resources/issue-488-2.json diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java index 6e4cd9303..06947ea55 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java @@ -88,4 +88,10 @@ public void issue458ExclusiveMinimumTrueRemoved() { assertOpenApiChangedEndpoints( "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_13.yaml"); } + + @Test + public void issue488RenameParameterAddAndRemoveParameterReturnFalse() { + assertOpenApiChangedEndpoints( + "issue-488-1.json", "issue-488-2.json"); + } } diff --git a/core/src/test/resources/issue-488-1.json b/core/src/test/resources/issue-488-1.json new file mode 100644 index 000000000..22e0009dd --- /dev/null +++ b/core/src/test/resources/issue-488-1.json @@ -0,0 +1,98 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "Test-API", + "description": "Testdescription", + "version": "v1" + }, + "paths": { + "/api/v1/test": { + "get": { + "tags": [ + "TestTag" + ], + "summary": "Retrieve a list Test objects", + "description": "Usage with testId parameter is recommended.", + "parameters": [ + { + "name": "testId", + "in": "query", + "description": "rename of prop before", + "schema": { + "type": "string" + } + }, + { + "name": "dateFrom", + "in": "query", + "description": "Searches documents with creation date equal or younger specified timestamp", + "schema": { + "type": "string" + } + }, + { + "name": "dateTo", + "in": "query", + "description": "Searches documents with creation date equal or older than specified timestamp", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TestDTO" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + } + } + } + } + }, + "components": { + "schemas": { + "TestDTO": { + "type": "object", + "properties": { + "Id": { + "type": "string", + "nullable": true + }, + "Timestamp": { + "type": "string", + "format": "date-time" + }, + "Test": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + } + }, + "securitySchemes": { + "BearerAuth": { + "type": "apiKey", + "description": "Fill in your acquired bearer token here, must be like 'Bearer TOKEN_HERE'", + "name": "Authorization", + "in": "header" + } + } + }, + "security": [ + { + "BearerAuth": [ ] + } + ] +} \ No newline at end of file diff --git a/core/src/test/resources/issue-488-2.json b/core/src/test/resources/issue-488-2.json new file mode 100644 index 000000000..463e210c7 --- /dev/null +++ b/core/src/test/resources/issue-488-2.json @@ -0,0 +1,98 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "Test-API", + "description": "Testdescription", + "version": "v1" + }, + "paths": { + "/api/v1/test": { + "get": { + "tags": [ + "TestTag" + ], + "summary": "Retrieve a list Test objects", + "description": "Usage with testId parameter is recommended.", + "parameters": [ + { + "name": "testIdWillBreak", + "in": "query", + "description": "rename of prop after", + "schema": { + "type": "string" + } + }, + { + "name": "dateFrom", + "in": "query", + "description": "Searches documents with creation date equal or younger specified timestamp", + "schema": { + "type": "string" + } + }, + { + "name": "dateTo", + "in": "query", + "description": "Searches documents with creation date equal or older than specified timestamp", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TestDTO" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + } + } + } + } + }, + "components": { + "schemas": { + "TestDTO": { + "type": "object", + "properties": { + "Id": { + "type": "string", + "nullable": true + }, + "Timestamp": { + "type": "string", + "format": "date-time" + }, + "Test": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + } + }, + "securitySchemes": { + "BearerAuth": { + "type": "apiKey", + "description": "Fill in your acquired bearer token here, must be like 'Bearer TOKEN_HERE'", + "name": "Authorization", + "in": "header" + } + } + }, + "security": [ + { + "BearerAuth": [ ] + } + ] +} \ No newline at end of file From dc6ad56fd297d5cb614705cba68155304091c579 Mon Sep 17 00:00:00 2001 From: westse <10818305+westse@users.noreply.github.com> Date: Sat, 16 Dec 2023 15:40:33 -0700 Subject: [PATCH 186/313] Configurable incompatibility checks (#552) config-file and config-prop CLI options - Gives user fine-grained control of what constitutes an incompatibile change. Maven plugin config parameters - configFiles param for a separate yaml config file Corresponds to CLI --config-file option. - configProps param for specifying config props in pom.xml. Corresponds to CLI --config-prop option. - OpenApiDiffMojoTest updated to verify parameters work. Relies on recent exhaustive testing of incompatible checks to ensure no regressions (see #545). Fix #551 Fix #550 Fix #303 --- README.md | 12 +++ .../openapitools/openapidiff/cli/Main.java | 37 ++++++++- core/pom.xml | 4 + .../openapidiff/core/OpenApiCompare.java | 72 +++++++++++++++- .../core/compare/OAuthFlowDiff.java | 5 +- .../core/compare/OAuthFlowsDiff.java | 11 +-- .../openapidiff/core/compare/OpenApiDiff.java | 19 ++++- .../core/compare/OpenApiDiffOptions.java | 49 +++++++++++ .../openapidiff/core/compare/PathsDiff.java | 4 +- .../core/compare/SecurityRequirementDiff.java | 2 +- .../compare/SecurityRequirementsDiff.java | 2 +- .../core/compare/SecuritySchemeDiff.java | 13 +-- .../core/model/BackwardIncompatibleProp.java | 82 +++++++++++++++++++ .../core/model/ChangedApiResponse.java | 10 ++- .../core/model/ChangedContent.java | 14 +++- .../core/model/ChangedExtensions.java | 18 +++- .../openapidiff/core/model/ChangedHeader.java | 30 ++++++- .../core/model/ChangedHeaders.java | 10 ++- .../core/model/ChangedOAuthFlow.java | 29 ++++++- .../core/model/ChangedOneOfSchema.java | 16 +++- .../core/model/ChangedOpenApi.java | 16 +++- .../core/model/ChangedParameter.java | 28 +++++-- .../core/model/ChangedParameters.java | 17 +++- .../openapidiff/core/model/ChangedPath.java | 10 ++- .../openapidiff/core/model/ChangedPaths.java | 18 +++- .../core/model/ChangedRequestBody.java | 7 +- .../openapidiff/core/model/ChangedSchema.java | 58 +++++++++---- .../model/ChangedSecurityRequirement.java | 16 +++- .../model/ChangedSecurityRequirements.java | 15 +++- .../core/model/ChangedSecurityScheme.java | 39 ++++++--- .../openapidiff/core/model/DiffContext.java | 19 ++++- .../core/model/schema/ChangedEnum.java | 17 +++- .../core/model/schema/ChangedMaxLength.java | 17 +++- .../model/schema/ChangedNumericRange.java | 70 ++++++++++------ .../core/model/schema/ChangedReadOnly.java | 15 +++- .../core/model/schema/ChangedRequired.java | 17 +++- .../core/model/schema/ChangedWriteOnly.java | 14 +++- .../openapidiff/core/TestUtils.java | 20 +++++ .../core/backcompat/ApiResponseBCTest.java | 7 +- .../core/backcompat/ContentBCTest.java | 11 ++- .../core/backcompat/EnumBCTest.java | 11 ++- .../core/backcompat/HeaderBCTest.java | 29 ++++--- .../core/backcompat/HeadersBCTest.java | 15 ++-- .../core/backcompat/MaxLengthBCTest.java | 11 ++- .../core/backcompat/NumericRangeBCTest.java | 57 ++++++------- .../core/backcompat/OAuthFlowBCTest.java | 15 +++- .../core/backcompat/OneOfBCTest.java | 15 ++-- .../core/backcompat/OpenApiBCTest.java | 7 +- .../core/backcompat/ParameterBCTest.java | 19 +++-- .../core/backcompat/ParametersBCTest.java | 11 ++- .../core/backcompat/PathBCTest.java | 7 +- .../core/backcompat/PathsBCTest.java | 7 +- .../core/backcompat/ReadOnlyBCTest.java | 13 ++- .../core/backcompat/RequestBodyBCTest.java | 7 +- .../core/backcompat/RequiredBCTest.java | 11 ++- .../core/backcompat/SchemaBCTest.java | 15 +++- .../backcompat/SecurityRequirementBCTest.java | 5 +- .../SecurityRequirementsBCTest.java | 9 +- .../core/backcompat/SecuritySchemeBCTest.java | 18 ++-- .../core/backcompat/WriteOnlyBCTest.java | 11 ++- .../openapidiff/core/utils/FileUtilsTest.java | 3 +- ...c_numericrange_changed_but_compatible.yaml | 19 ++--- .../resources/bc_response_header_base.yaml | 8 ++ ...sponse_header_changed_but_compatible.yaml} | 11 +++ ...> bc_response_header_explode_changed.yaml} | 7 ++ ...c_response_header_required_decreased.yaml} | 10 ++- ...c_response_header_required_increased.yaml} | 8 ++ ...ponse_headers_changed_but_compatible.yaml} | 0 ...aml => bc_response_headers_decreased.yaml} | 0 maven-example/pom.xml | 6 ++ .../openapidiff/maven/OpenApiDiffMojo.java | 21 ++++- .../maven/OpenApiDiffMojoTest.java | 15 ++++ maven/src/test/resources/newspec.yaml | 36 ++++++-- maven/src/test/resources/oldspec.yaml | 37 +++++++-- .../src/test/resources/test-config-file.yaml | 8 ++ pom.xml | 5 ++ 76 files changed, 1074 insertions(+), 283 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiffOptions.java create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java rename core/src/test/resources/{bc_response_header_required_deleted.yaml => bc_response_header_changed_but_compatible.yaml} (57%) rename core/src/test/resources/{bc_response_header_explode.yaml => bc_response_header_explode_changed.yaml} (72%) rename core/src/test/resources/{bc_response_header_deprecated.yaml => bc_response_header_required_decreased.yaml} (66%) rename core/src/test/resources/{bc_response_header_required_added.yaml => bc_response_header_required_increased.yaml} (69%) rename core/src/test/resources/{bc_response_headers_increased.yaml => bc_response_headers_changed_but_compatible.yaml} (100%) rename core/src/test/resources/{bc_response_headers_missing.yaml => bc_response_headers_decreased.yaml} (100%) create mode 100644 maven/src/test/resources/test-config-file.yaml diff --git a/README.md b/README.md index d558d321c..03dfddc11 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ usage: openapi-diff <old> <new> compatible --fail-on-incompatible Fail only if API changes broke backward compatibility + --config-file Config file to override default behavior. Supported file formats: .yaml + --config-prop Config property to override default behavior with key:value format (e.g. my.prop:true) -h,--help print this message --header <property=value> use given header for authorisation --html <file> export diff as html in given file @@ -119,6 +121,8 @@ usage: openapi-diff <old> <new> incompatible, compatible --fail-on-incompatible Fail only if API changes broke backward compatibility --fail-on-changed Fail if API changed but is backward compatible + --config-file Config file to override default behavior. Supported file formats: .yaml + --config-prop Config property to override default behavior with key:value format (e.g. my.prop:true) --trace be extra verbose --version print the version information and exit --warn Print warning information @@ -153,6 +157,14 @@ Add openapi-diff to your POM to show diffs when you test your Maven project. You <jsonOutputFileName>${project.basedir}/../maven/target/diff.json</jsonOutputFileName> <!-- Supply file path for markdown output to file if desired. --> <markdownOutputFileName>${project.basedir}/../maven/target/diff.md</markdownOutputFileName> + <!-- Supply config file(s), e.g. to disable incompatibility checks. Later files override earlier files --> + <configFiles> + <configFile>my/config-file.yaml</configFile> + </configFiles> + <!-- Supply config properties, e.g. to disable incompatibility checks. Overrides configFiles. --> + <configProps> + <incompatible.response.enum.increased>false</incompatible.response.enum.increased> + </configProps> </configuration> </execution> </executions> diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index 4970efcc7..b5399209f 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -3,6 +3,7 @@ import ch.qos.logback.classic.Level; import io.swagger.v3.parser.core.models.AuthorizationValue; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.util.Collections; @@ -16,6 +17,7 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.lang3.exception.ExceptionUtils; import org.openapitools.openapidiff.core.OpenApiCompare; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.AsciidocRender; import org.openapitools.openapidiff.core.output.ConsoleRender; @@ -49,6 +51,19 @@ public static void main(String... args) { .longOpt("fail-on-changed") .desc("Fail if API changed but is backward compatible") .build()); + options.addOption( + Option.builder() + .longOpt("config-file") + .hasArg() + .desc("Config file to override default behavior. Supported file formats: .yaml") + .build()); + options.addOption( + Option.builder() + .longOpt("config-prop") + .hasArg() + .desc( + "Config property to override default behavior. Arg in format of [propKey]:[propVal]") + .build()); options.addOption(Option.builder().longOpt("trace").desc("be extra verbose").build()); options.addOption( Option.builder().longOpt("debug").desc("Print debugging information").build()); @@ -179,7 +194,27 @@ public static void main(String... args) { auths = Collections.singletonList(new AuthorizationValue(headers[0], headers[1], "header")); } - ChangedOpenApi result = OpenApiCompare.fromLocations(oldPath, newPath, auths); + OpenApiDiffOptions.Builder optionBuilder = OpenApiDiffOptions.builder(); + String[] configFilePaths = line.getOptionValues("config-file"); + if (configFilePaths != null) { + for (String configFilePath : configFilePaths) { + optionBuilder.configYaml(new File(configFilePath)); + } + } + + String[] configProps = line.getOptionValues("config-prop"); + if (configProps != null) { + for (String propKeyAndVal : configProps) { + String[] split = propKeyAndVal.split(":"); + if (split.length != 2 || split[0].isEmpty() || split[1].isEmpty()) { + throw new IllegalArgumentException("--config-prop unexpected format: " + propKeyAndVal); + } + optionBuilder.configProperty(split[0], split[1]); + } + } + OpenApiDiffOptions compareOpts = optionBuilder.build(); + + ChangedOpenApi result = OpenApiCompare.fromLocations(oldPath, newPath, auths, compareOpts); ConsoleRender consoleRender = new ConsoleRender(); if (!logLevel.equals("OFF")) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); diff --git a/core/pom.xml b/core/pom.xml index 50b8ce87d..0f056b319 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -40,6 +40,10 @@ <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-configuration2</artifactId> + </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> diff --git a/core/src/main/java/org/openapitools/openapidiff/core/OpenApiCompare.java b/core/src/main/java/org/openapitools/openapidiff/core/OpenApiCompare.java index 4564733a5..daa3af9b1 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/OpenApiCompare.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/OpenApiCompare.java @@ -7,6 +7,7 @@ import java.io.File; import java.util.List; import org.openapitools.openapidiff.core.compare.OpenApiDiff; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; import org.openapitools.openapidiff.core.model.ChangedOpenApi; public class OpenApiCompare { @@ -40,7 +41,25 @@ public static ChangedOpenApi fromContents(String oldContent, String newContent) */ public static ChangedOpenApi fromContents( String oldContent, String newContent, List<AuthorizationValue> auths) { - return fromSpecifications(readContent(oldContent, auths), readContent(newContent, auths)); + return fromContents(oldContent, newContent, auths, OpenApiDiffOptions.builder().build()); + } + + /** + * compare two openapi doc + * + * @param oldContent old api-doc location:Json or Http + * @param newContent new api-doc location:Json or Http + * @param auths + * @param options + * @return Comparison result + */ + public static ChangedOpenApi fromContents( + String oldContent, + String newContent, + List<AuthorizationValue> auths, + OpenApiDiffOptions options) { + return fromSpecifications( + readContent(oldContent, auths), readContent(newContent, auths), options); } /** @@ -64,7 +83,21 @@ public static ChangedOpenApi fromFiles(File oldFile, File newFile) { */ public static ChangedOpenApi fromFiles( File oldFile, File newFile, List<AuthorizationValue> auths) { - return fromLocations(oldFile.getAbsolutePath(), newFile.getAbsolutePath(), auths); + return fromFiles(oldFile, newFile, auths, OpenApiDiffOptions.builder().build()); + } + + /** + * compare two openapi doc + * + * @param oldFile old api-doc file + * @param newFile new api-doc file + * @param auths + * @param options + * @return Comparison result + */ + public static ChangedOpenApi fromFiles( + File oldFile, File newFile, List<AuthorizationValue> auths, OpenApiDiffOptions options) { + return fromLocations(oldFile.getAbsolutePath(), newFile.getAbsolutePath(), auths, options); } /** @@ -88,7 +121,25 @@ public static ChangedOpenApi fromLocations(String oldLocation, String newLocatio */ public static ChangedOpenApi fromLocations( String oldLocation, String newLocation, List<AuthorizationValue> auths) { - return fromSpecifications(readLocation(oldLocation, auths), readLocation(newLocation, auths)); + return fromLocations(oldLocation, newLocation, auths, OpenApiDiffOptions.builder().build()); + } + + /** + * compare two openapi doc + * + * @param oldLocation old api-doc location (local or http) + * @param newLocation new api-doc location (local or http) + * @param auths + * @param options + * @return Comparison result + */ + public static ChangedOpenApi fromLocations( + String oldLocation, + String newLocation, + List<AuthorizationValue> auths, + OpenApiDiffOptions options) { + return fromSpecifications( + readLocation(oldLocation, auths), readLocation(newLocation, auths), options); } /** @@ -99,7 +150,20 @@ public static ChangedOpenApi fromLocations( * @return Comparison result */ public static ChangedOpenApi fromSpecifications(OpenAPI oldSpec, OpenAPI newSpec) { - return OpenApiDiff.compare(notNull(oldSpec, "old"), notNull(newSpec, "new")); + return fromSpecifications(oldSpec, newSpec, OpenApiDiffOptions.builder().build()); + } + + /** + * compare two openapi doc + * + * @param oldSpec old api-doc specification + * @param newSpec new api-doc specification + * @param options + * @return Comparison result + */ + public static ChangedOpenApi fromSpecifications( + OpenAPI oldSpec, OpenAPI newSpec, OpenApiDiffOptions options) { + return OpenApiDiff.compare(notNull(oldSpec, "old"), notNull(newSpec, "new"), options); } private static OpenAPI notNull(OpenAPI spec, String type) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowDiff.java index 48e5e0447..8dd404f5b 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowDiff.java @@ -8,6 +8,7 @@ import java.util.Objects; import java.util.Optional; import org.openapitools.openapidiff.core.model.ChangedOAuthFlow; +import org.openapitools.openapidiff.core.model.DiffContext; public class OAuthFlowDiff { private final OpenApiDiff openApiDiff; @@ -20,8 +21,8 @@ private static Map<String, Object> getExtensions(OAuthFlow oAuthFlow) { return ofNullable(oAuthFlow).map(OAuthFlow::getExtensions).orElse(null); } - public Optional<ChangedOAuthFlow> diff(OAuthFlow left, OAuthFlow right) { - ChangedOAuthFlow changedOAuthFlow = new ChangedOAuthFlow(left, right); + public Optional<ChangedOAuthFlow> diff(OAuthFlow left, OAuthFlow right, DiffContext context) { + ChangedOAuthFlow changedOAuthFlow = new ChangedOAuthFlow(left, right, context); if (left != null && right != null) { changedOAuthFlow .setAuthorizationUrl( diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowsDiff.java index 98ceb509f..2b1136618 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OAuthFlowsDiff.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Optional; import org.openapitools.openapidiff.core.model.ChangedOAuthFlows; +import org.openapitools.openapidiff.core.model.DiffContext; public class OAuthFlowsDiff { private final OpenApiDiff openApiDiff; @@ -19,24 +20,24 @@ private static Map<String, Object> getExtensions(OAuthFlows oAuthFlow) { return ofNullable(oAuthFlow).map(OAuthFlows::getExtensions).orElse(null); } - public Optional<ChangedOAuthFlows> diff(OAuthFlows left, OAuthFlows right) { + public Optional<ChangedOAuthFlows> diff(OAuthFlows left, OAuthFlows right, DiffContext context) { ChangedOAuthFlows changedOAuthFlows = new ChangedOAuthFlows(left, right); if (left != null && right != null) { openApiDiff .getOAuthFlowDiff() - .diff(left.getImplicit(), right.getImplicit()) + .diff(left.getImplicit(), right.getImplicit(), context) .ifPresent(changedOAuthFlows::setImplicitOAuthFlow); openApiDiff .getOAuthFlowDiff() - .diff(left.getPassword(), right.getPassword()) + .diff(left.getPassword(), right.getPassword(), context) .ifPresent(changedOAuthFlows::setPasswordOAuthFlow); openApiDiff .getOAuthFlowDiff() - .diff(left.getClientCredentials(), right.getClientCredentials()) + .diff(left.getClientCredentials(), right.getClientCredentials(), context) .ifPresent(changedOAuthFlows::setClientCredentialOAuthFlow); openApiDiff .getOAuthFlowDiff() - .diff(left.getAuthorizationCode(), right.getAuthorizationCode()) + .diff(left.getAuthorizationCode(), right.getAuthorizationCode(), context) .ifPresent(changedOAuthFlows::setAuthorizationCodeOAuthFlow); } openApiDiff diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java index 1f0fe03bf..f56ed04da 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java @@ -41,6 +41,7 @@ public class OpenApiDiff { private MetadataDiff metadataDiff; private final OpenAPI oldSpecOpenApi; private final OpenAPI newSpecOpenApi; + private final OpenApiDiffOptions options; private List<Endpoint> newEndpoints; private List<Endpoint> missingEndpoints; private List<ChangedOperation> changedOperations; @@ -50,18 +51,24 @@ public class OpenApiDiff { /* * @param oldSpecOpenApi * @param newSpecOpenApi + * @param diffOptions */ - private OpenApiDiff(OpenAPI oldSpecOpenApi, OpenAPI newSpecOpenApi) { + private OpenApiDiff(OpenAPI oldSpecOpenApi, OpenAPI newSpecOpenApi, OpenApiDiffOptions options) { this.oldSpecOpenApi = oldSpecOpenApi; this.newSpecOpenApi = newSpecOpenApi; + this.options = options; if (null == oldSpecOpenApi || null == newSpecOpenApi) { throw new RuntimeException("one of the old or new object is null"); } + if (null == options) { + throw new IllegalArgumentException("options parameter is null but is required"); + } initializeFields(); } - public static ChangedOpenApi compare(OpenAPI oldSpec, OpenAPI newSpec) { - return new OpenApiDiff(oldSpec, newSpec).compare(); + public static ChangedOpenApi compare( + OpenAPI oldSpec, OpenAPI newSpec, OpenApiDiffOptions diffOptions) { + return new OpenApiDiff(oldSpec, newSpec, diffOptions).compare(); } private void initializeFields() { @@ -87,6 +94,10 @@ private void initializeFields() { this.deferredSchemaCache = new DeferredSchemaCache(this); } + public OpenApiDiffOptions getOptions() { + return options; + } + private ChangedOpenApi compare() { preProcess(oldSpecOpenApi); preProcess(newSpecOpenApi); @@ -163,7 +174,7 @@ private void preProcess(OpenAPI openApi) { } private ChangedOpenApi getChangedOpenApi() { - return new ChangedOpenApi() + return new ChangedOpenApi(options) .setMissingEndpoints(missingEndpoints) .setNewEndpoints(newEndpoints) .setNewSpecOpenApi(newSpecOpenApi) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiffOptions.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiffOptions.java new file mode 100644 index 000000000..23f4e1c37 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiffOptions.java @@ -0,0 +1,49 @@ +package org.openapitools.openapidiff.core.compare; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import org.apache.commons.configuration2.CompositeConfiguration; +import org.apache.commons.configuration2.YAMLConfiguration; +import org.apache.commons.configuration2.ex.ConfigurationException; + +public class OpenApiDiffOptions { + private final CompositeConfiguration config; + + private OpenApiDiffOptions(CompositeConfiguration config) { + this.config = config; + } + + public CompositeConfiguration getConfig() { + return config; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private OpenApiDiffOptions built = new OpenApiDiffOptions(new CompositeConfiguration()); + + public Builder configYaml(File file) { + YAMLConfiguration yamlConfig = new YAMLConfiguration(); + try { + yamlConfig.read(new FileReader(file)); + } catch (ConfigurationException | FileNotFoundException e) { + throw new IllegalArgumentException("Problem loading config. file=" + file, e); + } + // Ideally immutable, but since it isn't, we just modify the config directly + built.getConfig().addConfigurationFirst(yamlConfig); + return this; + } + + public Builder configProperty(String propKey, String propVal) { + built.getConfig().setProperty(propKey, propVal); + return this; + } + + public OpenApiDiffOptions build() { + return built; + } + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index cb969f4fa..49cbff9c4 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -40,7 +40,7 @@ public DeferredChanged<ChangedPaths> diff( final Map<String, PathItem> left, final Map<String, PathItem> right) { DeferredBuilder<Changed> builder = new DeferredBuilder<>(); - ChangedPaths changedPaths = new ChangedPaths(left, right); + ChangedPaths changedPaths = new ChangedPaths(left, right, openApiDiff.getOptions()); changedPaths.getIncreased().putAll(right); left.keySet() @@ -82,7 +82,7 @@ public DeferredChanged<ChangedPaths> diff( params.put(oldParams.get(i), newParams.get(i)); } } - DiffContext context = new DiffContext(); + DiffContext context = new DiffContext(openApiDiff.getOptions()); context.setUrl(url); context.setParameters(params); context.setLeftAndRightUrls(url, rightUrl); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementDiff.java index 237e7815f..76b51a5d0 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementDiff.java @@ -66,7 +66,7 @@ public DeferredChanged<ChangedSecurityRequirement> diff( DeferredBuilder<Changed> builder = new DeferredBuilder<>(); ChangedSecurityRequirement changedSecurityRequirement = - new ChangedSecurityRequirement(left, right != null ? getCopy(right) : null); + new ChangedSecurityRequirement(left, right != null ? getCopy(right) : null, context); SecurityRequirement leftRequirement = left == null ? new SecurityRequirement() : left; SecurityRequirement rightRequirement = right == null ? new SecurityRequirement() : right; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementsDiff.java index 291dd5c65..324bf0017 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/SecurityRequirementsDiff.java @@ -88,7 +88,7 @@ protected DeferredChanged<ChangedSecurityRequirements> diff( right = right == null ? new ArrayList<>() : getCopy(right); ChangedSecurityRequirements changedSecurityRequirements = - new ChangedSecurityRequirements(left, right); + new ChangedSecurityRequirements(left, right, context); for (SecurityRequirement leftSecurity : left) { Optional<SecurityRequirement> rightSecOpt = contains(right, leftSecurity); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/SecuritySchemeDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/SecuritySchemeDiff.java index a27edb374..f68d638d3 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/SecuritySchemeDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/SecuritySchemeDiff.java @@ -51,8 +51,8 @@ public DeferredChanged<ChangedSecurityScheme> diff( changedSecuritySchemeOptional -> { ChangedSecurityScheme changedSecurityScheme = changedSecuritySchemeOptional.orElse( - new ChangedSecurityScheme(leftSecurityScheme, rightSecurityScheme)); - changedSecurityScheme = getCopyWithoutScopes(changedSecurityScheme); + new ChangedSecurityScheme(leftSecurityScheme, rightSecurityScheme, context)); + changedSecurityScheme = getCopyWithoutScopes(changedSecurityScheme, context); if (changedSecurityScheme != null && leftSecurityScheme.getType() == SecurityScheme.Type.OAUTH2) { @@ -71,7 +71,7 @@ protected DeferredChanged<ChangedSecurityScheme> computeDiff( SecurityScheme rightSecurityScheme, DiffContext context) { ChangedSecurityScheme changedSecurityScheme = - new ChangedSecurityScheme(leftSecurityScheme, rightSecurityScheme); + new ChangedSecurityScheme(leftSecurityScheme, rightSecurityScheme, context); openApiDiff .getMetadataDiff() @@ -87,7 +87,7 @@ protected DeferredChanged<ChangedSecurityScheme> computeDiff( case OAUTH2: openApiDiff .getOAuthFlowsDiff() - .diff(leftSecurityScheme.getFlows(), rightSecurityScheme.getFlows()) + .diff(leftSecurityScheme.getFlows(), rightSecurityScheme.getFlows(), context) .ifPresent(changedSecurityScheme::setOAuthFlows); break; @@ -114,9 +114,10 @@ protected DeferredChanged<ChangedSecurityScheme> computeDiff( return new RealizedChanged<>(changedSecurityScheme); } - private ChangedSecurityScheme getCopyWithoutScopes(ChangedSecurityScheme original) { + private ChangedSecurityScheme getCopyWithoutScopes( + ChangedSecurityScheme original, DiffContext context) { return new ChangedSecurityScheme( - original.getOldSecurityScheme(), original.getNewSecurityScheme()) + original.getOldSecurityScheme(), original.getNewSecurityScheme(), context) .setChangedType(original.isChangedType()) .setChangedIn(original.isChangedIn()) .setChangedScheme(original.isChangedScheme()) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java b/core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java new file mode 100644 index 000000000..f05a72f75 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java @@ -0,0 +1,82 @@ +package org.openapitools.openapidiff.core.model; + +import static org.apache.commons.lang3.ArrayUtils.isEmpty; + +import org.apache.commons.configuration2.Configuration; + +// Properties to enable/disable backward incompatibility checks +// Note: order is not programmatically significant but keep alphabetical for maintainability +public enum BackwardIncompatibleProp { + EXTENSION_CONTENT_TYPES_DECREASED("incompatible.extension.content.types.decreased", false), + EXTENSION_CONTENT_TYPE_DELETED("incompatible.extension.content.type.%s.deleted", false), + OPENAPI_ENDPOINTS_DECREASED("incompatible.openapi.endpoints.decreased", true), + REQUEST_BODY_REQUIRED_INCREASED("incompatible.request.body.increased", true), + REQUEST_CONTENT_DECREASED("incompatible.request.content.decreased", true), + REQUEST_ENUM_DECREASED("incompatible.request.enum.decreased", true), + REQUEST_MAX_LENGTH_DECREASED("incompatible.request.max.length.decreased", true), + REQUEST_NUMERIC_RANGE_DECREASED("incompatible.request.numeric.range.decreased", true), + REQUEST_ONEOF_DECREASED("incompatible.request.oneof.decreased", true), + REQUEST_PARAM_ALLOWEMPTY_DECREASED("incompatible.request.param.allowempty.decreased", true), + REQUEST_PARAM_EXPLODE_CHANGED("incompatible.request.param.explode.changed", true), + REQUEST_PARAM_STYLE_CHANGED("incompatible.request.param.style.changed", true), + REQUEST_PARAMS_DECREASED("incompatible.request.params.decreased", true), + REQUEST_PARAMS_REQUIRED_INCREASED("incompatible.request.params.required.increased", true), + REQUEST_READONLY_INCREASED("incompatible.request.readonly.increased", true), + REQUEST_READONLY_REQUIRED_DECREASED("incompatible.request.readonly.required.decreased", true), + REQUEST_REQUIRED_INCREASED("incompatible.request.required.increased", true), + RESPONSE_CONTENT_DECREASED("incompatible.response.content.decreased", true), + RESPONSE_ENUM_INCREASED("incompatible.response.enum.increased", true), + RESPONSE_HEADER_EXPLODE_CHANGED("incompatible.response.header.explode.changed", true), + RESPONSE_HEADER_REQUIRED_DECREASED("incompatible.response.header.required.decreased", true), + RESPONSE_HEADER_REQUIRED_INCREASED("incompatible.response.header.required.increased", true), + RESPONSE_HEADERS_DECREASED("incompatible.response.headers.decreased", true), + RESPONSE_MAX_LENGTH_INCREASED("incompatible.response.max.length.increased", true), + RESPONSE_NUMERIC_RANGE_INCREASED("incompatible.response.numeric.range.increased", false), + RESPONSE_ONEOF_INCREASED("incompatible.response.oneof.increased", true), + RESPONSE_REQUIRED_DECREASED("incompatible.response.required.decreased", true), + RESPONSE_RESPONSES_DECREASED("incompatible.response.responses.decreased", true), + RESPONSE_WRITEONLY_INCREASED("incompatible.response.writeonly.increased", true), + RESPONSE_WRITEONLY_REQUIRED_DECREASED("incompatible.response.writeonly.required.decreased", true), + SECURITY_REQUIREMENT_SCHEMES_INCREASED( + "incompatible.security.requirement.schemes.increased", true), + SECURITY_REQUIREMENTS_DECREASED("incompatible.security.requirements.decreased", true), + SECURITY_SCHEME_BEARER_FORMAT_CHANGED("incompatible.security.scheme.bearer.format.changed", true), + SECURITY_SCHEME_OAUTH2_AUTH_URL_CHANGED( + "incompatible.security.scheme.oauth2.auth.url.changed", true), + SECURITY_SCHEME_OAUTH2_REFRESH_URL_CHANGED( + "incompatible.security.scheme.oauth2.refresh.url.changed", true), + SECURITY_SCHEME_OAUTH2_TOKEN_URL_CHANGED( + "incompatible.security.scheme.oauth2.token.url.changed", true), + SECURITY_SCHEME_OPENIDCONNECT_URL_CHANGED( + "incompatible.security.scheme.openidconnect.url.changed", true), + SECURITY_SCHEME_SCHEME_CHANGED("incompatible.security.scheme.scheme.changed", true), + SECURITY_SCHEME_SCOPES_INCREASED("incompatible.security.scheme.scopes.increased", true), + SCHEMA_DISCRIMINATOR_CHANGED("incompatible.schema.discriminator.changed", true), + SCHEMA_TYPE_CHANGED("incompatible.schema.type.changed", true), + ; + + private final String propertyName; + private final boolean enabledByDefault; + + BackwardIncompatibleProp(String propertyName, boolean enabledByDefault) { + this.propertyName = propertyName; + this.enabledByDefault = enabledByDefault; + } + + public String getPropertyName() { + return propertyName; + } + + public boolean isEnabledByDefault() { + return enabledByDefault; + } + + public boolean enabled(DiffContext context, Object... formatArgs) { + return enabled(context.getConfig(), formatArgs); + } + + public boolean enabled(Configuration cfg, Object... formatArgs) { + String propName = isEmpty(formatArgs) ? propertyName : String.format(propertyName, formatArgs); + return cfg.getBoolean(propName, enabledByDefault); + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedApiResponse.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedApiResponse.java index e496f7a71..0b12a0ead 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedApiResponse.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedApiResponse.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_RESPONSES_DECREASED; + import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import java.util.LinkedHashMap; @@ -39,10 +41,12 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (!increased.isEmpty() && missing.isEmpty()) { - return DiffResult.COMPATIBLE; + if (!missing.isEmpty()) { + if (RESPONSE_RESPONSES_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public ApiResponses getOldApiResponses() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java index 192b49e66..472803ffd 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedContent.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_CONTENT_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_CONTENT_DECREASED; + import io.swagger.v3.oas.models.media.Content; import io.swagger.v3.oas.models.media.MediaType; import java.util.*; @@ -31,10 +34,15 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (context.isRequest() && missing.isEmpty() || context.isResponse() && missing.isEmpty()) { - return DiffResult.COMPATIBLE; + if (!missing.isEmpty()) { + if (context.isRequest() && REQUEST_CONTENT_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + if (context.isResponse() && RESPONSE_CONTENT_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public Content getOldContent() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExtensions.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExtensions.java index cde3b1511..f189b3e8c 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExtensions.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExtensions.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.EXTENSION_CONTENT_TYPES_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.EXTENSION_CONTENT_TYPE_DELETED; + import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -32,7 +35,20 @@ public List<Changed> getChangedElements() { @Override public DiffResult isCoreChanged() { - return DiffResult.NO_CHANGES; + if (increased.isEmpty() && missing.isEmpty()) { + return DiffResult.NO_CHANGES; + } + if (!missing.isEmpty()) { + if (EXTENSION_CONTENT_TYPES_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + for (String key : missing.keySet()) { + if (EXTENSION_CONTENT_TYPE_DELETED.enabled(context, key)) { + return DiffResult.INCOMPATIBLE; + } + } + } + return DiffResult.COMPATIBLE; } public Map<String, Object> getOldExtensions() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java index 8ec56568f..b7f505a9b 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java @@ -1,5 +1,9 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADER_EXPLODE_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADER_REQUIRED_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADER_REQUIRED_INCREASED; + import io.swagger.v3.oas.models.headers.Header; import java.util.Arrays; import java.util.List; @@ -34,10 +38,30 @@ public DiffResult isCoreChanged() { if (!required && !deprecated && !style && !explode) { return DiffResult.NO_CHANGES; } - if (!required && !style && !explode) { - return DiffResult.COMPATIBLE; + if (explode) { + if (RESPONSE_HEADER_EXPLODE_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (required) { + boolean requiredOld = oldHeader.getRequired() != null ? oldHeader.getRequired() : false; + boolean requiredNew = newHeader.getRequired() != null ? newHeader.getRequired() : false; + if (requiredOld && !requiredNew) { + if (RESPONSE_HEADER_REQUIRED_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (!requiredOld && requiredNew) { + // TODO: Document why desired or remove support. Client will just ignore new header? + if (RESPONSE_HEADER_REQUIRED_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + } + if (style) { + return DiffResult.INCOMPATIBLE; } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public Header getOldHeader() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeaders.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeaders.java index 451e94f1e..dd228da0f 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeaders.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeaders.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADERS_DECREASED; + import io.swagger.v3.oas.models.headers.Header; import java.util.ArrayList; import java.util.List; @@ -31,10 +33,12 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missing.isEmpty()) { - return DiffResult.COMPATIBLE; + if (!missing.isEmpty()) { + if (RESPONSE_HEADERS_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public Map<String, Header> getOldHeaders() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOAuthFlow.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOAuthFlow.java index 5409d1d99..b6179e9be 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOAuthFlow.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOAuthFlow.java @@ -1,5 +1,9 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_SCHEME_OAUTH2_AUTH_URL_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_SCHEME_OAUTH2_REFRESH_URL_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_SCHEME_OAUTH2_TOKEN_URL_CHANGED; + import io.swagger.v3.oas.models.security.OAuthFlow; import java.util.Collections; import java.util.List; @@ -8,14 +12,16 @@ public class ChangedOAuthFlow implements ComposedChanged { private OAuthFlow oldOAuthFlow; private OAuthFlow newOAuthFlow; + private final DiffContext context; private boolean authorizationUrl; private boolean tokenUrl; private boolean refreshUrl; private ChangedExtensions extensions; - public ChangedOAuthFlow(OAuthFlow oldOAuthFlow, OAuthFlow newOAuthFlow) { + public ChangedOAuthFlow(OAuthFlow oldOAuthFlow, OAuthFlow newOAuthFlow, DiffContext context) { this.oldOAuthFlow = oldOAuthFlow; this.newOAuthFlow = newOAuthFlow; + this.context = context; } @Override @@ -25,10 +31,25 @@ public List<Changed> getChangedElements() { @Override public DiffResult isCoreChanged() { - if (authorizationUrl || tokenUrl || refreshUrl) { - return DiffResult.INCOMPATIBLE; + if (!authorizationUrl && !tokenUrl && !refreshUrl) { + return DiffResult.NO_CHANGES; + } + if (authorizationUrl) { + if (SECURITY_SCHEME_OAUTH2_AUTH_URL_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (refreshUrl) { + if (SECURITY_SCHEME_OAUTH2_REFRESH_URL_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (tokenUrl) { + if (SECURITY_SCHEME_OAUTH2_TOKEN_URL_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.NO_CHANGES; + return DiffResult.COMPATIBLE; } public OAuthFlow getOldOAuthFlow() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java index ebf07d2b7..d1ecfdbde 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_ONEOF_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_ONEOF_INCREASED; + import io.swagger.v3.oas.models.media.Schema; import java.util.ArrayList; import java.util.List; @@ -31,10 +34,17 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (context.isRequest() && missing.isEmpty() || context.isResponse() && increased.isEmpty()) { - return DiffResult.COMPATIBLE; + if (context.isRequest() && !missing.isEmpty()) { + if (REQUEST_ONEOF_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (context.isResponse() && !increased.isEmpty()) { + if (RESPONSE_ONEOF_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public Map<String, String> getOldMapping() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java index e1bdd20bd..d0f23ca16 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOpenApi.java @@ -1,14 +1,18 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; + import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.models.OpenAPI; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; import org.openapitools.openapidiff.core.utils.EndpointUtils; public class ChangedOpenApi implements ComposedChanged { + private final OpenApiDiffOptions options; @JsonIgnore private OpenAPI oldSpecOpenApi; @JsonIgnore private OpenAPI newSpecOpenApi; private List<Endpoint> newEndpoints; @@ -17,6 +21,10 @@ public class ChangedOpenApi implements ComposedChanged { private List<ChangedSchema> changedSchemas; private ChangedExtensions changedExtensions; + public ChangedOpenApi(OpenApiDiffOptions options) { + this.options = options; + } + public List<Endpoint> getDeprecatedEndpoints() { return changedOperations.stream() .filter(ChangedOperation::isDeprecated) @@ -40,10 +48,12 @@ public DiffResult isCoreChanged() { if (newEndpoints.isEmpty() && missingEndpoints.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missingEndpoints.isEmpty()) { - return DiffResult.COMPATIBLE; + if (!missingEndpoints.isEmpty()) { + if (OPENAPI_ENDPOINTS_DECREASED.enabled(options.getConfig())) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public OpenAPI getOldSpecOpenApi() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java index 998570186..ff1ccfb48 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.*; + import io.swagger.v3.oas.models.parameters.Parameter; import java.util.Arrays; import java.util.List; @@ -41,13 +43,27 @@ public DiffResult isCoreChanged() { && !changeExplode) { return DiffResult.NO_CHANGES; } - if ((!changeRequired || Boolean.TRUE.equals(oldParameter.getRequired())) - && (!changeAllowEmptyValue || Boolean.TRUE.equals(newParameter.getAllowEmptyValue())) - && !changeStyle - && !changeExplode) { - return DiffResult.COMPATIBLE; + if (changeAllowEmptyValue && !Boolean.TRUE.equals(newParameter.getAllowEmptyValue())) { + if (REQUEST_PARAM_ALLOWEMPTY_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (changeExplode) { + if (REQUEST_PARAM_EXPLODE_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (changeRequired && !Boolean.TRUE.equals(oldParameter.getRequired())) { + if (REQUEST_PARAMS_REQUIRED_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (changeStyle) { + if (REQUEST_PARAM_STYLE_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public DiffContext getContext() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameters.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameters.java index 2b119bf80..86dc145fd 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameters.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameters.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAMS_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAMS_REQUIRED_INCREASED; + import io.swagger.v3.oas.models.parameters.Parameter; import java.util.ArrayList; import java.util.List; @@ -33,11 +36,17 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (increased.stream().noneMatch(p -> p.getRequired() != null && p.getRequired()) - && missing.isEmpty()) { - return DiffResult.COMPATIBLE; + if (!missing.isEmpty()) { + if (REQUEST_PARAMS_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (increased.stream().anyMatch(p -> p.getRequired() != null && p.getRequired())) { + if (REQUEST_PARAMS_REQUIRED_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public List<Parameter> getOldParameterList() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPath.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPath.java index e9fa4093a..2ba9830e7 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPath.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPath.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; + import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import java.util.*; @@ -36,10 +38,12 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missing.isEmpty()) { - return DiffResult.COMPATIBLE; + if (!missing.isEmpty()) { + if (OPENAPI_ENDPOINTS_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public String getPathUrl() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPaths.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPaths.java index 96af52785..5e032b498 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPaths.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedPaths.java @@ -1,16 +1,24 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; + import io.swagger.v3.oas.models.PathItem; import java.util.*; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; public class ChangedPaths implements ComposedChanged { + private final OpenApiDiffOptions options; private final Map<String, PathItem> oldPathMap; private final Map<String, PathItem> newPathMap; private Map<String, PathItem> increased; private Map<String, PathItem> missing; private Map<String, ChangedPath> changed; - public ChangedPaths(Map<String, PathItem> oldPathMap, Map<String, PathItem> newPathMap) { + public ChangedPaths( + Map<String, PathItem> oldPathMap, + Map<String, PathItem> newPathMap, + OpenApiDiffOptions options) { + this.options = options; this.oldPathMap = oldPathMap; this.newPathMap = newPathMap; this.increased = new LinkedHashMap<>(); @@ -28,10 +36,12 @@ public DiffResult isCoreChanged() { if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missing.isEmpty()) { - return DiffResult.COMPATIBLE; + if (!missing.isEmpty()) { + if (OPENAPI_ENDPOINTS_DECREASED.enabled(options.getConfig())) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public Map<String, PathItem> getOldPathMap() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedRequestBody.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedRequestBody.java index 83fadd407..48cc4cf0e 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedRequestBody.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedRequestBody.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; + import io.swagger.v3.oas.models.parameters.RequestBody; import java.util.Arrays; import java.util.List; @@ -31,7 +33,10 @@ public DiffResult isCoreChanged() { if (!changeRequired) { return DiffResult.NO_CHANGES; } - return DiffResult.INCOMPATIBLE; + if (OPENAPI_ENDPOINTS_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + return DiffResult.COMPATIBLE; } public RequestBody getOldRequestBody() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index d62cd7b69..a8200ba40 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -1,5 +1,9 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_REQUIRED_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_DISCRIMINATOR_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_TYPE_CHANGED; + import io.swagger.v3.oas.models.media.Schema; import java.util.*; import java.util.stream.Collectors; @@ -139,24 +143,50 @@ private DiffResult calculateCoreChanged() { && !discriminatorPropertyChanged) { return DiffResult.NO_CHANGES; } - boolean missingRequiredProperties = - oldSchema != null - && oldSchema.getRequired() != null - && missingProperties.keySet().stream() - .anyMatch(missingProperty -> oldSchema.getRequired().contains(missingProperty)); - boolean compatibleForResponse = - !missingRequiredProperties && (oldSchema == null || newSchema != null); - if ((context.isRequest() && compatibleForRequest() - || context.isResponse() && compatibleForResponse) - && !changedType - && !discriminatorPropertyChanged) { - return DiffResult.COMPATIBLE; + if (changedType) { + if (SCHEMA_TYPE_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (discriminatorPropertyChanged) { + if (SCHEMA_DISCRIMINATOR_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + + if (!compatibleForRequest() || !compatibleForResponse()) { + return DiffResult.INCOMPATIBLE; } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } private boolean compatibleForRequest() { - return (oldSchema != null || newSchema == null); + if (context.isRequest()) { + if (oldSchema == null && newSchema != null) { + // TODO: dead code? If not, create test. + return false; + } + } + return true; + } + + private boolean compatibleForResponse() { + if (context.isResponse()) { + if (oldSchema != null) { + if (newSchema == null) { + // TODO: dead code? If not, create test. + return false; + } + if (oldSchema.getRequired() != null + && missingProperties.keySet().stream() + .anyMatch(prop -> oldSchema.getRequired().contains(prop))) { + if (RESPONSE_REQUIRED_DECREASED.enabled(context)) { + return false; + } + } + } + } + return true; } public DiffContext getContext() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirement.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirement.java index f8e61f7dc..0c5ed1535 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirement.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirement.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_REQUIREMENT_SCHEMES_INCREASED; + import io.swagger.v3.oas.models.security.SecurityRequirement; import java.util.ArrayList; import java.util.List; @@ -8,14 +10,18 @@ public class ChangedSecurityRequirement implements ComposedChanged { private SecurityRequirement oldSecurityRequirement; private SecurityRequirement newSecurityRequirement; + private final DiffContext context; private SecurityRequirement missing; private SecurityRequirement increased; private List<ChangedSecurityScheme> changed; public ChangedSecurityRequirement( - SecurityRequirement oldSecurityRequirement, SecurityRequirement newSecurityRequirement) { + SecurityRequirement oldSecurityRequirement, + SecurityRequirement newSecurityRequirement, + DiffContext context) { this.oldSecurityRequirement = oldSecurityRequirement; this.newSecurityRequirement = newSecurityRequirement; + this.context = context; this.changed = new ArrayList<>(); } @@ -29,10 +35,12 @@ public DiffResult isCoreChanged() { if (increased == null && missing == null) { return DiffResult.NO_CHANGES; } - if (increased == null) { - return DiffResult.COMPATIBLE; + if (increased != null) { + if (SECURITY_REQUIREMENT_SCHEMES_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public void addMissing(String key, List<String> scopes) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirements.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirements.java index d8f813801..3a8f90a34 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirements.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityRequirements.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_REQUIREMENTS_DECREASED; + import io.swagger.v3.oas.models.security.SecurityRequirement; import java.util.ArrayList; import java.util.List; @@ -9,15 +11,18 @@ public class ChangedSecurityRequirements implements ComposedChanged { private List<SecurityRequirement> oldSecurityRequirements; private List<SecurityRequirement> newSecurityRequirements; + private final DiffContext context; private List<SecurityRequirement> missing; private List<SecurityRequirement> increased; private List<ChangedSecurityRequirement> changed; public ChangedSecurityRequirements( List<SecurityRequirement> oldSecurityRequirements, - List<SecurityRequirement> newSecurityRequirements) { + List<SecurityRequirement> newSecurityRequirements, + DiffContext context) { this.oldSecurityRequirements = oldSecurityRequirements; this.newSecurityRequirements = newSecurityRequirements; + this.context = context; this.changed = new ArrayList<>(); } @@ -31,10 +36,12 @@ public DiffResult isCoreChanged() { if (CollectionUtils.isEmpty(missing) && CollectionUtils.isEmpty(increased)) { return DiffResult.NO_CHANGES; } - if (CollectionUtils.isEmpty(missing)) { - return DiffResult.COMPATIBLE; + if (CollectionUtils.isNotEmpty(missing)) { + if (SECURITY_REQUIREMENTS_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public void addMissing(SecurityRequirement securityRequirement) { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java index 2850e0f17..1adb56b6f 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSecurityScheme.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.*; + import io.swagger.v3.oas.models.security.SecurityScheme; import java.util.Arrays; import java.util.List; @@ -8,6 +10,7 @@ public class ChangedSecurityScheme implements ComposedChanged { private SecurityScheme oldSecurityScheme; private SecurityScheme newSecurityScheme; + private final DiffContext context; private boolean changedType; private boolean changedIn; private boolean changedScheme; @@ -18,9 +21,11 @@ public class ChangedSecurityScheme implements ComposedChanged { private ChangedOAuthFlows oAuthFlows; private ChangedExtensions extensions; - public ChangedSecurityScheme(SecurityScheme oldSecurityScheme, SecurityScheme newSecurityScheme) { + public ChangedSecurityScheme( + SecurityScheme oldSecurityScheme, SecurityScheme newSecurityScheme, DiffContext context) { this.oldSecurityScheme = oldSecurityScheme; this.newSecurityScheme = newSecurityScheme; + this.context = context; } @Override @@ -38,22 +43,36 @@ public DiffResult isCoreChanged() { && (changedScopes == null || changedScopes.isUnchanged())) { return DiffResult.NO_CHANGES; } - if (!changedType - && !changedIn - && !changedScheme - && !changedBearerFormat - && !changedOpenIdConnectUrl - && (changedScopes == null || changedScopes.getIncreased().isEmpty())) { + if (changedBearerFormat) { + if (SECURITY_SCHEME_BEARER_FORMAT_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (changedOpenIdConnectUrl) { + if (SECURITY_SCHEME_OPENIDCONNECT_URL_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (changedScheme) { + if (SECURITY_SCHEME_SCHEME_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (changedScopes != null && !changedScopes.getIncreased().isEmpty()) { + if (SECURITY_SCHEME_SCOPES_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (changedIn || changedType) { // TODO: Dead code removal opportunity for changedType and changedIn. It appears that // SecuritySchemaDiff will never be given the chance to detect differences TYPE and // IN differences because that case has already been detected and filtered out by // SecurityRequirementsDiff and recorded as a dropped requirement in // ChangedSecurityRequirements. - - return DiffResult.COMPATIBLE; + return DiffResult.INCOMPATIBLE; } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public SecurityScheme getOldSecurityScheme() { diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java b/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java index 485c3518b..f2003d375 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/DiffContext.java @@ -1,13 +1,17 @@ package org.openapitools.openapidiff.core.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.models.PathItem; import java.util.HashMap; import java.util.Map; +import org.apache.commons.configuration2.Configuration; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; public class DiffContext { + @JsonIgnore private final OpenApiDiffOptions options; private String url; private Map<String, String> parameters; private PathItem.HttpMethod method; @@ -17,7 +21,8 @@ public class DiffContext { private String leftUrl; private String rightUrl; - public DiffContext() { + public DiffContext(OpenApiDiffOptions options) { + this.options = options; parameters = new HashMap<>(); response = false; request = true; @@ -43,6 +48,16 @@ public DiffContext copyWithLeftRightUrls(String leftUrl, String rightUrl) { return copy().setLeftAndRightUrls(leftUrl, rightUrl); } + @JsonIgnore + public OpenApiDiffOptions getOptions() { + return options; + } + + @JsonIgnore + public Configuration getConfig() { + return options.getConfig(); + } + private DiffContext setRequest() { this.request = true; this.response = false; @@ -82,7 +97,7 @@ private DiffContext setMethod(PathItem.HttpMethod method) { } private DiffContext copy() { - DiffContext context = new DiffContext(); + DiffContext context = new DiffContext(options); context.url = this.url; context.parameters = this.parameters; context.method = this.method; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedEnum.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedEnum.java index 0dcd5e6e9..ef4486628 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedEnum.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedEnum.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_ENUM_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_ENUM_INCREASED; + import java.util.List; import org.openapitools.openapidiff.core.model.ChangedList; import org.openapitools.openapidiff.core.model.DiffContext; @@ -13,10 +16,16 @@ public ChangedEnum(List<T> oldValue, List<T> newValue, DiffContext context) { @Override public DiffResult isItemsChanged() { - if (context.isRequest() && getMissing().isEmpty() - || context.isResponse() && getIncreased().isEmpty()) { - return DiffResult.COMPATIBLE; + if (context.isRequest() && !getMissing().isEmpty()) { + if (REQUEST_ENUM_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (context.isResponse() && !getIncreased().isEmpty()) { + if (RESPONSE_ENUM_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxLength.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxLength.java index 8bb5933da..efb068bcf 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxLength.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxLength.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_MAX_LENGTH_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_MAX_LENGTH_INCREASED; + import java.util.Objects; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.DiffContext; @@ -15,11 +18,17 @@ public DiffResult isChanged() { if (Objects.equals(oldValue, newValue)) { return DiffResult.NO_CHANGES; } - if (context.isRequest() && (newValue == null || oldValue != null && oldValue <= newValue) - || context.isResponse() && (oldValue == null || newValue != null && newValue <= oldValue)) { - return DiffResult.COMPATIBLE; + if (context.isRequest() && (oldValue == null || newValue != null && newValue < oldValue)) { + if (REQUEST_MAX_LENGTH_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (context.isResponse() && (newValue == null || oldValue != null && newValue > oldValue)) { + if (RESPONSE_MAX_LENGTH_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } public ChangedMaxLength( diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java index 537496cd9..cbb7b713d 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_NUMERIC_RANGE_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_NUMERIC_RANGE_INCREASED; + import java.math.BigDecimal; import java.util.Objects; import org.openapitools.openapidiff.core.model.Changed; @@ -25,35 +28,48 @@ public DiffResult isChanged() { && Objects.equals(oldMaximumExclusiveValue, newMaximumExclusiveValue)) { return DiffResult.NO_CHANGES; } - if (context.isRequest() - && (newMinimumValue == null - || oldMinimumValue != null - && oldMinimumValue.unscaledValue().compareTo(newMinimumValue.unscaledValue()) - >= 0) - && (newMaximumValue == null - || oldMaximumValue != null - && oldMaximumValue.unscaledValue().compareTo(newMaximumValue.unscaledValue()) - <= 0) - && (newMinimumExclusiveValue == null - || oldMinimumExclusiveValue != null && newMinimumExclusiveValue == true) - && (newMaximumExclusiveValue == null - || oldMaximumExclusiveValue != null && newMaximumExclusiveValue == true) - || context.isResponse() - && (newMinimumValue == null - || oldMinimumValue != null - && oldMinimumValue.unscaledValue().compareTo(newMinimumValue.unscaledValue()) - >= 0) - && (newMaximumValue == null - || oldMaximumValue != null - && oldMaximumValue.unscaledValue().compareTo(newMaximumValue.unscaledValue()) - <= 0) - && (newMinimumExclusiveValue == null - || oldMinimumExclusiveValue != null && newMinimumExclusiveValue == true) - && (newMaximumExclusiveValue == null - || oldMaximumExclusiveValue != null && newMaximumExclusiveValue == true)) { + + if ((context.isRequest() && !REQUEST_NUMERIC_RANGE_DECREASED.enabled(context)) + || (context.isResponse() && !RESPONSE_NUMERIC_RANGE_INCREASED.enabled(context))) { return DiffResult.COMPATIBLE; } - return DiffResult.INCOMPATIBLE; + + boolean exclusiveMaxOld = oldMaximumExclusiveValue != null && oldMaximumExclusiveValue; + boolean exclusiveMinOld = oldMinimumExclusiveValue != null && oldMinimumExclusiveValue; + boolean exclusiveMaxNew = newMaximumExclusiveValue != null && newMaximumExclusiveValue; + boolean exclusiveMinNew = newMinimumExclusiveValue != null && newMinimumExclusiveValue; + int diffMax = compare(oldMaximumValue, newMaximumValue, false); + int diffMin = compare(oldMinimumValue, newMinimumValue, true); + + if (context.isRequest()) { + if (diffMax > 0 || (diffMax == 0 && !exclusiveMaxOld && exclusiveMaxNew)) { + return DiffResult.INCOMPATIBLE; + } + if (diffMin < 0 || (diffMin == 0 && !exclusiveMinOld && exclusiveMinNew)) { + return DiffResult.INCOMPATIBLE; + } + } else if (context.isResponse()) { + if (diffMax < 0 || (diffMax == 0 && exclusiveMaxOld && !exclusiveMaxNew)) { + return DiffResult.INCOMPATIBLE; + } + if (diffMin > 0 || (diffMin == 0 && exclusiveMinOld && !exclusiveMinNew)) { + return DiffResult.INCOMPATIBLE; + } + } + return DiffResult.COMPATIBLE; + } + + private int compare(BigDecimal left, BigDecimal right, boolean nullMeansLessThan) { + if (left == null && right == null) { + return 0; + } + if (left == null) { + return nullMeansLessThan ? -1 : 1; + } + if (right == null) { + return nullMeansLessThan ? 1 : -1; + } + return left.unscaledValue().compareTo(right.unscaledValue()); } public ChangedNumericRange( diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedReadOnly.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedReadOnly.java index 25d86af8f..9bde49acd 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedReadOnly.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedReadOnly.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_READONLY_INCREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_READONLY_REQUIRED_DECREASED; + import java.util.Objects; import java.util.Optional; import org.openapitools.openapidiff.core.model.Changed; @@ -29,10 +32,16 @@ public DiffResult isChanged() { } if (context.isRequest()) { if (Boolean.TRUE.equals(newValue)) { - return DiffResult.INCOMPATIBLE; - } else { - return context.isRequired() ? DiffResult.INCOMPATIBLE : DiffResult.COMPATIBLE; + if (REQUEST_READONLY_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } else if (context.isRequired()) { + // Incompatible because a prev RO prop (invalid) is now not RO and required + if (REQUEST_READONLY_REQUIRED_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } + return DiffResult.COMPATIBLE; } return DiffResult.UNKNOWN; } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedRequired.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedRequired.java index d6b41f3cd..58a9ae49a 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedRequired.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedRequired.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_REQUIRED_INCREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_REQUIRED_DECREASED; + import java.util.List; import org.openapitools.openapidiff.core.model.ChangedList; import org.openapitools.openapidiff.core.model.DiffContext; @@ -13,10 +16,16 @@ public ChangedRequired(List<String> oldValue, List<String> newValue, DiffContext @Override public DiffResult isItemsChanged() { - if (context.isRequest() && getIncreased().isEmpty() - || context.isResponse() && getMissing().isEmpty()) { - return DiffResult.COMPATIBLE; + if (context.isRequest() && !getIncreased().isEmpty()) { + if (REQUEST_REQUIRED_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } + if (context.isResponse() && !getMissing().isEmpty()) { + if (RESPONSE_REQUIRED_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } - return DiffResult.INCOMPATIBLE; + return DiffResult.COMPATIBLE; } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedWriteOnly.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedWriteOnly.java index 91d19a644..110b6ede2 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedWriteOnly.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedWriteOnly.java @@ -1,5 +1,8 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_WRITEONLY_INCREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_WRITEONLY_REQUIRED_DECREASED; + import java.util.Objects; import java.util.Optional; import org.openapitools.openapidiff.core.model.Changed; @@ -29,10 +32,15 @@ public DiffResult isChanged() { } if (context.isResponse()) { if (Boolean.TRUE.equals(newValue)) { - return DiffResult.INCOMPATIBLE; - } else { - return context.isRequired() ? DiffResult.INCOMPATIBLE : DiffResult.COMPATIBLE; + if (RESPONSE_WRITEONLY_INCREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } + } else if (context.isRequired()) { + if (RESPONSE_WRITEONLY_REQUIRED_DECREASED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } } + return DiffResult.COMPATIBLE; } return DiffResult.UNKNOWN; } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java b/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java index 5e07d0bcd..64dac2767 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java @@ -3,6 +3,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.slf4j.LoggerFactory.getLogger; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.model.DiffResult; import org.slf4j.Logger; @@ -40,6 +42,24 @@ public static void assertSpecChangedButCompatible(String oldSpec, String newSpec assertThat(diffResult.isCompatible()).isTrue(); } + public static void assertSpecIncompatible( + String oldSpec, String newSpec, BackwardIncompatibleProp prop) { + OpenApiDiffOptions.Builder builder = OpenApiDiffOptions.builder(); + // Expect incompatible when BackwardIncompatibleProp enabled + builder.configProperty(prop.getPropertyName(), "true"); + OpenApiDiffOptions optsIncompat = builder.build(); + ChangedOpenApi apiIncompat = OpenApiCompare.fromLocations(oldSpec, newSpec, null, optsIncompat); + LOG.info("Result: {}", apiIncompat.isChanged().getValue()); + assertThat(apiIncompat.isIncompatible()).isTrue(); + // Expect changed but compatible when BackwardIncompatibleProp disabled + builder.configProperty(prop.getPropertyName(), "false"); + OpenApiDiffOptions optsCompat = builder.build(); + ChangedOpenApi apiCompat = OpenApiCompare.fromLocations(oldSpec, newSpec, null, optsCompat); + LOG.info("Result: {}", apiCompat.isChanged().getValue()); + assertThat(apiCompat.isDifferent()).isTrue(); + assertThat(apiCompat.isCompatible()).isTrue(); + } + public static void assertOpenApiBackwardCompatible( String oldSpec, String newSpec, boolean isDiff) { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java index c93bc5d4a..045a16e48 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ApiResponseBCTest.java @@ -1,10 +1,12 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_RESPONSES_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class ApiResponseBCTest { private final String BASE = "bc_response_apiresponse_base.yaml"; @@ -21,6 +23,7 @@ public void changedButCompatible() { @Test public void decreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_apiresponse_decreased.yaml"); + BackwardIncompatibleProp prop = RESPONSE_RESPONSES_DECREASED; + assertSpecIncompatible(BASE, "bc_response_apiresponse_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java index 130255b80..8bd95764e 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ContentBCTest.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_CONTENT_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_CONTENT_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class ContentBCTest { private final String BASE = "bc_content_base.yaml"; @@ -21,11 +24,13 @@ public void changedButCompatible() { @Test public void requestDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_content_decreased.yaml"); + BackwardIncompatibleProp prop = REQUEST_CONTENT_DECREASED; + assertSpecIncompatible(BASE, "bc_request_content_decreased.yaml", prop); } @Test public void responseDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_content_decreased.yaml"); + BackwardIncompatibleProp prop = RESPONSE_CONTENT_DECREASED; + assertSpecIncompatible(BASE, "bc_response_content_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java index 3eecfda39..d5a7921a4 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/EnumBCTest.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_ENUM_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_ENUM_INCREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class EnumBCTest { private final String BASE = "bc_enum_base.yaml"; @@ -21,11 +24,13 @@ public void changedButCompatible() { @Test public void requestDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_enum_decreased.yaml"); + BackwardIncompatibleProp prop = REQUEST_ENUM_DECREASED; + assertSpecIncompatible(BASE, "bc_request_enum_decreased.yaml", prop); } @Test public void responseIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_enum_increased.yaml"); + BackwardIncompatibleProp prop = RESPONSE_ENUM_INCREASED; + assertSpecIncompatible(BASE, "bc_response_enum_increased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java index d97209d19..bf36d7772 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeaderBCTest.java @@ -1,37 +1,44 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADER_EXPLODE_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADER_REQUIRED_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADER_REQUIRED_INCREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class HeaderBCTest { private final String BASE = "bc_response_header_base.yaml"; @Test - public void responseHeaderUnchanged() { + public void unchanged() { assertSpecUnchanged(BASE, BASE); } @Test - public void responseHeaderDeprecated() { - assertSpecChangedButCompatible(BASE, "bc_response_header_deprecated.yaml"); + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_response_header_changed_but_compatible.yaml"); } @Test - public void responseHeaderRequiredAdded() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_header_required_added.yaml"); + public void responseExplodeChanged() { + BackwardIncompatibleProp prop = RESPONSE_HEADER_EXPLODE_CHANGED; + assertSpecIncompatible(BASE, "bc_response_header_explode_changed.yaml", prop); } @Test - public void responseHeaderRequiredDeleted() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_header_required_deleted.yaml"); + public void responseRequiredDecreased() { + BackwardIncompatibleProp prop = RESPONSE_HEADER_REQUIRED_DECREASED; + assertSpecIncompatible(BASE, "bc_response_header_required_decreased.yaml", prop); } @Test - public void responseHeaderExplode() { - String RESPONSE_HEADER_EXPLODE = "bc_response_header_explode.yaml"; - assertOpenApiBackwardIncompatible(BASE, RESPONSE_HEADER_EXPLODE); + public void responseRequiredIncreased() { + // TODO: Document why desired or remove support (test added to avoid unintentional regression) + BackwardIncompatibleProp prop = RESPONSE_HEADER_REQUIRED_INCREASED; + assertSpecIncompatible(BASE, "bc_response_header_required_increased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java index b796a35e6..e08b4b8c8 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/HeadersBCTest.java @@ -1,26 +1,29 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_HEADERS_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class HeadersBCTest { private final String BASE = "bc_response_headers_base.yaml"; @Test - public void responseHeadersUnchanged() { + public void unchanged() { assertSpecUnchanged(BASE, BASE); } @Test - public void responseHeadersIncreased() { - assertSpecChangedButCompatible(BASE, "bc_response_headers_increased.yaml"); + public void changedButCompatible() { + assertSpecChangedButCompatible(BASE, "bc_response_headers_changed_but_compatible.yaml"); } @Test - public void responseHeadersMissing() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_headers_missing.yaml"); + public void responseDecreased() { + BackwardIncompatibleProp prop = RESPONSE_HEADERS_DECREASED; + assertSpecIncompatible(BASE, "bc_response_headers_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java index 96c019b40..243ff892a 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/MaxLengthBCTest.java @@ -1,9 +1,12 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_MAX_LENGTH_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_MAX_LENGTH_INCREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class MaxLengthBCTest { private final String BASE = "bc_maxlength_base.yaml"; @@ -15,11 +18,13 @@ public void maxLengthUnchanged() { @Test public void requestMaxLengthDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_maxlength_decreased.yaml"); + BackwardIncompatibleProp prop = REQUEST_MAX_LENGTH_DECREASED; + assertSpecIncompatible(BASE, "bc_request_maxlength_decreased.yaml", prop); } @Test public void responseMaxLengthIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_maxlength_increased.yaml"); + BackwardIncompatibleProp prop = RESPONSE_MAX_LENGTH_INCREASED; + assertSpecIncompatible(BASE, "bc_response_maxlength_increased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java index 1f713f98a..a589c7ea0 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/NumericRangeBCTest.java @@ -1,8 +1,10 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_NUMERIC_RANGE_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_NUMERIC_RANGE_INCREASED; import org.junit.jupiter.api.Test; @@ -16,99 +18,94 @@ public void unchanged() { @Test public void changedButCompatible() { - // TODO: Fix bug where response range-narrowing is deemed incompatible, then test here assertSpecChangedButCompatible(BASE, "bc_numericrange_changed_but_compatible.yaml"); } @Test public void requestExclusiveMaxCreated() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_max_created.yaml"); + assertIncompatibleRequest("bc_request_numericrange_exclusive_max_created.yaml"); } @Test public void requestExclusiveMaxSet() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_max_set.yaml"); + assertIncompatibleRequest("bc_request_numericrange_exclusive_max_set.yaml"); } @Test public void requestExclusiveMinCreated() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_min_created.yaml"); + assertIncompatibleRequest("bc_request_numericrange_exclusive_min_created.yaml"); } @Test public void requestExclusiveMinSet() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_exclusive_min_set.yaml"); + assertIncompatibleRequest("bc_request_numericrange_exclusive_min_set.yaml"); } @Test public void requestMaxAdded() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_max_added.yaml"); + assertIncompatibleRequest("bc_request_numericrange_max_added.yaml"); } @Test public void requestMaxDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_max_decreased.yaml"); + assertIncompatibleRequest("bc_request_numericrange_max_decreased.yaml"); } @Test public void requestMinAdded() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_min_added.yaml"); + assertIncompatibleRequest("bc_request_numericrange_min_added.yaml"); } @Test public void requestMinIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_numericrange_min_increased.yaml"); + assertIncompatibleRequest("bc_request_numericrange_min_increased.yaml"); } @Test public void responseExclusiveMaxDeleted() { - // TODO: Should be incompatible because clients may be unprepared for wider range - // (test added to avoid unintentional regression) - assertSpecChangedButCompatible(BASE, "bc_response_numericrange_exclusive_max_deleted.yaml"); + assertIncompatibleResponse("bc_response_numericrange_exclusive_max_deleted.yaml"); } @Test public void responseExclusiveMaxUnset() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_numericrange_exclusive_max_unset.yaml"); + assertIncompatibleResponse("bc_response_numericrange_exclusive_max_unset.yaml"); } @Test public void responseExclusiveMinDeleted() { - // TODO: Should be incompatible because clients may be unprepared for wider range - // (test added to avoid unintentional regression) - assertSpecChangedButCompatible(BASE, "bc_response_numericrange_exclusive_min_deleted.yaml"); + assertIncompatibleResponse("bc_response_numericrange_exclusive_min_deleted.yaml"); } @Test public void responseExclusiveMinUnset() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_numericrange_exclusive_min_unset.yaml"); + assertIncompatibleResponse("bc_response_numericrange_exclusive_min_unset.yaml"); } @Test public void responseMaxDeleted() { - // TODO: Should be incompatible because clients may be unprepared for wider range - // (test added to avoid unintentional regression) - assertSpecChangedButCompatible(BASE, "bc_response_numericrange_max_deleted.yaml"); + assertIncompatibleResponse("bc_response_numericrange_max_deleted.yaml"); } @Test public void responseMaxIncreased() { - // TODO: Should be incompatible because clients may be unprepared - // (test added to avoid unintentional regression) - assertSpecChangedButCompatible(BASE, "bc_response_numericrange_max_increased.yaml"); + assertIncompatibleResponse("bc_response_numericrange_max_increased.yaml"); } @Test public void responseMinDecreased() { - // TODO: Should be incompatible because clients may be unprepared for wider range - // (test added to avoid unintentional regression) - assertSpecChangedButCompatible(BASE, "bc_response_numericrange_min_decreased.yaml"); + assertIncompatibleResponse("bc_response_numericrange_min_decreased.yaml"); } @Test public void responseMinDeleted() { - // TODO: Should be incompatible because clients may be unprepared for wider range - // (test added to avoid unintentional regression) - assertSpecChangedButCompatible(BASE, "bc_response_numericrange_min_deleted.yaml"); + assertIncompatibleResponse("bc_response_numericrange_min_deleted.yaml"); + } + + private void assertIncompatibleRequest(String newSpec) { + assertSpecIncompatible(BASE, newSpec, REQUEST_NUMERIC_RANGE_DECREASED); + } + + private void assertIncompatibleResponse(String newSpec) { + assertSpecIncompatible(BASE, newSpec, RESPONSE_NUMERIC_RANGE_INCREASED); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java index 62cf3b9a0..476546504 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OAuthFlowBCTest.java @@ -1,9 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_SCHEME_OAUTH2_AUTH_URL_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_SCHEME_OAUTH2_REFRESH_URL_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_SCHEME_OAUTH2_TOKEN_URL_CHANGED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class OAuthFlowBCTest { private final String BASE = "bc_oauthflow_base.yaml"; @@ -15,16 +19,19 @@ public void unchanged() { @Test public void authorizationUrlChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_oauthflow_authorization_url_changed.yaml"); + BackwardIncompatibleProp prop = SECURITY_SCHEME_OAUTH2_AUTH_URL_CHANGED; + assertSpecIncompatible(BASE, "bc_oauthflow_authorization_url_changed.yaml", prop); } @Test public void refreshUrlChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_oauthflow_refresh_url_changed.yaml"); + BackwardIncompatibleProp prop = SECURITY_SCHEME_OAUTH2_REFRESH_URL_CHANGED; + assertSpecIncompatible(BASE, "bc_oauthflow_refresh_url_changed.yaml", prop); } @Test public void tokenUrlChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_oauthflow_token_url_changed.yaml"); + BackwardIncompatibleProp prop = SECURITY_SCHEME_OAUTH2_TOKEN_URL_CHANGED; + assertSpecIncompatible(BASE, "bc_oauthflow_token_url_changed.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java index e42829cca..fb2c06291 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OneOfBCTest.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_ONEOF_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_ONEOF_INCREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class OneOfBCTest { private final String BASE = "bc_oneof_base.yaml"; @@ -20,12 +23,14 @@ public void changedButCompatible() { } @Test - public void requestOneOfDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_oneof_decreased.yaml"); + public void requestDecreased() { + BackwardIncompatibleProp prop = REQUEST_ONEOF_DECREASED; + assertSpecIncompatible(BASE, "bc_request_oneof_decreased.yaml", prop); } @Test - public void responseOneOfIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_oneof_increased.yaml"); + public void responseIncreased() { + BackwardIncompatibleProp prop = RESPONSE_ONEOF_INCREASED; + assertSpecIncompatible(BASE, "bc_response_oneof_increased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java index 0cb493aa2..2d3e53065 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/OpenApiBCTest.java @@ -1,10 +1,12 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class OpenApiBCTest { private final String BASE = "bc_openapi_base.yaml"; @@ -21,6 +23,7 @@ public void changedButCompatible() { @Test public void endpointsDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_openapi_endpoints_decreased.yaml"); + BackwardIncompatibleProp prop = OPENAPI_ENDPOINTS_DECREASED; + assertSpecIncompatible(BASE, "bc_openapi_endpoints_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java index 4f1d30852..edcd40073 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParameterBCTest.java @@ -1,10 +1,15 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAMS_REQUIRED_INCREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAM_ALLOWEMPTY_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAM_EXPLODE_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAM_STYLE_CHANGED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class ParameterBCTest { private final String BASE = "bc_request_param_base.yaml"; @@ -21,21 +26,25 @@ public void changedButCompatible() { @Test public void allowEmptyValueDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_param_allowemptyvalue_decreased.yaml"); + BackwardIncompatibleProp prop = REQUEST_PARAM_ALLOWEMPTY_DECREASED; + assertSpecIncompatible(BASE, "bc_request_param_allowemptyvalue_decreased.yaml", prop); } @Test public void explodeChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_param_explode_changed.yaml"); + BackwardIncompatibleProp prop = REQUEST_PARAM_EXPLODE_CHANGED; + assertSpecIncompatible(BASE, "bc_request_param_explode_changed.yaml", prop); } @Test public void requiredIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_param_required_increased.yaml"); + BackwardIncompatibleProp prop = REQUEST_PARAMS_REQUIRED_INCREASED; + assertSpecIncompatible(BASE, "bc_request_param_required_increased.yaml", prop); } @Test public void styleChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_param_style_changed.yaml"); + BackwardIncompatibleProp prop = REQUEST_PARAM_STYLE_CHANGED; + assertSpecIncompatible(BASE, "bc_request_param_style_changed.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java index 1b913115d..5f2755bbc 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ParametersBCTest.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAMS_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_PARAMS_REQUIRED_INCREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class ParametersBCTest { private final String BASE = "bc_request_params_base.yaml"; @@ -21,11 +24,13 @@ public void changedButCompatible() { @Test public void decreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_params_decreased.yaml"); + BackwardIncompatibleProp prop = REQUEST_PARAMS_DECREASED; + assertSpecIncompatible(BASE, "bc_request_params_decreased.yaml", prop); } @Test public void requiredIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_params_required_increased.yaml"); + BackwardIncompatibleProp prop = REQUEST_PARAMS_REQUIRED_INCREASED; + assertSpecIncompatible(BASE, "bc_request_params_required_increased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java index b0b9ab39c..c1b2a60f1 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathBCTest.java @@ -1,10 +1,12 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class PathBCTest { private final String BASE = "bc_path_base.yaml"; @@ -21,6 +23,7 @@ public void changedButCompatible() { @Test public void opsDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_path_ops_decreased.yaml"); + BackwardIncompatibleProp prop = OPENAPI_ENDPOINTS_DECREASED; + assertSpecIncompatible(BASE, "bc_path_ops_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java index 495739d18..d865ee44a 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/PathsBCTest.java @@ -1,10 +1,12 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class PathsBCTest { private final String BASE = "bc_paths_base.yaml"; @@ -21,6 +23,7 @@ public void changedButCompatible() { @Test public void decreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_paths_decreased.yaml"); + BackwardIncompatibleProp prop = OPENAPI_ENDPOINTS_DECREASED; + assertSpecIncompatible(BASE, "bc_paths_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java index 579a7e178..02d2fa9a0 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/ReadOnlyBCTest.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_READONLY_INCREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_READONLY_REQUIRED_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class ReadOnlyBCTest { private final String BASE = "bc_readonly_base.yaml"; @@ -21,12 +24,14 @@ public void changedButCompatible() { @Test public void requestReadOnlyIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_readonly_increased.yaml"); + BackwardIncompatibleProp prop = REQUEST_READONLY_INCREASED; + assertSpecIncompatible(BASE, "bc_request_readonly_increased.yaml", prop); } @Test public void requestReadOnlyRequiredDecreased() { - // TODO: Document why desired or remove support (test added to avoid unintentional regression) - assertOpenApiBackwardIncompatible(BASE, "bc_request_readonly_required_decreased.yaml"); + // Incompatible because a prev RO prop (invalid) is now not RO and required + BackwardIncompatibleProp prop = REQUEST_READONLY_REQUIRED_DECREASED; + assertSpecIncompatible(BASE, "bc_request_readonly_required_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java index b02c0a3e0..5b1000702 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequestBodyBCTest.java @@ -1,9 +1,11 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.OPENAPI_ENDPOINTS_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class RequestBodyBCTest { private final String BASE = "bc_request_body_base.yaml"; @@ -15,6 +17,7 @@ public void unchanged() { @Test public void requiredChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_body_required_changed.yaml"); + BackwardIncompatibleProp prop = OPENAPI_ENDPOINTS_DECREASED; + assertSpecIncompatible(BASE, "bc_request_body_required_changed.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java index bda8b2d8e..c7cfadb0a 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/RequiredBCTest.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_REQUIRED_INCREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_REQUIRED_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class RequiredBCTest { @@ -22,11 +25,13 @@ public void changedButCompatible() { @Test public void requestRequiredIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_request_required_increased.yaml"); + BackwardIncompatibleProp prop = REQUEST_REQUIRED_INCREASED; + assertSpecIncompatible(BASE, "bc_request_required_increased.yaml", prop); } @Test public void responseRequiredDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_required_decreased.yaml"); + BackwardIncompatibleProp prop = RESPONSE_REQUIRED_DECREASED; + assertSpecIncompatible(BASE, "bc_response_required_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java index f0e683b79..781b48f2a 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java @@ -2,9 +2,14 @@ import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_REQUIRED_DECREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_DISCRIMINATOR_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_TYPE_CHANGED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class SchemaBCTest { private final String BASE = "bc_schema_base.yaml"; @@ -21,7 +26,8 @@ public void changedButCompatible() { @Test public void discriminatorChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_schema_discriminator_changed.yaml"); + BackwardIncompatibleProp prop = SCHEMA_DISCRIMINATOR_CHANGED; + assertSpecIncompatible(BASE, "bc_schema_discriminator_changed.yaml", prop); } @Test @@ -37,6 +43,7 @@ public void requestFormatIncreased() { @Test public void requestPropsPutIncreased() { + // See https://github.com/OpenAPITools/openapi-diff/issues/537 assertSpecChangedButCompatible(BASE, "bc_request_schema_props_put_increased.yaml"); } @@ -53,11 +60,13 @@ public void responseFormatIncreased() { @Test public void responsePropsRequiredDecreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_schema_props_required_decreased.yaml"); + BackwardIncompatibleProp prop = RESPONSE_REQUIRED_DECREASED; + assertSpecIncompatible(BASE, "bc_response_schema_props_required_decreased.yaml", prop); } @Test public void typeChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_schema_type_changed.yaml"); + BackwardIncompatibleProp prop = SCHEMA_TYPE_CHANGED; + assertSpecIncompatible(BASE, "bc_schema_type_changed.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java index 80c79cec9..73a3ca227 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementBCTest.java @@ -1,8 +1,10 @@ package org.openapitools.openapidiff.core.backcompat; import static org.openapitools.openapidiff.core.TestUtils.*; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_REQUIREMENT_SCHEMES_INCREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class SecurityRequirementBCTest { private final String BASE = "bc_security_requirement_base.yaml"; @@ -19,6 +21,7 @@ public void changedButCompatible() { @Test public void schemesIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_security_requirement_schemes_increased.yaml"); + BackwardIncompatibleProp prop = SECURITY_REQUIREMENT_SCHEMES_INCREASED; + assertSpecIncompatible(BASE, "bc_security_requirement_schemes_increased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java index a9df11df0..931b35bce 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecurityRequirementsBCTest.java @@ -1,10 +1,10 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; -import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; -import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.TestUtils.*; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SECURITY_REQUIREMENTS_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class SecurityRequirementsBCTest { private final String BASE = "bc_security_requirements_base.yaml"; @@ -26,7 +26,8 @@ public void changedButCompatible() { // requirements should be compatible. @Test public void decreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_security_requirements_decreased.yaml"); + BackwardIncompatibleProp prop = SECURITY_REQUIREMENTS_DECREASED; + assertSpecIncompatible(BASE, "bc_security_requirements_decreased.yaml", prop); } // TODO: A missing incompatible check seems to be if requirements increase from zero to 1 or more diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java index b275523dd..d89d824d5 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SecuritySchemeBCTest.java @@ -1,10 +1,10 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; -import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; -import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.TestUtils.*; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.*; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class SecuritySchemeBCTest { private final String BASE = "bc_security_scheme_base.yaml"; @@ -21,7 +21,8 @@ public void changedButCompatible() { @Test public void bearerFormatChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_bearer_format_changed.yaml"); + BackwardIncompatibleProp prop = SECURITY_SCHEME_BEARER_FORMAT_CHANGED; + assertSpecIncompatible(BASE, "bc_security_scheme_bearer_format_changed.yaml", prop); } @Test @@ -31,12 +32,14 @@ public void inChanged() { @Test public void openIdConnectUrlChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_open_id_connect_url_changed.yaml"); + BackwardIncompatibleProp prop = SECURITY_SCHEME_OPENIDCONNECT_URL_CHANGED; + assertSpecIncompatible(BASE, "bc_security_scheme_open_id_connect_url_changed.yaml", prop); } @Test public void schemeChanged() { - assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_scheme_changed.yaml"); + BackwardIncompatibleProp prop = SECURITY_SCHEME_SCHEME_CHANGED; + assertSpecIncompatible(BASE, "bc_security_scheme_scheme_changed.yaml", prop); } @Test @@ -46,6 +49,7 @@ public void typeChanged() { @Test public void scopesIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_security_scheme_scopes_increased.yaml"); + BackwardIncompatibleProp prop = SECURITY_SCHEME_SCOPES_INCREASED; + assertSpecIncompatible(BASE, "bc_security_scheme_scopes_increased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java index f3ea427f0..a12853c82 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/WriteOnlyBCTest.java @@ -1,10 +1,13 @@ package org.openapitools.openapidiff.core.backcompat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecChangedButCompatible; +import static org.openapitools.openapidiff.core.TestUtils.assertSpecIncompatible; import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_WRITEONLY_INCREASED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_WRITEONLY_REQUIRED_DECREASED; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; public class WriteOnlyBCTest { private final String BASE = "bc_writeonly_base.yaml"; @@ -21,12 +24,14 @@ public void changedButCompatible() { @Test public void responseWriteOnlyIncreased() { - assertOpenApiBackwardIncompatible(BASE, "bc_response_writeonly_increased.yaml"); + BackwardIncompatibleProp prop = RESPONSE_WRITEONLY_INCREASED; + assertSpecIncompatible(BASE, "bc_response_writeonly_increased.yaml", prop); } @Test public void responseWriteOnlyRequiredDecreased() { + BackwardIncompatibleProp prop = RESPONSE_WRITEONLY_REQUIRED_DECREASED; // TODO: Document why desired or remove support (test added to avoid unintentional regression) - assertOpenApiBackwardIncompatible(BASE, "bc_response_writeonly_required_decreased.yaml"); + assertSpecIncompatible(BASE, "bc_response_writeonly_required_decreased.yaml", prop); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java b/core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java index 5d9b4d79b..73c1e53b0 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/utils/FileUtilsTest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.ConsoleRender; @@ -20,7 +21,7 @@ class FileUtilsTest { @BeforeEach void setup() { - changedOpenApi = new ChangedOpenApi(); + changedOpenApi = new ChangedOpenApi(OpenApiDiffOptions.builder().build()); changedOpenApi.setChangedSchemas(Collections.emptyList()); changedOpenApi.setChangedOperations(Collections.emptyList()); changedOpenApi.setNewEndpoints(Collections.emptyList()); diff --git a/core/src/test/resources/bc_numericrange_changed_but_compatible.yaml b/core/src/test/resources/bc_numericrange_changed_but_compatible.yaml index b38f2fe9e..f7e5057f4 100644 --- a/core/src/test/resources/bc_numericrange_changed_but_compatible.yaml +++ b/core/src/test/resources/bc_numericrange_changed_but_compatible.yaml @@ -14,7 +14,6 @@ paths: type: integer format: int32 exclusiveMinimum: false - exclusiveMaximum: false application/text: schema: type: integer @@ -25,10 +24,9 @@ paths: schema: type: integer format: int32 - minimum: 9 - maximum: 21 - exclusiveMinimum: true - exclusiveMaximum: true + minimum: 10 + maximum: 20 + exclusiveMinimum: false responses: '200': description: successful operation @@ -37,21 +35,20 @@ paths: schema: type: integer format: int32 - exclusiveMinimum: false - exclusiveMaximum: false + exclusiveMinimum: true application/text: schema: type: integer format: int32 - # TODO: Narrowing response range fails as incompatible, but shouldn't it be ok? minimum: 10 maximum: 20 + exclusiveMinimum: true + exclusiveMaximum: true application/xml: schema: type: integer format: int32 - # TODO: Narrowing response range fails as incompatible, but shouldn't it be ok? - minimum: 10 - maximum: 20 + minimum: 11 + maximum: 19 exclusiveMinimum: true exclusiveMaximum: true diff --git a/core/src/test/resources/bc_response_header_base.yaml b/core/src/test/resources/bc_response_header_base.yaml index 17716ba06..1680fee21 100644 --- a/core/src/test/resources/bc_response_header_base.yaml +++ b/core/src/test/resources/bc_response_header_base.yaml @@ -19,3 +19,11 @@ paths: X-Header-2: schema: type: integer + X-Header-3: + schema: + type: integer + explode: false + X-Header-4: + schema: + type: integer + explode: true diff --git a/core/src/test/resources/bc_response_header_required_deleted.yaml b/core/src/test/resources/bc_response_header_changed_but_compatible.yaml similarity index 57% rename from core/src/test/resources/bc_response_header_required_deleted.yaml rename to core/src/test/resources/bc_response_header_changed_but_compatible.yaml index c227a3921..b660903db 100644 --- a/core/src/test/resources/bc_response_header_required_deleted.yaml +++ b/core/src/test/resources/bc_response_header_changed_but_compatible.yaml @@ -12,9 +12,20 @@ paths: description: successful operation headers: X-Header-1: + required: true schema: type: integer format: int32 + deprecated: false X-Header-2: schema: type: integer + deprecated: true + X-Header-3: + schema: + type: integer + explode: false + X-Header-4: + schema: + type: integer + explode: true diff --git a/core/src/test/resources/bc_response_header_explode.yaml b/core/src/test/resources/bc_response_header_explode_changed.yaml similarity index 72% rename from core/src/test/resources/bc_response_header_explode.yaml rename to core/src/test/resources/bc_response_header_explode_changed.yaml index d48a726a7..3403c28eb 100644 --- a/core/src/test/resources/bc_response_header_explode.yaml +++ b/core/src/test/resources/bc_response_header_explode_changed.yaml @@ -20,3 +20,10 @@ paths: schema: type: integer explode: true + X-Header-3: + schema: + type: integer + X-Header-4: + schema: + type: integer + explode: false diff --git a/core/src/test/resources/bc_response_header_deprecated.yaml b/core/src/test/resources/bc_response_header_required_decreased.yaml similarity index 66% rename from core/src/test/resources/bc_response_header_deprecated.yaml rename to core/src/test/resources/bc_response_header_required_decreased.yaml index 0c60132bd..9b457cdc7 100644 --- a/core/src/test/resources/bc_response_header_deprecated.yaml +++ b/core/src/test/resources/bc_response_header_required_decreased.yaml @@ -12,11 +12,17 @@ paths: description: successful operation headers: X-Header-1: - required: true schema: type: integer format: int32 X-Header-2: - deprecated: true schema: type: integer + X-Header-3: + schema: + type: integer + explode: false + X-Header-4: + schema: + type: integer + explode: true diff --git a/core/src/test/resources/bc_response_header_required_added.yaml b/core/src/test/resources/bc_response_header_required_increased.yaml similarity index 69% rename from core/src/test/resources/bc_response_header_required_added.yaml rename to core/src/test/resources/bc_response_header_required_increased.yaml index 83bceafe8..7d76aec7e 100644 --- a/core/src/test/resources/bc_response_header_required_added.yaml +++ b/core/src/test/resources/bc_response_header_required_increased.yaml @@ -17,6 +17,14 @@ paths: type: integer format: int32 X-Header-2: + schema: + type: integer required: true + X-Header-3: + schema: + type: integer + explode: false + X-Header-4: schema: type: integer + explode: true diff --git a/core/src/test/resources/bc_response_headers_increased.yaml b/core/src/test/resources/bc_response_headers_changed_but_compatible.yaml similarity index 100% rename from core/src/test/resources/bc_response_headers_increased.yaml rename to core/src/test/resources/bc_response_headers_changed_but_compatible.yaml diff --git a/core/src/test/resources/bc_response_headers_missing.yaml b/core/src/test/resources/bc_response_headers_decreased.yaml similarity index 100% rename from core/src/test/resources/bc_response_headers_missing.yaml rename to core/src/test/resources/bc_response_headers_decreased.yaml diff --git a/maven-example/pom.xml b/maven-example/pom.xml index bb3d9c7c5..356a10e0e 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -36,6 +36,12 @@ <consoleOutputFileName>${project.basedir}/../maven/target/diff.txt</consoleOutputFileName> <jsonOutputFileName>${project.basedir}/../maven/target/diff.json</jsonOutputFileName> <markdownOutputFileName>${project.basedir}/../maven/target/diff.md</markdownOutputFileName> + <configFiles> + <configFile>${project.basedir}/../maven/src/test/resources/test-config-file.yaml</configFile> + </configFiles> + <configProps> + <incompatible.request.params.required.increased>false</incompatible.request.params.required.increased> + </configProps> </configuration> </execution> </executions> diff --git a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java index c9aec95d1..406bf5fdd 100644 --- a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java +++ b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java @@ -3,9 +3,12 @@ import static org.openapitools.openapidiff.core.utils.FileUtils.writeToFile; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UncheckedIOException; +import java.util.List; +import java.util.Map; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -13,6 +16,7 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.openapitools.openapidiff.core.OpenApiCompare; +import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; import org.openapitools.openapidiff.core.model.ChangedOpenApi; import org.openapitools.openapidiff.core.output.AsciidocRender; import org.openapitools.openapidiff.core.output.ConsoleRender; @@ -47,6 +51,12 @@ public class OpenApiDiffMojo extends AbstractMojo { @Parameter(property = "markdownOutputFileName") String markdownOutputFileName; + @Parameter(property = "configFiles") + List<File> configFiles; + + @Parameter(property = "configProps") + Map<String, String> configProps; + @Parameter(property = "asciidocOutputFileName") String asciidocOutputFileName; @@ -58,7 +68,16 @@ public void execute() throws MojoExecutionException, MojoFailureException { } try { - final ChangedOpenApi diff = OpenApiCompare.fromLocations(oldSpec, newSpec); + OpenApiDiffOptions.Builder optionBuilder = OpenApiDiffOptions.builder(); + if (configFiles != null) { + configFiles.forEach(optionBuilder::configYaml); + } + if (configProps != null) { + configProps.forEach(optionBuilder::configProperty); + } + OpenApiDiffOptions options = optionBuilder.build(); + + final ChangedOpenApi diff = OpenApiCompare.fromLocations(oldSpec, newSpec, null, options); try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream)) { diff --git a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java index 01f166fe4..d38c66bde 100644 --- a/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java +++ b/maven/src/test/java/org/openapitools/openapidiff/maven/OpenApiDiffMojoTest.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Collections; import org.apache.maven.plugin.MojoExecutionException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -21,6 +22,7 @@ class OpenApiDiffMojoTest { private final File oldSpecFile = new File("src/test/resources/oldspec.yaml"); private final File newSpecFile = new File("src/test/resources/newspec.yaml"); + private final File configFile = new File("src/test/resources/test-config-file.yaml"); private final File consoleOutputfile = new File("target/diff.txt"); private final File markdownOutputfile = new File("target/diff.md"); @@ -106,6 +108,19 @@ void Should_BackwardIncompatibilityException_When_WantsExceptionAndSpecIsIncompa assertThrows(BackwardIncompatibilityException.class, mojo::execute); } + @Test + void Should_NotThrow_When_ConfigWithIncompatibleChecksDisabled() { + final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); + mojo.oldSpec = newSpecFile.getAbsolutePath(); + mojo.newSpec = oldSpecFile.getAbsolutePath(); + mojo.failOnIncompatible = true; + mojo.configFiles = Collections.singletonList(configFile); + mojo.configProps = + Collections.singletonMap("incompatible.request.params.required.increased", "false"); + + assertDoesNotThrow(mojo::execute); + } + @Test void Should_Skip_Mojo_WhenSkipIsTrue() { final OpenApiDiffMojo mojo = new OpenApiDiffMojo(); diff --git a/maven/src/test/resources/newspec.yaml b/maven/src/test/resources/newspec.yaml index e95978f04..7d326b882 100644 --- a/maven/src/test/resources/newspec.yaml +++ b/maven/src/test/resources/newspec.yaml @@ -1,15 +1,33 @@ ---- -openapi: 3.0.3 +openapi: 3.0.0 info: - title: Generated API - version: "1.0" + description: myDesc + title: myTitle + version: 1.0.0 paths: - /hello: + /widgets: get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + schema: + type: string + - name: query-param-2 + in: query + schema: + type: string responses: - "200": - description: OK + '200': + description: successful operation content: - text/plain: + application/json: schema: - type: string + type: object + properties: + prop1: + type: string + prop2: + type: string + required: + - prop1 + - prop2 diff --git a/maven/src/test/resources/oldspec.yaml b/maven/src/test/resources/oldspec.yaml index 2f2735763..40cd4175e 100644 --- a/maven/src/test/resources/oldspec.yaml +++ b/maven/src/test/resources/oldspec.yaml @@ -1,6 +1,33 @@ ---- -openapi: 3.0.3 +openapi: 3.0.0 info: - title: Generated API - version: "1.0" -paths: {} + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + get: + operationId: listWidgets + parameters: + - name: query-param-1 + in: query + required: true + schema: + type: string + - name: query-param-2 + in: query + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + prop1: + type: string + prop2: + type: string + required: + - prop1 diff --git a/maven/src/test/resources/test-config-file.yaml b/maven/src/test/resources/test-config-file.yaml new file mode 100644 index 000000000..633ad0be3 --- /dev/null +++ b/maven/src/test/resources/test-config-file.yaml @@ -0,0 +1,8 @@ +#### +## Config file for openapi-diff +#### + +incompatible: + response: + required: + decreased: false diff --git a/pom.xml b/pom.xml index 4524eca12..331e117bf 100644 --- a/pom.xml +++ b/pom.xml @@ -126,6 +126,11 @@ <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-configuration2</artifactId> + <version>2.9.0</version> + </dependency> <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> From 3575350e368ae61a51645996f1725f682437ccd7 Mon Sep 17 00:00:00 2001 From: nithintatikonda1 <77759605+nithintatikonda1@users.noreply.github.com> Date: Sat, 16 Dec 2023 14:43:12 -0800 Subject: [PATCH 187/313] Option to create HTML output with all changes (#541) Co-authored-by: Nithin Tatikonda <nithin.t@versa-networks.com> --- .../openapitools/openapidiff/cli/Main.java | 15 +- .../core/model/ChangedOperation.java | 3 + .../openapidiff/core/output/HtmlRender.java | 128 +++++++++++++++++- 3 files changed, 144 insertions(+), 2 deletions(-) diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index b5399209f..a8e0c84c2 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -116,8 +116,15 @@ public static void main(String... args) { .longOpt("html") .hasArg() .argName("file") - .desc("export diff as html in given file") + .desc("export diff as html in given file with incompatible changes") .build()); + options.addOption( + Option.builder() + .longOpt("html-detailed") + .hasArg() + .argName("file") + .desc("export diff as html in given file with all changes") + .build()); options.addOption( Option.builder() .longOpt("text") @@ -228,6 +235,12 @@ public static void main(String... args) { OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); htmlRender.render(result, outputStreamWriter); } + if (line.hasOption("html-detailed")) { + HtmlRender htmlRender = new HtmlRender(true); + FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("html-detailed")); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + htmlRender.render(result, outputStreamWriter); + } if (line.hasOption("markdown")) { MarkdownRender mdRender = new MarkdownRender(); FileOutputStream outputStream = new FileOutputStream(line.getOptionValue("markdown")); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java index 0da0516fc..a9e3dcf49 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java @@ -63,6 +63,9 @@ public DiffResult resultApiResponses() { public DiffResult resultRequestBody() { return requestBody == null ? DiffResult.NO_CHANGES : requestBody.isChanged(); } + public DiffResult resultSecurityRequirements() { + return securityRequirements == null ? DiffResult.NO_CHANGES : securityRequirements.isChanged(); + } public Operation getOldOperation() { return this.oldOperation; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java index 4de76c646..db6b5ed12 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java @@ -26,6 +26,7 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; +import io.swagger.v3.oas.models.security.SecurityRequirement; import j2html.rendering.FlatHtml; import j2html.tags.ContainerTag; import j2html.tags.specialized.DivTag; @@ -50,6 +51,8 @@ import org.openapitools.openapidiff.core.model.ChangedParameters; import org.openapitools.openapidiff.core.model.ChangedResponse; import org.openapitools.openapidiff.core.model.ChangedSchema; +import org.openapitools.openapidiff.core.model.ChangedSecurityRequirement; +import org.openapitools.openapidiff.core.model.ChangedSecurityRequirements; import org.openapitools.openapidiff.core.model.DiffContext; import org.openapitools.openapidiff.core.model.DiffResult; import org.openapitools.openapidiff.core.model.Endpoint; @@ -64,15 +67,27 @@ public class HtmlRender implements Render { private final String title; private final String linkCss; + private final boolean showAllChanges; protected ChangedOpenApi diff; public HtmlRender() { this("Api Change Log", "http://deepoove.com/swagger-diff/stylesheets/demo.css"); } + public HtmlRender(boolean showAllChanges) { + this("Api Change Log", "http://deepoove.com/swagger-diff/stylesheets/demo.css", showAllChanges); + } + public HtmlRender(String title, String linkCss) { this.title = title; this.linkCss = linkCss; + this.showAllChanges = false; + } + + public HtmlRender(String title, String linkCss, boolean showAllChanges) { + this.title = title; + this.linkCss = linkCss; + this.showAllChanges = showAllChanges; } public void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) { @@ -200,6 +215,11 @@ private OlTag ol_changed(List<ChangedOperation> changedOperations) { ul_detail.with( li().with(h3("Response")).with(ul_response(changedOperation.getApiResponses()))); } + if (showAllChanges && changedOperation.resultSecurityRequirements().isDifferent()) { + ul_detail.with( + li().with(h3("Security Requirements")) + .with(ul_securityRequirements(changedOperation.getSecurityRequirements()))); + } ol.with( li().with(span(method).withClass(method)) .withText(pathUrl + " ") @@ -209,6 +229,52 @@ private OlTag ol_changed(List<ChangedOperation> changedOperations) { return ol; } + private UlTag ul_securityRequirements(ChangedSecurityRequirements changedSecurityRequirements) { + List<SecurityRequirement> addRequirements = changedSecurityRequirements.getIncreased(); + List<SecurityRequirement> delRequirements = changedSecurityRequirements.getMissing(); + List<ChangedSecurityRequirement> changedRequirements = changedSecurityRequirements.getChanged(); + UlTag ul = ul().withClass("change security requirements"); + if (addRequirements != null) { + for (SecurityRequirement addRequirement : addRequirements) { + ul.with(li_addSecurityRequirement(addRequirement)); + } + } + if (delRequirements != null) { + for (SecurityRequirement delRequirement : delRequirements) { + ul.with(li_missingSecurityRequirement(delRequirement)); + } + } + if (changedRequirements != null) { + for (ChangedSecurityRequirement changedRequirement : changedRequirements) { + ul.with(li_changedSecurityRequirement(changedRequirement)); + } + } + + return ul; + } + + private LiTag li_addSecurityRequirement(SecurityRequirement securityRequirement) { + return li().withText("New security requirement : ") + .with(span(null == securityRequirement.toString() ? "" : (securityRequirement.toString()))); + } + + private LiTag li_missingSecurityRequirement(SecurityRequirement securityRequirement) { + return li().withText("Deleted security requirement : ") + .with(span(null == securityRequirement.toString() ? "" : (securityRequirement.toString()))); + } + + private LiTag li_changedSecurityRequirement( + ChangedSecurityRequirement changedSecurityRequirement) { + return li().withText(String.format("Changed security requirement : ")) + .with( + span( + (null == changedSecurityRequirement.getNewSecurityRequirement() + || null + == changedSecurityRequirement.getNewSecurityRequirement().toString()) + ? "" + : (changedSecurityRequirement.getNewSecurityRequirement().toString()))); + } + private UlTag ul_response(ChangedApiResponse changedApiResponse) { Map<String, ApiResponse> addResponses = changedApiResponse.getIncreased(); Map<String, ApiResponse> delResponses = changedApiResponse.getMissing(); @@ -279,9 +345,12 @@ private LiTag li_changedRequest(String name, ChangedMediaType request) { LiTag li = li().with(div_changedSchema(request.getSchema())) .withText(String.format("Changed body: '%s'", name)); - if (request.isIncompatible()) { + if (request.isIncompatible() && !showAllChanges) { incompatibilities(li, request.getSchema()); } + else if (showAllChanges) { + allChanges(li, request.getSchema()); + } return li; } @@ -291,6 +360,28 @@ private DivTag div_changedSchema(ChangedSchema schema) { return div; } + private void allChanges(final LiTag output, final ChangedSchema schema) { + allChanges(output, "", schema); + } + + private void allChanges( + final ContainerTag<?> output, String propName, final ChangedSchema schema) { + String prefix = propName.isEmpty() ? "" : propName + "."; + properties( + output, prefix, "Missing property", schema.getMissingProperties(), schema.getContext()); + properties( + output, prefix, "Added property", schema.getIncreasedProperties(), schema.getContext()); + + propertiesChanged( + output, prefix, "Changed property", schema.getChangedProperties(), schema.getContext()); + if (schema.getItems() != null) { + itemsAllChanges(output, propName, schema.getItems()); + } + schema + .getChangedProperties() + .forEach((name, property) -> allChanges(output, prefix + name, property)); + } + private void incompatibilities(final LiTag output, final ChangedSchema schema) { incompatibilities(output, "", schema); } @@ -316,6 +407,10 @@ private void items(ContainerTag<?> output, String propName, ChangedSchema schema incompatibilities(output, propName + "[n]", schema); } + private void itemsAllChanges(ContainerTag<?> output, String propName, ChangedSchema schema) { + allChanges(output, propName + "[n]", schema); + } + private void properties( ContainerTag<?> output, String propPrefix, @@ -327,6 +422,17 @@ private void properties( } } + private void propertiesChanged( + ContainerTag<?> output, + String propPrefix, + String title, + Map<String, ChangedSchema> properties, + DiffContext context) { + if (properties != null) { + properties.forEach((key, value) -> resolveProperty(output, propPrefix, key, value, title)); + } + } + private void resolveProperty( ContainerTag<?> output, String propPrefix, String key, Schema<?> value, String title) { try { @@ -336,6 +442,15 @@ private void resolveProperty( } } + private void resolveProperty( + ContainerTag<?> output, String propPrefix, String key, ChangedSchema value, String title) { + try { + property(output, propPrefix + key, title, resolve(value)); + } catch (Exception e) { + property(output, propPrefix + key, title, type(value)); + } + } + protected void property(ContainerTag<?> output, String name, String title, Schema<?> schema) { property(output, name, title, type(schema)); } @@ -349,6 +464,13 @@ protected Schema<?> resolve(Schema<?> schema) { diff.getNewSpecOpenApi().getComponents(), schema, schema.get$ref()); } + protected Schema<?> resolve(ChangedSchema schema) { + return refPointer.resolveRef( + diff.getNewSpecOpenApi().getComponents(), + schema.getNewSchema(), + schema.getNewSchema().get$ref()); + } + protected String type(Schema<?> schema) { String result = "object"; if (schema == null) { @@ -361,6 +483,10 @@ protected String type(Schema<?> schema) { return result; } + protected String type(ChangedSchema schema) { + return type(schema.getNewSchema()); + } + private UlTag ul_param(ChangedParameters changedParameters) { List<Parameter> addParameters = changedParameters.getIncreased(); List<Parameter> delParameters = changedParameters.getMissing(); From efd40a90a09fee96aa36c643fda28a0d664d0427 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Sat, 16 Dec 2023 22:47:05 +0000 Subject: [PATCH 188/313] [maven-release-plugin] prepare release 2.1.0-beta.8 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..afe9a6d58 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.8</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 0f056b319..312f8a99f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.8</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 356a10e0e..765ef735b 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.8</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.8</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..622de8b36 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.8</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 331e117bf..76fd8f93e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.8</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.8</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-07-25T21:46:40Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-12-16T22:46:21Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.8</version> </dependency> <dependency> <groupId>org.junit</groupId> From 7b829ae8b127eda1623e8d276d3b773237c22ef7 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Sat, 16 Dec 2023 22:47:09 +0000 Subject: [PATCH 189/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index afe9a6d58..6f11bc038 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.8</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 312f8a99f..0f056b319 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.8</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 765ef735b..356a10e0e 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.8</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.8</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 622de8b36..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.8</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 76fd8f93e..450c2e33f 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.8</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.8</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-12-16T22:46:21Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2023-12-16T22:47:09Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.8</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From 9328534bee51313efba73bb77036effeef74b17d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 19:01:40 +0100 Subject: [PATCH 190/313] build(deps): bump org.apache.maven.plugins:maven-compiler-plugin (#600) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 450c2e33f..a342a522c 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.11.0</version> + <version>3.12.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 4d9a0c354a4426cd600f26da83e4e73f8e3e8520 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Dec 2023 00:24:31 +0100 Subject: [PATCH 191/313] build(deps): bump org.apache.maven.plugins:maven-compiler-plugin (#602) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a342a522c..7443169a5 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.12.0</version> + <version>3.12.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 2ef4563c794ff3ecebc31a6d4f05f8cf5415f5eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 12:06:17 +0100 Subject: [PATCH 192/313] build(deps): bump slf4j.version from 2.0.9 to 2.0.10 (#605) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7443169a5..bcebf77df 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.19</swagger-parser.version> - <slf4j.version>2.0.9</slf4j.version> + <slf4j.version>2.0.10</slf4j.version> </properties> <dependencyManagement> From d2e91990e4132f4a5c17cbbcc2e9844002e6cef4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:47:54 +0100 Subject: [PATCH 193/313] build(deps): bump org.assertj:assertj-core from 3.24.2 to 3.25.0 (#606) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bcebf77df..01d1771a3 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.24.2</version> + <version>3.25.0</version> <scope>test</scope> </dependency> </dependencies> From 09cf0d47c968f32368c10ebb2c1f533038d9eabf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 14:11:50 +0100 Subject: [PATCH 194/313] build(deps): bump org.assertj:assertj-core from 3.25.0 to 3.25.1 (#607) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 01d1771a3..50144dd34 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.25.0</version> + <version>3.25.1</version> <scope>test</scope> </dependency> </dependencies> From beb1ad4c4e5d0f2cd0baa8904bf37f5dd4f2e9ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jan 2024 12:50:55 +0100 Subject: [PATCH 195/313] build(deps): bump slf4j.version from 2.0.10 to 2.0.11 (#608) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 50144dd34..95c3d8135 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.19</swagger-parser.version> - <slf4j.version>2.0.10</slf4j.version> + <slf4j.version>2.0.11</slf4j.version> </properties> <dependencyManagement> From 0f4c3701b1dad87653346a8a57df49b2e75ba952 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:32:59 +0100 Subject: [PATCH 196/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#609) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95c3d8135..0a1979a29 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.2.3</version> + <version>3.2.5</version> </plugin> <plugin> <groupId>com.coveo</groupId> From 27a5c69f1f081bd1e75539d56f242c0a959464bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:28:12 +0100 Subject: [PATCH 197/313] build(deps): bump org.cyclonedx:cyclonedx-maven-plugin (#612) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0a1979a29..4b8dc0277 100644 --- a/pom.xml +++ b/pom.xml @@ -349,7 +349,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.10</version> + <version>2.7.11</version> </plugin> </plugins> </pluginManagement> From 9cdacc3ae14ef6a7969fd16db6ee319045cb1981 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 10:02:52 +0100 Subject: [PATCH 198/313] build(deps): bump actions/cache from 3 to 4 (#613) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/maven.yml | 2 +- .github/workflows/pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 14e42bac9..8c337389e 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -38,7 +38,7 @@ jobs: server-username: OSS_USERNAME server-password: OSS_PASSWORD - name: Cache SonarCloud packages - uses: actions/cache@v3 + uses: actions/cache@v4 if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '17' }} env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index bdb76839f..d3a0a7bb7 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -29,7 +29,7 @@ jobs: java-version: ${{ matrix.java_version }} cache: 'maven' - name: Cache SonarCloud packages - uses: actions/cache@v3 + uses: actions/cache@v4 if: ${{ env.SONAR_TOKEN != null && env.SONAR_TOKEN != '' && matrix.java_version == '17' }} env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From e32fe1b5dd67ee41cb6f82b9a5cad9a6fa72570a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 10:54:28 +0100 Subject: [PATCH 199/313] build(deps): bump swagger-parser.version from 2.1.19 to 2.1.20 (#614) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4b8dc0277..72f73aef3 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.19</swagger-parser.version> + <swagger-parser.version>2.1.20</swagger-parser.version> <slf4j.version>2.0.11</slf4j.version> </properties> From f2447aa6697ebd6ae9e77222a822f22872ed501a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 10:51:18 +0100 Subject: [PATCH 200/313] build(deps): bump org.assertj:assertj-core from 3.25.1 to 3.25.2 (#615) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 72f73aef3..470a3362d 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.25.1</version> + <version>3.25.2</version> <scope>test</scope> </dependency> </dependencies> From dc8f13bcb55495ff11ccf9a8673d102b5a5bb492 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:21:22 +0100 Subject: [PATCH 201/313] build(deps): bump slf4j.version from 2.0.11 to 2.0.12 (#618) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 470a3362d..db8a014db 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.20</swagger-parser.version> - <slf4j.version>2.0.11</slf4j.version> + <slf4j.version>2.0.12</slf4j.version> </properties> <dependencyManagement> From ff484f50be579f5ed5c409eac6c096d5e1bb9cc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:21:54 +0100 Subject: [PATCH 202/313] build(deps): bump org.assertj:assertj-core from 3.25.2 to 3.25.3 (#617) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index db8a014db..32faa5a5c 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.25.2</version> + <version>3.25.3</version> <scope>test</scope> </dependency> </dependencies> From 34aef96d90140c543347a67b63bf09969c771111 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:22:01 +0100 Subject: [PATCH 203/313] build(deps): bump org.junit:junit-bom from 5.10.1 to 5.10.2 (#616) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 32faa5a5c..a34083d42 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.10.1</version> + <version>5.10.2</version> <type>pom</type> <scope>import</scope> </dependency> From 057e9caeb55794de22bd14c43a62799637ab5718 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 09:18:26 +0100 Subject: [PATCH 204/313] build(deps): bump org.apache.maven.plugins:maven-shade-plugin (#621) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a34083d42..752cc1e0f 100644 --- a/pom.xml +++ b/pom.xml @@ -328,7 +328,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.5.1</version> + <version>3.5.2</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From 78d223e997fa1ccc2813f38748e705abeb82b968 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Tue, 5 Mar 2024 22:36:04 +0100 Subject: [PATCH 205/313] fix(docs): fix Slack link in README Closes #624 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03dfddc11..36b1bcb92 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Compare two OpenAPI specifications (3.x) and render the difference to HTML plain [](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core) [](https://gitpod.io/#https://github.com/OpenAPITools/openapi-diff) -[](https://join.slack.com/t/openapi-generator/shared_invite/enQtNzAyNDMyOTU0OTE1LTY5ZDBiNDI5NzI5ZjQ1Y2E5OWVjMjZkYzY1ZGM2MWQ4YWFjMzcyNDY5MGI4NjQxNDBiMTlmZTc5NjY2ZTQ5MGM) +[](https://join.slack.com/t/openapi-generator/shared_invite/zt-12jxxd7p2-XUeQM~4pzsU9x~eGLQqX2g) [](https://hub.docker.com/r/openapitools/openapi-diff) [](https://hub.docker.com/r/openapitools/openapi-diff) From 2c34b3db09e969c55feece32c85e4465a77d2a4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:15:07 +0100 Subject: [PATCH 206/313] build(deps): bump swagger-parser.version from 2.1.20 to 2.1.21 (#628) Bumps `swagger-parser.version` from 2.1.20 to 2.1.21. Updates `io.swagger.parser.v3:swagger-parser-v3` from 2.1.20 to 2.1.21 Updates `io.swagger.parser.v3:swagger-parser` from 2.1.20 to 2.1.21 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.20...v2.1.21) Updates `io.swagger.parser.v3:swagger-parser-v2-converter` from 2.1.20 to 2.1.21 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 752cc1e0f..88ea82901 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.20</swagger-parser.version> + <swagger-parser.version>2.1.21</swagger-parser.version> <slf4j.version>2.0.12</slf4j.version> </properties> From a2ceca4ec21ec3e8d073b7c35fea3cdef4d541e4 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Thu, 7 Mar 2024 23:54:34 +0100 Subject: [PATCH 207/313] chore: code formatting --- .../openapitools/openapidiff/cli/Main.java | 12 ++-- .../core/model/ChangedOperation.java | 1 + .../openapidiff/core/output/HtmlRender.java | 57 +++++++++---------- .../openapidiff/core/ConsoleRenderTest.java | 15 ++--- .../openapidiff/core/ParameterDiffTest.java | 3 +- .../openapidiff/maven/OpenApiDiffMojo.java | 2 +- 6 files changed, 45 insertions(+), 45 deletions(-) diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index a8e0c84c2..c80d272b8 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -119,12 +119,12 @@ public static void main(String... args) { .desc("export diff as html in given file with incompatible changes") .build()); options.addOption( - Option.builder() - .longOpt("html-detailed") - .hasArg() - .argName("file") - .desc("export diff as html in given file with all changes") - .build()); + Option.builder() + .longOpt("html-detailed") + .hasArg() + .argName("file") + .desc("export diff as html in given file with all changes") + .build()); options.addOption( Option.builder() .longOpt("text") diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java index a9e3dcf49..2a6cc773a 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOperation.java @@ -63,6 +63,7 @@ public DiffResult resultApiResponses() { public DiffResult resultRequestBody() { return requestBody == null ? DiffResult.NO_CHANGES : requestBody.isChanged(); } + public DiffResult resultSecurityRequirements() { return securityRequirements == null ? DiffResult.NO_CHANGES : securityRequirements.isChanged(); } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java index db6b5ed12..eb4c5b884 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/HtmlRender.java @@ -217,8 +217,8 @@ private OlTag ol_changed(List<ChangedOperation> changedOperations) { } if (showAllChanges && changedOperation.resultSecurityRequirements().isDifferent()) { ul_detail.with( - li().with(h3("Security Requirements")) - .with(ul_securityRequirements(changedOperation.getSecurityRequirements()))); + li().with(h3("Security Requirements")) + .with(ul_securityRequirements(changedOperation.getSecurityRequirements()))); } ol.with( li().with(span(method).withClass(method)) @@ -255,24 +255,24 @@ private UlTag ul_securityRequirements(ChangedSecurityRequirements changedSecurit private LiTag li_addSecurityRequirement(SecurityRequirement securityRequirement) { return li().withText("New security requirement : ") - .with(span(null == securityRequirement.toString() ? "" : (securityRequirement.toString()))); + .with(span(null == securityRequirement.toString() ? "" : (securityRequirement.toString()))); } private LiTag li_missingSecurityRequirement(SecurityRequirement securityRequirement) { return li().withText("Deleted security requirement : ") - .with(span(null == securityRequirement.toString() ? "" : (securityRequirement.toString()))); + .with(span(null == securityRequirement.toString() ? "" : (securityRequirement.toString()))); } private LiTag li_changedSecurityRequirement( - ChangedSecurityRequirement changedSecurityRequirement) { + ChangedSecurityRequirement changedSecurityRequirement) { return li().withText(String.format("Changed security requirement : ")) - .with( - span( - (null == changedSecurityRequirement.getNewSecurityRequirement() - || null - == changedSecurityRequirement.getNewSecurityRequirement().toString()) - ? "" - : (changedSecurityRequirement.getNewSecurityRequirement().toString()))); + .with( + span( + (null == changedSecurityRequirement.getNewSecurityRequirement() + || null + == changedSecurityRequirement.getNewSecurityRequirement().toString()) + ? "" + : (changedSecurityRequirement.getNewSecurityRequirement().toString()))); } private UlTag ul_response(ChangedApiResponse changedApiResponse) { @@ -347,8 +347,7 @@ private LiTag li_changedRequest(String name, ChangedMediaType request) { .withText(String.format("Changed body: '%s'", name)); if (request.isIncompatible() && !showAllChanges) { incompatibilities(li, request.getSchema()); - } - else if (showAllChanges) { + } else if (showAllChanges) { allChanges(li, request.getSchema()); } return li; @@ -365,21 +364,21 @@ private void allChanges(final LiTag output, final ChangedSchema schema) { } private void allChanges( - final ContainerTag<?> output, String propName, final ChangedSchema schema) { + final ContainerTag<?> output, String propName, final ChangedSchema schema) { String prefix = propName.isEmpty() ? "" : propName + "."; properties( - output, prefix, "Missing property", schema.getMissingProperties(), schema.getContext()); + output, prefix, "Missing property", schema.getMissingProperties(), schema.getContext()); properties( - output, prefix, "Added property", schema.getIncreasedProperties(), schema.getContext()); + output, prefix, "Added property", schema.getIncreasedProperties(), schema.getContext()); propertiesChanged( - output, prefix, "Changed property", schema.getChangedProperties(), schema.getContext()); + output, prefix, "Changed property", schema.getChangedProperties(), schema.getContext()); if (schema.getItems() != null) { itemsAllChanges(output, propName, schema.getItems()); } schema - .getChangedProperties() - .forEach((name, property) -> allChanges(output, prefix + name, property)); + .getChangedProperties() + .forEach((name, property) -> allChanges(output, prefix + name, property)); } private void incompatibilities(final LiTag output, final ChangedSchema schema) { @@ -423,11 +422,11 @@ private void properties( } private void propertiesChanged( - ContainerTag<?> output, - String propPrefix, - String title, - Map<String, ChangedSchema> properties, - DiffContext context) { + ContainerTag<?> output, + String propPrefix, + String title, + Map<String, ChangedSchema> properties, + DiffContext context) { if (properties != null) { properties.forEach((key, value) -> resolveProperty(output, propPrefix, key, value, title)); } @@ -443,7 +442,7 @@ private void resolveProperty( } private void resolveProperty( - ContainerTag<?> output, String propPrefix, String key, ChangedSchema value, String title) { + ContainerTag<?> output, String propPrefix, String key, ChangedSchema value, String title) { try { property(output, propPrefix + key, title, resolve(value)); } catch (Exception e) { @@ -466,9 +465,9 @@ protected Schema<?> resolve(Schema<?> schema) { protected Schema<?> resolve(ChangedSchema schema) { return refPointer.resolveRef( - diff.getNewSpecOpenApi().getComponents(), - schema.getNewSchema(), - schema.getNewSchema().get$ref()); + diff.getNewSpecOpenApi().getComponents(), + schema.getNewSchema(), + schema.getNewSchema().get$ref()); } protected String type(Schema<?> schema) { diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java index 6d9bdd33e..83d024669 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java @@ -14,7 +14,8 @@ public void renderDoesNotFailWhenPropertyHasBeenRemoved() { ConsoleRender render = new ConsoleRender(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); - ChangedOpenApi diff = OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); render.render(diff, outputStreamWriter); assertThat(outputStream.toString()).isNotBlank(); } @@ -36,7 +37,7 @@ public void renderShowsWhatsDeletedSectionWhenEndpointIsDeleted() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = - OpenApiCompare.fromLocations("delete_endpoint_1.yaml", "delete_endpoint_2.yaml"); + OpenApiCompare.fromLocations("delete_endpoint_1.yaml", "delete_endpoint_2.yaml"); render.render(diff, outputStreamWriter); assertThat(outputStream.toString()).contains("What's Deleted"); } @@ -47,7 +48,7 @@ public void renderShowsWhatsNewSectionWhenEndpointIsAdded() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = - OpenApiCompare.fromLocations("add_endpoint_1.yaml", "add_endpoint_2.yaml"); + OpenApiCompare.fromLocations("add_endpoint_1.yaml", "add_endpoint_2.yaml"); render.render(diff, outputStreamWriter); assertThat(outputStream.toString()).contains("What's New"); } @@ -58,7 +59,7 @@ public void renderShowsWhatsDeprecatedSectionWhenEndpointIsDeprecated() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = - OpenApiCompare.fromLocations("deprecate_endpoint_1.yaml", "deprecate_endpoint_2.yaml"); + OpenApiCompare.fromLocations("deprecate_endpoint_1.yaml", "deprecate_endpoint_2.yaml"); render.render(diff, outputStreamWriter); assertThat(outputStream.toString()).contains("What's Deprecated"); } @@ -69,10 +70,10 @@ public void renderShowsWhatsChangedSectionWithCorrectFormattingWhenEndpointIsCha ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); ChangedOpenApi diff = - OpenApiCompare.fromLocations("change_endpoint_1.yaml", "change_endpoint_2.yaml"); + OpenApiCompare.fromLocations("change_endpoint_1.yaml", "change_endpoint_2.yaml"); render.render(diff, outputStreamWriter); assertThat(outputStream.toString()) - .contains("What's Changed") - .containsSubsequence("- GET /widgets", "Parameter:", "- Changed query-param-1 in query"); + .contains("What's Changed") + .containsSubsequence("- GET /widgets", "Parameter:", "- Changed query-param-1 in query"); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java index 06947ea55..d04305ed8 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java @@ -91,7 +91,6 @@ public void issue458ExclusiveMinimumTrueRemoved() { @Test public void issue488RenameParameterAddAndRemoveParameterReturnFalse() { - assertOpenApiChangedEndpoints( - "issue-488-1.json", "issue-488-2.json"); + assertOpenApiChangedEndpoints("issue-488-1.json", "issue-488-2.json"); } } diff --git a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java index 406bf5fdd..4fd7d9e14 100644 --- a/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java +++ b/maven/src/main/java/org/openapitools/openapidiff/maven/OpenApiDiffMojo.java @@ -56,7 +56,7 @@ public class OpenApiDiffMojo extends AbstractMojo { @Parameter(property = "configProps") Map<String, String> configProps; - + @Parameter(property = "asciidocOutputFileName") String asciidocOutputFileName; From f2702ff8c4e43c041bfdf22a50d6a9a3bca47240 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Thu, 7 Mar 2024 23:57:20 +0100 Subject: [PATCH 208/313] chore: build and run Docker image with Eclipse Temurin 21 (#629) --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 72bd50130..f6c362dba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -FROM openjdk:8-jdk-slim AS build +FROM eclipse-temurin:21-jdk-alpine AS build WORKDIR /build COPY ./ /build RUN ./mvnw -V -B -ff -P docker package -q -FROM openjdk:8-jre-slim +FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY --from=build /build/cli/target/openapi-diff-cli-*-all.jar /app/openapi-diff.jar ENTRYPOINT ["java", "-jar", "/app/openapi-diff.jar"] From e6895585df5bc6ae299b3a26ad5072a944f0c17b Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Fri, 8 Mar 2024 00:36:05 +0100 Subject: [PATCH 209/313] feat(docker): add App CDS for Docker image (#630) --- .dockerignore | 2 ++ Dockerfile | 10 ++++++++-- cli/pom.xml | 40 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..92322c4e0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.idea/ +target/ diff --git a/Dockerfile b/Dockerfile index f6c362dba..b07fd3dda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,12 @@ RUN ./mvnw -V -B -ff -P docker package -q FROM eclipse-temurin:21-jre-alpine WORKDIR /app -COPY --from=build /build/cli/target/openapi-diff-cli-*-all.jar /app/openapi-diff.jar -ENTRYPOINT ["java", "-jar", "/app/openapi-diff.jar"] +COPY --from=build /build/cli/target/openapi-diff.jar /app/openapi-diff.jar +COPY --from=build /build/core/src/test/resources/petstore_v2_* /tmp +RUN java -XX:ArchiveClassesAtExit=/app/appcds.jsa \ + -jar /app/openapi-diff.jar \ + /tmp/petstore_v2_1.yaml \ + /tmp/petstore_v2_2.yaml \ + && rm -f /tmp/petstore_v2_* +ENTRYPOINT ["java", "-Xshare:on", "-XX:SharedArchiveFile=/app/appcds.jsa", "-jar", "/app/openapi-diff.jar"] CMD ["--help"] diff --git a/cli/pom.xml b/cli/pom.xml index 6f11bc038..1ffcc3000 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -13,6 +13,10 @@ <name>openapi-diff-cli</name> <description>CLI for openapi-diff</description> + <properties> + <mainClass>org.openapitools.openapidiff.cli.Main</mainClass> + </properties> + <dependencies> <dependency> <groupId>org.openapitools.openapidiff</groupId> @@ -52,7 +56,7 @@ <shadedClassifierName>all</shadedClassifierName> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> - <mainClass>org.openapitools.openapidiff.cli.Main</mainClass> + <mainClass>${mainClass}</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" /> @@ -64,4 +68,38 @@ </plugin> </plugins> </build> + + <profiles> + <profile> + <id>docker</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <createDependencyReducedPom>false</createDependencyReducedPom> + <finalName>openapi-diff</finalName> + <transformers> + <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> + <mainClass>${mainClass}</mainClass> + </transformer> + <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> + <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" /> + <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer" /> + </transformers> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> </project> From 97807f12a200da8a7e2db8d575c3eaf6f51755ad Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Fri, 8 Mar 2024 00:41:02 +0100 Subject: [PATCH 210/313] feat(docker): publish additionally to GitHub container registry (#631) --- .github/workflows/release.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 58eb8973c..e4ae11c57 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,11 +53,17 @@ jobs: uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Login to DockerHub + - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Build & Push Docker image uses: docker/build-push-action@v5 with: @@ -67,3 +73,5 @@ jobs: tags: | openapitools/openapi-diff:${{ github.event.inputs.releaseVersion }} openapitools/openapi-diff:latest + ghcr.io/openapitools/openapi-diff:${{ github.event.inputs.releaseVersion }} + ghcr.io/openapitools/openapi-diff:latest From 44a824a1c1974da24df18d0b429ec56734ba355a Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Thu, 7 Mar 2024 23:42:26 +0000 Subject: [PATCH 211/313] [maven-release-plugin] prepare release 2.1.0-beta.9 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 1ffcc3000..5abdedf9c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.9</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 0f056b319..cd1f0bae6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.9</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 356a10e0e..d3f2a0ba2 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.9</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.9</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..3f09da806 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.9</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 88ea82901..abb18caac 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.9</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.9</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2023-12-16T22:47:09Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2024-03-07T23:41:42Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.9</version> </dependency> <dependency> <groupId>org.junit</groupId> From 4480884ff298ecf65a8a0cc5b94f675f5d74437d Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Thu, 7 Mar 2024 23:42:30 +0000 Subject: [PATCH 212/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 5abdedf9c..1ffcc3000 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.9</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index cd1f0bae6..0f056b319 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.9</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index d3f2a0ba2..356a10e0e 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.9</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.9</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 3f09da806..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.9</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index abb18caac..3ac5b651c 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.9</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.9</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2024-03-07T23:41:42Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2024-03-07T23:42:30Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.9</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From cb7e14134ead97c7e5da7826d9bd27254e2a9535 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Sat, 9 Mar 2024 13:42:18 +0100 Subject: [PATCH 213/313] revert: "feat(docker): publish additionally to GitHub container registry" This reverts commit 97807f12a200da8a7e2db8d575c3eaf6f51755ad. Refs #631 --- .github/workflows/release.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e4ae11c57..58eb8973c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,17 +53,11 @@ jobs: uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Login to Docker Hub + - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - name: Build & Push Docker image uses: docker/build-push-action@v5 with: @@ -73,5 +67,3 @@ jobs: tags: | openapitools/openapi-diff:${{ github.event.inputs.releaseVersion }} openapitools/openapi-diff:latest - ghcr.io/openapitools/openapi-diff:${{ github.event.inputs.releaseVersion }} - ghcr.io/openapitools/openapi-diff:latest From 1aa5e1877c78a55da0e2267cca8c7d5d021ccd33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 21:49:00 +0100 Subject: [PATCH 214/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin (#632) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3ac5b651c..ac384f2aa 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.1.0</version> + <version>3.2.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From fb41c504e7234e869da0d1176f81bd6c95874b42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:00:40 +0100 Subject: [PATCH 215/313] build(deps): bump org.apache.commons:commons-configuration2 (#633) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ac384f2aa..07e8d2ac0 100644 --- a/pom.xml +++ b/pom.xml @@ -129,7 +129,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-configuration2</artifactId> - <version>2.9.0</version> + <version>2.10.0</version> </dependency> <dependency> <groupId>commons-cli</groupId> From 5894b83a05c787f51ea681859b685bf59dec2941 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:21:13 +0100 Subject: [PATCH 216/313] build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#634) Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 3.10.0.2594 to 3.11.0.3922. - [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases) - [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/3.10.0.2594...3.11.0.3922) --- updated-dependencies: - dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 07e8d2ac0..32cfcc120 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> - <version>3.10.0.2594</version> + <version>3.11.0.3922</version> </plugin> <plugin> <groupId>org.cyclonedx</groupId> From 49f6ed9cf322af2508d7c1e8545417f44369c1b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 22:08:41 +0100 Subject: [PATCH 217/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin (#636) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 32cfcc120..7168fc8e6 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.2.0</version> + <version>3.2.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 46f6f796a5156fb6756da149cc21c27641ec38ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 22:08:53 +0100 Subject: [PATCH 218/313] build(deps): bump org.apache.maven.plugins:maven-compiler-plugin (#635) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7168fc8e6..8e9523750 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.12.1</version> + <version>3.13.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 0d72a500e5695671fe2b6a7958dcad7cb8392bc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:10:18 +0100 Subject: [PATCH 219/313] build(deps): bump org.apache.commons:commons-configuration2 (#637) Bumps org.apache.commons:commons-configuration2 from 2.10.0 to 2.10.1. --- updated-dependencies: - dependency-name: org.apache.commons:commons-configuration2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8e9523750..6b0c8094b 100644 --- a/pom.xml +++ b/pom.xml @@ -129,7 +129,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-configuration2</artifactId> - <version>2.10.0</version> + <version>2.10.1</version> </dependency> <dependency> <groupId>commons-cli</groupId> From c88cf5e893782becc192e7b1104807dedf58f1f5 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda <jochen@schalanda.name> Date: Thu, 21 Mar 2024 22:23:36 +0100 Subject: [PATCH 220/313] Move Logback config in core into test resources Fixes #638 --- .../resources/logback.xml => test/resources/logback-test.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/src/{main/resources/logback.xml => test/resources/logback-test.xml} (100%) diff --git a/core/src/main/resources/logback.xml b/core/src/test/resources/logback-test.xml similarity index 100% rename from core/src/main/resources/logback.xml rename to core/src/test/resources/logback-test.xml From 255846537366fc079f316c7f85300a584294aea3 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:27:56 +0000 Subject: [PATCH 221/313] [maven-release-plugin] prepare release 2.1.0-beta.10 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 1ffcc3000..c2879b69c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.10</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 0f056b319..f04d8046d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.10</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 356a10e0e..fd6ece5b8 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.10</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.10</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..fd3e8968c 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.10</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 6b0c8094b..c1442240b 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.10</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.10</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2024-03-07T23:42:30Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2024-03-21T21:27:12Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.10</version> </dependency> <dependency> <groupId>org.junit</groupId> From 2b388c94ee9bec059cdb024f6dcac1a97b1f0f40 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:28:00 +0000 Subject: [PATCH 222/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index c2879b69c..1ffcc3000 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.10</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index f04d8046d..0f056b319 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.10</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index fd6ece5b8..356a10e0e 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.10</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.10</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index fd3e8968c..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.10</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index c1442240b..c1fe7ec0b 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.10</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.10</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2024-03-21T21:27:12Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2024-03-21T21:28:00Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.10</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From b05f1c2c5a88f4f533e642b16204f7d3d1ec0dbc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:13:02 +0100 Subject: [PATCH 223/313] build(deps): bump org.cyclonedx:cyclonedx-maven-plugin (#641) Bumps [org.cyclonedx:cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.7.11 to 2.8.0. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.7.11...cyclonedx-maven-plugin-2.8.0) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c1fe7ec0b..a21b61f21 100644 --- a/pom.xml +++ b/pom.xml @@ -349,7 +349,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.7.11</version> + <version>2.8.0</version> </plugin> </plugins> </pluginManagement> From 8561d13e3dfa5b9ec89405545e851a1900c26b9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:04:01 +0100 Subject: [PATCH 224/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin (#642) Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.1...maven-gpg-plugin-3.2.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a21b61f21..a5b3ef98c 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.2.1</version> + <version>3.2.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From fd50e855c29ed7396523b51ea113a05ce3f6abe7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 11:43:24 +0200 Subject: [PATCH 225/313] build(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.12 (#643) Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.11 to 0.8.12. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.11...v0.8.12) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5b3ef98c..93a9061bc 100644 --- a/pom.xml +++ b/pom.xml @@ -339,7 +339,7 @@ <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> - <version>0.8.11</version> + <version>0.8.12</version> </plugin> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> From 1a9ab4cc7708c3058b332848f99671b118722b9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:33:46 +0200 Subject: [PATCH 226/313] build(deps): bump swagger-parser.version from 2.1.21 to 2.1.22 (#646) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 93a9061bc..dfa3487a2 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.21</swagger-parser.version> + <swagger-parser.version>2.1.22</swagger-parser.version> <slf4j.version>2.0.12</slf4j.version> </properties> From cbed9ea6c094d2660b313ac84e01f1ff8590f32d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:33:58 +0200 Subject: [PATCH 227/313] build(deps): bump org.apache.maven.plugins:maven-source-plugin (#645) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dfa3487a2..2e260c690 100644 --- a/pom.xml +++ b/pom.xml @@ -283,7 +283,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> - <version>3.3.0</version> + <version>3.3.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From b473092c466d6030dc9ea6a7b493b85aa202c918 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:58:26 +0200 Subject: [PATCH 228/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin (#648) Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.2 to 3.2.3. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.2...maven-gpg-plugin-3.2.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2e260c690..57d07bcab 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.2.2</version> + <version>3.2.3</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 3f880d60cd9246399366c9ff7f33b61032f771da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:34:34 +0200 Subject: [PATCH 229/313] build(deps): bump org.apache.maven.plugins:maven-jar-plugin (#651) Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.3.0...maven-jar-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 57d07bcab..866231770 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> - <version>3.3.0</version> + <version>3.4.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From d06545b7bfd3714c30122cd3aab39a808336c354 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:34:45 +0200 Subject: [PATCH 230/313] build(deps): bump slf4j.version from 2.0.12 to 2.0.13 (#649) Bumps `slf4j.version` from 2.0.12 to 2.0.13. Updates `org.slf4j:slf4j-api` from 2.0.12 to 2.0.13 Updates `org.slf4j:jcl-over-slf4j` from 2.0.12 to 2.0.13 Updates `org.slf4j:slf4j-simple` from 2.0.12 to 2.0.13 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 866231770..af52fa982 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.22</swagger-parser.version> - <slf4j.version>2.0.12</slf4j.version> + <slf4j.version>2.0.13</slf4j.version> </properties> <dependencyManagement> From 4cf29d06511a593b1aefe5e522413582d4885991 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:27:11 +0200 Subject: [PATCH 231/313] build(deps): bump commons-cli:commons-cli from 1.6.0 to 1.7.0 (#652) Bumps commons-cli:commons-cli from 1.6.0 to 1.7.0. --- updated-dependencies: - dependency-name: commons-cli:commons-cli dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af52fa982..f6bd77198 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> - <version>1.6.0</version> + <version>1.7.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> From 22302fabea270cb42f8c86443ebbe13f7511af0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 12:15:40 +0200 Subject: [PATCH 232/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin (#654) Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.3 to 3.2.4. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.3...maven-gpg-plugin-3.2.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f6bd77198..50cfb25c6 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.2.3</version> + <version>3.2.4</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 68371d50b5f6177c3fbce897fb505ec9f123e7ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:27:13 +0200 Subject: [PATCH 233/313] build(deps): bump org.apache.maven.plugins:maven-jar-plugin (#655) Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.0...maven-jar-plugin-3.4.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 50cfb25c6..a0b6bb74a 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> - <version>3.4.0</version> + <version>3.4.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 33ce30827fbbfc2f70e0c44c2d67c5922d4a8135 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 20:49:26 +0200 Subject: [PATCH 234/313] build(deps): bump org.apache.maven.plugins:maven-shade-plugin (#656) Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.5.2 to 3.5.3. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.2...maven-shade-plugin-3.5.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a0b6bb74a..cf49acbd1 100644 --- a/pom.xml +++ b/pom.xml @@ -328,7 +328,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.5.2</version> + <version>3.5.3</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From d5323a11c0b7d18d5c282ffe433cea6134c0fa83 Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:53:27 +0000 Subject: [PATCH 235/313] [maven-release-plugin] prepare release 2.1.0-beta.11 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 1ffcc3000..262b6d860 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.11</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 0f056b319..8c5be44e0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.11</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 356a10e0e..5647f9aa0 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.11</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.11</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..623aa6986 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.11</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index cf49acbd1..3822cbdd2 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.11</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.11</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2024-03-21T21:28:00Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2024-04-24T18:52:43Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.11</version> </dependency> <dependency> <groupId>org.junit</groupId> From 45889ed330a9e876050f3e240b39237a7b9f567e Mon Sep 17 00:00:00 2001 From: joschi <joschi@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:56:12 +0000 Subject: [PATCH 236/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 262b6d860..1ffcc3000 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.11</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 8c5be44e0..0f056b319 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.11</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 5647f9aa0..356a10e0e 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.11</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.11</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 623aa6986..f5e88ea50 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.11</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 3822cbdd2..f42d3d1b9 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.11</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.11</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2024-04-24T18:52:43Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2024-04-24T18:56:12Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.11</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From 64b6bce9665ff97390e7e55d13cb24f4fb6a716f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 12:01:11 +0200 Subject: [PATCH 237/313] build(deps): bump org.apache.maven.plugins:maven-deploy-plugin (#657) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f42d3d1b9..ac48dd884 100644 --- a/pom.xml +++ b/pom.xml @@ -323,7 +323,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> - <version>3.1.1</version> + <version>3.1.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 89bd9d1666c5902713574f4ef754fff0defa43e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 May 2024 12:10:03 +0200 Subject: [PATCH 238/313] build(deps): bump commons-cli:commons-cli from 1.7.0 to 1.8.0 (#663) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ac48dd884..0b6aa40b6 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> - <version>1.7.0</version> + <version>1.8.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> From 05d6fff6cae609c626a14016ae3896882bd52f45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:24:26 +0200 Subject: [PATCH 239/313] build(deps): bump org.assertj:assertj-core from 3.25.3 to 3.26.0 (#664) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0b6aa40b6..2a4d992d9 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.25.3</version> + <version>3.26.0</version> <scope>test</scope> </dependency> </dependencies> From a0ba5845fa65e8c06c6dd75b0afe794bb6b9e85b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:24:34 +0200 Subject: [PATCH 240/313] build(deps): bump org.sonatype.plugins:nexus-staging-maven-plugin (#665) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2a4d992d9..a17ea1937 100644 --- a/pom.xml +++ b/pom.xml @@ -333,7 +333,7 @@ <plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> - <version>1.6.13</version> + <version>1.7.0</version> <extensions>true</extensions> </plugin> <plugin> From 67c8676f85c8dc00bbf9da19c89e89e2093ef0d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:03:39 +0200 Subject: [PATCH 241/313] build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#670) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a17ea1937..64d34252b 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> - <version>3.11.0.3922</version> + <version>4.0.0.4121</version> </plugin> <plugin> <groupId>org.cyclonedx</groupId> From bed1f00f8c6781f3be72bdd1319d489510cb5049 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:03:47 +0200 Subject: [PATCH 242/313] build(deps): bump org.apache.maven.plugins:maven-shade-plugin (#669) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 64d34252b..8409bb142 100644 --- a/pom.xml +++ b/pom.xml @@ -328,7 +328,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.5.3</version> + <version>3.6.0</version> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> From 8aa10ef995575ec6a07e5051c0c50d1dde961edc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:03:54 +0200 Subject: [PATCH 243/313] build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin (#668) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8409bb142..b1507b7fe 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.6.3</version> + <version>3.7.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From b3c45afa12cfeb57d85252f26639d5d835c6f97d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:27:43 +0200 Subject: [PATCH 244/313] build(deps): bump org.apache.commons:commons-configuration2 (#672) Bumps org.apache.commons:commons-configuration2 from 2.10.1 to 2.11.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-configuration2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b1507b7fe..aae7a596e 100644 --- a/pom.xml +++ b/pom.xml @@ -129,7 +129,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-configuration2</artifactId> - <version>2.10.1</version> + <version>2.11.0</version> </dependency> <dependency> <groupId>commons-cli</groupId> From 37ea2ee3204eb2803bdf27c082f74d63f33b45a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:07:05 +0200 Subject: [PATCH 245/313] build(deps): bump org.apache.maven.plugins:maven-release-plugin (#678) Bumps [org.apache.maven.plugins:maven-release-plugin](https://github.com/apache/maven-release) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/apache/maven-release/releases) - [Commits](https://github.com/apache/maven-release/compare/maven-release-3.0.1...maven-release-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-release-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aae7a596e..224f051f5 100644 --- a/pom.xml +++ b/pom.xml @@ -293,7 +293,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>3.0.1</version> + <version>3.1.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From d70d9ba6fef4a7e65d7add606a169ca5a2b083c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:07:14 +0200 Subject: [PATCH 246/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#677) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.5 to 3.3.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.5...surefire-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 224f051f5..7bf2bfde9 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.2.5</version> + <version>3.3.0</version> </plugin> <plugin> <groupId>com.coveo</groupId> From b0ce4b45935ea3f1909463980bf6095ce7ad04bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:29:40 +0200 Subject: [PATCH 247/313] build(deps): bump docker/build-push-action from 5 to 6 (#679) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 58eb8973c..94d5c8ba5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -59,7 +59,7 @@ jobs: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} - name: Build & Push Docker image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . push: true From 4160502ad620952390140994135e2cc6193c1811 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:00:42 +0200 Subject: [PATCH 248/313] build(deps): bump org.apache.maven.plugins:maven-jar-plugin (#680) Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.4.1 to 3.4.2. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.1...maven-jar-plugin-3.4.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7bf2bfde9..052a16869 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> - <version>3.4.1</version> + <version>3.4.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From c647ac48985bcce6c822c16f427664de921e1074 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 10:21:04 +0200 Subject: [PATCH 249/313] build(deps): bump org.junit:junit-bom from 5.10.2 to 5.10.3 (#681) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 052a16869..c965c1e63 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.10.2</version> + <version>5.10.3</version> <type>pom</type> <scope>import</scope> </dependency> From dc2175215f6dbbc2b301a259a545dec87bab651d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:12:48 +0200 Subject: [PATCH 250/313] build(deps): bump org.assertj:assertj-core from 3.26.0 to 3.26.3 (#682) Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.0 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.0...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c965c1e63..336f1e2fa 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.26.0</version> + <version>3.26.3</version> <scope>test</scope> </dependency> </dependencies> From cf621102bc9e424acbf4e2379f52972db1854e01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2024 13:42:48 +0200 Subject: [PATCH 251/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#683) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.3.0 to 3.3.1. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.3.0...surefire-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 336f1e2fa..74d5821fd 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.3.0</version> + <version>3.3.1</version> </plugin> <plugin> <groupId>com.coveo</groupId> From 8b0432b70fab5a10d25a04349a9cd3098b5181d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:22:30 +0200 Subject: [PATCH 252/313] build(deps): bump org.apache.maven.plugins:maven-release-plugin (#685) Bumps [org.apache.maven.plugins:maven-release-plugin](https://github.com/apache/maven-release) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/apache/maven-release/releases) - [Commits](https://github.com/apache/maven-release/compare/maven-release-3.1.0...maven-release-3.1.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-release-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 74d5821fd..05e0f9b8a 100644 --- a/pom.xml +++ b/pom.xml @@ -293,7 +293,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>3.1.0</version> + <version>3.1.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 8b9071a08352d4c005b0dfcebddef468d7f6aa4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:38:22 +0200 Subject: [PATCH 253/313] build(deps): bump org.apache.commons:commons-lang3 from 3.14.0 to 3.15.0 (#686) Bumps org.apache.commons:commons-lang3 from 3.14.0 to 3.15.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 05e0f9b8a..9e9f965c1 100644 --- a/pom.xml +++ b/pom.xml @@ -139,7 +139,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> - <version>3.14.0</version> + <version>3.15.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> From c8cd2b6ac219773e7df245d85221993a5571d2aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 11:06:12 +0200 Subject: [PATCH 254/313] build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin (#687) Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.7.0 to 3.8.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.7.0...maven-javadoc-plugin-3.8.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9e9f965c1..1431b7be0 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.7.0</version> + <version>3.8.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From c2d418f3370dd165d32e592ef907dd0a272444f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 13:45:31 +0200 Subject: [PATCH 255/313] build(deps): bump org.cyclonedx:cyclonedx-maven-plugin (#688) Bumps [org.cyclonedx:cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.8.0 to 2.8.1. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.8.0...cyclonedx-maven-plugin-2.8.1) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1431b7be0..c0095bfbc 100644 --- a/pom.xml +++ b/pom.xml @@ -349,7 +349,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.8.0</version> + <version>2.8.1</version> </plugin> </plugins> </pluginManagement> From fbfe947a709fe394d1cf503eae2b1900f910d6af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 11:06:32 +0200 Subject: [PATCH 256/313] build(deps): bump slf4j.version from 2.0.13 to 2.0.14 (#689) Bumps `slf4j.version` from 2.0.13 to 2.0.14. Updates `org.slf4j:slf4j-api` from 2.0.13 to 2.0.14 Updates `org.slf4j:jcl-over-slf4j` from 2.0.13 to 2.0.14 Updates `org.slf4j:slf4j-simple` from 2.0.13 to 2.0.14 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c0095bfbc..817848fd3 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.22</swagger-parser.version> - <slf4j.version>2.0.13</slf4j.version> + <slf4j.version>2.0.14</slf4j.version> </properties> <dependencyManagement> From e43861fbb375313358d1d9e1acd5446b386190b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 10:56:33 +0200 Subject: [PATCH 257/313] build(deps): bump org.apache.commons:commons-lang3 from 3.15.0 to 3.16.0 (#690) Bumps org.apache.commons:commons-lang3 from 3.15.0 to 3.16.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 817848fd3..421567c21 100644 --- a/pom.xml +++ b/pom.xml @@ -139,7 +139,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> - <version>3.15.0</version> + <version>3.16.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> From 6875928d8b4cd485261b93120ebdc834c1ee7cb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 10:29:14 +0200 Subject: [PATCH 258/313] build(deps): bump slf4j.version from 2.0.14 to 2.0.15 (#691) Bumps `slf4j.version` from 2.0.14 to 2.0.15. Updates `org.slf4j:slf4j-api` from 2.0.14 to 2.0.15 Updates `org.slf4j:jcl-over-slf4j` from 2.0.14 to 2.0.15 Updates `org.slf4j:slf4j-simple` from 2.0.14 to 2.0.15 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 421567c21..9000744b8 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.22</swagger-parser.version> - <slf4j.version>2.0.14</slf4j.version> + <slf4j.version>2.0.15</slf4j.version> </properties> <dependencyManagement> From 36757c201320c0e29578eb6ae60e567e8ffc8bb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 10:41:55 +0200 Subject: [PATCH 259/313] build(deps): bump slf4j.version from 2.0.15 to 2.0.16 (#692) Bumps `slf4j.version` from 2.0.15 to 2.0.16. Updates `org.slf4j:slf4j-api` from 2.0.15 to 2.0.16 Updates `org.slf4j:jcl-over-slf4j` from 2.0.15 to 2.0.16 Updates `org.slf4j:slf4j-simple` from 2.0.15 to 2.0.16 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9000744b8..872f0be0e 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.22</swagger-parser.version> - <slf4j.version>2.0.15</slf4j.version> + <slf4j.version>2.0.16</slf4j.version> </properties> <dependencyManagement> From 42839a68b426d3d15fa16463781ea0aaa86fafe8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:04:38 +0200 Subject: [PATCH 260/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin (#693) Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.4 to 3.2.5. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.4...maven-gpg-plugin-3.2.5) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 872f0be0e..f03a6ed98 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.2.4</version> + <version>3.2.5</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From aeb4a56ff467eec0528892f19c073b8875541580 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:09:46 +0200 Subject: [PATCH 261/313] build(deps): bump org.junit:junit-bom from 5.10.3 to 5.11.0 (#696) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.10.3 to 5.11.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.11.0) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f03a6ed98..da587dabc 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.10.3</version> + <version>5.11.0</version> <type>pom</type> <scope>import</scope> </dependency> From c290387ed238779c0c900b7c404419c1f8c7cc5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:09:53 +0200 Subject: [PATCH 262/313] build(deps): bump commons-cli:commons-cli from 1.8.0 to 1.9.0 (#695) Bumps commons-cli:commons-cli from 1.8.0 to 1.9.0. --- updated-dependencies: - dependency-name: commons-cli:commons-cli dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index da587dabc..e0c0d895d 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> - <version>1.8.0</version> + <version>1.9.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> From e747726464b2d44093838ec62e6e60fabc5a4801 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:45:20 +0200 Subject: [PATCH 263/313] build(deps): bump org.apache.maven.plugins:maven-deploy-plugin (#701) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e0c0d895d..892823a6e 100644 --- a/pom.xml +++ b/pom.xml @@ -323,7 +323,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> - <version>3.1.2</version> + <version>3.1.3</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From d00e333dd925723210c24947e70094897bea5cc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:45:28 +0200 Subject: [PATCH 264/313] build(deps): bump org.apache.maven.plugins:maven-site-plugin (#700) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index f5e88ea50..cf9e70c5b 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -61,7 +61,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> - <version>3.12.1</version> + <version>3.20.0</version> </plugin> </plugins> </pluginManagement> From 81a125e7aa5b7a6089029b0b311acf5e00111d48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:45:40 +0200 Subject: [PATCH 265/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#698) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 892823a6e..a7d278660 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.3.1</version> + <version>3.4.0</version> </plugin> <plugin> <groupId>com.coveo</groupId> From 86dc12caf4a3fa88ff5fd5257e312e9257eca50b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Aug 2024 21:46:44 +0200 Subject: [PATCH 266/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#703) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a7d278660..ab14e0725 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.4.0</version> + <version>3.5.0</version> </plugin> <plugin> <groupId>com.coveo</groupId> From 65bc7e6a74eef75b853105b3847efa53b8b28efb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Aug 2024 21:46:51 +0200 Subject: [PATCH 267/313] build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin (#702) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ab14e0725..4f900793c 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.8.0</version> + <version>3.10.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 3fc4eb53e6200f0df19dc1969a47e3b8e3973e3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:00:55 +0200 Subject: [PATCH 268/313] build(deps): bump org.apache.commons:commons-lang3 from 3.16.0 to 3.17.0 (#705) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4f900793c..729b31a35 100644 --- a/pom.xml +++ b/pom.xml @@ -139,7 +139,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> - <version>3.16.0</version> + <version>3.17.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> From 6ff9f1ce4a17b56617e1b02a0993fceed73e8b48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 10:37:38 +0200 Subject: [PATCH 269/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin (#709) Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.5 to 3.2.6. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.5...maven-gpg-plugin-3.2.6) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 729b31a35..596851b92 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.2.5</version> + <version>3.2.6</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From c008e44adcecdbd6e2cb9fc38188d6a39226a0f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 11:17:47 +0100 Subject: [PATCH 270/313] build(deps): bump org.junit:junit-bom from 5.11.0 to 5.11.1 (#710) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.11.0 to 5.11.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.11.0...r5.11.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 596851b92..e91684214 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.11.0</version> + <version>5.11.1</version> <type>pom</type> <scope>import</scope> </dependency> From e415cf304be4e66276c7f722862c89b4f0e23ad0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 09:19:21 +0100 Subject: [PATCH 271/313] build(deps): bump org.cyclonedx:cyclonedx-maven-plugin (#711) Bumps [org.cyclonedx:cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.8.1 to 2.8.2. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.8.1...cyclonedx-maven-plugin-2.8.2) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e91684214..8c08872b2 100644 --- a/pom.xml +++ b/pom.xml @@ -349,7 +349,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.8.1</version> + <version>2.8.2</version> </plugin> </plugins> </pluginManagement> From 1dea2c7b448f35d8957fee6d1803c17e47dfd799 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:07:27 +0000 Subject: [PATCH 272/313] build(deps): bump org.apache.maven.plugins:maven-gpg-plugin Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.6 to 3.2.7. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.6...maven-gpg-plugin-3.2.7) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8c08872b2..08fece95f 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>3.2.6</version> + <version>3.2.7</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 535a105169ed0747b2e2f1a90e537d515cfa660a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 08:10:34 +0000 Subject: [PATCH 273/313] build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.10.0 to 3.11.2. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.10.0...maven-javadoc-plugin-3.11.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8c08872b2..1bf172197 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.10.0</version> + <version>3.11.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 2db0ad6d2c43566682c9b9dc92e311b790b12564 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 08:28:50 +0000 Subject: [PATCH 274/313] build(deps): bump org.junit:junit-bom from 5.11.1 to 5.11.4 Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.11.1 to 5.11.4. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.11.1...r5.11.4) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8c08872b2..7e6e35496 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.11.1</version> + <version>5.11.4</version> <type>pom</type> <scope>import</scope> </dependency> From a8ef8e0979dd565a0370508e7fac2306cdc6191b Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Mon, 27 Jan 2025 04:43:39 +0100 Subject: [PATCH 275/313] 717 issue fix (#718) * Improve change detection to consider changeDefault field in ChangedSchema * Add test for defaults handling in Schema * Add test for defaults handling in Schema --- .../openapidiff/core/model/ChangedSchema.java | 1 + .../openapidiff/core/SchemaDefaultsTest.java | 26 +++++++++++++++++++ .../issue-717-schema-defaults-handling-1.yaml | 21 +++++++++++++++ .../issue-717-schema-defaults-handling-2.yaml | 21 +++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java create mode 100644 core/src/test/resources/issue-717-schema-defaults-handling-1.yaml create mode 100644 core/src/test/resources/issue-717-schema-defaults-handling-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index a8200ba40..aa527e4e6 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -136,6 +136,7 @@ private DiffResult calculateCoreChanged() { if (!changedType && (oldSchema == null && newSchema == null || oldSchema != null && newSchema != null) && !changeFormat + && !changeDefault && increasedProperties.isEmpty() && missingProperties.isEmpty() && changedProperties.values().isEmpty() diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java new file mode 100644 index 000000000..52abeac6d --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java @@ -0,0 +1,26 @@ +package org.openapitools.openapidiff.core; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.model.ChangedSchema; + +public class SchemaDefaultsTest { + + @Test + public void issue717DefaultsInSchema() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "issue-717-schema-defaults-handling-1.yaml", + "issue-717-schema-defaults-handling-2.yaml"); + + assertEquals(1, changedOpenApi.getChangedOperations().size()); + assertEquals(1, changedOpenApi.getChangedSchemas().size()); + ChangedSchema changedSchema = changedOpenApi.getChangedSchemas().get(0); + assertEquals(1, changedSchema.getChangedProperties().size()); + assertTrue(changedSchema.getChangedProperties().containsKey("field1")); + assertTrue(changedSchema.getChangedProperties().get("field1").isChangeDefault()); + } +} diff --git a/core/src/test/resources/issue-717-schema-defaults-handling-1.yaml b/core/src/test/resources/issue-717-schema-defaults-handling-1.yaml new file mode 100644 index 000000000..3ecee6886 --- /dev/null +++ b/core/src/test/resources/issue-717-schema-defaults-handling-1.yaml @@ -0,0 +1,21 @@ +openapi: 3.1.0 +info: + description: Schema defaults handling + title: defaults + version: 1.0.0 +paths: + /defaults/property-schema/: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + default: default value + type: string \ No newline at end of file diff --git a/core/src/test/resources/issue-717-schema-defaults-handling-2.yaml b/core/src/test/resources/issue-717-schema-defaults-handling-2.yaml new file mode 100644 index 000000000..143174770 --- /dev/null +++ b/core/src/test/resources/issue-717-schema-defaults-handling-2.yaml @@ -0,0 +1,21 @@ +openapi: 3.1.0 +info: + description: Schema defaults handling + title: defaults + version: 1.0.0 +paths: + /defaults/property-schema/: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + default: default value updated + type: string \ No newline at end of file From 6e072525b706975d248733c091a884b71df1b720 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Mon, 27 Jan 2025 04:55:02 +0100 Subject: [PATCH 276/313] Add support for examples diff (#671) --- .../openapidiff/core/compare/ContentDiff.java | 19 +- .../openapidiff/core/compare/HeaderDiff.java | 6 +- .../core/compare/MediaTypeDiff.java | 40 +++++ .../openapidiff/core/compare/OpenApiDiff.java | 6 + .../core/compare/ParameterDiff.java | 6 +- .../openapidiff/core/compare/SchemaDiff.java | 5 +- .../schemadiffresult/SchemaDiffResult.java | 6 +- .../core/model/ChangedExample.java | 66 +++++++ .../core/model/ChangedExamples.java | 66 +++++++ .../openapidiff/core/model/ChangedHeader.java | 30 +++- .../core/model/ChangedMediaType.java | 34 +++- .../core/model/ChangedParameter.java | 30 +++- .../openapidiff/core/model/ChangedSchema.java | 32 ++++ .../openapidiff/core/ExamplesDiffTest.java | 167 ++++++++++++++++++ .../openapidiff/core/TestUtils.java | 7 + ...issue-666-oas-3-0-examples-handling-1.yaml | 126 +++++++++++++ ...issue-666-oas-3-0-examples-handling-2.yaml | 126 +++++++++++++ ...issue-666-oas-3-1-examples-handling-1.yaml | 152 ++++++++++++++++ ...issue-666-oas-3-1-examples-handling-2.yaml | 152 ++++++++++++++++ 19 files changed, 1054 insertions(+), 22 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/compare/MediaTypeDiff.java create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExample.java create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExamples.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/ExamplesDiffTest.java create mode 100644 core/src/test/resources/issue-666-oas-3-0-examples-handling-1.yaml create mode 100644 core/src/test/resources/issue-666-oas-3-0-examples-handling-2.yaml create mode 100644 core/src/test/resources/issue-666-oas-3-1-examples-handling-1.yaml create mode 100644 core/src/test/resources/issue-666-oas-3-1-examples-handling-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ContentDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ContentDiff.java index b647172db..7cf27dca7 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ContentDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ContentDiff.java @@ -5,7 +5,9 @@ import io.swagger.v3.oas.models.media.Content; import io.swagger.v3.oas.models.media.MediaType; -import java.util.*; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedContent; import org.openapitools.openapidiff.core.model.ChangedMediaType; @@ -34,22 +36,15 @@ public DeferredChanged<ChangedContent> diff(Content left, Content right, DiffCon MediaType oldMediaType = left.get(mediaTypeKey); MediaType newMediaType = right.get(mediaTypeKey); - ChangedMediaType changedMediaType = - new ChangedMediaType(oldMediaType.getSchema(), newMediaType.getSchema(), context); - builder .with( openApiDiff - .getSchemaDiff() - .diff( - oldMediaType.getSchema(), - newMediaType.getSchema(), - context.copyWithRequired(true))) + .getMediaTypeDiff() + .diff(oldMediaType, newMediaType, context.copyWithRequired(true))) .ifPresent( value -> { - changedMediaType.setSchema(value); - if (!isUnchanged(changedMediaType)) { - changedMediaTypes.put(mediaTypeKey, changedMediaType); + if (!isUnchanged(value)) { + changedMediaTypes.put(mediaTypeKey, value); } }); }); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java index ecdfd5878..0f71c4963 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java @@ -6,6 +6,8 @@ import java.util.Objects; import java.util.Optional; import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.ChangedExample; +import org.openapitools.openapidiff.core.model.ChangedExamples; import org.openapitools.openapidiff.core.model.ChangedHeader; import org.openapitools.openapidiff.core.model.DiffContext; import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder; @@ -49,7 +51,9 @@ protected DeferredChanged<ChangedHeader> computeDiff( !Boolean.TRUE.equals(left.getDeprecated()) && Boolean.TRUE.equals(right.getDeprecated())) .setStyle(!Objects.equals(left.getStyle(), right.getStyle())) - .setExplode(getBooleanDiff(left.getExplode(), right.getExplode())); + .setExplode(getBooleanDiff(left.getExplode(), right.getExplode())) + .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) + .setExample(new ChangedExample(left.getExample(), right.getExample())); builder .with( openApiDiff diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/MediaTypeDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/MediaTypeDiff.java new file mode 100644 index 000000000..a80324a92 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/MediaTypeDiff.java @@ -0,0 +1,40 @@ +package org.openapitools.openapidiff.core.compare; + +import static org.openapitools.openapidiff.core.utils.ChangedUtils.isChanged; + +import io.swagger.v3.oas.models.media.MediaType; +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.ChangedExample; +import org.openapitools.openapidiff.core.model.ChangedExamples; +import org.openapitools.openapidiff.core.model.ChangedMediaType; +import org.openapitools.openapidiff.core.model.DiffContext; +import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder; +import org.openapitools.openapidiff.core.model.deferred.DeferredChanged; + +public class MediaTypeDiff { + + private final OpenApiDiff openApiDiff; + + public MediaTypeDiff(OpenApiDiff openApiDiff) { + this.openApiDiff = openApiDiff; + } + + public DeferredChanged<ChangedMediaType> diff( + MediaType left, MediaType right, DiffContext context) { + DeferredBuilder<Changed> builder = new DeferredBuilder<>(); + + ChangedMediaType changedMediaType = + new ChangedMediaType(left.getSchema(), right.getSchema(), context) + .setExample(new ChangedExample(left.getExample(), right.getExample())) + .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())); + + builder + .with( + openApiDiff + .getSchemaDiff() + .diff(left.getSchema(), right.getSchema(), context.copyWithRequired(true))) + .ifPresent(changedMediaType::setSchema); + + return builder.build().mapOptional(value -> isChanged(changedMediaType)); + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java index f56ed04da..c1bb414d8 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OpenApiDiff.java @@ -24,6 +24,7 @@ public class OpenApiDiff { private PathDiff pathDiff; private SchemaDiff schemaDiff; private ContentDiff contentDiff; + private MediaTypeDiff mediaTypeDiff; private ParametersDiff parametersDiff; private ParameterDiff parameterDiff; private RequestBodyDiff requestBodyDiff; @@ -76,6 +77,7 @@ private void initializeFields() { this.pathDiff = new PathDiff(this); this.schemaDiff = new SchemaDiff(this); this.contentDiff = new ContentDiff(this); + this.mediaTypeDiff = new MediaTypeDiff(this); this.parametersDiff = new ParametersDiff(this); this.parameterDiff = new ParameterDiff(this); this.requestBodyDiff = new RequestBodyDiff(this); @@ -204,6 +206,10 @@ public ContentDiff getContentDiff() { return this.contentDiff; } + public MediaTypeDiff getMediaTypeDiff() { + return this.mediaTypeDiff; + } + public ParametersDiff getParametersDiff() { return this.parametersDiff; } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java index 6652b0bc4..d85ad92a8 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java @@ -6,6 +6,8 @@ import java.util.Objects; import java.util.Optional; import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.ChangedExample; +import org.openapitools.openapidiff.core.model.ChangedExamples; import org.openapitools.openapidiff.core.model.ChangedParameter; import org.openapitools.openapidiff.core.model.DiffContext; import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder; @@ -56,7 +58,9 @@ protected DeferredChanged<ChangedParameter> computeDiff( .setChangeAllowEmptyValue( getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue())) .setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle())) - .setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode())); + .setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode())) + .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) + .setExample(new ChangedExample(left.getExample(), right.getExample())); builder .with( openApiDiff diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java index 1d1961bf7..1b410818b 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java @@ -106,7 +106,7 @@ protected static Schema<?> resolveComposedSchema( return schema; } - protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) { + protected static <T, U> Schema<T> addSchema(Schema<T> schema, Schema<U> fromSchema) { if (fromSchema.getProperties() != null) { if (schema.getProperties() == null) { schema.setProperties(new LinkedHashMap<>()); @@ -206,6 +206,9 @@ protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) { if (fromSchema.getExample() != null) { schema.setExample(fromSchema.getExample()); } + if (fromSchema.getExamples() != null) { + schema.setExamples((List<T>) fromSchema.getExamples()); + } if (fromSchema.getExternalDocs() != null) { if (schema.getExternalDocs() == null) { schema.setExternalDocs(new ExternalDocumentation()); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index 6886f8c54..7b59bc3b1 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -11,6 +11,8 @@ import org.openapitools.openapidiff.core.compare.OpenApiDiff; import org.openapitools.openapidiff.core.model.Change; import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.ChangedExample; +import org.openapitools.openapidiff.core.model.ChangedExamples; import org.openapitools.openapidiff.core.model.ChangedSchema; import org.openapitools.openapidiff.core.model.DiffContext; import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder; @@ -70,7 +72,9 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( right.getExclusiveMinimum(), left.getExclusiveMaximum(), right.getExclusiveMaximum(), - context)); + context)) + .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) + .setExample(new ChangedExample(left.getExample(), right.getExample())); builder .with( openApiDiff diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExample.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExample.java new file mode 100644 index 000000000..4e540eca3 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExample.java @@ -0,0 +1,66 @@ +package org.openapitools.openapidiff.core.model; + +import java.util.Objects; + +public class ChangedExample implements Changed { + + private Object leftExample; + private Object rightExample; + + public ChangedExample(Object leftExample, Object rightExample) { + this.leftExample = leftExample; + this.rightExample = rightExample; + } + + public Object getLeftExample() { + return leftExample; + } + + public void setLeftExample(Object leftExample) { + this.leftExample = leftExample; + } + + public Object getRightExample() { + return rightExample; + } + + public void setRightExample(Object rightExample) { + this.rightExample = rightExample; + } + + @Override + public DiffResult isChanged() { + if (!Objects.equals(leftExample, rightExample)) { + return DiffResult.METADATA; + } + return DiffResult.NO_CHANGES; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + if (object == null || getClass() != object.getClass()) { + return false; + } + ChangedExample that = (ChangedExample) object; + return Objects.equals(leftExample, that.leftExample) + && Objects.equals(rightExample, that.rightExample); + } + + @Override + public int hashCode() { + return Objects.hash(leftExample, rightExample); + } + + @Override + public String toString() { + return "ChangedExample{" + + "leftExample=" + + leftExample + + ", rightExample=" + + rightExample + + '}'; + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExamples.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExamples.java new file mode 100644 index 000000000..c1a00bbbc --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedExamples.java @@ -0,0 +1,66 @@ +package org.openapitools.openapidiff.core.model; + +import java.util.Objects; + +public class ChangedExamples implements Changed { + + private Object leftExamples; + private Object rightExamples; + + public ChangedExamples(Object leftExamples, Object rightExamples) { + this.leftExamples = leftExamples; + this.rightExamples = rightExamples; + } + + public Object getLeftExamples() { + return leftExamples; + } + + public void setLeftExamples(Object leftExamples) { + this.leftExamples = leftExamples; + } + + public Object getRightExamples() { + return rightExamples; + } + + public void setRightExamples(Object rightExamples) { + this.rightExamples = rightExamples; + } + + @Override + public DiffResult isChanged() { + if (!Objects.equals(leftExamples, rightExamples)) { + return DiffResult.METADATA; + } + return DiffResult.NO_CHANGES; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + if (object == null || getClass() != object.getClass()) { + return false; + } + ChangedExamples that = (ChangedExamples) object; + return Objects.equals(leftExamples, that.leftExamples) + && Objects.equals(rightExamples, that.rightExamples); + } + + @Override + public int hashCode() { + return Objects.hash(leftExamples, rightExamples); + } + + @Override + public String toString() { + return "ChangedExamples{" + + ", leftExamples=" + + leftExamples + + ", rightExamples=" + + rightExamples + + '}'; + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java index b7f505a9b..0c9e3384f 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedHeader.java @@ -18,6 +18,8 @@ public class ChangedHeader implements ComposedChanged { private boolean style; private boolean explode; private ChangedMetadata description; + private ChangedExamples examples; + private ChangedExample example; private ChangedSchema schema; private ChangedContent content; private ChangedExtensions extensions; @@ -30,7 +32,7 @@ public ChangedHeader(Header oldHeader, Header newHeader, DiffContext context) { @Override public List<Changed> getChangedElements() { - return Arrays.asList(description, schema, content, extensions); + return Arrays.asList(description, example, examples, schema, content, extensions); } @Override @@ -96,6 +98,14 @@ public ChangedMetadata getDescription() { return this.description; } + public ChangedExamples getExamples() { + return this.examples; + } + + public ChangedExample getExample() { + return this.example; + } + public ChangedSchema getSchema() { return this.schema; } @@ -133,6 +143,16 @@ public ChangedHeader setDescription(final ChangedMetadata description) { return this; } + public ChangedHeader setExamples(ChangedExamples examples) { + this.examples = examples; + return this; + } + + public ChangedHeader setExample(ChangedExample example) { + this.example = example; + return this; + } + public ChangedHeader setSchema(final ChangedSchema schema) { this.schema = schema; return this; @@ -161,6 +181,8 @@ public boolean equals(Object o) { && Objects.equals(newHeader, that.newHeader) && Objects.equals(context, that.context) && Objects.equals(description, that.description) + && Objects.equals(examples, that.examples) + && Objects.equals(example, that.example) && Objects.equals(schema, that.schema) && Objects.equals(content, that.content) && Objects.equals(extensions, that.extensions); @@ -177,6 +199,8 @@ public int hashCode() { style, explode, description, + examples, + example, schema, content, extensions); @@ -200,6 +224,10 @@ public java.lang.String toString() { + this.isExplode() + ", description=" + this.getDescription() + + ", examples=" + + this.getExamples() + + ", example=" + + this.getExample() + ", schema=" + this.getSchema() + ", content=" diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedMediaType.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedMediaType.java index 7136dea04..43f9a443d 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedMediaType.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedMediaType.java @@ -1,7 +1,7 @@ package org.openapitools.openapidiff.core.model; import io.swagger.v3.oas.models.media.Schema; -import java.util.Collections; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -10,6 +10,8 @@ public class ChangedMediaType implements ComposedChanged { private final Schema newSchema; private final DiffContext context; private ChangedSchema schema; + private ChangedExamples examples; + private ChangedExample example; public ChangedMediaType(Schema oldSchema, Schema newSchema, DiffContext context) { this.oldSchema = oldSchema; @@ -19,7 +21,7 @@ public ChangedMediaType(Schema oldSchema, Schema newSchema, DiffContext context) @Override public List<Changed> getChangedElements() { - return Collections.singletonList(schema); + return Arrays.asList(schema, examples, example); } @Override @@ -43,11 +45,29 @@ public ChangedSchema getSchema() { return this.schema; } + public ChangedExamples getExamples() { + return this.examples; + } + + public ChangedExample getExample() { + return this.example; + } + public ChangedMediaType setSchema(final ChangedSchema schema) { this.schema = schema; return this; } + public ChangedMediaType setExamples(final ChangedExamples examples) { + this.examples = examples; + return this; + } + + public ChangedMediaType setExample(final ChangedExample example) { + this.example = example; + return this; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -56,12 +76,14 @@ public boolean equals(Object o) { return Objects.equals(oldSchema, that.oldSchema) && Objects.equals(newSchema, that.newSchema) && Objects.equals(context, that.context) - && Objects.equals(schema, that.schema); + && Objects.equals(schema, that.schema) + && Objects.equals(examples, that.examples) + && Objects.equals(example, that.example); } @Override public int hashCode() { - return Objects.hash(oldSchema, newSchema, context, schema); + return Objects.hash(oldSchema, newSchema, context, schema, examples, example); } @java.lang.Override @@ -74,6 +96,10 @@ public java.lang.String toString() { + this.getContext() + ", schema=" + this.getSchema() + + ", examples=" + + this.getExamples() + + ", example=" + + this.getExample() + ")"; } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java index ff1ccfb48..4b8208e24 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedParameter.java @@ -19,6 +19,8 @@ public class ChangedParameter implements ComposedChanged { private boolean changeExplode; private boolean changeAllowEmptyValue; private ChangedMetadata description; + private ChangedExamples examples; + private ChangedExample example; private ChangedSchema schema; private ChangedContent content; private ChangedExtensions extensions; @@ -31,7 +33,7 @@ public ChangedParameter(String name, String in, DiffContext context) { @Override public List<Changed> getChangedElements() { - return Arrays.asList(description, schema, content, extensions); + return Arrays.asList(description, examples, example, schema, content, extensions); } @Override @@ -110,6 +112,14 @@ public ChangedMetadata getDescription() { return this.description; } + public ChangedExamples getExamples() { + return this.examples; + } + + public ChangedExample getExample() { + return this.example; + } + public ChangedSchema getSchema() { return this.schema; } @@ -172,6 +182,16 @@ public ChangedParameter setDescription(final ChangedMetadata description) { return this; } + public ChangedParameter setExamples(final ChangedExamples examples) { + this.examples = examples; + return this; + } + + public ChangedParameter setExample(final ChangedExample example) { + this.example = example; + return this; + } + public ChangedParameter setSchema(final ChangedSchema schema) { this.schema = schema; return this; @@ -203,6 +223,8 @@ public boolean equals(Object o) { && Objects.equals(name, that.name) && Objects.equals(in, that.in) && Objects.equals(description, that.description) + && Objects.equals(examples, that.examples) + && Objects.equals(example, that.example) && Objects.equals(schema, that.schema) && Objects.equals(content, that.content) && Objects.equals(extensions, that.extensions); @@ -222,6 +244,8 @@ public int hashCode() { changeExplode, changeAllowEmptyValue, description, + examples, + example, schema, content, extensions); @@ -251,6 +275,10 @@ public java.lang.String toString() { + this.isChangeAllowEmptyValue() + ", description=" + this.getDescription() + + ", examples=" + + this.getExamples() + + ", example=" + + this.getExample() + ", schema=" + this.getSchema() + ", content=" diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index aa527e4e6..aa3de8d1e 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -25,6 +25,8 @@ public class ChangedSchema implements ComposedChanged { protected Map<String, Schema<?>> missingProperties; protected boolean changeDeprecated; protected ChangedMetadata description; + protected ChangedExamples examples; + protected ChangedExample example; protected boolean changeTitle; protected ChangedRequired required; protected boolean changeDefault; @@ -106,6 +108,8 @@ public List<Changed> getChangedElements() { changedProperties.values().stream(), Stream.of( description, + examples, + example, readOnly, writeOnly, items, @@ -222,6 +226,14 @@ public boolean isChangeDeprecated() { return this.changeDeprecated; } + public ChangedExamples getExamples() { + return this.examples; + } + + public ChangedExample getExample() { + return this.example; + } + public ChangedMetadata getDescription() { return this.description; } @@ -332,6 +344,18 @@ public ChangedSchema setDescription(final ChangedMetadata description) { return this; } + public ChangedSchema setExamples(final ChangedExamples examples) { + clearChangedCache(); + this.examples = examples; + return this; + } + + public ChangedSchema setExample(final ChangedExample example) { + clearChangedCache(); + this.example = example; + return this; + } + public ChangedSchema setChangeTitle(final boolean changeTitle) { clearChangedCache(); this.changeTitle = changeTitle; @@ -441,6 +465,8 @@ public boolean equals(Object o) { && Objects.equals(increasedProperties, that.increasedProperties) && Objects.equals(missingProperties, that.missingProperties) && Objects.equals(description, that.description) + && Objects.equals(examples, that.examples) + && Objects.equals(example, that.example) && Objects.equals(required, that.required) && Objects.equals(enumeration, that.enumeration) && Objects.equals(readOnly, that.readOnly) @@ -465,6 +491,8 @@ public int hashCode() { missingProperties, changeDeprecated, description, + examples, + example, changeTitle, required, changeDefault, @@ -502,6 +530,10 @@ public java.lang.String toString() { + this.isChangeDeprecated() + ", description=" + this.getDescription() + + ", examples=" + + this.getExamples() + + ", example=" + + this.getExample() + ", changeTitle=" + this.isChangeTitle() + ", required=" diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ExamplesDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ExamplesDiffTest.java new file mode 100644 index 000000000..1743de4d1 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/ExamplesDiffTest.java @@ -0,0 +1,167 @@ +package org.openapitools.openapidiff.core; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.openapitools.openapidiff.core.TestUtils.getOpenApiChangedOperations; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOperation; + +public class ExamplesDiffTest { + + @Test + public void issue666OAS30ExampleInMediaType() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-0-examples-handling-1.yaml", + "issue-666-oas-3-0-examples-handling-2.yaml"); + + ChangedOperation requestMediaTypeExampleChanged = + changedOperations.stream() + .filter(o -> "/example/request/media-type".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + ChangedOperation responseMediaTypeExampleChanged = + changedOperations.stream() + .filter(o -> "/example/response/media-type".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(requestMediaTypeExampleChanged).isNotNull(); + assertThat(responseMediaTypeExampleChanged).isNotNull(); + } + + @Test + public void issue666OAS31ExamplesInMediaType() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-1-examples-handling-1.yaml", + "issue-666-oas-3-1-examples-handling-2.yaml"); + + ChangedOperation requestMediaTypeExamplesChanged = + changedOperations.stream() + .filter(o -> "/examples/request/media-type".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + ChangedOperation responseMediaTypeExamplesChanged = + changedOperations.stream() + .filter(o -> "/examples/response/media-type".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(requestMediaTypeExamplesChanged).isNotNull(); + assertThat(responseMediaTypeExamplesChanged).isNotNull(); + } + + @Test + public void issue666OAS30ExampleInParameter() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-0-examples-handling-1.yaml", + "issue-666-oas-3-0-examples-handling-2.yaml"); + + ChangedOperation paramExampleChanged = + changedOperations.stream() + .filter(o -> "/example/parameter/{id}".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(paramExampleChanged).isNotNull(); + } + + @Test + public void issue666OAS31ExamplesInParameter() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-1-examples-handling-1.yaml", + "issue-666-oas-3-1-examples-handling-2.yaml"); + + ChangedOperation paramExamplesChanged = + changedOperations.stream() + .filter(o -> "/examples/parameter/{id}".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(paramExamplesChanged).isNotNull(); + } + + @Test + public void issue666OAS30ExampleInResponseHeader() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-0-examples-handling-1.yaml", + "issue-666-oas-3-0-examples-handling-2.yaml"); + + ChangedOperation operation = + changedOperations.stream() + .filter(o -> "/example/response/header".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(operation).isNotNull(); + } + + @Test + public void issue666OAS31ExamplesInResponseHeader() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-1-examples-handling-1.yaml", + "issue-666-oas-3-1-examples-handling-2.yaml"); + + ChangedOperation operation = + changedOperations.stream() + .filter(o -> "/examples/response/header".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(operation).isNotNull(); + } + + @Test + public void issue666OAS30ExampleInSchema() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-0-examples-handling-1.yaml", + "issue-666-oas-3-0-examples-handling-2.yaml"); + + ChangedOperation operation = + changedOperations.stream() + .filter(o -> "/example/model/property".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(operation).isNotNull(); + } + + @Test + public void issue666OAS31ExamplesInSchema() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-1-examples-handling-1.yaml", + "issue-666-oas-3-1-examples-handling-2.yaml"); + + ChangedOperation operation = + changedOperations.stream() + .filter(o -> "/examples/model/property".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(operation).isNotNull(); + } + + @Test + public void issue666OAS30ExampleInComposedSchema() { + List<ChangedOperation> changedOperations = + getOpenApiChangedOperations( + "issue-666-oas-3-0-examples-handling-1.yaml", + "issue-666-oas-3-0-examples-handling-2.yaml"); + + ChangedOperation operation = + changedOperations.stream() + .filter(o -> "/example/model/property/composed".equals(o.getPathUrl())) + .findFirst() + .orElse(null); + + assertThat(operation).isNotNull(); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java b/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java index 64dac2767..597bf830f 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/TestUtils.java @@ -3,9 +3,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.slf4j.LoggerFactory.getLogger; +import java.util.List; import org.openapitools.openapidiff.core.compare.OpenApiDiffOptions; import org.openapitools.openapidiff.core.model.BackwardIncompatibleProp; import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.model.ChangedOperation; import org.openapitools.openapidiff.core.model.DiffResult; import org.slf4j.Logger; @@ -72,4 +74,9 @@ public static void assertOpenApiBackwardIncompatible(String oldSpec, String newS LOG.info("Result: {}", changedOpenApi.isChanged().getValue()); assertThat(changedOpenApi.isIncompatible()).isTrue(); } + + public static List<ChangedOperation> getOpenApiChangedOperations(String oldSpec, String newSpec) { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); + return changedOpenApi.getChangedOperations(); + } } diff --git a/core/src/test/resources/issue-666-oas-3-0-examples-handling-1.yaml b/core/src/test/resources/issue-666-oas-3-0-examples-handling-1.yaml new file mode 100644 index 000000000..041db37f6 --- /dev/null +++ b/core/src/test/resources/issue-666-oas-3-0-examples-handling-1.yaml @@ -0,0 +1,126 @@ +openapi: 3.0.2 +info: + description: Examples handling + title: Examples + version: 1.0.0 +paths: + /example/request/media-type: + post: + requestBody: + content: + application/json: + example: simple example + schema: + type: string + responses: + '200': + description: description + content: + application/json: + schema: + type: string + /example/response/media-type: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + content: + application/json: + example: simple example + schema: + type: string + /example/parameter/{id}: + post: + parameters: + - name: id + in: path + example: example + schema: + type: string + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + content: + application/json: + schema: + type: string + /example/response/header: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + headers: + X-Header: + example: example + schema: + type: integer + format: int32 + content: + application/json: + schema: + type: string + /example/model/property: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TestDTO" + responses: + '200': + description: description + content: + application/json: + schema: + type: string + /example/model/property/composed: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TestComposedDTO" + responses: + '200': + description: description + content: + application/json: + schema: + type: string +components: + schemas: + TestDTO: + type: object + properties: + field1: + example: example + type: string + TestDTO2: + type: object + properties: + field2: + example: example + type: string + TestComposedDTO: + type: object + properties: + field1: + type: object + allOf: + - $ref: "#/components/schemas/TestDTO" + - $ref: "#/components/schemas/TestDTO2" \ No newline at end of file diff --git a/core/src/test/resources/issue-666-oas-3-0-examples-handling-2.yaml b/core/src/test/resources/issue-666-oas-3-0-examples-handling-2.yaml new file mode 100644 index 000000000..e0d5914a5 --- /dev/null +++ b/core/src/test/resources/issue-666-oas-3-0-examples-handling-2.yaml @@ -0,0 +1,126 @@ +openapi: 3.0.2 +info: + description: Examples handling + title: Examples + version: 2.0.0 +paths: + /example/request/media-type: + post: + requestBody: + content: + application/json: + example: simple example updated + schema: + type: string + responses: + '200': + description: description + content: + application/json: + schema: + type: string + /example/response/media-type: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + content: + application/json: + example: simple example updated + schema: + type: string + /example/parameter/{id}: + post: + parameters: + - name: id + in: path + example: example updated + schema: + type: string + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + content: + application/json: + schema: + type: string + /example/response/header: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + headers: + X-Header: + example: updated example + schema: + type: integer + format: int32 + content: + application/json: + schema: + type: string + /example/model/property: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TestDTO" + responses: + '200': + description: description + content: + application/json: + schema: + type: string + /example/model/property/composed: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TestComposedDTO" + responses: + '200': + description: description + content: + application/json: + schema: + type: string +components: + schemas: + TestDTO: + type: object + properties: + field1: + example: example updated + type: string + TestDTO2: + type: object + properties: + field2: + example: example updated + type: string + TestComposedDTO: + type: object + properties: + field1: + type: object + allOf: + - $ref: "#/components/schemas/TestDTO" + - $ref: "#/components/schemas/TestDTO2" \ No newline at end of file diff --git a/core/src/test/resources/issue-666-oas-3-1-examples-handling-1.yaml b/core/src/test/resources/issue-666-oas-3-1-examples-handling-1.yaml new file mode 100644 index 000000000..e03ea0090 --- /dev/null +++ b/core/src/test/resources/issue-666-oas-3-1-examples-handling-1.yaml @@ -0,0 +1,152 @@ +openapi: 3.1.0 +info: + description: Examples handling + title: Examples + version: 1.0.0 +paths: + /example/request/media-type: + post: + requestBody: + content: + application/json: + example: simple example + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /examples/request/media-type: + post: + requestBody: + content: + application/json: + examples: + first: example + second: example + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /example/response/media-type: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + example: simple example + schema: + type: string + /examples/response/media-type: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + examples: + first: example + second: example + schema: + type: string + /example/parameter/{id}: + post: + parameters: + - name: id + in: path + example: example + schema: + type: string + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /examples/parameter/{id}: + post: + parameters: + - name: id + in: path + examples: + first: example + second: example + schema: + type: string + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /examples/response/header: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + headers: + X-Header: + examples: + first: example + second: example + schema: + type: integer + format: int32 + content: + application/json: + schema: + type: string + /examples/model/property: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TestDTO" + responses: + '200': + description: description + content: + application/json: + schema: + type: string +components: + schemas: + TestDTO: + type: object + properties: + field1: + examples: + - first example + - second example + type: string \ No newline at end of file diff --git a/core/src/test/resources/issue-666-oas-3-1-examples-handling-2.yaml b/core/src/test/resources/issue-666-oas-3-1-examples-handling-2.yaml new file mode 100644 index 000000000..26d11d91d --- /dev/null +++ b/core/src/test/resources/issue-666-oas-3-1-examples-handling-2.yaml @@ -0,0 +1,152 @@ +openapi: 3.1.0 +info: + description: Examples handling + title: Examples + version: 2.0.0 +paths: + /example/request/media-type: + post: + requestBody: + content: + application/json: + example: simple example updated + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /examples/request/media-type: + post: + requestBody: + content: + application/json: + examples: + first: example updated + second: example updated + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /example/response/media-type: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + example: simple example updated + schema: + type: string + /examples/response/media-type: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + examples: + first: example updated + second: example updated + schema: + type: string + /example/parameter/{id}: + post: + parameters: + - name: id + in: path + example: example updated + schema: + type: string + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /examples/parameter/{id}: + post: + parameters: + - name: id + in: path + examples: + first: example updated + second: example updated + schema: + type: string + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + content: + application/json: + schema: + type: string + /examples/response/header: + post: + requestBody: + content: + application/json: + schema: + type: string + responses: + '200': + description: description + headers: + X-Header: + examples: + first: example updated + second: example updated + schema: + type: integer + format: int32 + content: + application/json: + schema: + type: string + /examples/model/property: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TestDTO" + responses: + '200': + description: description + content: + application/json: + schema: + type: string +components: + schemas: + TestDTO: + type: object + properties: + field1: + examples: + - first example updated + - second example updated + type: string \ No newline at end of file From 5649672464e193d94802c4b07415205619110b67 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Mon, 27 Jan 2025 04:59:54 +0100 Subject: [PATCH 277/313] Add support for distinguishing equivalent paths by parameter format in overloaded parameters (#661) * Add support for distinguishing equivalent paths by parameter format in overloaded parameters * Fix typos in PathsDiff.java * Add test case for complex path parameter with dot while handling overloaded parameters --------- Co-authored-by: Aliaksandr Pinchuk <apinchuk@eisgroup.com> --- .../openapidiff/core/compare/PathsDiff.java | 18 ++++++++-- .../resources/parameters_overloading.yaml | 35 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java index 49cbff9c4..8b4f459b8 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/PathsDiff.java @@ -125,6 +125,8 @@ private static boolean methodsAndParametersIntersect(PathItem a, PathItem b) { } /** + * Checks if provided parameter pairs are equal by type and format + * * @param left parameters from the first compared method * @param right parameters from the second compared method * @return <code>true</code> in case each parameter pair is of the same type; <code>false</code> @@ -134,9 +136,21 @@ private static boolean parametersIntersect(List<Parameter> left, List<Parameter> int parametersSize = left.size(); long intersectedParameters = IntStream.range(0, left.size()) - .filter( - i -> left.get(i).getSchema().getType().equals(right.get(i).getSchema().getType())) + .filter(i -> parametersTypeEquals(left.get(i), right.get(i))) .count(); return parametersSize == intersectedParameters; } + + /** + * Checks if provided parameter pair is equal by type and format + * + * @param left parameter from the first compared method + * @param right parameter from the second compared method + * @return <code>true</code> in case parameter pair is of the same type; <code>false</code> + * otherwise + */ + private static boolean parametersTypeEquals(Parameter left, Parameter right) { + return Objects.equals(left.getSchema().getType(), right.getSchema().getType()) + && Objects.equals(left.getSchema().getFormat(), right.getSchema().getFormat()); + } } diff --git a/core/src/test/resources/parameters_overloading.yaml b/core/src/test/resources/parameters_overloading.yaml index bd3bee96c..061444451 100644 --- a/core/src/test/resources/parameters_overloading.yaml +++ b/core/src/test/resources/parameters_overloading.yaml @@ -3,6 +3,21 @@ info: title: Projects API version: 1.0.0 paths: + /projects/{key}: + get: + parameters: + - in: path + name: key + required: true + schema: + type: string + responses: + '200': + description: 'Success' + content: + application/json: + schema: + $ref: '#/components/schemas/SampleResponse' /projects/{id}: get: parameters: @@ -35,6 +50,26 @@ paths: application/json: schema: $ref: '#/components/schemas/SampleResponse' + /projects/{id}.{idPostfix}: + get: + parameters: + - in: path + name: id + required: true + schema: + type: string + - in: path + name: idPostfix + required: true + schema: + type: string + responses: + '200': + description: 'Success' + content: + application/json: + schema: + $ref: '#/components/schemas/SampleResponse' components: schemas: SampleResponse: From e6f92c0d58c5a907fcc143262cb732a88dbf82d4 Mon Sep 17 00:00:00 2001 From: DrSatyr <DrSatyr@users.noreply.github.com> Date: Mon, 27 Jan 2025 23:01:31 +0000 Subject: [PATCH 278/313] [maven-release-plugin] prepare release 2.1.0-beta.12 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 1ffcc3000..e7691818c 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.12</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index 0f056b319..b9fabe675 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.12</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 356a10e0e..9977c097a 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.12</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.12</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index cf9e70c5b..968a055f2 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.12</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index 243bc3fab..ab454f8d7 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.12</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>HEAD</tag> + <tag>2.1.0-beta.12</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2024-04-24T18:56:12Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2025-01-27T23:00:45Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-SNAPSHOT</version> + <version>2.1.0-beta.12</version> </dependency> <dependency> <groupId>org.junit</groupId> From 9c1fae109e14478e9073cb49979374cf6baae9da Mon Sep 17 00:00:00 2001 From: DrSatyr <DrSatyr@users.noreply.github.com> Date: Mon, 27 Jan 2025 23:01:35 +0000 Subject: [PATCH 279/313] [maven-release-plugin] prepare for next development iteration --- cli/pom.xml | 2 +- core/pom.xml | 2 +- maven-example/pom.xml | 4 ++-- maven/pom.xml | 2 +- pom.xml | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index e7691818c..1ffcc3000 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.12</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-cli</artifactId> diff --git a/core/pom.xml b/core/pom.xml index b9fabe675..0f056b319 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.12</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-core</artifactId> diff --git a/maven-example/pom.xml b/maven-example/pom.xml index 9977c097a..356a10e0e 100644 --- a/maven-example/pom.xml +++ b/maven-example/pom.xml @@ -3,7 +3,7 @@ <parent> <artifactId>openapi-diff-parent</artifactId> <groupId>org.openapitools.openapidiff</groupId> - <version>2.1.0-beta.12</version> + <version>2.1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -23,7 +23,7 @@ <plugin> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-maven</artifactId> - <version>2.1.0-beta.12</version> + <version>2.1.0-SNAPSHOT</version> <executions> <execution> <goals> diff --git a/maven/pom.xml b/maven/pom.xml index 968a055f2..cf9e70c5b 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.12</version> + <version>2.1.0-SNAPSHOT</version> </parent> <artifactId>openapi-diff-maven</artifactId> diff --git a/pom.xml b/pom.xml index ab454f8d7..90422c762 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-parent</artifactId> - <version>2.1.0-beta.12</version> + <version>2.1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>openapi-diff-parent</name> @@ -54,7 +54,7 @@ <connection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</connection> <developerConnection>scm:git:https://github.com/OpenAPITools/openapi-diff.git</developerConnection> <url>https://github.com/OpenAPITools/openapi-diff</url> - <tag>2.1.0-beta.12</tag> + <tag>HEAD</tag> </scm> <distributionManagement> @@ -75,7 +75,7 @@ <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.build.outputTimestamp>2025-01-27T23:00:45Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2025-01-27T23:01:35Z</project.build.outputTimestamp> <project.scm.id>github</project.scm.id> <sonar.organization>openapitools</sonar.organization> @@ -92,7 +92,7 @@ <dependency> <groupId>org.openapitools.openapidiff</groupId> <artifactId>openapi-diff-core</artifactId> - <version>2.1.0-beta.12</version> + <version>2.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.junit</groupId> From e282461184e4f5f593a1b05e015554365667d884 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Tue, 28 Jan 2025 01:23:30 +0100 Subject: [PATCH 280/313] Actualize badges in README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 36b1bcb92..dd2cec01c 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,14 @@ Compare two OpenAPI specifications (3.x) and render the difference to HTML plain [](https://github.com/OpenAPITools/openapi-diff/actions?query=branch%3Amaster+workflow%3A"Main+Build") [](https://sonarcloud.io/dashboard?id=OpenAPITools_openapi-diff) -[](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core) + +[](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core) +[](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core) [](https://gitpod.io/#https://github.com/OpenAPITools/openapi-diff) [](https://join.slack.com/t/openapi-generator/shared_invite/zt-12jxxd7p2-XUeQM~4pzsU9x~eGLQqX2g) -[](https://hub.docker.com/r/openapitools/openapi-diff) -[](https://hub.docker.com/r/openapitools/openapi-diff) +[](https://hub.docker.com/r/openapitools/openapi-diff) [](https://hub.docker.com/r/openapitools/openapi-diff/tags) # Requirements From ae3272bea2919e8143431e556bfd7bdb2110004f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 08:01:36 +0000 Subject: [PATCH 281/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.0 to 3.5.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.0...surefire-3.5.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90422c762..f00d41005 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.5.0</version> + <version>3.5.2</version> </plugin> <plugin> <groupId>com.coveo</groupId> From fd473cc37faf58710c7c65cd8083dfe02b34232f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 08:01:41 +0000 Subject: [PATCH 282/313] build(deps): bump swagger-parser.version from 2.1.22 to 2.1.25 Bumps `swagger-parser.version` from 2.1.22 to 2.1.25. Updates `io.swagger.parser.v3:swagger-parser-v3` from 2.1.22 to 2.1.25 Updates `io.swagger.parser.v3:swagger-parser` from 2.1.22 to 2.1.25 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.22...v2.1.25) Updates `io.swagger.parser.v3:swagger-parser-v2-converter` from 2.1.22 to 2.1.25 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90422c762..5cf7b6c15 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.22</swagger-parser.version> + <swagger-parser.version>2.1.25</swagger-parser.version> <slf4j.version>2.0.16</slf4j.version> </properties> From d18ad283ce6915d7ca092cc50f0fc067a1edec1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 08:01:44 +0000 Subject: [PATCH 283/313] build(deps): bump org.apache.maven.plugins:maven-site-plugin Bumps [org.apache.maven.plugins:maven-site-plugin](https://github.com/apache/maven-site-plugin) from 3.20.0 to 3.21.0. - [Release notes](https://github.com/apache/maven-site-plugin/releases) - [Commits](https://github.com/apache/maven-site-plugin/compare/maven-site-plugin-3.20.0...maven-site-plugin-3.21.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-site-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- maven/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/pom.xml b/maven/pom.xml index cf9e70c5b..afaa97de4 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -61,7 +61,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> - <version>3.20.0</version> + <version>3.21.0</version> </plugin> </plugins> </pluginManagement> From 4536adf4e6f5e7cc820221f53b5fdaa0f092d33d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 08:01:37 +0000 Subject: [PATCH 284/313] build(deps): bump org.assertj:assertj-core from 3.26.3 to 3.27.3 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.3...assertj-build-3.27.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f045af169..c787f8929 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.26.3</version> + <version>3.27.3</version> <scope>test</scope> </dependency> </dependencies> From 144352186978654be7c44a91d804365dfdc39434 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 08:01:49 +0000 Subject: [PATCH 285/313] build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 4.0.0.4121 to 5.0.0.4389. - [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases) - [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/4.0.0.4121...5.0.0.4389) --- updated-dependencies: - dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f045af169..a421cb6ca 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> - <version>4.0.0.4121</version> + <version>5.0.0.4389</version> </plugin> <plugin> <groupId>org.cyclonedx</groupId> From 88ea26a107e2b4b73ab430c36d33a182b01dc472 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 08:01:54 +0000 Subject: [PATCH 286/313] build(deps): bump org.cyclonedx:cyclonedx-maven-plugin Bumps [org.cyclonedx:cyclonedx-maven-plugin](https://github.com/CycloneDX/cyclonedx-maven-plugin) from 2.8.2 to 2.9.1. - [Release notes](https://github.com/CycloneDX/cyclonedx-maven-plugin/releases) - [Commits](https://github.com/CycloneDX/cyclonedx-maven-plugin/compare/cyclonedx-maven-plugin-2.8.2...cyclonedx-maven-plugin-2.9.1) --- updated-dependencies: - dependency-name: org.cyclonedx:cyclonedx-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f045af169..856d9925f 100644 --- a/pom.xml +++ b/pom.xml @@ -349,7 +349,7 @@ <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> - <version>2.8.2</version> + <version>2.9.1</version> </plugin> </plugins> </pluginManagement> From de11782204e4546940e5a8683c4739cf8170c010 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Thu, 30 Jan 2025 19:33:26 +0100 Subject: [PATCH 287/313] Migrate from deprecated circleCi openJDK image --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9ef615cc7..f7e564a85 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ jobs: working_directory: ~/openapi-diff docker: - - image: circleci/openjdk:8-jdk-node-browsers + - image: cimg/openjdk:8.0.442 steps: From d2e50d6b560578dcc2edfe0a6aa78a6bd4f3cfdc Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Thu, 30 Jan 2025 20:17:43 +0100 Subject: [PATCH 288/313] Fix sonar issues to pass quality gate --- .../openapidiff/core/compare/ParametersDiff.java | 4 +++- .../core/model/schema/ChangedNumericRange.java | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java index 352be4bf1..6de3b4c28 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java @@ -114,7 +114,9 @@ public boolean pathUnchangedParametersChanged( boolean samePathDifferentParameter = !newParameterRealized.equals(parameter); newParameterRealized.setName( newParameterName); // Important:: MUST Reset the name as this is not a copy - return samePathDifferentParameter; + if (samePathDifferentParameter) { + return true; + } } return false; } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java index cbb7b713d..151c12fb6 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNumericRange.java @@ -1,5 +1,6 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.apache.commons.lang3.BooleanUtils.isTrue; import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_NUMERIC_RANGE_DECREASED; import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_NUMERIC_RANGE_INCREASED; @@ -34,10 +35,10 @@ public DiffResult isChanged() { return DiffResult.COMPATIBLE; } - boolean exclusiveMaxOld = oldMaximumExclusiveValue != null && oldMaximumExclusiveValue; - boolean exclusiveMinOld = oldMinimumExclusiveValue != null && oldMinimumExclusiveValue; - boolean exclusiveMaxNew = newMaximumExclusiveValue != null && newMaximumExclusiveValue; - boolean exclusiveMinNew = newMinimumExclusiveValue != null && newMinimumExclusiveValue; + boolean exclusiveMaxOld = isTrue(oldMaximumExclusiveValue); + boolean exclusiveMinOld = isTrue(oldMinimumExclusiveValue); + boolean exclusiveMaxNew = isTrue(newMaximumExclusiveValue); + boolean exclusiveMinNew = isTrue(newMinimumExclusiveValue); int diffMax = compare(oldMaximumValue, newMaximumValue, false); int diffMin = compare(oldMinimumValue, newMinimumValue, true); From 9da0c09386ea325b0df20b4c5b9d9eb7c8b37075 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Thu, 30 Jan 2025 20:52:08 +0100 Subject: [PATCH 289/313] Revert "build(deps): bump fmt-maven-plugin from 2.9.1 to 2.13" --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4e404b7f9..9fc899bc7 100644 --- a/pom.xml +++ b/pom.xml @@ -308,7 +308,7 @@ <plugin> <groupId>com.coveo</groupId> <artifactId>fmt-maven-plugin</artifactId> - <version>2.13</version> + <version>2.9.1</version> </plugin> <plugin> <groupId>io.github.phillipuniverse</groupId> From 86a4453b018995c05396aa2d54f7dd3dd99c4951 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Fri, 7 Feb 2025 10:44:30 +0100 Subject: [PATCH 290/313] Add brew instructions to readme file. Fix for issue #744. --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dd2cec01c..9a487f243 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,14 @@ Available on [Maven Central](https://search.maven.org/artifact/org.openapitools. </dependency> ``` +# Homebrew +Available for Mac users on [brew](https://formulae.brew.sh/formula/openapi-diff) + +```bash +brew install openapi-diff +``` +Usage instructions in [Ussage -> Command line](#command-line) + # Docker Available on [Docker Hub](https://hub.docker.com/r/openapitools/openapi-diff/) as `openapitools/openapi-diff`. @@ -72,7 +80,6 @@ usage: openapi-diff <old> <new> --warn Print warning information ``` - ## Build the image This is only required if you want to try new changes in the Dockerfile of this project. From 19875753ed4242f1502e2c0b98ea3caa680e92ea Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Fri, 7 Feb 2025 15:40:18 +0100 Subject: [PATCH 291/313] Fix breaking changes in Render contract (#742) * Fix breaking changes in Render contract * Fix code review issue, update readme, add test, group render tests within one folder. * Fix formatting --- README.md | 51 ++++++------------- .../openapidiff/core/output/Render.java | 34 ++++++++++++- .../core/{ => output}/AsciidocRenderTest.java | 4 +- .../core/{ => output}/ConsoleRenderTest.java | 4 +- .../core/{ => output}/HtmlRenderTest.java | 4 +- .../core/{ => output}/JsonRenderTest.java | 4 +- .../core/{ => output}/MarkdownRenderTest.java | 4 +- .../openapidiff/core/output/RenderTest.java | 27 ++++++++++ 8 files changed, 86 insertions(+), 46 deletions(-) rename core/src/test/java/org/openapitools/openapidiff/core/{ => output}/AsciidocRenderTest.java (97%) rename core/src/test/java/org/openapitools/openapidiff/core/{ => output}/ConsoleRenderTest.java (96%) rename core/src/test/java/org/openapitools/openapidiff/core/{ => output}/HtmlRenderTest.java (87%) rename core/src/test/java/org/openapitools/openapidiff/core/{ => output}/JsonRenderTest.java (91%) rename core/src/test/java/org/openapitools/openapidiff/core/{ => output}/MarkdownRenderTest.java (94%) create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/output/RenderTest.java diff --git a/README.md b/README.md index 9a487f243..862561c2d 100644 --- a/README.md +++ b/README.md @@ -200,56 +200,37 @@ public class Main { #### HTML ```java -String html = new HtmlRender("Changelog", - "http://deepoove.com/swagger-diff/stylesheets/demo.css") - .render(diff); - -try { - FileWriter fw = new FileWriter("testNewApi.html"); - fw.write(html); - fw.close(); -} catch (IOException e) { - e.printStackTrace(); -} +String htmlRender = new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css"); +FileOutputStream outputStream = new FileOutputStream("testDiff.html"); +OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); +htmlRender.render(diff, outputStreamWriter); ``` #### Markdown ```java -String render = new MarkdownRender().render(diff); -try { - FileWriter fw = new FileWriter("testDiff.md"); - fw.write(render); - fw.close(); -} catch (IOException e) { - e.printStackTrace(); -} +JsonRender markdownRender = new MarkdownRender(); +FileOutputStream outputStream = new FileOutputStream("testDiff.md"); +OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); +markdownRender.render(diff, outputStreamWriter); ``` #### Asciidoc ```java -String render = new AsciidocRender().render(diff); -try { - FileWriter fw = new FileWriter("testDiff.adoc"); - fw.write(render); - fw.close(); -} catch (IOException e) { - e.printStackTrace(); -} +JsonRender asciidocRender = new AsciidocRender(); +FileOutputStream outputStream = new FileOutputStream("testDiff.adoc"); +OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); +asciidocRender.render(diff, outputStreamWriter); ``` #### JSON ```java -String render = new JsonRender().render(diff); -try { - FileWriter fw = new FileWriter("testDiff.json"); - fw.write(render); - fw.close(); -} catch (IOException e) { - e.printStackTrace(); -} +JsonRender jsonRender = new JsonRender(); +FileOutputStream outputStream = new FileOutputStream("testDiff.json"); +OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); +jsonRender.render(diff, outputStreamWriter); ``` ### Extensions diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java b/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java index 8169f31cd..529a290b9 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/Render.java @@ -1,5 +1,6 @@ package org.openapitools.openapidiff.core.output; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import org.openapitools.openapidiff.core.exception.RendererException; @@ -7,7 +8,38 @@ public interface Render { - void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter); + /** + * render provided diff object + * + * @param diff diff object to render + * @param outputStreamWriter writer for rendered results + */ + void render(ChangedOpenApi diff, OutputStreamWriter outputStreamWriter) throws RendererException; + + /** + * render provided diff object + * + * @deprecated since 2.1.0, use {@link Render#render(ChangedOpenApi, OutputStreamWriter)} to avoid + * massive String output issues. details <a + * href="https://github.com/OpenAPITools/openapi-diff/issues/543">#543</a> + * @param diff diff object to render + * @return rendered output + */ + @Deprecated + default String render(ChangedOpenApi diff) throws RendererException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(byteArrayOutputStream); + render(diff, outputStreamWriter); + String result = byteArrayOutputStream.toString(); + + try { + outputStreamWriter.close(); + } catch (IOException e) { + throw new RendererException(e); + } + + return result; + } default void safelyAppend(OutputStreamWriter outputStreamWriter, String csq) { try { diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AsciidocRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/output/AsciidocRenderTest.java similarity index 97% rename from core/src/test/java/org/openapitools/openapidiff/core/AsciidocRenderTest.java rename to core/src/test/java/org/openapitools/openapidiff/core/output/AsciidocRenderTest.java index dae2440eb..228623a2c 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/AsciidocRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/output/AsciidocRenderTest.java @@ -1,12 +1,12 @@ -package org.openapitools.openapidiff.core; +package org.openapitools.openapidiff.core.output; import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.output.AsciidocRender; public class AsciidocRenderTest { @Test diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/output/ConsoleRenderTest.java similarity index 96% rename from core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java rename to core/src/test/java/org/openapitools/openapidiff/core/output/ConsoleRenderTest.java index 83d024669..675633fcd 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ConsoleRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/output/ConsoleRenderTest.java @@ -1,12 +1,12 @@ -package org.openapitools.openapidiff.core; +package org.openapitools.openapidiff.core.output; import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.output.ConsoleRender; public class ConsoleRenderTest { @Test diff --git a/core/src/test/java/org/openapitools/openapidiff/core/HtmlRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/output/HtmlRenderTest.java similarity index 87% rename from core/src/test/java/org/openapitools/openapidiff/core/HtmlRenderTest.java rename to core/src/test/java/org/openapitools/openapidiff/core/output/HtmlRenderTest.java index aa44725c4..e62268d10 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/HtmlRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/output/HtmlRenderTest.java @@ -1,12 +1,12 @@ -package org.openapitools.openapidiff.core; +package org.openapitools.openapidiff.core.output; import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.output.HtmlRender; public class HtmlRenderTest { @Test diff --git a/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/output/JsonRenderTest.java similarity index 91% rename from core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java rename to core/src/test/java/org/openapitools/openapidiff/core/output/JsonRenderTest.java index 280dce9d0..da5ce9ecc 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/JsonRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/output/JsonRenderTest.java @@ -1,12 +1,12 @@ -package org.openapitools.openapidiff.core; +package org.openapitools.openapidiff.core.output; import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.output.JsonRender; public class JsonRenderTest { @Test diff --git a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/output/MarkdownRenderTest.java similarity index 94% rename from core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java rename to core/src/test/java/org/openapitools/openapidiff/core/output/MarkdownRenderTest.java index d30c6e0b1..fb1f24fef 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/output/MarkdownRenderTest.java @@ -1,12 +1,12 @@ -package org.openapitools.openapidiff.core; +package org.openapitools.openapidiff.core.output; import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.OpenApiCompare; import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.output.MarkdownRender; public class MarkdownRenderTest { @Test diff --git a/core/src/test/java/org/openapitools/openapidiff/core/output/RenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/output/RenderTest.java new file mode 100644 index 000000000..86f1e5842 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/output/RenderTest.java @@ -0,0 +1,27 @@ +package org.openapitools.openapidiff.core.output; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.io.IOException; +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.exception.RendererException; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; + +class RenderTest { + + private final Render testRenderImpl = + (diff, outputStreamWriter) -> { + try { + outputStreamWriter.write("Output"); + outputStreamWriter.close(); + } catch (IOException e) { + throw new RendererException(e); + } + }; + + @Test + void testDefaultRenderMethod() { + ChangedOpenApi diff = new ChangedOpenApi(null); + assertThat(testRenderImpl.render(diff)).isEqualTo("Output"); + } +} From 3afafefb71577bc9e8ee2654efc315f643d1498a Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Tue, 11 Feb 2025 10:20:37 +0100 Subject: [PATCH 292/313] Removal of 'deprecated' not detected (#743) * Fix issue #485 - Removal of 'deprecated' is not detected on schema, operation, parameter, and header level. * Reorganize tests structure * Extend test coverage for CchemaDiff, OperationDiff, ParameterDiff, HeaderDiff --- .../openapidiff/core/compare/HeaderDiff.java | 15 +- .../core/compare/OperationDiff.java | 3 +- .../core/compare/ParameterDiff.java | 17 +- .../schemadiffresult/SchemaDiffResult.java | 4 +- .../openapidiff/core/AddPropDiffTest.java | 21 -- .../openapidiff/core/AddPropPutDiffTest.java | 25 -- .../core/AdditionalPropertiesTest.java | 21 -- .../openapidiff/core/ChangesResolver.java | 72 ++++++ .../openapidiff/core/OperationDiffTest.java | 62 ++++- .../openapidiff/core/ParameterDiffTest.java | 213 ++++++++++++++++-- .../core/ParametersOverloadingTest.java | 27 --- .../core/PathParameterSchemaDiffTest.java | 53 ----- .../core/ResponseHeaderDiffTest.java | 86 +++++-- .../openapidiff/core/SchemaDefaultsTest.java | 26 --- .../openapidiff/core/SchemaDiffTest.java | 107 +++++++++ core/src/test/resources/header_1.yaml | 129 ----------- core/src/test/resources/header_2.yaml | 129 ----------- .../operationDiff/operation_diff_1.yaml | 54 +++++ .../operationDiff/operation_diff_2.yaml | 55 +++++ core/src/test/resources/operation_diff_1.yaml | 24 -- core/src/test/resources/operation_diff_2.yaml | 24 -- .../issue-458-integer-limits_1.yaml | 0 .../issue-458-integer-limits_10.yaml | 0 .../issue-458-integer-limits_11.yaml | 0 .../issue-458-integer-limits_12.yaml | 0 .../issue-458-integer-limits_13.yaml | 0 .../issue-458-integer-limits_14.yaml | 0 .../issue-458-integer-limits_15.yaml | 0 .../issue-458-integer-limits_2.yaml | 0 .../issue-458-integer-limits_3.yaml | 0 .../issue-458-integer-limits_4.yaml | 0 .../issue-458-integer-limits_5.yaml | 0 .../issue-458-integer-limits_6.yaml | 0 .../issue-458-integer-limits_7.yaml | 0 .../issue-458-integer-limits_8.yaml | 0 .../issue-458-integer-limits_9.yaml | 0 .../{ => parameterDiff}/issue-488-1.json | 0 .../{ => parameterDiff}/issue-488-2.json | 0 .../parameterDiff/parameter_diff_1.yaml | 102 +++++++++ .../parameterDiff/parameter_diff_2.yaml | 102 +++++++++ .../parameters_overloading.yaml | 0 .../parameters_overloading_2.yaml | 0 ...th_parameter_diff_param_name_diff_new.yaml | 0 ...th_parameter_diff_param_name_diff_old.yaml | 0 ..._parameter_diff_param_schema_diff_new.yaml | 0 ..._parameter_diff_param_schema_diff_old.yaml | 0 core/src/test/resources/parameters_diff.yaml | 185 --------------- .../src/test/resources/parameters_diff_1.yaml | 185 --------------- .../src/test/resources/parameters_diff_2.yaml | 183 --------------- .../responseHeaderDiff/response_header_1.yaml | 64 ++++++ .../responseHeaderDiff/response_header_2.yaml | 64 ++++++ .../schema-add-property-1.yaml} | 0 .../schema-add-property-2.yaml} | 0 .../schema-add-property-put-1.yaml} | 0 .../schema-add-property-put-2.yaml} | 0 .../schema-additional-properties-1.json} | 0 .../schema-additional-properties-2.json} | 0 .../schema-deprecated-handling-1.yaml | 33 +++ .../schema-deprecated-handling-2.yaml | 33 +++ .../schema-props-defaults-handling-1.yaml} | 0 .../schema-props-defaults-handling-2.yaml} | 0 61 files changed, 1015 insertions(+), 1103 deletions(-) delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java delete mode 100644 core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java create mode 100644 core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java delete mode 100644 core/src/test/resources/header_1.yaml delete mode 100644 core/src/test/resources/header_2.yaml create mode 100644 core/src/test/resources/operationDiff/operation_diff_1.yaml create mode 100644 core/src/test/resources/operationDiff/operation_diff_2.yaml delete mode 100644 core/src/test/resources/operation_diff_1.yaml delete mode 100644 core/src/test/resources/operation_diff_2.yaml rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_1.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_10.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_11.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_12.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_13.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_14.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_15.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_2.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_3.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_4.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_5.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_6.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_7.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_8.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-458-integer-limits_9.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/issue-488-1.json (100%) rename core/src/test/resources/{ => parameterDiff}/issue-488-2.json (100%) create mode 100644 core/src/test/resources/parameterDiff/parameter_diff_1.yaml create mode 100644 core/src/test/resources/parameterDiff/parameter_diff_2.yaml rename core/src/test/resources/{ => parameterDiff}/parameters_overloading.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/parameters_overloading_2.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/path_parameter_diff_param_name_diff_new.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/path_parameter_diff_param_name_diff_old.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/path_parameter_diff_param_schema_diff_new.yaml (100%) rename core/src/test/resources/{ => parameterDiff}/path_parameter_diff_param_schema_diff_old.yaml (100%) delete mode 100644 core/src/test/resources/parameters_diff.yaml delete mode 100644 core/src/test/resources/parameters_diff_1.yaml delete mode 100644 core/src/test/resources/parameters_diff_2.yaml create mode 100644 core/src/test/resources/responseHeaderDiff/response_header_1.yaml create mode 100644 core/src/test/resources/responseHeaderDiff/response_header_2.yaml rename core/src/test/resources/{add-prop-1.yaml => schemaDiff/schema-add-property-1.yaml} (100%) rename core/src/test/resources/{add-prop-2.yaml => schemaDiff/schema-add-property-2.yaml} (100%) rename core/src/test/resources/{add-prop-put-1.yaml => schemaDiff/schema-add-property-put-1.yaml} (100%) rename core/src/test/resources/{add-prop-put-2.yaml => schemaDiff/schema-add-property-put-2.yaml} (100%) rename core/src/test/resources/{issue-256_1.json => schemaDiff/schema-additional-properties-1.json} (100%) rename core/src/test/resources/{issue-256_2.json => schemaDiff/schema-additional-properties-2.json} (100%) create mode 100644 core/src/test/resources/schemaDiff/schema-deprecated-handling-1.yaml create mode 100644 core/src/test/resources/schemaDiff/schema-deprecated-handling-2.yaml rename core/src/test/resources/{issue-717-schema-defaults-handling-1.yaml => schemaDiff/schema-props-defaults-handling-1.yaml} (100%) rename core/src/test/resources/{issue-717-schema-defaults-handling-2.yaml => schemaDiff/schema-props-defaults-handling-2.yaml} (100%) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java index 0f71c4963..593c29df1 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/HeaderDiff.java @@ -4,7 +4,6 @@ import io.swagger.v3.oas.models.headers.Header; import java.util.HashSet; import java.util.Objects; -import java.util.Optional; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedExample; import org.openapitools.openapidiff.core.model.ChangedExamples; @@ -46,12 +45,10 @@ protected DeferredChanged<ChangedHeader> computeDiff( DeferredBuilder<Changed> builder = new DeferredBuilder<>(); ChangedHeader changedHeader = new ChangedHeader(left, right, context) - .setRequired(getBooleanDiff(left.getRequired(), right.getRequired())) - .setDeprecated( - !Boolean.TRUE.equals(left.getDeprecated()) - && Boolean.TRUE.equals(right.getDeprecated())) + .setRequired(!Objects.equals(left.getRequired(), right.getRequired())) + .setDeprecated(!Objects.equals(left.getDeprecated(), right.getDeprecated())) .setStyle(!Objects.equals(left.getStyle(), right.getStyle())) - .setExplode(getBooleanDiff(left.getExplode(), right.getExplode())) + .setExplode(!Objects.equals(left.getExplode(), right.getExplode())) .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) .setExample(new ChangedExample(left.getExample(), right.getExample())); builder @@ -77,10 +74,4 @@ protected DeferredChanged<ChangedHeader> computeDiff( .ifPresent(changedHeader::setExtensions); return builder.buildIsChanged(changedHeader); } - - private boolean getBooleanDiff(Boolean left, Boolean right) { - boolean leftRequired = Optional.ofNullable(left).orElse(Boolean.FALSE); - boolean rightRequired = Optional.ofNullable(right).orElse(Boolean.FALSE); - return leftRequired != rightRequired; - } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java index 8d960ba31..b44093263 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/OperationDiff.java @@ -57,8 +57,7 @@ public DeferredChanged<ChangedOperation> diff( .diff(oldOperation.getOperationId(), newOperation.getOperationId(), context)) .ifPresent(changedOperation::setOperationId); changedOperation.setDeprecated( - !Boolean.TRUE.equals(oldOperation.getDeprecated()) - && Boolean.TRUE.equals(newOperation.getDeprecated())); + !Objects.equals(oldOperation.getDeprecated(), newOperation.getDeprecated())); if (oldOperation.getRequestBody() != null || newOperation.getRequestBody() != null) { builder diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java index d85ad92a8..3a8389d16 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/ParameterDiff.java @@ -4,7 +4,6 @@ import io.swagger.v3.oas.models.parameters.Parameter; import java.util.HashSet; import java.util.Objects; -import java.util.Optional; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.ChangedExample; import org.openapitools.openapidiff.core.model.ChangedExamples; @@ -51,14 +50,12 @@ protected DeferredChanged<ChangedParameter> computeDiff( new ChangedParameter(right.getName(), right.getIn(), context) .setOldParameter(left) .setNewParameter(right) - .setChangeRequired(getBooleanDiff(left.getRequired(), right.getRequired())) - .setDeprecated( - !Boolean.TRUE.equals(left.getDeprecated()) - && Boolean.TRUE.equals(right.getDeprecated())) + .setChangeRequired(!Objects.equals(left.getRequired(), right.getRequired())) + .setDeprecated(!Objects.equals(left.getDeprecated(), right.getDeprecated())) .setChangeAllowEmptyValue( - getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue())) + !Objects.equals(left.getAllowEmptyValue(), right.getAllowEmptyValue())) .setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle())) - .setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode())) + .setChangeExplode(!Objects.equals(left.getExplode(), right.getExplode())) .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) .setExample(new ChangedExample(left.getExample(), right.getExample())); builder @@ -84,10 +81,4 @@ protected DeferredChanged<ChangedParameter> computeDiff( .ifPresent(changedParameter::setExtensions); return builder.buildIsChanged(changedParameter); } - - private boolean getBooleanDiff(Boolean left, Boolean right) { - boolean leftRequired = Optional.ofNullable(left).orElse(Boolean.FALSE); - boolean rightRequired = Optional.ofNullable(right).orElse(Boolean.FALSE); - return leftRequired != rightRequired; - } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index 7b59bc3b1..1cd63ae83 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -50,9 +50,7 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( .setContext(context) .setOldSchema(left) .setNewSchema(right) - .setChangeDeprecated( - !Boolean.TRUE.equals(left.getDeprecated()) - && Boolean.TRUE.equals(right.getDeprecated())) + .setChangeDeprecated(!Objects.equals(left.getDeprecated(), right.getDeprecated())) .setChangeTitle(!Objects.equals(left.getTitle(), right.getTitle())) .setRequired( ListDiff.diff(new ChangedRequired(left.getRequired(), right.getRequired(), context))) diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java deleted file mode 100644 index 6d668c115..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/AddPropDiffTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.openapitools.openapidiff.core; - -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; - -import org.junit.jupiter.api.Test; - -public class AddPropDiffTest { - private final String OPENAPI_DOC1 = "add-prop-1.yaml"; - private final String OPENAPI_DOC2 = "add-prop-2.yaml"; - - @Test - public void testDiffSame() { - assertOpenApiAreEquals(OPENAPI_DOC1, OPENAPI_DOC1); - } - - @Test - public void testDiffDifferent() { - assertOpenApiBackwardCompatible(OPENAPI_DOC1, OPENAPI_DOC2, true); - } -} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java deleted file mode 100644 index 6ecc1bc22..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/AddPropPutDiffTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.openapitools.openapidiff.core; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; - -import org.junit.jupiter.api.Test; -import org.openapitools.openapidiff.core.model.ChangedOpenApi; - -public class AddPropPutDiffTest { - private final String OPENAPI_DOC1 = "add-prop-put-1.yaml"; - private final String OPENAPI_DOC2 = "add-prop-put-2.yaml"; - - @Test - public void testDiffSame() { - assertOpenApiAreEquals(OPENAPI_DOC1, OPENAPI_DOC1); - } - - @Test - public void testFieldAdditionalInPutApiIsCompatible() { - // See https://github.com/OpenAPITools/openapi-diff/pull/537 - ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - assertThat(changedOpenApi.isDifferent()).isTrue(); - assertThat(changedOpenApi.isCompatible()).isTrue(); - } -} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java b/core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java deleted file mode 100644 index 7fabd712c..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/AdditionalPropertiesTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.openapitools.openapidiff.core; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.ByteArrayOutputStream; -import java.io.OutputStreamWriter; -import org.junit.jupiter.api.Test; -import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.output.ConsoleRender; - -class AdditionalPropertiesTest { - @Test - void booleanAdditionalPropertiesAreSupported() { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); - ChangedOpenApi diff = OpenApiCompare.fromLocations("issue-256_1.json", "issue-256_2.json"); - ConsoleRender render = new ConsoleRender(); - render.render(diff, outputStreamWriter); - assertThat(outputStream.toString()).isNotBlank(); - } -} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java b/core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java new file mode 100644 index 000000000..0050f95ad --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java @@ -0,0 +1,72 @@ +package org.openapitools.openapidiff.core; + +import io.swagger.v3.oas.models.PathItem.HttpMethod; +import java.util.Optional; +import javax.annotation.Nullable; +import org.openapitools.openapidiff.core.model.ChangedApiResponse; +import org.openapitools.openapidiff.core.model.ChangedContent; +import org.openapitools.openapidiff.core.model.ChangedHeaders; +import org.openapitools.openapidiff.core.model.ChangedMediaType; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.model.ChangedOperation; +import org.openapitools.openapidiff.core.model.ChangedParameter; +import org.openapitools.openapidiff.core.model.ChangedParameters; +import org.openapitools.openapidiff.core.model.ChangedRequestBody; +import org.openapitools.openapidiff.core.model.ChangedResponse; +import org.openapitools.openapidiff.core.model.ChangedSchema; + +public class ChangesResolver { + + @Nullable + public static ChangedOperation getChangedOperation( + ChangedOpenApi changedOpenApi, HttpMethod method, String path) { + return changedOpenApi.getChangedOperations().stream() + .filter( + operation -> + operation.getHttpMethod().equals(method) && operation.getPathUrl().equals(path)) + .findFirst() + .orElse(null); + } + + @Nullable + public static ChangedParameter getChangedParameter( + ChangedOpenApi changedOpenApi, HttpMethod method, String path, String parameterName) { + ChangedOperation changedOperation = getChangedOperation(changedOpenApi, method, path); + + if (changedOperation == null) { + return null; + } + + return Optional.ofNullable(changedOperation.getParameters()) + .map(ChangedParameters::getChanged) + .flatMap( + changedParameters -> + changedParameters.stream() + .filter(changedParameter -> changedParameter.getName().equals(parameterName)) + .findFirst()) + .orElse(null); + } + + @Nullable + public static ChangedHeaders getChangedResponseHeaders( + ChangedOpenApi changedOpenApi, HttpMethod method, String path, String responseCode) { + return Optional.ofNullable(getChangedOperation(changedOpenApi, method, path)) + .map(ChangedOperation::getApiResponses) + .map(ChangedApiResponse::getChanged) + .map(responses -> responses.get(responseCode)) + .map(ChangedResponse::getHeaders) + .orElse(null); + } + + @Nullable + public static ChangedSchema getRequestBodyChangedSchema( + ChangedOperation changedOperation, String mediaType) { + return Optional.ofNullable(changedOperation) + .map(ChangedOperation::getRequestBody) + .map(ChangedRequestBody::getContent) + .map(ChangedContent::getChanged) + .map(changedMediaTypes -> changedMediaTypes.get(mediaType)) + .map(ChangedMediaType::getSchema) + .orElse(null); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/OperationDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/OperationDiffTest.java index 79f929f82..4a1794204 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/OperationDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/OperationDiffTest.java @@ -1,23 +1,69 @@ package org.openapitools.openapidiff.core; +import static io.swagger.v3.oas.models.PathItem.HttpMethod.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.openapitools.openapidiff.core.ChangesResolver.getChangedOperation; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.model.ChangedOperation; import org.openapitools.openapidiff.core.model.DiffResult; public class OperationDiffTest { - private final String OPENAPI_DOC1 = "operation_diff_1.yaml"; - private final String OPENAPI_DOC2 = "operation_diff_2.yaml"; + private final String OPENAPI_DOC1 = "operationDiff/operation_diff_1.yaml"; + private final String OPENAPI_DOC2 = "operationDiff/operation_diff_2.yaml"; @Test - public void testContentDiffWithOneEmptyMediaType() { + public void testOperationIdChanged() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - assertThat(changedOpenApi.isChanged()).isEqualTo(DiffResult.METADATA); - assertThat(changedOpenApi.isDifferent()).isTrue(); - assertThat(changedOpenApi.getChangedOperations().size()).isEqualTo(1); - assertThat(changedOpenApi.getChangedOperations().get(0).getOperationId().isDifferent()) - .isTrue(); + ChangedOperation changedOperation = + getChangedOperation(changedOpenApi, GET, "/operation/operation-id"); + + assertThat(changedOperation).isNotNull(); + assertThat(changedOperation.isChanged()).isEqualTo(DiffResult.METADATA); + assertThat(changedOperation.getOperationId().getRight()).isEqualTo("changed"); + } + + @Test + public void testOperationSummaryChanged() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedOperation changedOperation = + getChangedOperation(changedOpenApi, GET, "/operation/summary"); + + assertThat(changedOperation).isNotNull(); + assertThat(changedOperation.isChanged()).isEqualTo(DiffResult.METADATA); + assertThat(changedOperation.getSummary().getRight()).isEqualTo("changed"); + } + + @Test + public void testOperationDescriptionChanged() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedOperation changedOperation = + getChangedOperation(changedOpenApi, GET, "/operation/description"); + + assertThat(changedOperation).isNotNull(); + assertThat(changedOperation.isChanged()).isEqualTo(DiffResult.METADATA); + assertThat(changedOperation.getDescription().getRight()).isEqualTo("changed"); + } + + @Test + public void testOperationBecomesDeprecated() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedOperation changedOperation = + getChangedOperation(changedOpenApi, GET, "/operation/becomes-deprecated"); + + assertThat(changedOperation).isNotNull(); + assertThat(changedOperation.isDeprecated()).isTrue(); + } + + @Test + public void testOperationBecomesNotDeprecated() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedOperation changedOperation = + getChangedOperation(changedOpenApi, GET, "/operation/becomes-not-deprecated"); + + assertThat(changedOperation).isNotNull(); + assertThat(changedOperation.isDeprecated()).isTrue(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java index d04305ed8..40f0cba74 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ParameterDiffTest.java @@ -1,96 +1,277 @@ package org.openapitools.openapidiff.core; +import static io.swagger.v3.oas.models.PathItem.HttpMethod.GET; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.openapitools.openapidiff.core.ChangesResolver.getChangedOperation; +import static org.openapitools.openapidiff.core.ChangesResolver.getChangedParameter; +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiChangedEndpoints; +import io.swagger.v3.oas.models.parameters.Parameter; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.model.ChangedOperation; +import org.openapitools.openapidiff.core.model.ChangedParameter; +import org.openapitools.openapidiff.core.model.ChangedParameters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ParameterDiffTest { + private final String OPENAPI_DOC1 = "parameterDiff/parameter_diff_1.yaml"; + private final String OPENAPI_DOC2 = "parameterDiff/parameter_diff_2.yaml"; + private final String OVERLOADED_PARAMETERS = "parameterDiff/parameters_overloading.yaml"; + private final String DUPLICATED_PARAMETER_TYPES = "parameterDiff/parameters_overloading_2.yaml"; + + @Test + public void testAddParameter() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedOperation changedOperation = + getChangedOperation(changedOpenApi, GET, "/parameter/added"); + + assertThat(changedOperation).isNotNull(); + List<Parameter> increasedParams = + Optional.ofNullable(changedOperation.getParameters()) + .map(ChangedParameters::getIncreased) + .orElse(Collections.emptyList()); + assertThat(increasedParams.size()).isEqualTo(1); + assertThat(increasedParams.get(0).getName()).isEqualTo("param"); + } + + @Test + public void testRemoveParameter() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedOperation changedOperation = + getChangedOperation(changedOpenApi, GET, "/parameter/removed"); + + assertThat(changedOperation).isNotNull(); + List<Parameter> missingParams = + Optional.ofNullable(changedOperation.getParameters()) + .map(ChangedParameters::getMissing) + .orElse(Collections.emptyList()); + assertThat(missingParams.size()).isEqualTo(1); + assertThat(missingParams.get(0).getName()).isEqualTo("param"); + } + @Test - public void testDiffDifferent() { - assertOpenApiChangedEndpoints("parameters_diff_1.yaml", "parameters_diff_2.yaml"); + public void testParameterBecomesDeprecated() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedParameter changedParameter = + getChangedParameter(changedOpenApi, GET, "/parameter/becomes-deprecated", "X-Header"); + + assertThat(changedParameter).isNotNull(); + assertThat(changedParameter.isDeprecated()).isTrue(); + } + + @Test + public void testParameterBecomesNotDeprecated() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedParameter changedParameter = + getChangedParameter(changedOpenApi, GET, "/parameter/becomes-not-deprecated", "X-Header"); + + assertThat(changedParameter).isNotNull(); + assertThat(changedParameter.isDeprecated()).isTrue(); + } + + @Test + public void testParameterRequiredChanged() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedParameter changedParameter = + getChangedParameter(changedOpenApi, GET, "/parameter/required", "param"); + + assertThat(changedParameter).isNotNull(); + assertThat(changedParameter.isChangeRequired()).isTrue(); + } + + @Test + public void testParameterDescriptionChanged() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedParameter changedParameter = + getChangedParameter(changedOpenApi, GET, "/parameter/description", "param"); + + assertThat(changedParameter).isNotNull(); + assertThat(changedParameter.getDescription().getRight()).isEqualTo("changed"); + } + + @Test + public void testParameterExplodeChanged() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedParameter changedParameter = + getChangedParameter(changedOpenApi, GET, "/parameter/explode", "param"); + + assertThat(changedParameter).isNotNull(); + assertThat(changedParameter.isChangeExplode()).isTrue(); + } + + @Test + public void testParameterStyleChanged() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedParameter changedParameter = + getChangedParameter(changedOpenApi, GET, "/parameter/style", "param"); + + assertThat(changedParameter).isNotNull(); + assertThat(changedParameter.isChangeStyle()).isTrue(); + } + + @Test + void testDiffWithOverloadedParameterTypes() { + assertDoesNotThrow( + () -> OpenApiCompare.fromLocations(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS)); + assertOpenApiAreEquals(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS); + } + + @Test + void testDiffWithDuplicatedParameterTypes() { + assertThrows( + IllegalArgumentException.class, + () -> OpenApiCompare.fromLocations(DUPLICATED_PARAMETER_TYPES, DUPLICATED_PARAMETER_TYPES), + "Two path items have the same signature: /projects/{}"); } @Test public void issue458MaximumDecreased() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_2.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_2.yaml"); } @Test public void issue458MaximumIncreased() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_3.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_3.yaml"); } @Test public void issue458MinimumDecreased() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_4.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_4.yaml"); } @Test public void issue458MinimumIncreased() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_5.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_5.yaml"); } @Test public void issue458IntegerFormatChanged() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_6.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_6.yaml"); } @Test public void issue458ExclusiveMinimumChanged() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_7.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_7.yaml"); } @Test public void issue458ExclusiveMaximumChanged() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_8.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_8.yaml"); } @Test public void issue458ExclusiveMinimumRemoved() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_9.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_9.yaml"); } @Test public void issue458ExclusiveMaximumRemoved() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_1.yaml", "issue-458-integer-limits_10.yaml"); + "parameterDiff/issue-458-integer-limits_1.yaml", + "parameterDiff/issue-458-integer-limits_10.yaml"); } @Test public void issue458ExclusiveMaximumTrueToFalse() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_12.yaml"); + "parameterDiff/issue-458-integer-limits_11.yaml", + "parameterDiff/issue-458-integer-limits_12.yaml"); } @Test public void issue458ExclusiveMinimumTrueToFalse() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_13.yaml"); + "parameterDiff/issue-458-integer-limits_11.yaml", + "parameterDiff/issue-458-integer-limits_13.yaml"); } @Test public void issue458ExclusiveMaximumTrueRemoved() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_12.yaml"); + "parameterDiff/issue-458-integer-limits_11.yaml", + "parameterDiff/issue-458-integer-limits_12.yaml"); } @Test public void issue458ExclusiveMinimumTrueRemoved() { assertOpenApiChangedEndpoints( - "issue-458-integer-limits_11.yaml", "issue-458-integer-limits_13.yaml"); + "parameterDiff/issue-458-integer-limits_11.yaml", + "parameterDiff/issue-458-integer-limits_13.yaml"); } @Test public void issue488RenameParameterAddAndRemoveParameterReturnFalse() { - assertOpenApiChangedEndpoints("issue-488-1.json", "issue-488-2.json"); + assertOpenApiChangedEndpoints( + "parameterDiff/issue-488-1.json", "parameterDiff/issue-488-2.json"); + } + + final String TEST_MSG_1 = + "Testing: \n" + + "1. Same path but different pathParameters\n" + + "2. different parameters in the parameters: section\n" + + "3. Parameters have different schema\n" + + "eg:\n" + + "old path -- students/{id}\n" + + "old schema -- id: integer\n" + + "new path -- students/{username}\n" + + "new schema -- username: string"; + + @Test + @DisplayName( + "Same Path, different PathParams, Params in the `Parameters`: match pathParam, Different Schema") + public void pathSamePathParamsDiffParamSameAsInPathButSchemaDiff() { + final Logger logger = LoggerFactory.getLogger(ParameterDiffTest.class); + logger.info(TEST_MSG_1); + String OPENAPI_DOC1 = "parameterDiff/path_parameter_diff_param_schema_diff_old.yaml"; + String OPENAPI_DOC2 = "parameterDiff/path_parameter_diff_param_schema_diff_new.yaml"; + ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + Assertions.assertTrue(diff.isDifferent()); + Assertions.assertFalse(diff.isCompatible()); + } + + final String TEST_MSG_2 = + "Testing: \n" + + "1. Same path but different pathParameters\n" + + "2. different parameters in the parameters: section\n" + + "3. Parameters have same schema\n"; + + @Test + @DisplayName( + "Same Path, different PathParams, Params in the `Parameters`: match pathParam, same Schema") + public void pathSamePathParamsDiffParamNameDiffSchemaSame() { + final Logger logger = LoggerFactory.getLogger(ParameterDiffTest.class); + logger.info(TEST_MSG_2); + String OPENAPI_DOC1 = "parameterDiff/path_parameter_diff_param_name_diff_old.yaml"; + String OPENAPI_DOC2 = "parameterDiff/path_parameter_diff_param_name_diff_new.yaml"; + ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + Assertions.assertFalse(diff.isDifferent()); + Assertions.assertTrue(diff.isCompatible()); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java deleted file mode 100644 index bc779be56..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/ParametersOverloadingTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.openapitools.openapidiff.core; - -import static org.junit.jupiter.api.Assertions.*; -import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals; - -import org.junit.jupiter.api.Test; - -class ParametersOverloadingTest { - - private final String OVERLOADED_PARAMETERS = "parameters_overloading.yaml"; - private final String DUPLICATED_PARAMETER_TYPES = "parameters_overloading_2.yaml"; - - @Test - void testDiffWithOverloadedParameterTypes() { - assertDoesNotThrow( - () -> OpenApiCompare.fromLocations(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS)); - assertOpenApiAreEquals(OVERLOADED_PARAMETERS, OVERLOADED_PARAMETERS); - } - - @Test - void testDiffWithDuplicatedParameterTypes() { - assertThrows( - IllegalArgumentException.class, - () -> OpenApiCompare.fromLocations(DUPLICATED_PARAMETER_TYPES, DUPLICATED_PARAMETER_TYPES), - "Two path items have the same signature: /projects/{}"); - } -} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java deleted file mode 100644 index 1c4065ed9..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/PathParameterSchemaDiffTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.openapitools.openapidiff.core; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PathParameterSchemaDiffTest { - final String TEST_MSG_1 = - "Testing: \n" - + "1. Same path but different pathParameters\n" - + "2. different parameters in the parameters: section\n" - + "3. Parameters have different schema\n" - + "eg:\n" - + "old path -- students/{id}\n" - + "old schema -- id: integer\n" - + "new path -- students/{username}\n" - + "new schema -- username: string"; - - final String TEST_MSG_2 = - "Testing: \n" - + "1. Same path but different pathParameters\n" - + "2. different parameters in the parameters: section\n" - + "3. Parameters have same schema\n"; - - @Test - @DisplayName( - "Same Path, different PathParams, Params in the `Parameters`: match pathParam, Different Schema") - public void pathSamePathParamsDiffParamSameAsInPathButSchemaDiff() { - final Logger logger = LoggerFactory.getLogger(PathParameterSchemaDiffTest.class); - logger.info(TEST_MSG_1); - String OPENAPI_DOC1 = "path_parameter_diff_param_schema_diff_old.yaml"; - String OPENAPI_DOC2 = "path_parameter_diff_param_schema_diff_new.yaml"; - ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - Assertions.assertTrue(diff.isDifferent()); - Assertions.assertFalse(diff.isCompatible()); - } - - @Test - @DisplayName( - "Same Path, different PathParams, Params in the `Parameters`: match pathParam, same Schema") - public void pathSamePathParamsDiffParamNameDiffSchemaSame() { - final Logger logger = LoggerFactory.getLogger(PathParameterSchemaDiffTest.class); - logger.info(TEST_MSG_2); - String OPENAPI_DOC1 = "path_parameter_diff_param_name_diff_old.yaml"; - String OPENAPI_DOC2 = "path_parameter_diff_param_name_diff_new.yaml"; - ChangedOpenApi diff = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - Assertions.assertFalse(diff.isDifferent()); - Assertions.assertTrue(diff.isCompatible()); - } -} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ResponseHeaderDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/ResponseHeaderDiffTest.java index 05e4ecfe3..c388e9692 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ResponseHeaderDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ResponseHeaderDiffTest.java @@ -1,34 +1,86 @@ package org.openapitools.openapidiff.core; +import static io.swagger.v3.oas.models.PathItem.HttpMethod.GET; import static org.assertj.core.api.Assertions.assertThat; +import static org.openapitools.openapidiff.core.ChangesResolver.getChangedResponseHeaders; import java.util.Map; import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedHeader; import org.openapitools.openapidiff.core.model.ChangedHeaders; import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.model.ChangedResponse; public class ResponseHeaderDiffTest { - private final String OPENAPI_DOC1 = "header_1.yaml"; - private final String OPENAPI_DOC2 = "header_2.yaml"; + private final String OPENAPI_DOC1 = "responseHeaderDiff/response_header_1.yaml"; + private final String OPENAPI_DOC2 = "responseHeaderDiff/response_header_2.yaml"; @Test - public void testDiffDifferent() { + public void testResponseHeadersDescriptionChanges() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedHeaders changedResponseHeaders = + getChangedResponseHeaders(changedOpenApi, GET, "/response/headers/description", "200"); - assertThat(changedOpenApi.getNewEndpoints()).isEmpty(); - assertThat(changedOpenApi.getMissingEndpoints()).isEmpty(); - assertThat(changedOpenApi.getChangedOperations()).isNotEmpty(); - - Map<String, ChangedResponse> changedResponses = - changedOpenApi.getChangedOperations().get(0).getApiResponses().getChanged(); - assertThat(changedResponses).isNotEmpty(); - assertThat(changedResponses).containsKey("200"); - ChangedHeaders changedHeaders = changedResponses.get("200").getHeaders(); - assertThat(changedHeaders.isDifferent()).isTrue(); - assertThat(changedHeaders.getChanged()).hasSize(1); - assertThat(changedHeaders.getIncreased()).hasSize(1); - assertThat(changedHeaders.getMissing()).hasSize(1); + assertThat(changedResponseHeaders).isNotNull(); + Map<String, ChangedHeader> changedHeaders = changedResponseHeaders.getChanged(); + + assertThat(changedHeaders).containsKey("x-header-description-changed"); + assertThat(changedHeaders.get("x-header-description-changed").getDescription()).isNotNull(); + assertThat(changedHeaders.get("x-header-description-changed").getDescription().getLeft()) + .isEqualTo("old description"); + assertThat(changedHeaders.get("x-header-description-changed").getDescription().getRight()) + .isEqualTo("new description"); + + assertThat(changedHeaders).containsKey("x-header-description-added"); + assertThat(changedHeaders.get("x-header-description-added").getDescription()).isNotNull(); + assertThat(changedHeaders.get("x-header-description-added").getDescription().getLeft()) + .isNull(); + assertThat(changedHeaders.get("x-header-description-added").getDescription().getRight()) + .isEqualTo("added description"); + + assertThat(changedHeaders).containsKey("x-header-description-removed"); + assertThat(changedHeaders.get("x-header-description-removed").getDescription()).isNotNull(); + assertThat(changedHeaders.get("x-header-description-removed").getDescription().getLeft()) + .isEqualTo("old description"); + assertThat(changedHeaders.get("x-header-description-removed").getDescription().getRight()) + .isNull(); + } + + @Test + public void testResponseHeadersRequiredChanges() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedHeaders changedResponseHeaders = + getChangedResponseHeaders(changedOpenApi, GET, "/response/headers/required", "200"); + + assertThat(changedResponseHeaders).isNotNull(); + Map<String, ChangedHeader> changedHeaders = changedResponseHeaders.getChanged(); + + assertThat(changedHeaders).containsKey("x-header-required-changed"); + } + + @Test + public void testResponseHeadersExplodeChanges() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedHeaders changedResponseHeaders = + getChangedResponseHeaders(changedOpenApi, GET, "/response/headers/explode", "200"); + + assertThat(changedResponseHeaders).isNotNull(); + Map<String, ChangedHeader> changedHeaders = changedResponseHeaders.getChanged(); + + assertThat(changedHeaders).containsKey("x-header-explode-changed"); + } + + @Test // issue #485 + public void testResponseHeadersDeprecatedChanges() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + ChangedHeaders changedResponseHeaders = + getChangedResponseHeaders(changedOpenApi, GET, "/response/headers/deprecated", "200"); + + assertThat(changedResponseHeaders).isNotNull(); + Map<String, ChangedHeader> changedHeaders = changedResponseHeaders.getChanged(); + assertThat(changedHeaders).containsKey("x-header-becomes-deprecated"); + assertThat(changedHeaders.get("x-header-becomes-deprecated").isDeprecated()).isTrue(); + assertThat(changedHeaders).containsKey("x-header-becomes-not-deprecated"); + assertThat(changedHeaders.get("x-header-becomes-not-deprecated").isDeprecated()).isTrue(); } } diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java deleted file mode 100644 index 52abeac6d..000000000 --- a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDefaultsTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.openapitools.openapidiff.core; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; -import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.model.ChangedSchema; - -public class SchemaDefaultsTest { - - @Test - public void issue717DefaultsInSchema() { - ChangedOpenApi changedOpenApi = - OpenApiCompare.fromLocations( - "issue-717-schema-defaults-handling-1.yaml", - "issue-717-schema-defaults-handling-2.yaml"); - - assertEquals(1, changedOpenApi.getChangedOperations().size()); - assertEquals(1, changedOpenApi.getChangedSchemas().size()); - ChangedSchema changedSchema = changedOpenApi.getChangedSchemas().get(0); - assertEquals(1, changedSchema.getChangedProperties().size()); - assertTrue(changedSchema.getChangedProperties().containsKey("field1")); - assertTrue(changedSchema.getChangedProperties().get("field1").isChangeDefault()); - } -} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java new file mode 100644 index 000000000..9016f2b91 --- /dev/null +++ b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java @@ -0,0 +1,107 @@ +package org.openapitools.openapidiff.core; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.openapitools.openapidiff.core.ChangesResolver.getChangedOperation; +import static org.openapitools.openapidiff.core.ChangesResolver.getRequestBodyChangedSchema; +import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; + +import io.swagger.v3.oas.models.PathItem.HttpMethod; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import org.junit.jupiter.api.Test; +import org.openapitools.openapidiff.core.model.ChangedOpenApi; +import org.openapitools.openapidiff.core.model.ChangedOperation; +import org.openapitools.openapidiff.core.model.ChangedSchema; +import org.openapitools.openapidiff.core.output.ConsoleRender; + +public class SchemaDiffTest { + + @Test // issue #717 + public void schemaPropertyDefaultChanged() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-props-defaults-handling-1.yaml", + "schemaDiff/schema-props-defaults-handling-2.yaml"); + + assertEquals(1, changedOpenApi.getChangedOperations().size()); + assertEquals(1, changedOpenApi.getChangedSchemas().size()); + ChangedSchema changedSchema = changedOpenApi.getChangedSchemas().get(0); + assertEquals(1, changedSchema.getChangedProperties().size()); + assertTrue(changedSchema.getChangedProperties().containsKey("field1")); + assertTrue(changedSchema.getChangedProperties().get("field1").isChangeDefault()); + } + + @Test + public void schemaPropertyTypeChanged() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-props-defaults-handling-1.yaml", + "schemaDiff/schema-props-defaults-handling-2.yaml"); + } + + @Test // issue #485 + public void schemaBecomesDeprecatedTest() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-deprecated-handling-1.yaml", + "schemaDiff/schema-deprecated-handling-2.yaml"); + + ChangedOperation operation = + getChangedOperation(changedOpenApi, HttpMethod.POST, "/schema-diff/deprecated/added"); + assertNotNull(operation); + + ChangedSchema requestBodySchema = getRequestBodyChangedSchema(operation, "application/json"); + assertNotNull(requestBodySchema); + assertTrue(requestBodySchema.isChangeDeprecated()); + } + + @Test // issue #485 + public void schemaBecomesNotDeprecatedTest() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-deprecated-handling-1.yaml", + "schemaDiff/schema-deprecated-handling-2.yaml"); + + ChangedOperation operation = + getChangedOperation(changedOpenApi, HttpMethod.POST, "/schema-diff/deprecated/removed"); + assertNotNull(operation); + + ChangedSchema requestBodySchema = getRequestBodyChangedSchema(operation, "application/json"); + assertNotNull(requestBodySchema); + assertTrue(requestBodySchema.isChangeDeprecated()); + } + + @Test // issue #256 + void booleanAdditionalPropertiesAreSupported() { + ChangedOpenApi diff = + OpenApiCompare.fromLocations( + "schemaDiff/schema-additional-properties-1.json", + "schemaDiff/schema-additional-properties-2.json"); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + ConsoleRender render = new ConsoleRender(); + render.render(diff, outputStreamWriter); + assertThat(outputStream.toString()).isNotBlank(); + } + + @Test + public void addPropertyHandlingTest() { + assertOpenApiBackwardCompatible( + "schemaDiff/schema-add-property-1.yaml", "schemaDiff/schema-add-property-2.yaml", true); + } + + @Test // issue #537 + public void addPropertyInPutApiIsCompatible() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-add-property-put-1.yaml", + "schemaDiff/schema-add-property-put-2.yaml"); + + assertThat(changedOpenApi.isDifferent()).isTrue(); + assertThat(changedOpenApi.isCompatible()).isTrue(); + } +} diff --git a/core/src/test/resources/header_1.yaml b/core/src/test/resources/header_1.yaml deleted file mode 100644 index 66f4a1665..000000000 --- a/core/src/test/resources/header_1.yaml +++ /dev/null @@ -1,129 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - /user/login: - get: - tags: - - user - summary: Logs user into the system - description: '' - operationId: loginUser - parameters: - - name: username - in: query - description: The user name for login - required: true - schema: - type: string - responses: - '200': - description: successful operation - headers: - X-Rate-Limit: - description: calls per hour allowed by the user - schema: - type: integer - format: int32 - X-Expires-After: - description: date in UTC when token expires - schema: - type: integer - content: - application/xml: - schema: - type: integer - application/json: - schema: - type: string - '400': - description: Invalid username/password supplied -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - securitySchemes: - petstore_auth: - type: oauth2 - flows: - implicit: - authorizationUrl: 'http://petstore.swagger.io/oauth/dialog' - scopes: - 'write:pets': modify pets in your account - 'read:pets': read your pets - api_key: - type: apiKey - name: api_key - in: header - schemas: - Pet: - type: object - required: - - pet_type - properties: - pet_type: - type: string - discriminator: - propertyName: pet_type - mapping: - cachorro: Dog - Cat: - type: object - properties: - name: - type: string - Dog: - type: object - properties: - bark: - type: string - Lizard: - type: object - properties: - lovesRocks: - type: boolean - - MyResponseType: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - $ref: '#/components/schemas/Lizard' - discriminator: - propertyName: pet_type - mapping: - dog: '#/components/schemas/Dog' \ No newline at end of file diff --git a/core/src/test/resources/header_2.yaml b/core/src/test/resources/header_2.yaml deleted file mode 100644 index 124b75ef3..000000000 --- a/core/src/test/resources/header_2.yaml +++ /dev/null @@ -1,129 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - /user/login: - get: - tags: - - user - summary: Logs user into the system - description: '' - operationId: loginUser - parameters: - - name: username - in: query - description: The user name for login - required: true - schema: - type: string - responses: - '200': - description: successful operation - headers: - X-Rate-Limit-New: - description: calls per hour allowed by the user - schema: - type: integer - format: int32 - X-Expires-After: - description: date in UTC when token expires - schema: - type: string - content: - application/xml: - schema: - type: integer - application/json: - schema: - type: string - '400': - description: Invalid username/password supplied -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - securitySchemes: - petstore_auth: - type: oauth2 - flows: - implicit: - authorizationUrl: 'http://petstore.swagger.io/oauth/dialog' - scopes: - 'write:pets': modify pets in your account - 'read:pets': read your pets - api_key: - type: apiKey - name: api_key - in: header - schemas: - Pet: - type: object - required: - - pet_type - properties: - pet_type: - type: string - discriminator: - propertyName: pet_type - mapping: - cachorro: Dog - Cat: - type: object - properties: - name: - type: string - Dog: - type: object - properties: - bark: - type: string - Lizard: - type: object - properties: - lovesRocks: - type: boolean - - MyResponseType: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - $ref: '#/components/schemas/Lizard' - discriminator: - propertyName: pet_type - mapping: - dog: '#/components/schemas/Dog' \ No newline at end of file diff --git a/core/src/test/resources/operationDiff/operation_diff_1.yaml b/core/src/test/resources/operationDiff/operation_diff_1.yaml new file mode 100644 index 000000000..e0faf2df2 --- /dev/null +++ b/core/src/test/resources/operationDiff/operation_diff_1.yaml @@ -0,0 +1,54 @@ +--- +openapi: "3.0.1" +info: + title: "Test title" + description: "This is a test metadata" + termsOfService: "http://test.com" + contact: + name: "Mark Snijder" + url: "marksnijder.nl" + email: "snijderd@gmail.com" + license: + name: "To be decided" + url: "http://test.com" + version: "version 1.0" +paths: + /operation/operation-id: + get: + operationId: operation + responses: + '200': + description: response + content: + application/json: {} + /operation/summary: + get: + summary: summary + responses: + '200': + description: response + content: + application/json: { } + /operation/description: + get: + description: description + responses: + '200': + description: response + content: + application/json: { } + /operation/becomes-deprecated: + get: + responses: + '200': + description: response + content: + application/json: { } + /operation/becomes-not-deprecated: + get: + deprecated: true + responses: + '200': + description: response + content: + application/json: { } diff --git a/core/src/test/resources/operationDiff/operation_diff_2.yaml b/core/src/test/resources/operationDiff/operation_diff_2.yaml new file mode 100644 index 000000000..8f5124955 --- /dev/null +++ b/core/src/test/resources/operationDiff/operation_diff_2.yaml @@ -0,0 +1,55 @@ +--- +openapi: "3.0.1" +info: + title: "Test title" + description: "This is a test metadata" + termsOfService: "http://test.com" + contact: + name: "Mark Snijder" + url: "marksnijder.nl" + email: "snijderd@gmail.com" + license: + name: "To be decided" + url: "http://test.com" + version: "version 1.0" +paths: + /operation/operation-id: + get: + operationId: changed + responses: + '200': + description: response + content: + application/json: {} + /operation/summary: + get: + summary: changed + responses: + '200': + description: response + content: + application/json: { } + /operation/description: + get: + description: changed + responses: + '200': + description: response + content: + application/json: { } + /operation/becomes-deprecated: + get: + deprecated: true + responses: + '200': + description: response + content: + application/json: { } + /operation/becomes-not-deprecated: + get: + deprecated: false + responses: + '200': + description: response + content: + application/json: { } diff --git a/core/src/test/resources/operation_diff_1.yaml b/core/src/test/resources/operation_diff_1.yaml deleted file mode 100644 index 0618b58e6..000000000 --- a/core/src/test/resources/operation_diff_1.yaml +++ /dev/null @@ -1,24 +0,0 @@ ---- -openapi: "3.0.1" -info: - title: "Test title" - description: "This is a test metadata" - termsOfService: "http://test.com" - contact: - name: "Mark Snijder" - url: "marksnijder.nl" - email: "snijderd@gmail.com" - license: - name: "To be decided" - url: "http://test.com" - version: "version 1.0" -paths: - /pets/{id}: - get: - description: Returns a user based on a single ID, if the user does not have access to the pet - operationId: operation - responses: - '200': - description: response - content: - application/json: {} diff --git a/core/src/test/resources/operation_diff_2.yaml b/core/src/test/resources/operation_diff_2.yaml deleted file mode 100644 index 8d60a2dc1..000000000 --- a/core/src/test/resources/operation_diff_2.yaml +++ /dev/null @@ -1,24 +0,0 @@ ---- -openapi: "3.0.1" -info: - title: "Test title" - description: "This is a test metadata" - termsOfService: "http://test.com" - contact: - name: "Mark Snijder" - url: "marksnijder.nl" - email: "snijderd@gmail.com" - license: - name: "To be decided" - url: "http://test.com" - version: "version 1.0" -paths: - /pets/{id}: - get: - description: Returns a user based on a single ID, if the user does not have access to the pet - operationId: changed - responses: - '200': - description: response - content: - application/json: {} diff --git a/core/src/test/resources/issue-458-integer-limits_1.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_1.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_1.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_1.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_10.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_10.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_10.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_10.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_11.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_11.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_11.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_11.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_12.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_12.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_12.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_12.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_13.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_13.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_13.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_13.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_14.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_14.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_14.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_14.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_15.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_15.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_15.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_15.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_2.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_2.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_2.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_2.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_3.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_3.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_3.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_3.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_4.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_4.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_4.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_4.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_5.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_5.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_5.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_5.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_6.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_6.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_6.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_6.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_7.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_7.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_7.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_7.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_8.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_8.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_8.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_8.yaml diff --git a/core/src/test/resources/issue-458-integer-limits_9.yaml b/core/src/test/resources/parameterDiff/issue-458-integer-limits_9.yaml similarity index 100% rename from core/src/test/resources/issue-458-integer-limits_9.yaml rename to core/src/test/resources/parameterDiff/issue-458-integer-limits_9.yaml diff --git a/core/src/test/resources/issue-488-1.json b/core/src/test/resources/parameterDiff/issue-488-1.json similarity index 100% rename from core/src/test/resources/issue-488-1.json rename to core/src/test/resources/parameterDiff/issue-488-1.json diff --git a/core/src/test/resources/issue-488-2.json b/core/src/test/resources/parameterDiff/issue-488-2.json similarity index 100% rename from core/src/test/resources/issue-488-2.json rename to core/src/test/resources/parameterDiff/issue-488-2.json diff --git a/core/src/test/resources/parameterDiff/parameter_diff_1.yaml b/core/src/test/resources/parameterDiff/parameter_diff_1.yaml new file mode 100644 index 000000000..c17217338 --- /dev/null +++ b/core/src/test/resources/parameterDiff/parameter_diff_1.yaml @@ -0,0 +1,102 @@ +openapi: "3.1.0" +info: + title: "Parameters diff test" + description: "TParameters diff test" + version: "1.0" +paths: + /parameter/added: + get: + responses: + '200': + description: response + content: + application/json: { } + /parameter/removed: + get: + parameters: + - in: query + name: param + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/becomes-deprecated: + get: + parameters: + - in: header + name: X-Header + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/becomes-not-deprecated: + get: + parameters: + - in: header + name: X-Header + deprecated: true + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/required: + get: + parameters: + - in: query + name: param + required: true + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/description: + get: + parameters: + - in: query + name: param + description: description + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/explode: + get: + parameters: + - in: query + name: param + schema: + type: string + explode: true + responses: + '200': + description: response + content: + application/json: { } + /parameter/style: + get: + parameters: + - in: query + name: param + schema: + type: string + style: simple + responses: + '200': + description: response + content: + application/json: { } \ No newline at end of file diff --git a/core/src/test/resources/parameterDiff/parameter_diff_2.yaml b/core/src/test/resources/parameterDiff/parameter_diff_2.yaml new file mode 100644 index 000000000..0c30b6b1d --- /dev/null +++ b/core/src/test/resources/parameterDiff/parameter_diff_2.yaml @@ -0,0 +1,102 @@ +openapi: "3.1.0" +info: + title: "Parameters diff test" + description: "TParameters diff test" + version: "1.0" +paths: + /parameter/added: + get: + parameters: + - in: query + name: param + schema: + type: string + responses: + '200': + description: response + content: + application/json: {} + /parameter/removed: + get: + responses: + '200': + description: response + content: + application/json: { } + /parameter/becomes-deprecated: + get: + parameters: + - in: header + name: X-Header + deprecated: true + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/becomes-not-deprecated: + get: + parameters: + - in: header + name: X-Header + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/required: + get: + parameters: + - in: query + name: param + required: false + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/description: + get: + parameters: + - in: query + name: param + description: changed + schema: + type: string + responses: + '200': + description: response + content: + application/json: { } + /parameter/explode: + get: + parameters: + - in: query + name: param + schema: + type: string + explode: false + responses: + '200': + description: response + content: + application/json: { } + /parameter/style: + get: + parameters: + - in: query + name: param + schema: + type: string + style: matrix + responses: + '200': + description: response + content: + application/json: { } \ No newline at end of file diff --git a/core/src/test/resources/parameters_overloading.yaml b/core/src/test/resources/parameterDiff/parameters_overloading.yaml similarity index 100% rename from core/src/test/resources/parameters_overloading.yaml rename to core/src/test/resources/parameterDiff/parameters_overloading.yaml diff --git a/core/src/test/resources/parameters_overloading_2.yaml b/core/src/test/resources/parameterDiff/parameters_overloading_2.yaml similarity index 100% rename from core/src/test/resources/parameters_overloading_2.yaml rename to core/src/test/resources/parameterDiff/parameters_overloading_2.yaml diff --git a/core/src/test/resources/path_parameter_diff_param_name_diff_new.yaml b/core/src/test/resources/parameterDiff/path_parameter_diff_param_name_diff_new.yaml similarity index 100% rename from core/src/test/resources/path_parameter_diff_param_name_diff_new.yaml rename to core/src/test/resources/parameterDiff/path_parameter_diff_param_name_diff_new.yaml diff --git a/core/src/test/resources/path_parameter_diff_param_name_diff_old.yaml b/core/src/test/resources/parameterDiff/path_parameter_diff_param_name_diff_old.yaml similarity index 100% rename from core/src/test/resources/path_parameter_diff_param_name_diff_old.yaml rename to core/src/test/resources/parameterDiff/path_parameter_diff_param_name_diff_old.yaml diff --git a/core/src/test/resources/path_parameter_diff_param_schema_diff_new.yaml b/core/src/test/resources/parameterDiff/path_parameter_diff_param_schema_diff_new.yaml similarity index 100% rename from core/src/test/resources/path_parameter_diff_param_schema_diff_new.yaml rename to core/src/test/resources/parameterDiff/path_parameter_diff_param_schema_diff_new.yaml diff --git a/core/src/test/resources/path_parameter_diff_param_schema_diff_old.yaml b/core/src/test/resources/parameterDiff/path_parameter_diff_param_schema_diff_old.yaml similarity index 100% rename from core/src/test/resources/path_parameter_diff_param_schema_diff_old.yaml rename to core/src/test/resources/parameterDiff/path_parameter_diff_param_schema_diff_old.yaml diff --git a/core/src/test/resources/parameters_diff.yaml b/core/src/test/resources/parameters_diff.yaml deleted file mode 100644 index 97cc8e9b9..000000000 --- a/core/src/test/resources/parameters_diff.yaml +++ /dev/null @@ -1,185 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - '/pet/{petId}': - parameters: - - name: newHeaderParam - in: header - required: false - schema: - type: integer - delete: - tags: - - pet - summary: Deletes a pet - description: '' - operationId: deletePet - parameters: - - name: api_key - in: header - required: false - schema: - type: string - - name: newHeaderParam - in: header - required: false - schema: - type: string - - name: petId - in: path - description: Pet id to delete - required: true - schema: - type: integer - format: int64 - responses: - '400': - description: Invalid ID supplied - '404': - description: Pet not found - /pet: - post: - tags: - - pet - summary: Add a new pet to the store - description: '' - operationId: addPet - responses: - '405': - description: Invalid input - requestBody: - $ref: '#/components/requestBodies/Pet' - /pet/findByStatus2: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - deprecated: true - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - enum: - - available - - pending - - sold - default: available - responses: - '200': - description: successful operation - content: - application/xml: - schema: - type: array - items: - $ref: '#/components/schemas/Pet' - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Pet' - '400': - description: Invalid status value -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - application/xml: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - schemas: - Tag: - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - xml: - name: Tag - Pet: - type: object - required: - - name - - photoUrls - properties: - id: - type: integer - format: int64 - category: - type: string - name: - type: string - example: doggie - newField: - type: string - example: a field demo - description: a field demo - photoUrls: - type: array - xml: - name: photoUrl - wrapped: true - items: - type: string - tags: - type: array - xml: - name: tag - wrapped: true - items: - $ref: '#/components/schemas/Tag' - status: - type: string - description: pet status in the store - enum: - - available - - pending - - sold - xml: - name: Pet \ No newline at end of file diff --git a/core/src/test/resources/parameters_diff_1.yaml b/core/src/test/resources/parameters_diff_1.yaml deleted file mode 100644 index 97cc8e9b9..000000000 --- a/core/src/test/resources/parameters_diff_1.yaml +++ /dev/null @@ -1,185 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 1.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - '/pet/{petId}': - parameters: - - name: newHeaderParam - in: header - required: false - schema: - type: integer - delete: - tags: - - pet - summary: Deletes a pet - description: '' - operationId: deletePet - parameters: - - name: api_key - in: header - required: false - schema: - type: string - - name: newHeaderParam - in: header - required: false - schema: - type: string - - name: petId - in: path - description: Pet id to delete - required: true - schema: - type: integer - format: int64 - responses: - '400': - description: Invalid ID supplied - '404': - description: Pet not found - /pet: - post: - tags: - - pet - summary: Add a new pet to the store - description: '' - operationId: addPet - responses: - '405': - description: Invalid input - requestBody: - $ref: '#/components/requestBodies/Pet' - /pet/findByStatus2: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - deprecated: true - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - enum: - - available - - pending - - sold - default: available - responses: - '200': - description: successful operation - content: - application/xml: - schema: - type: array - items: - $ref: '#/components/schemas/Pet' - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Pet' - '400': - description: Invalid status value -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - application/xml: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - schemas: - Tag: - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - xml: - name: Tag - Pet: - type: object - required: - - name - - photoUrls - properties: - id: - type: integer - format: int64 - category: - type: string - name: - type: string - example: doggie - newField: - type: string - example: a field demo - description: a field demo - photoUrls: - type: array - xml: - name: photoUrl - wrapped: true - items: - type: string - tags: - type: array - xml: - name: tag - wrapped: true - items: - $ref: '#/components/schemas/Tag' - status: - type: string - description: pet status in the store - enum: - - available - - pending - - sold - xml: - name: Pet \ No newline at end of file diff --git a/core/src/test/resources/parameters_diff_2.yaml b/core/src/test/resources/parameters_diff_2.yaml deleted file mode 100644 index a4e38e85d..000000000 --- a/core/src/test/resources/parameters_diff_2.yaml +++ /dev/null @@ -1,183 +0,0 @@ -openapi: 3.0.0 -servers: - - url: 'http://petstore.swagger.io/v2' -info: - description: >- - This is a sample server Petstore server. You can find out more about - Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, - #swagger](http://swagger.io/irc/). For this sample, you can use the api key - `special-key` to test the authorization filters. - version: 2.0.0 - title: Swagger Petstore - termsOfService: 'http://swagger.io/terms/' - contact: - email: apiteam@swagger.io - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -tags: - - name: pet - description: Everything about your Pets - externalDocs: - description: Find out more - url: 'http://swagger.io' - - name: store - description: Access to Petstore orders - - name: user - description: Operations about user - externalDocs: - description: Find out more about our store - url: 'http://swagger.io' -paths: - '/pet/{petId}': - delete: - tags: - - pet - summary: Deletes a pet - description: '' - operationId: deletePet - parameters: - - name: api_key - in: header - required: false - schema: - type: string - - name: petId - in: path - description: Pet id to delete - required: true - schema: - type: integer - format: int64 - responses: - '400': - description: Invalid ID supplied - '404': - description: Pet not found - /pet: - post: - tags: - - pet - summary: Add a new pet to the store - description: '' - operationId: addPet - parameters: - - name: tags - in: query - description: add new query param demo - required: true - explode: true - schema: - type: array - items: - type: string - responses: - '405': - description: Invalid input - requestBody: - $ref: '#/components/requestBodies/Pet' - /pet/findByStatus2: - get: - tags: - - pet - summary: Finds Pets by status - description: Multiple status values can be provided with comma separated strings - operationId: findPetsByStatus - parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - explode: true - schema: - type: array - items: - type: string - enum: - - available - - pending - - sold - default: available - responses: - '200': - description: successful operation - content: - application/xml: - schema: - type: array - items: - $ref: '#/components/schemas/Pet' - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Pet' - '400': - description: Invalid status value -externalDocs: - description: Find out more about Swagger - url: 'http://swagger.io' -components: - requestBodies: - Pet: - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - application/xml: - schema: - $ref: '#/components/schemas/Pet' - description: Pet object that needs to be added to the store - required: true - schemas: - Tag: - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - xml: - name: Tag - Pet: - type: object - required: - - name - - photoUrls - properties: - id: - type: integer - format: int64 - category: - type: string - name: - type: string - example: doggie - newField: - type: string - example: a field demo - description: a field demo - photoUrls: - type: array - xml: - name: photoUrl - wrapped: true - items: - type: string - tags: - type: array - xml: - name: tag - wrapped: true - items: - $ref: '#/components/schemas/Tag' - status: - type: string - description: pet status in the store - enum: - - available - - pending - - sold - xml: - name: Pet \ No newline at end of file diff --git a/core/src/test/resources/responseHeaderDiff/response_header_1.yaml b/core/src/test/resources/responseHeaderDiff/response_header_1.yaml new file mode 100644 index 000000000..d668deb9a --- /dev/null +++ b/core/src/test/resources/responseHeaderDiff/response_header_1.yaml @@ -0,0 +1,64 @@ +openapi: 3.1.0 +info: + description: Response headers handling + title: response headers + version: 1.0.0 +paths: + /response/headers/deprecated: + get: + responses: + '200': + description: some description + headers: + x-header-becomes-deprecated: + schema: + type: string + x-header-becomes-not-deprecated: + deprecated: true + schema: + type: string + content: + application/json: { } + /response/headers/description: + get: + responses: + '200': + description: some description + headers: + x-header-description-changed: + description: old description + schema: + type: string + x-header-description-added: + schema: + type: string + x-header-description-removed: + description: old description + schema: + type: string + content: + application/json: { } + /response/headers/required: + get: + responses: + '200': + description: some description + headers: + x-header-required-changed: + required: true + schema: + type: string + content: + application/json: { } + /response/headers/explode: + get: + responses: + '200': + description: some description + headers: + x-header-explode-changed: + explode: false + schema: + type: string + content: + application/json: { } \ No newline at end of file diff --git a/core/src/test/resources/responseHeaderDiff/response_header_2.yaml b/core/src/test/resources/responseHeaderDiff/response_header_2.yaml new file mode 100644 index 000000000..fc2175233 --- /dev/null +++ b/core/src/test/resources/responseHeaderDiff/response_header_2.yaml @@ -0,0 +1,64 @@ +openapi: 3.1.0 +info: + description: Response headers handling + title: response headers + version: 1.0.0 +paths: + /response/headers/deprecated: + get: + responses: + '200': + description: some description + headers: + x-header-becomes-deprecated: + deprecated: true + schema: + type: string + x-header-becomes-not-deprecated: + schema: + type: string + content: + application/json: {} + /response/headers/description: + get: + responses: + '200': + description: some description + headers: + x-header-description-changed: + description: new description + schema: + type: string + x-header-description-added: + description: added description + schema: + type: string + x-header-description-removed: + schema: + type: string + content: + application/json: { } + /response/headers/required: + get: + responses: + '200': + description: some description + headers: + x-header-required-changed: + required: false + schema: + type: string + content: + application/json: { } + /response/headers/explode: + get: + responses: + '200': + description: some description + headers: + x-header-explode-changed: + explode: true + schema: + type: string + content: + application/json: { } \ No newline at end of file diff --git a/core/src/test/resources/add-prop-1.yaml b/core/src/test/resources/schemaDiff/schema-add-property-1.yaml similarity index 100% rename from core/src/test/resources/add-prop-1.yaml rename to core/src/test/resources/schemaDiff/schema-add-property-1.yaml diff --git a/core/src/test/resources/add-prop-2.yaml b/core/src/test/resources/schemaDiff/schema-add-property-2.yaml similarity index 100% rename from core/src/test/resources/add-prop-2.yaml rename to core/src/test/resources/schemaDiff/schema-add-property-2.yaml diff --git a/core/src/test/resources/add-prop-put-1.yaml b/core/src/test/resources/schemaDiff/schema-add-property-put-1.yaml similarity index 100% rename from core/src/test/resources/add-prop-put-1.yaml rename to core/src/test/resources/schemaDiff/schema-add-property-put-1.yaml diff --git a/core/src/test/resources/add-prop-put-2.yaml b/core/src/test/resources/schemaDiff/schema-add-property-put-2.yaml similarity index 100% rename from core/src/test/resources/add-prop-put-2.yaml rename to core/src/test/resources/schemaDiff/schema-add-property-put-2.yaml diff --git a/core/src/test/resources/issue-256_1.json b/core/src/test/resources/schemaDiff/schema-additional-properties-1.json similarity index 100% rename from core/src/test/resources/issue-256_1.json rename to core/src/test/resources/schemaDiff/schema-additional-properties-1.json diff --git a/core/src/test/resources/issue-256_2.json b/core/src/test/resources/schemaDiff/schema-additional-properties-2.json similarity index 100% rename from core/src/test/resources/issue-256_2.json rename to core/src/test/resources/schemaDiff/schema-additional-properties-2.json diff --git a/core/src/test/resources/schemaDiff/schema-deprecated-handling-1.yaml b/core/src/test/resources/schemaDiff/schema-deprecated-handling-1.yaml new file mode 100644 index 000000000..48dcd021e --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-deprecated-handling-1.yaml @@ -0,0 +1,33 @@ +openapi: 3.1.0 +info: + description: Schema deprecated handling + title: defaults + version: 1.0.0 +paths: + /schema-diff/deprecated/added: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/DeprecatedAdded" + /schema-diff/deprecated/removed: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/DeprecatedRemoved" +components: + schemas: + DeprecatedAdded: + type: object + properties: + field1: + type: string + DeprecatedRemoved: + type: object + deprecated: true + properties: + field1: + type: string \ No newline at end of file diff --git a/core/src/test/resources/schemaDiff/schema-deprecated-handling-2.yaml b/core/src/test/resources/schemaDiff/schema-deprecated-handling-2.yaml new file mode 100644 index 000000000..00432216c --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-deprecated-handling-2.yaml @@ -0,0 +1,33 @@ +openapi: 3.1.0 +info: + description: Schema deprecated handling + title: defaults + version: 1.0.0 +paths: + /schema-diff/deprecated/added: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/DeprecatedAdded" + /schema-diff/deprecated/removed: + post: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/DeprecatedRemoved" +components: + schemas: + DeprecatedAdded: + deprecated: true + type: object + properties: + field1: + type: string + DeprecatedRemoved: + type: object + properties: + field1: + type: string \ No newline at end of file diff --git a/core/src/test/resources/issue-717-schema-defaults-handling-1.yaml b/core/src/test/resources/schemaDiff/schema-props-defaults-handling-1.yaml similarity index 100% rename from core/src/test/resources/issue-717-schema-defaults-handling-1.yaml rename to core/src/test/resources/schemaDiff/schema-props-defaults-handling-1.yaml diff --git a/core/src/test/resources/issue-717-schema-defaults-handling-2.yaml b/core/src/test/resources/schemaDiff/schema-props-defaults-handling-2.yaml similarity index 100% rename from core/src/test/resources/issue-717-schema-defaults-handling-2.yaml rename to core/src/test/resources/schemaDiff/schema-props-defaults-handling-2.yaml From 42c17beb92d351a22178545644c2d2c0bd494247 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Thu, 13 Feb 2025 11:41:55 +0100 Subject: [PATCH 293/313] Change of 'multipleof' is not detected (#746) --- .../schemadiffresult/SchemaDiffResult.java | 1 + .../openapidiff/core/model/ChangedSchema.java | 23 ++++++++ .../core/model/schema/ChangedMultipleOf.java | 57 +++++++++++++++++++ .../openapidiff/core/ChangesResolver.java | 43 +++++++++++++- .../openapidiff/core/SchemaDiffTest.java | 56 +++++++++++++----- .../schemaDiff/schema-multiple-of-diff-1.yaml | 29 ++++++++++ .../schemaDiff/schema-multiple-of-diff-2.yaml | 29 ++++++++++ 7 files changed, 224 insertions(+), 14 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMultipleOf.java create mode 100644 core/src/test/resources/schemaDiff/schema-multiple-of-diff-1.yaml create mode 100644 core/src/test/resources/schemaDiff/schema-multiple-of-diff-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index 1cd63ae83..f3b1d44c9 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -71,6 +71,7 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( left.getExclusiveMaximum(), right.getExclusiveMaximum(), context)) + .setMultipleOf(new ChangedMultipleOf(left.getMultipleOf(), right.getMultipleOf())) .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) .setExample(new ChangedExample(left.getExample(), right.getExample())); builder diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index aa3de8d1e..d11575ade 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -10,6 +10,7 @@ import java.util.stream.Stream; import org.openapitools.openapidiff.core.model.schema.ChangedEnum; import org.openapitools.openapidiff.core.model.schema.ChangedMaxLength; +import org.openapitools.openapidiff.core.model.schema.ChangedMultipleOf; import org.openapitools.openapidiff.core.model.schema.ChangedNumericRange; import org.openapitools.openapidiff.core.model.schema.ChangedReadOnly; import org.openapitools.openapidiff.core.model.schema.ChangedRequired; @@ -37,6 +38,7 @@ public class ChangedSchema implements ComposedChanged { protected boolean changedType; protected ChangedMaxLength maxLength; protected ChangedNumericRange numericRange; + protected ChangedMultipleOf multipleOf; protected boolean discriminatorPropertyChanged; protected ChangedSchema items; protected ChangedOneOfSchema oneOfSchema; @@ -119,6 +121,7 @@ public List<Changed> getChangedElements() { required, maxLength, numericRange, + multipleOf, extensions)) .collect(Collectors.toList()); } @@ -274,6 +277,14 @@ public ChangedMaxLength getMaxLength() { return this.maxLength; } + public ChangedNumericRange getNumericRange() { + return this.numericRange; + } + + public ChangedMultipleOf getMultipleOf() { + return this.multipleOf; + } + public boolean isDiscriminatorPropertyChanged() { return this.discriminatorPropertyChanged; } @@ -416,6 +427,12 @@ public ChangedSchema setNumericRange(final ChangedNumericRange numericRange) { return this; } + public ChangedSchema setMultipleOf(final ChangedMultipleOf multipleOf) { + clearChangedCache(); + this.multipleOf = multipleOf; + return this; + } + public ChangedSchema setDiscriminatorPropertyChanged(final boolean discriminatorPropertyChanged) { clearChangedCache(); this.discriminatorPropertyChanged = discriminatorPropertyChanged; @@ -473,6 +490,7 @@ public boolean equals(Object o) { && Objects.equals(writeOnly, that.writeOnly) && Objects.equals(maxLength, that.maxLength) && Objects.equals(numericRange, that.numericRange) + && Objects.equals(multipleOf, that.multipleOf) && Objects.equals(items, that.items) && Objects.equals(oneOfSchema, that.oneOfSchema) && Objects.equals(addProp, that.addProp) @@ -503,6 +521,7 @@ public int hashCode() { changedType, maxLength, numericRange, + multipleOf, discriminatorPropertyChanged, items, oneOfSchema, @@ -552,6 +571,10 @@ public java.lang.String toString() { + this.isChangedType() + ", maxLength=" + this.getMaxLength() + + ", numericRange=" + + this.getNumericRange() + + ", multipleOf=" + + this.getMultipleOf() + ", discriminatorPropertyChanged=" + this.isDiscriminatorPropertyChanged() + ", items=" diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMultipleOf.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMultipleOf.java new file mode 100644 index 000000000..adaf15710 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMultipleOf.java @@ -0,0 +1,57 @@ +package org.openapitools.openapidiff.core.model.schema; + +import java.math.BigDecimal; +import java.util.Objects; +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffResult; + +public class ChangedMultipleOf implements Changed { + + private final BigDecimal left; + private final BigDecimal right; + + public ChangedMultipleOf(BigDecimal leftMultipleOf, BigDecimal rightMultipleOf) { + this.left = leftMultipleOf; + this.right = rightMultipleOf; + } + + @Override + public DiffResult isChanged() { + if (Objects.equals(left, right)) { + return DiffResult.NO_CHANGES; + } + + // multipleof removed -> compatible + if (right == null) { + return DiffResult.COMPATIBLE; + } + + return DiffResult.INCOMPATIBLE; + } + + public BigDecimal getLeft() { + return left; + } + + public BigDecimal getRight() { + return right; + } + + @Override + public String toString() { + return "ChangedMultipleOf [left=" + left + ", right=" + right + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ChangedMultipleOf that = (ChangedMultipleOf) o; + return Objects.equals(left, that.getLeft()) && Objects.equals(right, that.getRight()); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java b/core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java index 0050f95ad..cb0fe37b6 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/ChangesResolver.java @@ -17,6 +17,14 @@ public class ChangesResolver { + /** + * Get the ChangedOperation for the given method and path. + * + * @param changedOpenApi the ChangedOpenApi object + * @param method the HTTP method + * @param path the path + * @return the ChangedOperation object + */ @Nullable public static ChangedOperation getChangedOperation( ChangedOpenApi changedOpenApi, HttpMethod method, String path) { @@ -28,6 +36,15 @@ public static ChangedOperation getChangedOperation( .orElse(null); } + /** + * Get the ChangedParameter for the given method, path, and parameter name. + * + * @param changedOpenApi the ChangedOpenApi object + * @param method the HTTP method + * @param path the path + * @param parameterName the parameter name + * @return the ChangedParameter object + */ @Nullable public static ChangedParameter getChangedParameter( ChangedOpenApi changedOpenApi, HttpMethod method, String path, String parameterName) { @@ -47,6 +64,15 @@ public static ChangedParameter getChangedParameter( .orElse(null); } + /** + * Get the ChangedHeaders for the given method, path, and response code. + * + * @param changedOpenApi the ChangedOpenApi object + * @param method the HTTP method + * @param path the path + * @param responseCode the response code + * @return the ChangedHeaders object + */ @Nullable public static ChangedHeaders getChangedResponseHeaders( ChangedOpenApi changedOpenApi, HttpMethod method, String path, String responseCode) { @@ -58,9 +84,24 @@ public static ChangedHeaders getChangedResponseHeaders( .orElse(null); } + /** + * Get the ChangedSchema for the given method, path, and media type. + * + * @param changedOpenApi the ChangedOpenApi object + * @param method the HTTP method + * @param path the path + * @param mediaType the media type + * @return the ChangedSchema object + */ @Nullable public static ChangedSchema getRequestBodyChangedSchema( - ChangedOperation changedOperation, String mediaType) { + ChangedOpenApi changedOpenApi, HttpMethod method, String path, String mediaType) { + ChangedOperation changedOperation = getChangedOperation(changedOpenApi, method, path); + + if (changedOperation == null) { + return null; + } + return Optional.ofNullable(changedOperation) .map(ChangedOperation::getRequestBody) .map(ChangedRequestBody::getContent) diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java index 9016f2b91..0b4eab6cb 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java @@ -1,19 +1,19 @@ package org.openapitools.openapidiff.core; +import static io.swagger.v3.oas.models.PathItem.HttpMethod.POST; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.openapitools.openapidiff.core.ChangesResolver.getChangedOperation; import static org.openapitools.openapidiff.core.ChangesResolver.getRequestBodyChangedSchema; import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible; -import io.swagger.v3.oas.models.PathItem.HttpMethod; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; +import java.math.BigDecimal; +import java.util.Map; import org.junit.jupiter.api.Test; import org.openapitools.openapidiff.core.model.ChangedOpenApi; -import org.openapitools.openapidiff.core.model.ChangedOperation; import org.openapitools.openapidiff.core.model.ChangedSchema; import org.openapitools.openapidiff.core.output.ConsoleRender; @@ -49,11 +49,9 @@ public void schemaBecomesDeprecatedTest() { "schemaDiff/schema-deprecated-handling-1.yaml", "schemaDiff/schema-deprecated-handling-2.yaml"); - ChangedOperation operation = - getChangedOperation(changedOpenApi, HttpMethod.POST, "/schema-diff/deprecated/added"); - assertNotNull(operation); - - ChangedSchema requestBodySchema = getRequestBodyChangedSchema(operation, "application/json"); + ChangedSchema requestBodySchema = + getRequestBodyChangedSchema( + changedOpenApi, POST, "/schema-diff/deprecated/added", "application/json"); assertNotNull(requestBodySchema); assertTrue(requestBodySchema.isChangeDeprecated()); } @@ -65,11 +63,9 @@ public void schemaBecomesNotDeprecatedTest() { "schemaDiff/schema-deprecated-handling-1.yaml", "schemaDiff/schema-deprecated-handling-2.yaml"); - ChangedOperation operation = - getChangedOperation(changedOpenApi, HttpMethod.POST, "/schema-diff/deprecated/removed"); - assertNotNull(operation); - - ChangedSchema requestBodySchema = getRequestBodyChangedSchema(operation, "application/json"); + ChangedSchema requestBodySchema = + getRequestBodyChangedSchema( + changedOpenApi, POST, "/schema-diff/deprecated/removed", "application/json"); assertNotNull(requestBodySchema); assertTrue(requestBodySchema.isChangeDeprecated()); } @@ -104,4 +100,38 @@ public void addPropertyInPutApiIsCompatible() { assertThat(changedOpenApi.isDifferent()).isTrue(); assertThat(changedOpenApi.isCompatible()).isTrue(); } + + @Test // issues #483 #463 + public void changeMultipleOfHandling() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-multiple-of-diff-1.yaml", + "schemaDiff/schema-multiple-of-diff-2.yaml"); + ChangedSchema changedSchema = + getRequestBodyChangedSchema( + changedOpenApi, POST, "/schema/numeric/multiple-of", "application/json"); + + assertThat(changedSchema).isNotNull(); + Map<String, ChangedSchema> props = changedSchema.getChangedProperties(); + assertThat(props).isNotEmpty(); + + // Check changes in multipleOf + assertThat(props.get("field1").getMultipleOf().isIncompatible()).isTrue(); + assertThat(props.get("field1").getMultipleOf().getLeft()).isEqualTo(BigDecimal.valueOf(10)); + assertThat(props.get("field1").getMultipleOf().getRight()).isEqualTo(BigDecimal.valueOf(20)); + + assertThat(props.get("field2").getMultipleOf().isIncompatible()).isTrue(); + assertThat(props.get("field2").getMultipleOf().getLeft()).isEqualTo(BigDecimal.valueOf(0.01)); + assertThat(props.get("field2").getMultipleOf().getRight()).isEqualTo(BigDecimal.valueOf(0.1)); + + // Check addition of multipleOf + assertThat(props.get("field3").getMultipleOf().isIncompatible()).isTrue(); + assertThat(props.get("field3").getMultipleOf().getLeft()).isNull(); + assertThat(props.get("field3").getMultipleOf().getRight()).isEqualTo(BigDecimal.valueOf(10)); + + // Check deletion of multipleOf + assertThat(props.get("field4").getMultipleOf().isCompatible()).isTrue(); + assertThat(props.get("field4").getMultipleOf().getLeft()).isEqualTo(BigDecimal.valueOf(10)); + assertThat(props.get("field4").getMultipleOf().getRight()).isNull(); + } } diff --git a/core/src/test/resources/schemaDiff/schema-multiple-of-diff-1.yaml b/core/src/test/resources/schemaDiff/schema-multiple-of-diff-1.yaml new file mode 100644 index 000000000..49d3f3b17 --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-multiple-of-diff-1.yaml @@ -0,0 +1,29 @@ +openapi: 3.1.0 +info: + description: Schema diff + title: schema diff + version: 1.0.0 +paths: + /schema/numeric/multiple-of: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + type: integer + multipleOf: 10 + field2: + type: integer + multipleOf: 0.01 + field3: + type: integer + field4: + type: integer + multipleOf: 10 \ No newline at end of file diff --git a/core/src/test/resources/schemaDiff/schema-multiple-of-diff-2.yaml b/core/src/test/resources/schemaDiff/schema-multiple-of-diff-2.yaml new file mode 100644 index 000000000..58311d082 --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-multiple-of-diff-2.yaml @@ -0,0 +1,29 @@ +openapi: 3.1.0 +info: + description: Schema diff + title: schema diff + version: 1.0.0 +paths: + /schema/numeric/multiple-of: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + type: integer + multipleOf: 20 + field2: + type: integer + multipleOf: 0.1 + field3: + type: integer + multipleOf: 10 + field4: + type: integer \ No newline at end of file From 8508eb5be8497a8b2072d91b4dc4d85791dee82c Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Fri, 14 Feb 2025 13:33:08 +0100 Subject: [PATCH 294/313] Change of 'nullable' is not detected (#747) Fixes #482 --- .../ComposedSchemaDiffResult.java | 2 +- .../schemadiffresult/SchemaDiffResult.java | 1 + .../openapidiff/core/model/ChangedSchema.java | 18 +++++++ .../core/model/schema/ChangedNullable.java | 54 +++++++++++++++++++ .../{ => schema}/ChangedOneOfSchema.java | 7 ++- .../core/output/MarkdownRender.java | 1 + .../openapidiff/core/SchemaDiffTest.java | 31 +++++++++++ .../schemaDiff/schema-nullable-diff-1.yaml | 28 ++++++++++ .../schemaDiff/schema-nullable-diff-2.yaml | 28 ++++++++++ 9 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNullable.java rename core/src/main/java/org/openapitools/openapidiff/core/model/{ => schema}/ChangedOneOfSchema.java (90%) create mode 100644 core/src/test/resources/schemaDiff/schema-nullable-diff-1.yaml create mode 100644 core/src/test/resources/schemaDiff/schema-nullable-diff-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ComposedSchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ComposedSchemaDiffResult.java index e76aa0155..2f86318eb 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ComposedSchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ComposedSchemaDiffResult.java @@ -12,13 +12,13 @@ import org.apache.commons.collections4.CollectionUtils; import org.openapitools.openapidiff.core.compare.MapKeyDiff; import org.openapitools.openapidiff.core.compare.OpenApiDiff; -import org.openapitools.openapidiff.core.model.ChangedOneOfSchema; import org.openapitools.openapidiff.core.model.ChangedSchema; import org.openapitools.openapidiff.core.model.DiffContext; import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder; import org.openapitools.openapidiff.core.model.deferred.DeferredChanged; import org.openapitools.openapidiff.core.model.deferred.RealizedChanged; import org.openapitools.openapidiff.core.model.deferred.RecursiveSchemaSet; +import org.openapitools.openapidiff.core.model.schema.ChangedOneOfSchema; import org.openapitools.openapidiff.core.utils.RefPointer; import org.openapitools.openapidiff.core.utils.RefType; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index f3b1d44c9..b8a0f1410 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -72,6 +72,7 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( right.getExclusiveMaximum(), context)) .setMultipleOf(new ChangedMultipleOf(left.getMultipleOf(), right.getMultipleOf())) + .setNullable(new ChangedNullable(left.getNullable(), right.getNullable())) .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) .setExample(new ChangedExample(left.getExample(), right.getExample())); builder diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index d11575ade..2344a3341 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -11,7 +11,9 @@ import org.openapitools.openapidiff.core.model.schema.ChangedEnum; import org.openapitools.openapidiff.core.model.schema.ChangedMaxLength; import org.openapitools.openapidiff.core.model.schema.ChangedMultipleOf; +import org.openapitools.openapidiff.core.model.schema.ChangedNullable; import org.openapitools.openapidiff.core.model.schema.ChangedNumericRange; +import org.openapitools.openapidiff.core.model.schema.ChangedOneOfSchema; import org.openapitools.openapidiff.core.model.schema.ChangedReadOnly; import org.openapitools.openapidiff.core.model.schema.ChangedRequired; import org.openapitools.openapidiff.core.model.schema.ChangedWriteOnly; @@ -39,6 +41,7 @@ public class ChangedSchema implements ComposedChanged { protected ChangedMaxLength maxLength; protected ChangedNumericRange numericRange; protected ChangedMultipleOf multipleOf; + protected ChangedNullable nullable; protected boolean discriminatorPropertyChanged; protected ChangedSchema items; protected ChangedOneOfSchema oneOfSchema; @@ -122,6 +125,7 @@ public List<Changed> getChangedElements() { maxLength, numericRange, multipleOf, + nullable, extensions)) .collect(Collectors.toList()); } @@ -285,6 +289,10 @@ public ChangedMultipleOf getMultipleOf() { return this.multipleOf; } + public ChangedNullable getNullable() { + return this.nullable; + } + public boolean isDiscriminatorPropertyChanged() { return this.discriminatorPropertyChanged; } @@ -433,6 +441,12 @@ public ChangedSchema setMultipleOf(final ChangedMultipleOf multipleOf) { return this; } + public ChangedSchema setNullable(final ChangedNullable nullable) { + clearChangedCache(); + this.nullable = nullable; + return this; + } + public ChangedSchema setDiscriminatorPropertyChanged(final boolean discriminatorPropertyChanged) { clearChangedCache(); this.discriminatorPropertyChanged = discriminatorPropertyChanged; @@ -491,6 +505,7 @@ public boolean equals(Object o) { && Objects.equals(maxLength, that.maxLength) && Objects.equals(numericRange, that.numericRange) && Objects.equals(multipleOf, that.multipleOf) + && Objects.equals(nullable, that.nullable) && Objects.equals(items, that.items) && Objects.equals(oneOfSchema, that.oneOfSchema) && Objects.equals(addProp, that.addProp) @@ -522,6 +537,7 @@ public int hashCode() { maxLength, numericRange, multipleOf, + nullable, discriminatorPropertyChanged, items, oneOfSchema, @@ -575,6 +591,8 @@ public java.lang.String toString() { + this.getNumericRange() + ", multipleOf=" + this.getMultipleOf() + + ", nullable=" + + this.getNullable() + ", discriminatorPropertyChanged=" + this.isDiscriminatorPropertyChanged() + ", items=" diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNullable.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNullable.java new file mode 100644 index 000000000..befc1d16d --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedNullable.java @@ -0,0 +1,54 @@ +package org.openapitools.openapidiff.core.model.schema; + +import java.util.Objects; +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffResult; + +public class ChangedNullable implements Changed { + + private final Boolean left; + private final Boolean right; + + public ChangedNullable(Boolean leftNullable, Boolean rightNullable) { + this.left = leftNullable; + this.right = rightNullable; + } + + @Override + public DiffResult isChanged() { + boolean leftValue = left != null && left; + boolean rightValue = right != null && right; + + if (leftValue != rightValue) { + return DiffResult.COMPATIBLE; + } + + return DiffResult.NO_CHANGES; + } + + public Boolean getLeft() { + return left; + } + + public Boolean getRight() { + return right; + } + + @Override + public String toString() { + return "ChangedNullable [left=" + left + ", right=" + right + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ChangedNullable that = (ChangedNullable) o; + return Objects.equals(left, that.getLeft()) && Objects.equals(right, that.getRight()); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedOneOfSchema.java similarity index 90% rename from core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java rename to core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedOneOfSchema.java index d1ecfdbde..60159f569 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedOneOfSchema.java @@ -1,4 +1,4 @@ -package org.openapitools.openapidiff.core.model; +package org.openapitools.openapidiff.core.model.schema; import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_ONEOF_DECREASED; import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_ONEOF_INCREASED; @@ -8,6 +8,11 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.ChangedSchema; +import org.openapitools.openapidiff.core.model.ComposedChanged; +import org.openapitools.openapidiff.core.model.DiffContext; +import org.openapitools.openapidiff.core.model.DiffResult; public class ChangedOneOfSchema implements ComposedChanged { private final Map<String, String> oldMapping; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java index 5e0d0dd76..e55179b15 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java @@ -20,6 +20,7 @@ import org.apache.commons.lang3.StringUtils; import org.openapitools.openapidiff.core.exception.RendererException; import org.openapitools.openapidiff.core.model.*; +import org.openapitools.openapidiff.core.model.schema.ChangedOneOfSchema; import org.openapitools.openapidiff.core.utils.RefPointer; import org.openapitools.openapidiff.core.utils.RefType; import org.slf4j.Logger; diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java index 0b4eab6cb..318cae335 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java @@ -134,4 +134,35 @@ public void changeMultipleOfHandling() { assertThat(props.get("field4").getMultipleOf().getLeft()).isEqualTo(BigDecimal.valueOf(10)); assertThat(props.get("field4").getMultipleOf().getRight()).isNull(); } + + @Test // issue #482 + public void changeNullabeHandling() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-nullable-diff-1.yaml", "schemaDiff/schema-nullable-diff-2.yaml"); + ChangedSchema changedSchema = + getRequestBodyChangedSchema(changedOpenApi, POST, "/schema/nullable", "application/json"); + + assertThat(changedSchema).isNotNull(); + Map<String, ChangedSchema> props = changedSchema.getChangedProperties(); + assertThat(props).isNotEmpty(); + + // Check no changes in nullable + assertThat(props.get("field0")).isNull(); + + // Check changes in nullable + assertThat(props.get("field1").getNullable().isCompatible()).isTrue(); + assertThat(props.get("field1").getNullable().getLeft()).isTrue(); + assertThat(props.get("field1").getNullable().getRight()).isFalse(); + + // Check deletion of nullable + assertThat(props.get("field2").getNullable().isCompatible()).isTrue(); + assertThat(props.get("field2").getNullable().getLeft()).isTrue(); + assertThat(props.get("field2").getNullable().getRight()).isNull(); + + // Check addition of nullable + assertThat(props.get("field3").getNullable().isCompatible()).isTrue(); + assertThat(props.get("field3").getNullable().getLeft()).isNull(); + assertThat(props.get("field3").getNullable().getRight()).isTrue(); + } } diff --git a/core/src/test/resources/schemaDiff/schema-nullable-diff-1.yaml b/core/src/test/resources/schemaDiff/schema-nullable-diff-1.yaml new file mode 100644 index 000000000..b467c3746 --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-nullable-diff-1.yaml @@ -0,0 +1,28 @@ +openapi: 3.0.1 +info: + description: Schema diff nullable + title: schema diff nullable + version: 1.0.0 +paths: + /schema/nullable: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field0: + type: integer + field1: + type: integer + nullable: true + field2: + type: integer + nullable: true + field3: + type: integer \ No newline at end of file diff --git a/core/src/test/resources/schemaDiff/schema-nullable-diff-2.yaml b/core/src/test/resources/schemaDiff/schema-nullable-diff-2.yaml new file mode 100644 index 000000000..e186f76e6 --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-nullable-diff-2.yaml @@ -0,0 +1,28 @@ +openapi: 3.0.1 +info: + description: Schema diff nullable + title: schema diff nullable + version: 1.0.0 +paths: + /schema/nullable: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field0: + type: integer + field1: + type: integer + nullable: false + field2: + type: integer + field3: + type: integer + nullable: true \ No newline at end of file From 9413c362164a1850a85144bec7f97cf5df362f64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:40:02 +0100 Subject: [PATCH 295/313] build(deps): bump slf4j.version from 2.0.16 to 2.0.17 (#751) Bumps `slf4j.version` from 2.0.16 to 2.0.17. Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:jcl-over-slf4j` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:jcl-over-slf4j dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9fc899bc7..ec37c59e9 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> <swagger-parser.version>2.1.25</swagger-parser.version> - <slf4j.version>2.0.16</slf4j.version> + <slf4j.version>2.0.17</slf4j.version> </properties> <dependencyManagement> From b525b7a0d91099857ea4ae2035b869449e8dafda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:42:03 +0100 Subject: [PATCH 296/313] build(deps): bump org.junit:junit-bom from 5.11.4 to 5.12.0 (#749) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.11.4 to 5.12.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.11.4...r5.12.0) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ec37c59e9..85db23d0b 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.11.4</version> + <version>5.12.0</version> <type>pom</type> <scope>import</scope> </dependency> From 36212c932cbad6eed29669262d1d55bce7a80624 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:42:20 +0100 Subject: [PATCH 297/313] build(deps): bump org.apache.maven.plugins:maven-compiler-plugin (#748) Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.13.0 to 3.14.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 85db23d0b..12d067520 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.13.0</version> + <version>3.14.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 771a642f09dde5d8f9fbb45131b6c980dcba4190 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2025 10:38:48 +0100 Subject: [PATCH 298/313] build(deps): bump org.apache.maven.plugins:maven-deploy-plugin (#752) Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 12d067520..5f34ab003 100644 --- a/pom.xml +++ b/pom.xml @@ -323,7 +323,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> - <version>3.1.3</version> + <version>3.1.4</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From cc8d12adfa839603a13c95b25bacc8fbba39f99d Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Fri, 28 Feb 2025 00:00:34 +0100 Subject: [PATCH 299/313] Changes on 'minItems' and 'maxItems' not detected (#753) --- .../schemadiffresult/SchemaDiffResult.java | 6 ++- .../openapidiff/core/model/ChangedSchema.java | 34 +++++++++++++++ .../core/model/schema/ChangedMaxItems.java | 43 +++++++++++++++++++ .../core/model/schema/ChangedMinItems.java | 43 +++++++++++++++++++ .../openapidiff/core/SchemaDiffTest.java | 35 +++++++++++++++ .../schema-min-max-items-diff-1.yaml | 42 ++++++++++++++++++ .../schema-min-max-items-diff-2.yaml | 42 ++++++++++++++++++ 7 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxItems.java create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinItems.java create mode 100644 core/src/test/resources/schemaDiff/schema-min-max-items-diff-1.yaml create mode 100644 core/src/test/resources/schemaDiff/schema-min-max-items-diff-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index b8a0f1410..05337b7ea 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -19,6 +19,8 @@ import org.openapitools.openapidiff.core.model.deferred.DeferredChanged; import org.openapitools.openapidiff.core.model.deferred.RecursiveSchemaSet; import org.openapitools.openapidiff.core.model.schema.*; +import org.openapitools.openapidiff.core.model.schema.ChangedMaxItems; +import org.openapitools.openapidiff.core.model.schema.ChangedMinItems; public class SchemaDiffResult { protected ChangedSchema changedSchema; @@ -74,7 +76,9 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( .setMultipleOf(new ChangedMultipleOf(left.getMultipleOf(), right.getMultipleOf())) .setNullable(new ChangedNullable(left.getNullable(), right.getNullable())) .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) - .setExample(new ChangedExample(left.getExample(), right.getExample())); + .setExample(new ChangedExample(left.getExample(), right.getExample())) + .setMaxItems(new ChangedMaxItems(left.getMaxItems(), right.getMaxItems(), context)) + .setMinItems(new ChangedMinItems(left.getMinItems(), right.getMinItems(), context)); builder .with( openApiDiff diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index 2344a3341..12f373ea6 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -9,7 +9,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.openapitools.openapidiff.core.model.schema.ChangedEnum; +import org.openapitools.openapidiff.core.model.schema.ChangedMaxItems; import org.openapitools.openapidiff.core.model.schema.ChangedMaxLength; +import org.openapitools.openapidiff.core.model.schema.ChangedMinItems; import org.openapitools.openapidiff.core.model.schema.ChangedMultipleOf; import org.openapitools.openapidiff.core.model.schema.ChangedNullable; import org.openapitools.openapidiff.core.model.schema.ChangedNumericRange; @@ -41,6 +43,8 @@ public class ChangedSchema implements ComposedChanged { protected ChangedMaxLength maxLength; protected ChangedNumericRange numericRange; protected ChangedMultipleOf multipleOf; + protected ChangedMaxItems maxItems; + protected ChangedMinItems minItems; protected ChangedNullable nullable; protected boolean discriminatorPropertyChanged; protected ChangedSchema items; @@ -125,6 +129,8 @@ public List<Changed> getChangedElements() { maxLength, numericRange, multipleOf, + maxItems, + minItems, nullable, extensions)) .collect(Collectors.toList()); @@ -289,6 +295,14 @@ public ChangedMultipleOf getMultipleOf() { return this.multipleOf; } + public ChangedMaxItems getMaxItems() { + return this.maxItems; + } + + public ChangedMinItems getMinItems() { + return this.minItems; + } + public ChangedNullable getNullable() { return this.nullable; } @@ -441,6 +455,18 @@ public ChangedSchema setMultipleOf(final ChangedMultipleOf multipleOf) { return this; } + public ChangedSchema setMaxItems(final ChangedMaxItems maxItems) { + clearChangedCache(); + this.maxItems = maxItems; + return this; + } + + public ChangedSchema setMinItems(final ChangedMinItems minItems) { + clearChangedCache(); + this.minItems = minItems; + return this; + } + public ChangedSchema setNullable(final ChangedNullable nullable) { clearChangedCache(); this.nullable = nullable; @@ -505,6 +531,8 @@ public boolean equals(Object o) { && Objects.equals(maxLength, that.maxLength) && Objects.equals(numericRange, that.numericRange) && Objects.equals(multipleOf, that.multipleOf) + && Objects.equals(maxItems, that.maxItems) + && Objects.equals(minItems, that.minItems) && Objects.equals(nullable, that.nullable) && Objects.equals(items, that.items) && Objects.equals(oneOfSchema, that.oneOfSchema) @@ -537,6 +565,8 @@ public int hashCode() { maxLength, numericRange, multipleOf, + maxItems, + minItems, nullable, discriminatorPropertyChanged, items, @@ -591,6 +621,10 @@ public java.lang.String toString() { + this.getNumericRange() + ", multipleOf=" + this.getMultipleOf() + + ", maxItems=" + + this.getMaxItems() + + ", minItems=" + + this.getMinItems() + ", nullable=" + this.getNullable() + ", discriminatorPropertyChanged=" diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxItems.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxItems.java new file mode 100644 index 000000000..1af1134b7 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxItems.java @@ -0,0 +1,43 @@ +package org.openapitools.openapidiff.core.model.schema; + +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffContext; +import org.openapitools.openapidiff.core.model.DiffResult; + +public class ChangedMaxItems implements Changed { + private final Integer oldValue; + private final Integer newValue; + private final DiffContext context; + + public ChangedMaxItems(Integer oldValue, Integer newValue, DiffContext context) { + this.oldValue = oldValue; + this.newValue = newValue; + this.context = context; + } + + @Override + public DiffResult isChanged() { + if (oldValue == null && newValue == null) { + return DiffResult.NO_CHANGES; + } + if (oldValue == null || newValue == null) { + return DiffResult.COMPATIBLE; + } + if (newValue < oldValue) { + return DiffResult.INCOMPATIBLE; + } + return DiffResult.COMPATIBLE; + } + + public Integer getOldValue() { + return oldValue; + } + + public Integer getNewValue() { + return newValue; + } + + public DiffContext getContext() { + return context; + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinItems.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinItems.java new file mode 100644 index 000000000..7791893c0 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinItems.java @@ -0,0 +1,43 @@ +package org.openapitools.openapidiff.core.model.schema; + +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffContext; +import org.openapitools.openapidiff.core.model.DiffResult; + +public class ChangedMinItems implements Changed { + private final Integer oldValue; + private final Integer newValue; + private final DiffContext context; + + public ChangedMinItems(Integer oldValue, Integer newValue, DiffContext context) { + this.oldValue = oldValue; + this.newValue = newValue; + this.context = context; + } + + @Override + public DiffResult isChanged() { + if (oldValue == null && newValue == null) { + return DiffResult.NO_CHANGES; + } + if (oldValue == null || newValue == null) { + return DiffResult.COMPATIBLE; + } + if (newValue > oldValue) { + return DiffResult.INCOMPATIBLE; + } + return DiffResult.COMPATIBLE; + } + + public Integer getOldValue() { + return oldValue; + } + + public Integer getNewValue() { + return newValue; + } + + public DiffContext getContext() { + return context; + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java index 318cae335..4275a4a82 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java @@ -135,6 +135,41 @@ public void changeMultipleOfHandling() { assertThat(props.get("field4").getMultipleOf().getRight()).isNull(); } + @Test // issues #480 + public void changeMinMaxItemsHandling() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-min-max-items-diff-1.yaml", + "schemaDiff/schema-min-max-items-diff-2.yaml"); + ChangedSchema changedSchema = + getRequestBodyChangedSchema( + changedOpenApi, POST, "/schema/array/items", "application/json"); + + assertThat(changedSchema).isNotNull(); + Map<String, ChangedSchema> props = changedSchema.getChangedProperties(); + assertThat(props).isNotEmpty(); + + // Check increasing of minItems + assertThat(props.get("field1").getMinItems().isIncompatible()).isTrue(); + assertThat(props.get("field1").getMinItems().getOldValue()).isEqualTo(1); + assertThat(props.get("field1").getMinItems().getNewValue()).isEqualTo(2); + + // Check decreasing of minItems + assertThat(props.get("field2").getMinItems().isCompatible()).isTrue(); + assertThat(props.get("field2").getMinItems().getOldValue()).isEqualTo(20); + assertThat(props.get("field2").getMinItems().getNewValue()).isEqualTo(10); + + // Check increasing of maxItems + assertThat(props.get("field3").getMaxItems().isCompatible()).isTrue(); + assertThat(props.get("field3").getMaxItems().getOldValue()).isEqualTo(90); + assertThat(props.get("field3").getMaxItems().getNewValue()).isEqualTo(100); + + // Check decreasing of maxItems + assertThat(props.get("field4").getMaxItems().isIncompatible()).isTrue(); + assertThat(props.get("field4").getMaxItems().getOldValue()).isEqualTo(100); + assertThat(props.get("field4").getMaxItems().getNewValue()).isEqualTo(90); + } + @Test // issue #482 public void changeNullabeHandling() { ChangedOpenApi changedOpenApi = diff --git a/core/src/test/resources/schemaDiff/schema-min-max-items-diff-1.yaml b/core/src/test/resources/schemaDiff/schema-min-max-items-diff-1.yaml new file mode 100644 index 000000000..23d841484 --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-min-max-items-diff-1.yaml @@ -0,0 +1,42 @@ +openapi: 3.1.0 +info: + description: Schema diff + title: schema diff + version: 1.0.0 +paths: + /schema/array/items: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + type: array + items: + type: string + minItems: 1 + maxItems: 100 + field2: + type: array + items: + type: string + minItems: 20 + maxItems: 100 + field3: + type: array + items: + type: string + minItems: 1 + maxItems: 90 + field4: + type: array + items: + type: string + minItems: 1 + maxItems: 100 diff --git a/core/src/test/resources/schemaDiff/schema-min-max-items-diff-2.yaml b/core/src/test/resources/schemaDiff/schema-min-max-items-diff-2.yaml new file mode 100644 index 000000000..0d8e6199b --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-min-max-items-diff-2.yaml @@ -0,0 +1,42 @@ +openapi: 3.1.0 +info: + description: Schema diff + title: schema diff + version: 1.0.0 +paths: + /schema/array/items: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + type: array + items: + type: string + minItems: 2 + maxItems: 100 + field2: + type: array + items: + type: string + minItems: 10 + maxItems: 100 + field3: + type: array + items: + type: string + minItems: 1 + maxItems: 100 + field4: + type: array + items: + type: string + minItems: 1 + maxItems: 90 From 30a6d78b99a13facfbcd2ca2acf35375efef4b06 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Fri, 28 Feb 2025 19:55:06 +0100 Subject: [PATCH 300/313] Changes on "minProperties" / "maxProperties" are not detected (#754) Fixes #479 --- .../schemadiffresult/SchemaDiffResult.java | 6 ++- .../openapidiff/core/model/ChangedSchema.java | 38 ++++++++++++++- .../model/schema/ChangedMaxProperties.java | 46 +++++++++++++++++++ .../model/schema/ChangedMinProperties.java | 46 +++++++++++++++++++ .../openapidiff/core/SchemaDiffTest.java | 35 ++++++++++++++ .../schema-min-max-properties-diff-1.yaml | 30 ++++++++++++ .../schema-min-max-properties-diff-2.yaml | 30 ++++++++++++ 7 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxProperties.java create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinProperties.java create mode 100644 core/src/test/resources/schemaDiff/schema-min-max-properties-diff-1.yaml create mode 100644 core/src/test/resources/schemaDiff/schema-min-max-properties-diff-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index 05337b7ea..698eade4d 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -78,7 +78,11 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) .setExample(new ChangedExample(left.getExample(), right.getExample())) .setMaxItems(new ChangedMaxItems(left.getMaxItems(), right.getMaxItems(), context)) - .setMinItems(new ChangedMinItems(left.getMinItems(), right.getMinItems(), context)); + .setMinItems(new ChangedMinItems(left.getMinItems(), right.getMinItems(), context)) + .setMaxProperties( + new ChangedMaxProperties(left.getMaxProperties(), right.getMaxProperties(), context)) + .setMinProperties( + new ChangedMinProperties(left.getMinProperties(), right.getMinProperties(), context)); builder .with( openApiDiff diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index 12f373ea6..db98a329e 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -11,7 +11,9 @@ import org.openapitools.openapidiff.core.model.schema.ChangedEnum; import org.openapitools.openapidiff.core.model.schema.ChangedMaxItems; import org.openapitools.openapidiff.core.model.schema.ChangedMaxLength; +import org.openapitools.openapidiff.core.model.schema.ChangedMaxProperties; import org.openapitools.openapidiff.core.model.schema.ChangedMinItems; +import org.openapitools.openapidiff.core.model.schema.ChangedMinProperties; import org.openapitools.openapidiff.core.model.schema.ChangedMultipleOf; import org.openapitools.openapidiff.core.model.schema.ChangedNullable; import org.openapitools.openapidiff.core.model.schema.ChangedNumericRange; @@ -45,6 +47,8 @@ public class ChangedSchema implements ComposedChanged { protected ChangedMultipleOf multipleOf; protected ChangedMaxItems maxItems; protected ChangedMinItems minItems; + protected ChangedMaxProperties maxProperties; + protected ChangedMinProperties minProperties; protected ChangedNullable nullable; protected boolean discriminatorPropertyChanged; protected ChangedSchema items; @@ -131,6 +135,8 @@ public List<Changed> getChangedElements() { multipleOf, maxItems, minItems, + maxProperties, + minProperties, nullable, extensions)) .collect(Collectors.toList()); @@ -327,6 +333,14 @@ public ChangedExtensions getExtensions() { return this.extensions; } + public ChangedMaxProperties getMaxProperties() { + return this.maxProperties; + } + + public ChangedMinProperties getMinProperties() { + return this.minProperties; + } + public ChangedSchema setContext(final DiffContext context) { this.context = context; return this; @@ -503,6 +517,18 @@ public ChangedSchema setExtensions(final ChangedExtensions extensions) { return this; } + public ChangedSchema setMaxProperties(final ChangedMaxProperties maxProperties) { + clearChangedCache(); + this.maxProperties = maxProperties; + return this; + } + + public ChangedSchema setMinProperties(final ChangedMinProperties minProperties) { + clearChangedCache(); + this.minProperties = minProperties; + return this; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -537,7 +563,9 @@ public boolean equals(Object o) { && Objects.equals(items, that.items) && Objects.equals(oneOfSchema, that.oneOfSchema) && Objects.equals(addProp, that.addProp) - && Objects.equals(extensions, that.extensions); + && Objects.equals(extensions, that.extensions) + && Objects.equals(maxProperties, that.maxProperties) + && Objects.equals(minProperties, that.minProperties); } @Override @@ -572,7 +600,9 @@ public int hashCode() { items, oneOfSchema, addProp, - extensions); + extensions, + maxProperties, + minProperties); } @java.lang.Override @@ -637,6 +667,10 @@ public java.lang.String toString() { + this.getAddProp() + ", extensions=" + this.getExtensions() + + ", maxProperties=" + + this.getMaxProperties() + + ", minProperties=" + + this.getMinProperties() + ")"; } } diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxProperties.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxProperties.java new file mode 100644 index 000000000..c4c56af3f --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMaxProperties.java @@ -0,0 +1,46 @@ +package org.openapitools.openapidiff.core.model.schema; + +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffContext; +import org.openapitools.openapidiff.core.model.DiffResult; + +public class ChangedMaxProperties implements Changed { + private Integer oldValue; + private Integer newValue; + private DiffContext context; + + public ChangedMaxProperties(Integer oldValue, Integer newValue, DiffContext context) { + this.oldValue = oldValue; + this.newValue = newValue; + this.context = context; + } + + public Integer getOldValue() { + return oldValue; + } + + public Integer getNewValue() { + return newValue; + } + + @Override + public DiffResult isChanged() { + if (oldValue == null && newValue == null) { + return DiffResult.NO_CHANGES; + } + + if (oldValue == null) { + return DiffResult.INCOMPATIBLE; + } + + if (newValue == null) { + return DiffResult.COMPATIBLE; + } + + if (!oldValue.equals(newValue)) { + return oldValue > newValue ? DiffResult.INCOMPATIBLE : DiffResult.COMPATIBLE; + } + + return DiffResult.NO_CHANGES; + } +} diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinProperties.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinProperties.java new file mode 100644 index 000000000..f574b5c80 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedMinProperties.java @@ -0,0 +1,46 @@ +package org.openapitools.openapidiff.core.model.schema; + +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffContext; +import org.openapitools.openapidiff.core.model.DiffResult; + +public class ChangedMinProperties implements Changed { + private Integer oldValue; + private Integer newValue; + private DiffContext context; + + public ChangedMinProperties(Integer oldValue, Integer newValue, DiffContext context) { + this.oldValue = oldValue; + this.newValue = newValue; + this.context = context; + } + + public Integer getOldValue() { + return oldValue; + } + + public Integer getNewValue() { + return newValue; + } + + @Override + public DiffResult isChanged() { + if (oldValue == null && newValue == null) { + return DiffResult.NO_CHANGES; + } + + if (oldValue == null) { + return DiffResult.INCOMPATIBLE; + } + + if (newValue == null) { + return DiffResult.COMPATIBLE; + } + + if (!oldValue.equals(newValue)) { + return newValue > oldValue ? DiffResult.INCOMPATIBLE : DiffResult.COMPATIBLE; + } + + return DiffResult.NO_CHANGES; + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java index 4275a4a82..3915789bb 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java @@ -200,4 +200,39 @@ public void changeNullabeHandling() { assertThat(props.get("field3").getNullable().getLeft()).isNull(); assertThat(props.get("field3").getNullable().getRight()).isTrue(); } + + @Test // issue #479 + public void changeMinMaxPropertiesHandling() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-min-max-properties-diff-1.yaml", + "schemaDiff/schema-min-max-properties-diff-2.yaml"); + ChangedSchema changedSchema = + getRequestBodyChangedSchema( + changedOpenApi, POST, "/schema/object/min-max-properties", "application/json"); + + assertThat(changedSchema).isNotNull(); + Map<String, ChangedSchema> props = changedSchema.getChangedProperties(); + assertThat(props).isNotEmpty(); + + // Check increasing of minProperties + assertThat(props.get("field1").getMinProperties().isIncompatible()).isTrue(); + assertThat(props.get("field1").getMinProperties().getOldValue()).isEqualTo(1); + assertThat(props.get("field1").getMinProperties().getNewValue()).isEqualTo(10); + + // Check decreasing of minProperties + assertThat(props.get("field2").getMinProperties().isCompatible()).isTrue(); + assertThat(props.get("field2").getMinProperties().getOldValue()).isEqualTo(10); + assertThat(props.get("field2").getMinProperties().getNewValue()).isEqualTo(1); + + // Check increasing of maxProperties + assertThat(props.get("field3").getMaxProperties().isCompatible()).isTrue(); + assertThat(props.get("field3").getMaxProperties().getOldValue()).isEqualTo(10); + assertThat(props.get("field3").getMaxProperties().getNewValue()).isEqualTo(100); + + // Check decreasing of maxProperties + assertThat(props.get("field4").getMaxProperties().isIncompatible()).isTrue(); + assertThat(props.get("field4").getMaxProperties().getOldValue()).isEqualTo(100); + assertThat(props.get("field4").getMaxProperties().getNewValue()).isEqualTo(10); + } } diff --git a/core/src/test/resources/schemaDiff/schema-min-max-properties-diff-1.yaml b/core/src/test/resources/schemaDiff/schema-min-max-properties-diff-1.yaml new file mode 100644 index 000000000..263d710f7 --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-min-max-properties-diff-1.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.1 +info: + description: Schema diff + title: schema diff + version: 1.0.0 +paths: + /schema/object/min-max-properties: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + type: object + minProperties: 1 + field2: + type: object + minProperties: 10 + field3: + type: object + maxProperties: 10 + field4: + type: object + maxProperties: 100 diff --git a/core/src/test/resources/schemaDiff/schema-min-max-properties-diff-2.yaml b/core/src/test/resources/schemaDiff/schema-min-max-properties-diff-2.yaml new file mode 100644 index 000000000..17183d8a5 --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-min-max-properties-diff-2.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.1 +info: + description: Schema diff + title: schema diff + version: 1.0.0 +paths: + /schema/object/min-max-properties: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field1: + type: object + minProperties: 10 + field2: + type: object + minProperties: 1 + field3: + type: object + maxProperties: 100 + field4: + type: object + maxProperties: 10 From 7ef7b827e588376ccbb4b3e2f47201b8870497f1 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Sun, 16 Mar 2025 19:32:18 +0100 Subject: [PATCH 301/313] Fix CLI version option (#756) --- .gitignore | 3 +++ cli/pom.xml | 6 ++++++ .../java/org/openapitools/openapidiff/cli/Main.java | 11 ++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7956bcbd3..9190ddebe 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* target/ + +# IDE files +.vscode/settings.json \ No newline at end of file diff --git a/cli/pom.xml b/cli/pom.xml index 1ffcc3000..f1782dd1a 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -57,6 +57,9 @@ <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>${mainClass}</mainClass> + <manifestEntries> + <Implementation-Version>${project.version}</Implementation-Version> + </manifestEntries> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" /> @@ -89,6 +92,9 @@ <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>${mainClass}</mainClass> + <manifestEntries> + <Implementation-Version>${project.version}</Implementation-Version> + </manifestEntries> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" /> diff --git a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java index c80d272b8..a9e223d27 100644 --- a/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java +++ b/cli/src/main/java/org/openapitools/openapidiff/cli/Main.java @@ -35,7 +35,10 @@ public static void main(String... args) { Options options = new Options(); options.addOption(Option.builder("h").longOpt("help").desc("print this message").build()); options.addOption( - Option.builder().longOpt("version").desc("print the version information and exit").build()); + Option.builder("v") + .longOpt("version") + .desc("print the version information and exit") + .build()); options.addOption( Option.builder() .longOpt("state") @@ -72,6 +75,7 @@ public static void main(String... args) { options.addOption(Option.builder().longOpt("warn").desc("Print warning information").build()); options.addOption(Option.builder().longOpt("error").desc("Print error information").build()); options.addOption(Option.builder().longOpt("off").desc("No information printed").build()); + options.addOption(Option.builder().longOpt("off").desc("No information printed").build()); options.addOption( Option.builder("l") .longOpt("log") @@ -149,6 +153,11 @@ public static void main(String... args) { printHelp(options); System.exit(0); } + if (line.hasOption("version") || line.hasOption("v")) { + String version = Main.class.getPackage().getImplementationVersion(); + System.out.println("openapi-diff version: " + (version != null ? version : "DEV")); + System.exit(0); + } String logLevel = "ERROR"; if (line.hasOption("off")) { logLevel = "OFF"; From 1701963315d05397976829f2fe5389145fb3f6e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 19:35:36 +0100 Subject: [PATCH 302/313] build(deps): bump org.junit:junit-bom from 5.12.0 to 5.12.1 (#757) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.12.0 to 5.12.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.0...r5.12.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5f34ab003..5d65053be 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.12.0</version> + <version>5.12.1</version> <type>pom</type> <scope>import</scope> </dependency> From 95d4c0b71bf9856f638b889d1363ca60c98dc976 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Tue, 18 Mar 2025 20:45:47 +0100 Subject: [PATCH 303/313] Add support for 'uniqueItems' schema diff detection (#758) --- .../schemadiffresult/SchemaDiffResult.java | 1 + .../openapidiff/core/model/ChangedSchema.java | 17 ++++++ .../core/model/schema/ChangedUniqueItems.java | 58 +++++++++++++++++++ .../openapidiff/core/SchemaDiffTest.java | 40 ++++++++++++- .../schemaDiff/schema-uniqueItems-diff-1.yaml | 31 ++++++++++ .../schemaDiff/schema-uniqueItems-diff-2.yaml | 31 ++++++++++ 6 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedUniqueItems.java create mode 100644 core/src/test/resources/schemaDiff/schema-uniqueItems-diff-1.yaml create mode 100644 core/src/test/resources/schemaDiff/schema-uniqueItems-diff-2.yaml diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java index 698eade4d..32cb5bee9 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java @@ -75,6 +75,7 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff( context)) .setMultipleOf(new ChangedMultipleOf(left.getMultipleOf(), right.getMultipleOf())) .setNullable(new ChangedNullable(left.getNullable(), right.getNullable())) + .setUniqueItems(new ChangedUniqueItems(left.getUniqueItems(), right.getUniqueItems())) .setExamples(new ChangedExamples(left.getExamples(), right.getExamples())) .setExample(new ChangedExample(left.getExample(), right.getExample())) .setMaxItems(new ChangedMaxItems(left.getMaxItems(), right.getMaxItems(), context)) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java index db98a329e..3779ee853 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java @@ -20,6 +20,7 @@ import org.openapitools.openapidiff.core.model.schema.ChangedOneOfSchema; import org.openapitools.openapidiff.core.model.schema.ChangedReadOnly; import org.openapitools.openapidiff.core.model.schema.ChangedRequired; +import org.openapitools.openapidiff.core.model.schema.ChangedUniqueItems; import org.openapitools.openapidiff.core.model.schema.ChangedWriteOnly; public class ChangedSchema implements ComposedChanged { @@ -50,6 +51,7 @@ public class ChangedSchema implements ComposedChanged { protected ChangedMaxProperties maxProperties; protected ChangedMinProperties minProperties; protected ChangedNullable nullable; + protected ChangedUniqueItems uniqueItems; protected boolean discriminatorPropertyChanged; protected ChangedSchema items; protected ChangedOneOfSchema oneOfSchema; @@ -138,6 +140,7 @@ public List<Changed> getChangedElements() { maxProperties, minProperties, nullable, + uniqueItems, extensions)) .collect(Collectors.toList()); } @@ -313,6 +316,10 @@ public ChangedNullable getNullable() { return this.nullable; } + public ChangedUniqueItems getUniqueItems() { + return uniqueItems; + } + public boolean isDiscriminatorPropertyChanged() { return this.discriminatorPropertyChanged; } @@ -487,6 +494,12 @@ public ChangedSchema setNullable(final ChangedNullable nullable) { return this; } + public ChangedSchema setUniqueItems(ChangedUniqueItems uniqueItems) { + clearChangedCache(); + this.uniqueItems = uniqueItems; + return this; + } + public ChangedSchema setDiscriminatorPropertyChanged(final boolean discriminatorPropertyChanged) { clearChangedCache(); this.discriminatorPropertyChanged = discriminatorPropertyChanged; @@ -560,6 +573,7 @@ public boolean equals(Object o) { && Objects.equals(maxItems, that.maxItems) && Objects.equals(minItems, that.minItems) && Objects.equals(nullable, that.nullable) + && Objects.equals(uniqueItems, that.uniqueItems) && Objects.equals(items, that.items) && Objects.equals(oneOfSchema, that.oneOfSchema) && Objects.equals(addProp, that.addProp) @@ -596,6 +610,7 @@ public int hashCode() { maxItems, minItems, nullable, + uniqueItems, discriminatorPropertyChanged, items, oneOfSchema, @@ -657,6 +672,8 @@ public java.lang.String toString() { + this.getMinItems() + ", nullable=" + this.getNullable() + + ", uniqueItems=" + + this.getUniqueItems() + ", discriminatorPropertyChanged=" + this.isDiscriminatorPropertyChanged() + ", items=" diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedUniqueItems.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedUniqueItems.java new file mode 100644 index 000000000..ecccdf674 --- /dev/null +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedUniqueItems.java @@ -0,0 +1,58 @@ +package org.openapitools.openapidiff.core.model.schema; + +import java.util.Objects; +import org.openapitools.openapidiff.core.model.Changed; +import org.openapitools.openapidiff.core.model.DiffResult; + +public class ChangedUniqueItems implements Changed { + + private final Boolean left; + private final Boolean right; + + public ChangedUniqueItems(Boolean leftNullable, Boolean rightNullable) { + this.left = leftNullable; + this.right = rightNullable; + } + + @Override + public DiffResult isChanged() { + boolean leftValue = left != null && left; + boolean rightValue = right != null && right; + + if (leftValue == false && rightValue == true) { + return DiffResult.INCOMPATIBLE; + } + + if (leftValue == true && rightValue == false) { + return DiffResult.COMPATIBLE; + } + + return DiffResult.NO_CHANGES; + } + + public Boolean getLeft() { + return left; + } + + public Boolean getRight() { + return right; + } + + @Override + public String toString() { + return "ChangedUniqueItems [left=" + left + ", right=" + right + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ChangedNullable that = (ChangedNullable) o; + return Objects.equals(left, that.getLeft()) && Objects.equals(right, that.getRight()); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } +} diff --git a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java index 3915789bb..17014e868 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/SchemaDiffTest.java @@ -171,7 +171,7 @@ public void changeMinMaxItemsHandling() { } @Test // issue #482 - public void changeNullabeHandling() { + public void changeNullableHandling() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations( "schemaDiff/schema-nullable-diff-1.yaml", "schemaDiff/schema-nullable-diff-2.yaml"); @@ -201,6 +201,44 @@ public void changeNullabeHandling() { assertThat(props.get("field3").getNullable().getRight()).isTrue(); } + @Test // issue #478 + public void changeUniqueItemsHandling() { + ChangedOpenApi changedOpenApi = + OpenApiCompare.fromLocations( + "schemaDiff/schema-uniqueItems-diff-1.yaml", + "schemaDiff/schema-uniqueItems-diff-2.yaml"); + ChangedSchema changedSchema = + getRequestBodyChangedSchema( + changedOpenApi, POST, "/schema/uniqueItems", "application/json"); + + assertThat(changedSchema).isNotNull(); + Map<String, ChangedSchema> props = changedSchema.getChangedProperties(); + assertThat(props).isNotEmpty(); + + // Check no changes in uniqueItems + assertThat(props.get("field0")).isNull(); + + // Check changes true -> false + assertThat(props.get("field1").getUniqueItems().isCompatible()).isTrue(); + assertThat(props.get("field1").getUniqueItems().getLeft()).isTrue(); + assertThat(props.get("field1").getUniqueItems().getRight()).isFalse(); + + // Check changes false -> true + assertThat(props.get("field2").getUniqueItems().isIncompatible()).isTrue(); + assertThat(props.get("field2").getUniqueItems().getLeft()).isFalse(); + assertThat(props.get("field2").getUniqueItems().getRight()).isTrue(); + + // Check deletion of uniqueItems + assertThat(props.get("field3").getUniqueItems().isCompatible()).isTrue(); + assertThat(props.get("field3").getUniqueItems().getLeft()).isTrue(); + assertThat(props.get("field3").getUniqueItems().getRight()).isNull(); + + // Check addition of uniqueItems + assertThat(props.get("field4").getUniqueItems().isIncompatible()).isTrue(); + assertThat(props.get("field4").getUniqueItems().getLeft()).isNull(); + assertThat(props.get("field4").getUniqueItems().getRight()).isTrue(); + } + @Test // issue #479 public void changeMinMaxPropertiesHandling() { ChangedOpenApi changedOpenApi = diff --git a/core/src/test/resources/schemaDiff/schema-uniqueItems-diff-1.yaml b/core/src/test/resources/schemaDiff/schema-uniqueItems-diff-1.yaml new file mode 100644 index 000000000..dc0e60dec --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-uniqueItems-diff-1.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.1 +info: + description: Schema diff uniqueItems + title: schema diff uniqueItems + version: 1.0.0 +paths: + /schema/uniqueItems: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field0: + type: integer + field1: + type: integer + uniqueItems: true + field2: + type: integer + uniqueItems: false + field3: + type: integer + uniqueItems: true + field4: + type: integer \ No newline at end of file diff --git a/core/src/test/resources/schemaDiff/schema-uniqueItems-diff-2.yaml b/core/src/test/resources/schemaDiff/schema-uniqueItems-diff-2.yaml new file mode 100644 index 000000000..12e2b906e --- /dev/null +++ b/core/src/test/resources/schemaDiff/schema-uniqueItems-diff-2.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.1 +info: + description: Schema diff uniqueItems + title: schema diff uniqueItems + version: 1.0.0 +paths: + /schema/uniqueItems: + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestDTO' +components: + schemas: + TestDTO: + type: object + properties: + field0: + type: integer + field1: + type: integer + uniqueItems: false + field2: + type: integer + uniqueItems: true + field3: + type: integer + field4: + type: integer + uniqueItems: true \ No newline at end of file From 1f3c0acbc23fb988a5ceb4b256d1ca0274fcc74c Mon Sep 17 00:00:00 2001 From: bebeside77 <bebeside77@gmail.com> Date: Tue, 25 Mar 2025 18:54:52 +0900 Subject: [PATCH 304/313] Fix README.md Render difference code example (#760) Co-authored-by: yw.kang <yw.kang@navercorp.com> --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 862561c2d..8849ef016 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,7 @@ public class Main { #### HTML ```java -String htmlRender = new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css"); +HtmlRender htmlRender = new HtmlRender("Changelog", "http://deepoove.com/swagger-diff/stylesheets/demo.css"); FileOutputStream outputStream = new FileOutputStream("testDiff.html"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); htmlRender.render(diff, outputStreamWriter); @@ -209,7 +209,7 @@ htmlRender.render(diff, outputStreamWriter); #### Markdown ```java -JsonRender markdownRender = new MarkdownRender(); +MarkdownRender markdownRender = new MarkdownRender(); FileOutputStream outputStream = new FileOutputStream("testDiff.md"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); markdownRender.render(diff, outputStreamWriter); @@ -218,7 +218,7 @@ markdownRender.render(diff, outputStreamWriter); #### Asciidoc ```java -JsonRender asciidocRender = new AsciidocRender(); +AsciidocRender asciidocRender = new AsciidocRender(); FileOutputStream outputStream = new FileOutputStream("testDiff.adoc"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); asciidocRender.render(diff, outputStreamWriter); From 797d991a72eec70cac486630d15a4a639947b571 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 10:46:50 +0100 Subject: [PATCH 305/313] build(deps): bump swagger-parser.version from 2.1.25 to 2.1.26 (#761) Bumps `swagger-parser.version` from 2.1.25 to 2.1.26. Updates `io.swagger.parser.v3:swagger-parser-v3` from 2.1.25 to 2.1.26 Updates `io.swagger.parser.v3:swagger-parser` from 2.1.25 to 2.1.26 - [Release notes](https://github.com/swagger-api/swagger-parser/releases) - [Commits](https://github.com/swagger-api/swagger-parser/compare/v2.1.25...v2.1.26) Updates `io.swagger.parser.v3:swagger-parser-v2-converter` from 2.1.25 to 2.1.26 --- updated-dependencies: - dependency-name: io.swagger.parser.v3:swagger-parser-v3 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.swagger.parser.v3:swagger-parser-v2-converter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5d65053be..f55ca4a2d 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ <sonar.host.url>https://sonarcloud.io</sonar.host.url> <sonar.moduleKey>${project.artifactId}</sonar.moduleKey> - <swagger-parser.version>2.1.25</swagger-parser.version> + <swagger-parser.version>2.1.26</swagger-parser.version> <slf4j.version>2.0.17</slf4j.version> </properties> From dcbd88866bf09cc5120a6d0e0d77bd930b8e3d06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 10:50:15 +0100 Subject: [PATCH 306/313] build(deps): bump org.sonarsource.scanner.maven:sonar-maven-plugin (#762) Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 5.0.0.4389 to 5.1.0.4751. - [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases) - [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/5.0.0.4389...5.1.0.4751) --- updated-dependencies: - dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f55ca4a2d..2089f5cb6 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> - <version>5.0.0.4389</version> + <version>5.1.0.4751</version> </plugin> <plugin> <groupId>org.cyclonedx</groupId> From 2098a98a91468843fd85e2d278a871511e7121b2 Mon Sep 17 00:00:00 2001 From: chatelao <olivier.chatelain@gmail.com> Date: Fri, 28 Mar 2025 15:31:25 +0100 Subject: [PATCH 307/313] Update README.md - Type fix "usSage" (#763) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8849ef016..e4979c1e3 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Available for Mac users on [brew](https://formulae.brew.sh/formula/openapi-diff) ```bash brew install openapi-diff ``` -Usage instructions in [Ussage -> Command line](#command-line) +Usage instructions in [Usage -> Command line](#command-line) # Docker From f08d28bbbf21860592747f1f3dcff2794fd0da1f Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Sat, 29 Mar 2025 15:06:30 +0100 Subject: [PATCH 308/313] Update .gitignore to exclude .vscode and .settings directories --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9190ddebe..cecc8665b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ hs_err_pid* target/ # IDE files -.vscode/settings.json \ No newline at end of file +.vscode +.settings From da6016467ed99e93c8806ede7708629df38a14b1 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Sat, 29 Mar 2025 15:07:39 +0100 Subject: [PATCH 309/313] Update .gitignore to include .idea and .vscode directories --- .gitignore | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index cecc8665b..7da72d7f2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,6 @@ .classpath .project -.settings/* -.idea *.iml # Mobile Tools for Java (J2ME) @@ -19,5 +17,6 @@ hs_err_pid* target/ # IDE files -.vscode .settings +.idea +.vscode From 52cba1f27518c6e91f2eae1029fb37e45ef57748 Mon Sep 17 00:00:00 2001 From: Aliaksandr Pinchuk <aliaksandr.pin4uk@gmail.com> Date: Sun, 30 Mar 2025 17:46:37 +0200 Subject: [PATCH 310/313] Apply MANIFEST Implementation-Version for each project module --- cli/pom.xml | 3 --- pom.xml | 7 +++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index f1782dd1a..573eb6c42 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -57,9 +57,6 @@ <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>${mainClass}</mainClass> - <manifestEntries> - <Implementation-Version>${project.version}</Implementation-Version> - </manifestEntries> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" /> diff --git a/pom.xml b/pom.xml index 2089f5cb6..2aa90f367 100644 --- a/pom.xml +++ b/pom.xml @@ -289,6 +289,13 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.4.2</version> + <configuration> + <archive> + <manifestEntries> + <Implementation-Version>${project.version}</Implementation-Version> + </manifestEntries> + </archive> + </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 4bfb376eac0365c8c2e44531b6169efba74bc96b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Apr 2025 11:50:11 +0200 Subject: [PATCH 311/313] build(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#764) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.2 to 3.5.3. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.2...surefire-3.5.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2aa90f367..a28dddb14 100644 --- a/pom.xml +++ b/pom.xml @@ -310,7 +310,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>3.5.2</version> + <version>3.5.3</version> </plugin> <plugin> <groupId>com.coveo</groupId> From c3f9d28b45191bed3f2ca77dd43fbbcabb1d25c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Apr 2025 11:50:22 +0200 Subject: [PATCH 312/313] build(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.12 to 0.8.13 (#765) Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.12 to 0.8.13. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.12...v0.8.13) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-version: 0.8.13 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a28dddb14..04acfd2f5 100644 --- a/pom.xml +++ b/pom.xml @@ -346,7 +346,7 @@ <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> - <version>0.8.12</version> + <version>0.8.13</version> </plugin> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> From fd1124108505ff8959b478da26bed7f78c69ad01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:42:39 +0200 Subject: [PATCH 313/313] build(deps): bump org.junit:junit-bom from 5.12.1 to 5.12.2 (#767) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.12.1 to 5.12.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 04acfd2f5..70b53b80e 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> - <version>5.12.1</version> + <version>5.12.2</version> <type>pom</type> <scope>import</scope> </dependency>