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
 [![Build](https://github.com/OpenAPITools/openapi-diff/workflows/Main%20Build/badge.svg)](https://github.com/OpenAPITools/openapi-diff/actions?query=branch%3Amaster+workflow%3A"Main+Build")
 [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=OpenAPITools_openapi-diff&metric=alert_status)](https://sonarcloud.io/dashboard?id=OpenAPITools_openapi-diff)
 [![Maven Central](https://img.shields.io/maven-central/v/org.openapitools.openapidiff/openapi-diff-core)](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core)
+
+[![Contribute with Gitpod](https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/OpenAPITools/openapi-diff)
 [![Join the Slack chat room](https://img.shields.io/badge/Slack-Join%20the%20chat%20room-orange)](https://join.slack.com/t/openapi-generator/shared_invite/enQtNzAyNDMyOTU0OTE1LTY5ZDBiNDI5NzI5ZjQ1Y2E5OWVjMjZkYzY1ZGM2MWQ4YWFjMzcyNDY5MGI4NjQxNDBiMTlmZTc5NjY2ZTQ5MGM)
 
 [![Docker Cloud Automated build](https://img.shields.io/docker/cloud/automated/openapitools/openapi-diff)](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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
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.
 
 [![Build](https://github.com/OpenAPITools/openapi-diff/workflows/Main%20Build/badge.svg)](https://github.com/OpenAPITools/openapi-diff/actions?query=branch%3Amaster+workflow%3A"Main+Build")
 [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=OpenAPITools_openapi-diff&metric=alert_status)](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
 [![Maven Central](https://img.shields.io/maven-central/v/org.openapitools.openapidiff/openapi-diff-core)](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core)
 
 [![Contribute with Gitpod](https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/OpenAPITools/openapi-diff)
-[![Join the Slack chat room](https://img.shields.io/badge/Slack-Join%20the%20chat%20room-orange)](https://join.slack.com/t/openapi-generator/shared_invite/enQtNzAyNDMyOTU0OTE1LTY5ZDBiNDI5NzI5ZjQ1Y2E5OWVjMjZkYzY1ZGM2MWQ4YWFjMzcyNDY5MGI4NjQxNDBiMTlmZTc5NjY2ZTQ5MGM)
+[![Join the Slack chat room](https://img.shields.io/badge/Slack-Join%20the%20chat%20room-orange)](https://join.slack.com/t/openapi-generator/shared_invite/zt-12jxxd7p2-XUeQM~4pzsU9x~eGLQqX2g)
 
 [![Docker Cloud Automated build](https://img.shields.io/docker/cloud/automated/openapitools/openapi-diff)](https://hub.docker.com/r/openapitools/openapi-diff)
 [![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/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
 
 [![Build](https://github.com/OpenAPITools/openapi-diff/workflows/Main%20Build/badge.svg)](https://github.com/OpenAPITools/openapi-diff/actions?query=branch%3Amaster+workflow%3A"Main+Build")
 [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=OpenAPITools_openapi-diff&metric=alert_status)](https://sonarcloud.io/dashboard?id=OpenAPITools_openapi-diff)
-[![Maven Central](https://img.shields.io/maven-central/v/org.openapitools.openapidiff/openapi-diff-core)](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core)
+
+[![Maven Central 2.0.x](https://img.shields.io/maven-central/v/org.openapitools.openapidiff/openapi-diff-core?versionPrefix=2.0)](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core)
+[![Maven Central 2.1.x](https://img.shields.io/maven-central/v/org.openapitools.openapidiff/openapi-diff-core?versionPrefix=2.1)](https://search.maven.org/artifact/org.openapitools.openapidiff/openapi-diff-core)
 
 [![Contribute with Gitpod](https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/OpenAPITools/openapi-diff)
 [![Join the Slack chat room](https://img.shields.io/badge/Slack-Join%20the%20chat%20room-orange)](https://join.slack.com/t/openapi-generator/shared_invite/zt-12jxxd7p2-XUeQM~4pzsU9x~eGLQqX2g)
 
-[![Docker Cloud Automated build](https://img.shields.io/docker/cloud/automated/openapitools/openapi-diff)](https://hub.docker.com/r/openapitools/openapi-diff)
-[![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/openapitools/openapi-diff)](https://hub.docker.com/r/openapitools/openapi-diff)
+[![Docker Automated build](https://img.shields.io/docker/automated/openapitools/openapi-diff)](https://hub.docker.com/r/openapitools/openapi-diff)
 [![Docker Image Version](https://img.shields.io/docker/v/openapitools/openapi-diff?sort=semver)](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>