From 89fc63112584613a781c35ee9f271b1406009c5c Mon Sep 17 00:00:00 2001
From: Damiano Albani <damiano.albani@gmail.com>
Date: Wed, 2 Nov 2022 06:39:53 +0100
Subject: [PATCH 1/6] Upgrade CommonMark dependency to v0.20.0 (#13872)

---
 modules/openapi-generator/pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml
index 3d04d22fb6e..55b6a31aa12 100644
--- a/modules/openapi-generator/pom.xml
+++ b/modules/openapi-generator/pom.xml
@@ -354,9 +354,9 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-           <groupId>com.atlassian.commonmark</groupId>
+           <groupId>org.commonmark</groupId>
            <artifactId>commonmark</artifactId>
-           <version>0.11.0</version>
+           <version>0.20.0</version>
         </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
-- 
GitLab


From 0d1e31324b35463f087b620bedea6da961323f62 Mon Sep 17 00:00:00 2001
From: Thomas Hansen <thomasphansen@users.noreply.github.com>
Date: Wed, 2 Nov 2022 07:08:21 +0100
Subject: [PATCH 2/6] [PHP] Accept 0 as value for query parameters (#13868)

---
 .../resources/php/ObjectSerializer.mustache   | 53 ++++++++++-
 .../lib/ObjectSerializer.php                  | 53 ++++++++++-
 .../tests/ObjectSerializerTest.php            | 91 +++++++++++++++++++
 3 files changed, 189 insertions(+), 8 deletions(-)

diff --git a/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache b/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache
index 476938159f0..5cd224a6e04 100644
--- a/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache
+++ b/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache
@@ -148,6 +148,49 @@ class ObjectSerializer
         return rawurlencode(self::toString($value));
     }
 
+    /**
+     * Checks if a value is empty, based on its OpenAPI type.
+     *
+     * @param mixed  $value
+     * @param string $openApiType
+     *
+     * @return bool true if $value is empty
+     */
+    private static function isEmptyValue($value, string $openApiType): bool
+    {
+        # If empty() returns false, it is not empty regardless of its type.
+        if (!empty($value)) {
+            return false;
+        }
+
+        # Null is always empty, as we cannot send a real "null" value in a query parameter.
+        if ($value === null) {
+            return true;
+        }
+
+        switch ($openApiType) {
+            # For numeric values, false and '' are considered empty.
+            # This comparison is safe for floating point values, since the previous call to empty() will
+            # filter out values that don't match 0.
+            case 'int':
+            case 'integer':
+                return $value !== 0;
+
+            case 'number':
+            case 'float':
+                return $value !== 0 && $value !== 0.0;
+
+            # For boolean values, '' is considered empty
+            case 'bool':
+            case 'boolean':
+                return !in_array($value, [false, 0], true);
+
+            # For all the other types, any value at this point can be considered empty.
+            default:
+                return true;
+        }
+    }
+
     /**
      * Take query parameter properties and turn it into an array suitable for
      * native http_build_query or GuzzleHttp\Psr7\Query::build.
@@ -169,10 +212,12 @@ class ObjectSerializer
         bool $explode = true,
         bool $required = true
     ): array {
-        if (
-            empty($value)
-            && ($value !== false || $openApiType !== 'boolean') // if $value === false and $openApiType ==='boolean' it isn't empty
-        ) {
+
+        # Check if we should omit this parameter from the query. This should only happen when:
+        #  - Parameter is NOT required; AND
+        #  - its value is set to a value that is equivalent to "empty", depending on its OpenAPI type. For
+        #    example, 0 as "int" or "boolean" is NOT an empty value.
+        if (self::isEmptyValue($value, $openApiType)) {
             if ($required) {
                 return ["{$paramName}" => ''];
             } else {
diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php
index a4cf679dfbe..0dd7232b1b4 100644
--- a/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php
+++ b/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php
@@ -157,6 +157,49 @@ class ObjectSerializer
         return rawurlencode(self::toString($value));
     }
 
+    /**
+     * Checks if a value is empty, based on its OpenAPI type.
+     *
+     * @param mixed  $value
+     * @param string $openApiType
+     *
+     * @return bool true if $value is empty
+     */
+    private static function isEmptyValue($value, string $openApiType): bool
+    {
+        # If empty() returns false, it is not empty regardless of its type.
+        if (!empty($value)) {
+            return false;
+        }
+
+        # Null is always empty, as we cannot send a real "null" value in a query parameter.
+        if ($value === null) {
+            return true;
+        }
+
+        switch ($openApiType) {
+            # For numeric values, false and '' are considered empty.
+            # This comparison is safe for floating point values, since the previous call to empty() will
+            # filter out values that don't match 0.
+            case 'int':
+            case 'integer':
+                return $value !== 0;
+
+            case 'number':
+            case 'float':
+                return $value !== 0 && $value !== 0.0;
+
+            # For boolean values, '' is considered empty
+            case 'bool':
+            case 'boolean':
+                return !in_array($value, [false, 0], true);
+
+            # For all the other types, any value at this point can be considered empty.
+            default:
+                return true;
+        }
+    }
+
     /**
      * Take query parameter properties and turn it into an array suitable for
      * native http_build_query or GuzzleHttp\Psr7\Query::build.
@@ -178,10 +221,12 @@ class ObjectSerializer
         bool $explode = true,
         bool $required = true
     ): array {
-        if (
-            empty($value)
-            && ($value !== false || $openApiType !== 'boolean') // if $value === false and $openApiType ==='boolean' it isn't empty
-        ) {
+
+        # Check if we should omit this parameter from the query. This should only happen when:
+        #  - Parameter is NOT required; AND
+        #  - its value is set to a value that is equivalent to "empty", depending on its OpenAPI type. For
+        #    example, 0 as "int" or "boolean" is NOT an empty value.
+        if (self::isEmptyValue($value, $openApiType)) {
             if ($required) {
                 return ["{$paramName}" => ''];
             } else {
diff --git a/samples/client/petstore/php/OpenAPIClient-php/tests/ObjectSerializerTest.php b/samples/client/petstore/php/OpenAPIClient-php/tests/ObjectSerializerTest.php
index 8743611a520..84f59c95134 100644
--- a/samples/client/petstore/php/OpenAPIClient-php/tests/ObjectSerializerTest.php
+++ b/samples/client/petstore/php/OpenAPIClient-php/tests/ObjectSerializerTest.php
@@ -336,6 +336,97 @@ class ObjectSerializerTest extends TestCase
             'form null DateTime object, explode on, required false' => [
                 null, 'dateTime', '\DateTime', 'form', true, false, '',
             ],
+            'form 1 int, explode on, required false' => [
+                1, 'field', 'int', 'form', true, false, 'field=1',
+            ],
+            'form 0 int, explode on, required false' => [
+                0, 'field', 'int', 'form', true, false, 'field=0',
+            ],
+            'form 0 int, explode on, required true' => [
+                0, 'field', 'int', 'form', true, true, 'field=0',
+            ],
+            'form null int, explode on, required false' => [
+                null, 'field', 'int', 'form', true, false, '',
+            ],
+            'form null int, explode on, required true' => [
+                null, 'field', 'int', 'form', true, true, 'field=',
+            ],
+            'form 1 integer, explode on, required false' => [
+                1, 'field', 'integer', 'form', true, false, 'field=1',
+            ],
+            'form 0 integer, explode on, required false' => [
+                0, 'field', 'integer', 'form', true, false, 'field=0',
+            ],
+            'form 0 integer, explode on, required true' => [
+                0, 'field', 'integer', 'form', true, true, 'field=0',
+            ],
+            'form null integer, explode on, required false' => [
+                null, 'field', 'integer', 'form', true, false, '',
+            ],
+            'form null integer, explode on, required true' => [
+                null, 'field', 'integer', 'form', true, true, 'field=',
+            ],
+            'form 1.1 float, explode on, required false' => [
+                1.1, 'field', 'float', 'form', true, false, 'field=1.1',
+            ],
+            'form 0 float, explode on, required false' => [
+                0, 'field', 'float', 'form', true, false, 'field=0',
+            ],
+            'form 0.0 float, explode on, required false' => [
+                0.0, 'field', 'float', 'form', true, false, 'field=0',
+            ],
+            'form 0 float, explode on, required true' => [
+                0, 'field', 'float', 'form', true, true, 'field=0',
+            ],
+            'form 0.0 float, explode on, required true' => [
+                0.0, 'field', 'float', 'form', true, true, 'field=0',
+            ],
+            'form null float, explode on, required false' => [
+                null, 'field', 'float', 'form', true, false, '',
+            ],
+            'form null float, explode on, required true' => [
+                null, 'field', 'float', 'form', true, true, 'field=',
+            ],
+            'form 1.1 number, explode on, required false' => [
+                1.1, 'field', 'number', 'form', true, false, 'field=1.1',
+            ],
+            'form 0 number, explode on, required false' => [
+                0, 'field', 'number', 'form', true, false, 'field=0',
+            ],
+            'form 0.0 number, explode on, required false' => [
+                0.0, 'field', 'number', 'form', true, false, 'field=0',
+            ],
+            'form 0 number, explode on, required true' => [
+                0, 'field', 'number', 'form', true, true, 'field=0',
+            ],
+            'form 0.0 number, explode on, required true' => [
+                0.0, 'field', 'number', 'form', true, true, 'field=0',
+            ],
+            'form null number, explode on, required false' => [
+                null, 'field', 'number', 'form', true, false, '',
+            ],
+            'form null number, explode on, required true' => [
+                null, 'field', 'number', 'form', true, true, 'field=',
+            ],
+            'form true bool, explode on, required false' => [
+                true, 'field', 'bool', 'form', true, false, 'field=1',
+            ],
+            'form false bool, explode on, required false' => [
+                false, 'field', 'bool', 'form', true, false, 'field=0',
+            ],
+            'form empty bool, explode on, required false' => [
+                null, 'field', 'bool', 'form', true, false, '',
+            ],
+            'form empty bool, explode on, required true' => [
+                null, 'field', 'bool', 'form', true, true, 'field=',
+            ],
+            # Entries for "boolean" type are already covered in the beginning of this provider
+            'form 1 bool, explode on, required false' => [
+                1, 'field', 'bool', 'form', true, false, 'field=1',
+            ],
+            'form 0 bool, explode on, required false' => [
+                0, 'field', 'bool', 'form', true, false, 'field=0',
+            ],
         ];
     }
 
-- 
GitLab


From bfcb3864a703d4daaac90f41e381f5e594cfabfa Mon Sep 17 00:00:00 2001
From: William Cheng <wing328hk@gmail.com>
Date: Thu, 3 Nov 2022 16:54:57 +0800
Subject: [PATCH 3/6] Update project dependencies - root, openapi-generator
 (#13881)

* update project dependencies - root, openapi-generator

* use 2.9.3 for jdk8
---
 modules/openapi-generator/pom.xml | 12 ++++++------
 pom.xml                           |  8 ++++----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml
index 55b6a31aa12..f9dec6200d3 100644
--- a/modules/openapi-generator/pom.xml
+++ b/modules/openapi-generator/pom.xml
@@ -79,7 +79,7 @@
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>exec-maven-plugin</artifactId>
-                <version>1.6.0</version>
+                <version>3.1.0</version>
                 <executions>
                     <execution>
                         <goals>
@@ -227,7 +227,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jxr-plugin</artifactId>
-                <version>3.0.0</version>
+                <version>3.3.0</version>
                 <configuration>
                     <aggregate>true</aggregate>
                 </configuration>
@@ -415,23 +415,23 @@
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava-testlib</artifactId>
-            <version>28.2-jre</version>
+            <version>31.1-jre</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>net.java.dev.jna</groupId>
             <artifactId>jna</artifactId>
-            <version>5.5.0</version>
+            <version>5.12.1</version>
         </dependency>
         <dependency>
             <groupId>com.github.ben-manes.caffeine</groupId>
             <artifactId>caffeine</artifactId>
-            <version>2.8.1</version>
+            <version>2.9.3</version>
         </dependency>
         <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
-            <version>3.19.0</version>
+            <version>3.23.1</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/pom.xml b/pom.xml
index 09f7a3db8c8..3d7e16cf6d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1485,7 +1485,7 @@
 
         <archunit.version>0.23.1</archunit.version>
         <checkstyle.plugin.version>3.1.0</checkstyle.plugin.version>
-        <commons-cli.version>1.4</commons-cli.version>
+        <commons-cli.version>1.5.0</commons-cli.version>
         <commons-io.version>2.11.0</commons-io.version>
         <commons-lang.version>3.12.0</commons-lang.version>
         <commons-text.version>1.10.0</commons-text.version>
@@ -1493,7 +1493,7 @@
         <generex.version>1.0.2</generex.version>
         <git-commit-id-plugin.version>4.9.10</git-commit-id-plugin.version>
         <groovy.version>3.0.9</groovy.version>
-        <guava.version>30.1.1-jre</guava.version>
+        <guava.version>31.1-jre</guava.version>
         <handlebars-java.version>4.2.1</handlebars-java.version>
         <jackson-threetenbp.version>2.10.0</jackson-threetenbp.version>
         <jackson-databind.version>2.13.4.2</jackson-databind.version>
@@ -1508,10 +1508,10 @@
         <maven-project-info-reports-plugin.version>3.0.0</maven-project-info-reports-plugin.version>
         <maven-release-plugin.version>2.5.3</maven-release-plugin.version>
         <maven-site-plugin.version>3.7.1</maven-site-plugin.version>
-        <mockito.version>4.5.1</mockito.version>
+        <mockito.version>4.8.1</mockito.version>
         <pmd-plugin.version>3.12.0</pmd-plugin.version>
         <reflections.version>0.10</reflections.version>
-        <rxgen.version>1.3</rxgen.version>
+        <rxgen.version>1.4</rxgen.version>
         <scala-maven-plugin.version>4.6.1</scala-maven-plugin.version>
         <slf4j.version>1.7.36</slf4j.version>
         <spotbugs-plugin.version>3.1.12.2</spotbugs-plugin.version>
-- 
GitLab


From 4a7a2f5e6dd77855911b73d75dd9ef6322ad3bff Mon Sep 17 00:00:00 2001
From: Mark Delk <jethrodaniel@gmail.com>
Date: Thu, 3 Nov 2022 04:26:13 -0500
Subject: [PATCH 4/6] [RUBY] handle Faraday::ConnectionFailed api error
 (#13894)

* handle Faraday::ConnectionFailed api error

* commit generated files
---
 .../resources/ruby-client/api_client_faraday_partial.mustache   | 2 ++
 samples/client/petstore/ruby-faraday/lib/petstore/api_client.rb | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/modules/openapi-generator/src/main/resources/ruby-client/api_client_faraday_partial.mustache b/modules/openapi-generator/src/main/resources/ruby-client/api_client_faraday_partial.mustache
index 59dedfc8535..be5e26dcd66 100644
--- a/modules/openapi-generator/src/main/resources/ruby-client/api_client_faraday_partial.mustache
+++ b/modules/openapi-generator/src/main/resources/ruby-client/api_client_faraday_partial.mustache
@@ -26,6 +26,8 @@
         end
       rescue Faraday::TimeoutError
         fail ApiError.new('Connection timed out')
+      rescue Faraday::ConnectionFailed
+        fail ApiError.new('Connection failed')
       end
 
       if opts[:return_type]
diff --git a/samples/client/petstore/ruby-faraday/lib/petstore/api_client.rb b/samples/client/petstore/ruby-faraday/lib/petstore/api_client.rb
index d23e8e88d82..5a52719c53b 100644
--- a/samples/client/petstore/ruby-faraday/lib/petstore/api_client.rb
+++ b/samples/client/petstore/ruby-faraday/lib/petstore/api_client.rb
@@ -71,6 +71,8 @@ module Petstore
         end
       rescue Faraday::TimeoutError
         fail ApiError.new('Connection timed out')
+      rescue Faraday::ConnectionFailed
+        fail ApiError.new('Connection failed')
       end
 
       if opts[:return_type]
-- 
GitLab


From d2a9da5061fc997c49c36bbc2c354934c87e8778 Mon Sep 17 00:00:00 2001
From: Michael Ramstein <633688+mrmstn@users.noreply.github.com>
Date: Thu, 3 Nov 2022 10:46:24 +0100
Subject: [PATCH 5/6] [Elixir] Fixes issue with maps/dictionary not present in
 payload (#13874)

* Adds fix to deserialize nullable maps

* Generate Samples
---
 .../resources/elixir/deserializer.ex.mustache | 19 ++++++++++++-------
 .../lib/openapi_petstore/deserializer.ex      | 19 ++++++++++++-------
 2 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/modules/openapi-generator/src/main/resources/elixir/deserializer.ex.mustache b/modules/openapi-generator/src/main/resources/elixir/deserializer.ex.mustache
index 91e6414afda..a5c4da88658 100644
--- a/modules/openapi-generator/src/main/resources/elixir/deserializer.ex.mustache
+++ b/modules/openapi-generator/src/main/resources/elixir/deserializer.ex.mustache
@@ -19,13 +19,18 @@ defmodule {{moduleName}}.Deserializer do
   end
 
   def deserialize(model, field, :map, mod, options) do
-    model
-    |> Map.update!(
-      field,
-      &Map.new(&1, fn {key, val} ->
-        {key, Poison.Decode.decode(val, Keyword.merge(options, [as: struct(mod)]))}
-      end)
-    )
+    maybe_transform_map = fn
+      nil ->
+        nil
+
+      existing_value ->
+        Map.new(existing_value, fn
+          {key, val} ->
+            {key, Poison.Decode.decode(val, Keyword.merge(options, as: struct(mod)))}
+        end)
+    end
+
+    Map.update!(model, field, maybe_transform_map)
   end
 
   def deserialize(model, field, :date, _, _options) do
diff --git a/samples/client/petstore/elixir/lib/openapi_petstore/deserializer.ex b/samples/client/petstore/elixir/lib/openapi_petstore/deserializer.ex
index b9215647504..bdd072f0897 100644
--- a/samples/client/petstore/elixir/lib/openapi_petstore/deserializer.ex
+++ b/samples/client/petstore/elixir/lib/openapi_petstore/deserializer.ex
@@ -21,13 +21,18 @@ defmodule OpenapiPetstore.Deserializer do
   end
 
   def deserialize(model, field, :map, mod, options) do
-    model
-    |> Map.update!(
-      field,
-      &Map.new(&1, fn {key, val} ->
-        {key, Poison.Decode.decode(val, Keyword.merge(options, [as: struct(mod)]))}
-      end)
-    )
+    maybe_transform_map = fn
+      nil ->
+        nil
+
+      existing_value ->
+        Map.new(existing_value, fn
+          {key, val} ->
+            {key, Poison.Decode.decode(val, Keyword.merge(options, as: struct(mod)))}
+        end)
+    end
+
+    Map.update!(model, field, maybe_transform_map)
   end
 
   def deserialize(model, field, :date, _, _options) do
-- 
GitLab


From 0784b20dff5bdabd2cb57a2f8c3633aff1c6c237 Mon Sep 17 00:00:00 2001
From: Nickeau <gerardnico@users.noreply.github.com>
Date: Thu, 3 Nov 2022 16:06:11 +0100
Subject: [PATCH 6/6] Clash of variable names when the body is just a string

If a `body` is just treated as a string, you would get a body clash name on `body` and `requestBody`

ie
```java
RequestParameter body = requestParameters.body();
String body = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference<String>(){}) : null;
```
with this change:
```java
RequestParameter requestParameterBody = requestParameters.body();
String body = requestParameterBody != null ? DatabindCodec.mapper().convertValue(requestParameterBody.get(), new TypeReference<String>(){}) :
```
---
 .../main/resources/JavaVertXWebServer/bodyParams.mustache    | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/bodyParams.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/bodyParams.mustache
index aa8ed5e08e4..7e8c4fd6caa 100644
--- a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/bodyParams.mustache
+++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/bodyParams.mustache
@@ -1,4 +1,5 @@
 {{#isBodyParam}}
-        RequestParameter body = requestParameters.body();
-        {{{dataType}}} {{paramName}} = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference<{{{dataType}}}>(){}) : null;
+  {{! Don't use body or requestBody as name, to avoid a name clash with the paramName }}
+  RequestParameter requestParameterBody = requestParameters.body();
+  {{{dataType}}} {{paramName}} = requestParameterBody != null ? DatabindCodec.mapper().convertValue(requestParameterBody.get(), new TypeReference<{{{dataType}}}>(){}) : null;
 {{/isBodyParam}}
-- 
GitLab