Compare commits

...

49 Commits

Author SHA1 Message Date
William Cheng
a049e4c271 better comment 2019-08-19 18:06:27 +08:00
William Cheng
eee7a40629 remove dollar sign from java const name 2019-08-19 15:42:59 +08:00
Esteban Gehring
a5ab60bec8 mention TypeScript Angular 8.x compatibility 2019-08-19 08:55:13 +02:00
Kris Raney
e086ad1b6e Guarantee a unique name for the constants that represent enum values (#3644)
* Guarantee a unique name for the constants that represent enum values

* update samples

* Use all-caps
2019-08-19 14:34:26 +08:00
Akira Tanimura
1a6d3671d9 fix the model's valid? of Ruby client to prevent runtime error (#3670) (#3671) 2019-08-19 13:31:34 +08:00
Sai Giridhar P
589e5c6312 [csharp-netcore] Fixing the XML documentation warnings. (#3674)
* fix(csharp-netcore): Fixing the XML warnings

* fix(csharp-netcore): Updating Pet project

* fix(csharp-netcore): Minor fix

* fix(csharp-netcore): Minor fix

* fix(csharp-netcore): Minor ifx

* fix(csharp-netcore): Minor fix
2019-08-19 13:30:47 +08:00
Martin Delille
024f46814c cpp-qt5-client: fix memory leak in api-body (#3661) 2019-08-17 22:19:16 +02:00
Richard Whitehouse
1ce09788a9 [Rust Server] Support Bearer based Authentication (#3606)
Add handling case for Bearer Authentication on the client and update the samples
2019-08-17 12:30:47 +01:00
Richard Whitehouse
44fda895d2 [Rust Server] Frunk - LabelledGeneric - support (#3552)
Derive the LabelledGeneric trait on Swagger models.  This allows
conversion between structurally similar types by using
https://docs.rs/frunk/0.2.2/frunk/#transmogrifying.

Exit if example fails to run
2019-08-17 11:03:38 +01:00
Ronny Pfannschmidt
aa4ead2a6d autoupdating generator script: userdef cache dir (#3631)
with this addition the script should be able to store the jars at a user-defined folder if desired
2019-08-17 11:42:57 +08:00
lwlee2608
7e8c7db798 InlineResolver to flatten callback operations (#3398)
Signed-off-by: lwlee2608 <lwlee2608@gmail.com>
2019-08-17 11:18:52 +09:00
Kris Raney
b83fe0c611 [Go]URLEncode path parameters (#3643)
* URLEncode path parameters

* update samples

* Use correct module naming
2019-08-16 20:58:54 +08:00
Slavek Kabrda
5182955cca [Java][client] make it possible to send explicit nulls for nullable fields (#3474)
* [Java][client] make it possible to send explicit nulls for nullable fields

* Regenerate samples
2019-08-16 16:26:06 +08:00
Jérémie Bresson
cd9eea2fe5 [java-client][jersey2][resteasy] add support for TRACE method (#3653) 2019-08-16 05:42:41 +02:00
Justin Sherrill
ef88bd175f [Ruby][faraday] Properly pass verify_mode to faraday (#3652) 2019-08-16 09:45:18 +09:00
Qingping Hou
99fcfbc802 [Python] support api key refresh in configuration module (#3594) 2019-08-15 22:06:36 +08:00
Jérémie Bresson
a4811c7850 [java-client] set collection to null when not required (#3615)
* [java][model] set collection to null when not required

* Fix tests

* Fix trailing whitespace

* generate samples

* Restore 'de.thetaphi' plugin in pom.xml
2019-08-15 22:01:19 +08:00
Jérémie Bresson
2ada4d90b4 [core] process TRACE operation (#3648) 2019-08-15 21:59:59 +08:00
William Cheng
dac370b7f7 Add @muttleyxd to C++ technical committee (#3649) 2019-08-15 18:33:17 +08:00
Steven Masala
6f7d2792c7 fix imports and property name when using anyof/oneof in services (#3639) 2019-08-15 11:15:21 +02:00
Aiham
2d7785ac63 Support nullable in typescript-fetch client (#3645) 2019-08-15 09:44:56 +02:00
Benjamin Douglas
eb6ca9199b Use javax.annotation.processing.Generated for Java 11 native client (#3637)
Before Java 9, the `Generated` annotation was part of JEE and in the
`javax.annotation` package. Starting with Java 9, it is now part
of the standard SDK, under the new `javax.annotation.processing`
package.

This change creates a custom Generated annotation template for the
native clientlib, since it is guaranteed to be run in Java 11+.
2019-08-15 06:47:23 +02:00
William Cheng
c3535cf9ca Add test cases to cover different collection formats (#3640)
* add test cases to cover different collection format

* add space params to retrofit 1.x

* add space params to retrofit 2.x

* rename url to localVarUrl

* fix exception in haskell servant
2019-08-15 11:09:12 +08:00
William Cheng
286cdfdfa2 ensure ruby oas2 samples is up-to-date (#3638) 2019-08-14 17:18:02 +08:00
William Cheng
55786119e7 Import Go package with leading underscore (#3634)
* escape import with underscore in go client

* revert changes to test spec
2019-08-14 15:17:12 +08:00
John Wang
94d4e0cfac [Golang][Client] Fix collectionFormat=multi request bug (#3390)
* fix parameter-collectionformat-multi

* update template to tabs
2019-08-13 21:19:33 +08:00
Olivier THIERRY
99d85a39a3 [Slim] Distinction between basicBasic and basicBearer authentication (#3621)
* [Slim] Distinction between basicBasic and basicBearer authentication

* [Slim] Update Petstore samples
2019-08-13 20:39:55 +08:00
Jim Schubert
b936d72dfa [kotlin] Change Kotlin client exceptions to expose lack of support as UnsupportedOperationException rather than NotImplementedException. (#3611)
* [kotlin] Throw catchable exceptions rather than TODO()

* [kotlin] Regenerate samples
2019-08-13 08:38:00 -04:00
William Cheng
93aedcf3d5 update dart jaguar samples 2019-08-13 19:00:10 +08:00
Jaumard
d04e16a255 manage nullable definition (#3599)
update deps
2019-08-13 18:51:31 +08:00
William Cheng
fae0528cd5 update cli option in Dart (#3627) 2019-08-13 17:13:50 +08:00
Nick Meinhold
ba65f675e2 [Dart] Make clients crossplatform (#3608)
* Remove browserClient flag and bump http dependency

* Run shell scripts so CIs can verify the change
2019-08-13 15:35:00 +08:00
Oliver Ponder
5e27f11ef1 Use the latest version of superagent. (#3579)
* Use the latest version of superagent.

* Run javascript shell scripts.
2019-08-13 15:19:22 +08:00
Qingping Hou
850c493c63 [Python] avoid unnecessary dictionary lookup in get_api_key method (#3592) 2019-08-13 13:55:45 +08:00
Juang, Yi-Lin
f5327b601e [aspnetcore] Fix nullable enum and duplicate model (#3622)
* Fix enum nullable

* Update samples
2019-08-13 13:49:16 +08:00
Juang, Yi-Lin
123efc5d65 [aspnetcore] Add max/min length attributes for models (#3588)
* Fix max min length

* Update samples
2019-08-13 11:48:15 +08:00
Glenn Schmidt
36ccd87a80 Fix composed properties missing from allVars (#3616)
* Fix composed properties missing from allVars

* Update the allOfCompositionTest to check allVars
2019-08-12 23:27:01 +08:00
Steffen
20db89e277 typescript-angular: Add correct library versions for Angular 8.0.0 (#3619)
* Add correct library versions for Angular 8.0.0

* Keep Angular default version of 7.0.0 to avoid breaking changes

* Add petstore example for Angular 8

* Add ngVersion field to typescript-angular-v8-petstore-provided-in-root-with-npm.json
2019-08-12 15:44:05 +02:00
Jim Schubert
a5349cfde5 [cli][gradle] filter deprecated generators by default when listing available generators (#3612)
* Filter deprecated generators from CLI list by default.
* [gradle] Exclude deprecated generators from list by default, add "include" option to allow for customization of list task.
* Update scripts to support the --include option of the list command
* Update gradle/cli docs for generators listing with "include" option.
2019-08-12 08:25:52 -04:00
HoaBo
4a92cd8dca If the return type is empty, it should be void instead of Response (#3617) 2019-08-12 11:00:13 +02:00
siada
c8a65a9942 [Typescript] Fix typescript-inversify compiler errors (#3607)
* Update addJsonHeaders 

addJsonHeaders currently throws a compiler error because the headers args in get/put/post etc is nullable, but the argument in addJsonHeaders is not

* Executed samples generator
2019-08-12 07:46:55 +02:00
Jim Schubert
4b6499c636 [maven] Support user overrides for serverVariables (carryover from #3363) (#3609)
*  Adds server variables overrides option to the Maven plugin
2019-08-11 14:49:51 -04:00
William Cheng
290550ef91 Add build badges for 4.2.x branch (#3610) 2019-08-12 00:35:49 +08:00
Jim Schubert
06533b977c [core][gradle] User-defined server variable substitutions (#3363)
* [core] Initial support for server variable overrides
* [gradle] Support user overrides for serverVariables
* [core] Clarify server variable overrides, and propagate them to templates in the "servers" array
2019-08-11 09:57:36 -04:00
Andrey
07381e7275 Fix kotlin templates (#3504)
* Fix kotlin templates to use okhttp 4.0.1.
* Fix escaping of dataType field.
* Fix handling of arrays/lists of enums.
2019-08-11 09:35:57 -04:00
Juang, Yi-Lin
22d022b2d5 [aspnetcore] Add TypeConverter for enum string conversion (#3557)
* Add TypeConverter for enum
2019-08-10 22:57:36 -04:00
Michal Foksa
42d6420400 Feature/mustache lambda tests (#3447)
* Mustache lambda tests

* If lambda key is already taken in additionalProperties, throw an exception.

* Test whether common lambdas are registered in additionalProperties.
2019-08-10 22:15:40 -04:00
Gustaf Barkeling
ac85c8f901 Fix #3604 by adding undefined as return type to headers and credentials methods in runtime.ts (#3605) 2019-08-10 10:45:41 +02:00
William Cheng
5956569e7a Prepare 4.1.1-SNAPSHOT (#3603)
* update pom

* update samples

* update pom
2019-08-10 09:41:08 +08:00
2491 changed files with 38667 additions and 6847 deletions

View File

@@ -53,6 +53,7 @@ public class ArrayOfArrayOfNumberOnlyTest {
List<BigDecimal> arrayArrayNumber = new ArrayList<BigDecimal>();
arrayArrayNumber.add(b1);
arrayArrayNumber.add(b2);
model.setArrayArrayNumber(new ArrayList<List<BigDecimal>>());
model.getArrayArrayNumber().add(arrayArrayNumber);
// create another instance for comparison
@@ -62,6 +63,7 @@ public class ArrayOfArrayOfNumberOnlyTest {
List<BigDecimal> arrayArrayNumber2 = new ArrayList<BigDecimal>();
arrayArrayNumber2.add(b1);
arrayArrayNumber2.add(b2);
model2.setArrayArrayNumber(new ArrayList<List<BigDecimal>>());
model2.getArrayArrayNumber().add(arrayArrayNumber2);
Assert.assertTrue(model2.equals(model));

View File

@@ -8,6 +8,12 @@
[![Windows Test](https://ci.appveyor.com/api/projects/status/github/openapitools/openapi-generator?branch=master&svg=true&passingText=Windows%20Test%20-%20OK&failingText=Windows%20Test%20-%20Fails)](https://ci.appveyor.com/project/WilliamCheng/openapi-generator-wh2wu)
[![JDK11 Build](https://cloud.drone.io/api/badges/OpenAPITools/openapi-generator/status.svg?ref=refs/heads/master)](https://cloud.drone.io/OpenAPITools/openapi-generator)
[`4.2.x`](https://github.com/OpenAPITools/openapi-generator/tree/4.2.x) branch: [![Build Status](https://img.shields.io/travis/OpenAPITools/openapi-generator/4.2.x.svg?label=Integration%20Test)](https://travis-ci.org/OpenAPITools/openapi-generator)
[![Integration Test2](https://circleci.com/gh/OpenAPITools/openapi-generator/tree/4.2.x.svg?style=shield)](https://circleci.com/gh/OpenAPITools/openapi-generator)
[![Run Status](https://api.shippable.com/projects/5af6bf74e790f4070084a115/badge?branch=4.2.x)](https://app.shippable.com/github/OpenAPITools/openapi-generator)
[![Windows Test](https://ci.appveyor.com/api/projects/status/github/openapitools/openapi-generator?branch=4.2.x&svg=true&passingText=Windows%20Test%20-%20OK&failingText=Windows%20Test%20-%20Fails)](https://ci.appveyor.com/project/WilliamCheng/openapi-generator-wh2wu)
[![JDK11 Build](https://cloud.drone.io/api/badges/OpenAPITools/openapi-generator/status.svg?ref=refs/heads/4.2.x)](https://cloud.drone.io/OpenAPITools/openapi-generator)
[`5.0.x`](https://github.com/OpenAPITools/openapi-generator/tree/5.0.x) branch: [![Build Status](https://img.shields.io/travis/OpenAPITools/openapi-generator/5.0.x.svg?label=Integration%20Test)](https://travis-ci.org/OpenAPITools/openapi-generator)
[![Integration Test2](https://circleci.com/gh/OpenAPITools/openapi-generator/tree/5.0.x.svg?style=shield)](https://circleci.com/gh/OpenAPITools/openapi-generator)
[![Run Status](https://api.shippable.com/projects/5af6bf74e790f4070084a115/badge?branch=5.0.x)](https://app.shippable.com/github/OpenAPITools/openapi-generator)
@@ -59,7 +65,7 @@ OpenAPI Generator allows generation of API client libraries (SDK generation), se
| | Languages/Frameworks |
|-|-|
**API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C**, **C#** (.net 2.0, 3.5 or later), **C++** (cpp-restsdk, Qt5, Tizen), **Clojure**, **Dart (1.x, 2.x)**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured, Spring 5 Web Client), **Kotlin**, **Lua**, **Node.js/JavaScript** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types), **Objective-C**, **OCaml**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (rust, rust-server), **Scala** (akka, http4s, scalaz, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (AngularJS, Angular (2.x - 7.x), Aurelia, Axios, Fetch, Inversify, jQuery, Node, Rxjs)
**API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C**, **C#** (.net 2.0, 3.5 or later), **C++** (cpp-restsdk, Qt5, Tizen), **Clojure**, **Dart (1.x, 2.x)**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured, Spring 5 Web Client), **Kotlin**, **Lua**, **Node.js/JavaScript** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types), **Objective-C**, **OCaml**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (rust, rust-server), **Scala** (akka, http4s, scalaz, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (AngularJS, Angular (2.x - 8.x), Aurelia, Axios, Fetch, Inversify, jQuery, Node, Rxjs)
**Server stubs** | **Ada**, **C#** (ASP.NET Core, NancyFx), **C++** (Pistache, Restbed, Qt5 QHTTPEngine), **Erlang**, **F#** (Giraffe), **Go** (net/http, Gin), **Haskell** (Servant), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples)), **Kotlin** (Spring Boot, Ktor), **PHP** (Laravel, Lumen, Slim, Silex, [Symfony](https://symfony.com/), [Zend Expressive](https://github.com/zendframework/zend-expressive)), **Python** (Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** (rust-server), **Scala** ([Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), [Play](https://www.playframework.com/), Scalatra)
**API documentation generators** | **HTML**, **Confluence Wiki**
**Configuration files** | [**Apache2**](https://httpd.apache.org/)
@@ -101,8 +107,9 @@ The OpenAPI Specification has undergone 3 revisions since initial creation in 20
OpenAPI Generator Version | Release Date | Notes
---------------------------- | ------------ | -----
5.0.0 (upcoming major release) [SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/5.0.0-SNAPSHOT/)| 13.05.2020 | Major release with breaking changes (no fallback)
4.1.0 (upcoming minor release) [SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/4.1.0-SNAPSHOT/)| 31.07.2019 | Minor release (breaking changes with fallbacks)
[4.1.0](https://github.com/OpenAPITools/openapi-generator/releases/tag/v4.1.0) (latest stable release) | 09.07.2019 | Patch release (bug fixes, minor enhancements, etc)
4.2.0 (upcoming minor release) [SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/4.2.0-SNAPSHOT/)| 09.10.2019 | Minor release (breaking changes with fallbacks)
4.1.1 (upcoming minor release) [SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/4.1.1-SNAPSHOT/)| 23.08.2019 | Patch release (bug fixes, enhancements)
[4.1.0](https://github.com/OpenAPITools/openapi-generator/releases/tag/v4.1.0) (latest stable release) | 09.08.2019 | Minor release (breaking changes with fallbacks)
OpenAPI Spec compatibility: 1.0, 1.1, 1.2, 2.0, 3.0
@@ -448,7 +455,6 @@ NAME
SYNOPSIS
openapi-generator-cli generate
[(-a <authorization> | --auth <authorization>)]
[--additional-properties <additional properties>...]
[--api-package <api package>] [--artifact-id <artifact id>]
[--artifact-version <artifact version>]
[(-c <configuration file> | --config <configuration file>)]
@@ -469,12 +475,13 @@ SYNOPSIS
[--model-name-prefix <model name prefix>]
[--model-name-suffix <model name suffix>]
[--model-package <model package>]
[(-o <output directory> | --output <output directory>)]
[(-o <output directory> | --output <output directory>)]
[(-p <additional properties> | --additional-properties <additional properties>)...]
[--package-name <package name>] [--release-note <release note>]
[--remove-operation-id-prefix]
[--reserved-words-mappings <reserved word mappings>...]
[(-s | --skip-overwrite)] [--skip-validate-spec]
[--strict-spec <true/false strict behavior>]
[(-s | --skip-overwrite)] [--server-variables <server variables>...]
[--skip-validate-spec] [--strict-spec <true/false strict behavior>]
[(-t <template directory> | --template-dir <template directory>)]
[--type-mappings <type mappings>...] [(-v | --verbose)]
@@ -790,7 +797,7 @@ If you want to join the committee, please kindly apply by sending an email to te
| Apex | |
| Bash | @frol (2017/07) @bkryza (2017/08) @kenjones-cisco (2017/09) |
| C | @zhemant (2018/11) |
| C++ | @ravinikam (2017/07) @stkrwork (2017/07) @etherealjoy (2018/02) @martindelille (2018/03) |
| C++ | @ravinikam (2017/07) @stkrwork (2017/07) @etherealjoy (2018/02) @martindelille (2018/03) @muttleyxd (2019/08) |
| C# | @mandrean (2017/08), @jimschubert (2017/09) [:heart:](https://www.patreon.com/jimschubert) |
| Clojure | |
| Dart | @ircecho (2017/07) @swipesight (2018/09) @jaumard (2018/09) |

View File

@@ -38,4 +38,8 @@ for spec_path in modules/openapi-generator/src/test/resources/*/rust-server/* ;
$@"
java $JAVA_OPTS -jar $executable $args
if [ $? -ne 0 ]; then
exit $?
fi
done

View File

@@ -13,3 +13,4 @@
./bin/typescript-angular-v7-petstore-not-provided-in-root-with-npm.sh
./bin/typescript-angular-v7-petstore-provided-in-root.sh
./bin/typescript-angular-v7-petstore-provided-in-root-with-npm.sh
./bin/typescript-angular-v8-petstore-provided-in-root-with-npm.sh

View File

@@ -0,0 +1,7 @@
{
"npmName": "@openapitools/typescript-angular-petstore",
"npmVersion": "1.0.0",
"npmRepository" : "https://skimdb.npmjs.com/registry",
"snapshot" : false,
"ngVersion": "8.0.0"
}

View File

@@ -0,0 +1,32 @@
#!/bin/sh
SCRIPT="$0"
echo "# START SCRIPT: $SCRIPT"
while [ -h "$SCRIPT" ] ; do
ls=`ls -ld "$SCRIPT"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
SCRIPT="$link"
else
SCRIPT=`dirname "$SCRIPT"`/"$link"
fi
done
if [ ! -d "${APP_DIR}" ]; then
APP_DIR=`dirname "$SCRIPT"`/..
APP_DIR=`cd "${APP_DIR}"; pwd`
fi
executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar"
if [ ! -f "$executable" ]
then
mvn -B clean package
fi
# if you've executed sbt assembly previously it will use that instead.
export JAVA_OPTS="${JAVA_OPTS} -Xmx1024M -DloggerPath=conf/log4j.properties"
ags="generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g typescript-angular -c bin/typescript-angular-v8-petstore-provided-in-root-with-npm.json -o samples/client/petstore/typescript-angular-v8-provided-in-root/builds/with-npm --additional-properties ngVersion=8.0.0 $@"
java $JAVA_OPTS -jar $executable $ags

View File

@@ -12,6 +12,7 @@ sleep 5
# LIST OF SCRIPTS:
declare -a scripts=(
# SAMPLES
"./bin/ruby-client-petstore.sh"
"./bin/openapi3/ruby-client-petstore.sh"
"./bin/openapi3/ruby-client-faraday-petstore.sh"
"./bin/java-petstore-all.sh"
@@ -57,11 +58,11 @@ declare -a scripts=(
"./bin/groovy-petstore.sh"
"./bin/apex-petstore.sh"
"./bin/perl-petstore-all.sh"
"./bin/dart-jaguar-petstore.sh"
#"./bin/elm-petstore-all.sh"
"./bin/meta-codegen.sh"
# OTHERS
"./bin/utils/export_docs_generators.sh"
"./bin/utils/export_generators_docusaurus_index.sh"
"./bin/utils/copy-to-website.sh"
"./bin/utils/export_generators_readme.sh")

View File

@@ -5,7 +5,7 @@ echo "# START SCRIPT: ${SCRIPT}"
executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar"
for GENERATOR in $(java -jar ${executable} list --short | sed -e 's/,/\'$'\n''/g')
for GENERATOR in $(java -jar ${executable} list --short --include all | sed -e 's/,/\'$'\n''/g')
do
./bin/utils/export_generator.sh ${GENERATOR}
done

View File

@@ -1,20 +0,0 @@
#!/bin/sh
SCRIPT="$0"
echo "# START SCRIPT: $SCRIPT"
executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar"
\rm -rf docs/generators.md
cat > docs/generators.md << EOF
---
id: generators
title: Generators List
---
EOF
java -jar $executable list --docsite >> docs/generators.md
echo "Wrote $(pwd)/docs/generators.md"

View File

@@ -15,6 +15,6 @@ title: Generators List
EOF
java -jar $executable list | sed -e 's/\([A-Z]*\) generators:/* \1 generators:/g' -e 's/- \([a-z0-9\-]*\)/- [\1]\(generators\/\1.md\)/g' >> docs/generators.md
java -jar $executable list --docsite --include all >> docs/generators.md
echo "Wrote $(pwd)/docs/generators.md"

View File

@@ -42,7 +42,7 @@ artifactid=openapi-generator-cli
ver=${OPENAPI_GENERATOR_VERSION:-$(latest.tag $ghrepo)}
jar=${artifactid}-${ver}.jar
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
DIR=${OPENAPI_GENERATOR_DOWLOAD_CACHE_DIR:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"}
if [ ! -f ${DIR}/${jar} ]; then
repo="central::default::https://repo1.maven.org/maven2/"

View File

@@ -11,4 +11,4 @@ call .\bin\windows\typescript-angular-v7-provided-in-root.bat
call .\bin\windows\typescript-angular-v7-provided-in-root-with-npm.bat
call .\bin\windows\typescript-angular-v7-not-provided-in-root.bat
call .\bin\windows\typescript-angular-v7-not-provided-in-root-with-npm.bat
call .\bin\windows\typescript-angular-v8-provided-in-root-with-npm.bat

View File

@@ -0,0 +1,9 @@
set executable=.\modules\openapi-generator-cli\target\openapi-generator-cli.jar
If Not Exist %executable% (
mvn clean package
)
set ags=generate -i modules\openapi-generator\src\test\resources\2_0\petstore.yaml -g typescript-angular -c bin/typescript-angular-v8-petstore-provided-in-root-with-npm.json -o samples\client\petstore\typescript-angular-v8-provided-in-root\builds\with-npm --additional-properties ngVersion=8.0.0
java %JAVA_OPTS% -jar %executable% %ags%

View File

@@ -5,132 +5,132 @@ title: Generators List
The following generators are available:
* CLIENT generators:
- [ada](generators/ada.md)
- [android](generators/android.md)
- [apex](generators/apex.md)
- [bash](generators/bash.md)
- [c](generators/c.md)
- [clojure](generators/clojure.md)
- [cpp-qt5-client](generators/cpp-qt5-client.md)
- [cpp-restsdk](generators/cpp-restsdk.md)
- [cpp-tizen](generators/cpp-tizen.md)
- [csharp](generators/csharp.md)
- [csharp-dotnet2](generators/csharp-dotnet2.md) (deprecated)
- [csharp-netcore](generators/csharp-netcore.md)
- [dart](generators/dart.md)
- [dart-jaguar](generators/dart-jaguar.md)
- [eiffel](generators/eiffel.md)
- [elixir](generators/elixir.md)
- [elm](generators/elm.md)
- [erlang-client](generators/erlang-client.md)
- [erlang-proper](generators/erlang-proper.md)
- [flash](generators/flash.md)
- [go](generators/go.md)
- [go-experimental](generators/go-experimental.md)
- [groovy](generators/groovy.md)
- [haskell-http-client](generators/haskell-http-client.md)
- [java](generators/java.md)
- [javascript](generators/javascript.md)
- [javascript-closure-angular](generators/javascript-closure-angular.md)
- [javascript-flowtyped](generators/javascript-flowtyped.md)
- [jaxrs-cxf-client](generators/jaxrs-cxf-client.md)
- [jmeter](generators/jmeter.md)
- [kotlin](generators/kotlin.md)
- [lua](generators/lua.md)
- [objc](generators/objc.md)
- [ocaml](generators/ocaml.md)
- [perl](generators/perl.md)
- [php](generators/php.md)
- [powershell](generators/powershell.md)
- [python](generators/python.md)
- [python-experimental](generators/python-experimental.md)
- [r](generators/r.md)
- [ruby](generators/ruby.md)
- [rust](generators/rust.md)
- [scala-akka](generators/scala-akka.md)
- [scala-gatling](generators/scala-gatling.md)
- [scala-httpclient-deprecated](generators/scala-httpclient-deprecated.md) (deprecated)
- [scalaz](generators/scalaz.md)
- [swift2-deprecated](generators/swift2-deprecated.md) (deprecated)
- [swift3-deprecated](generators/swift3-deprecated.md) (deprecated)
- [swift4](generators/swift4.md)
- [typescript-angular](generators/typescript-angular.md)
- [typescript-angularjs](generators/typescript-angularjs.md)
- [typescript-aurelia](generators/typescript-aurelia.md)
- [typescript-axios](generators/typescript-axios.md)
- [typescript-fetch](generators/typescript-fetch.md)
- [typescript-inversify](generators/typescript-inversify.md)
- [typescript-jquery](generators/typescript-jquery.md)
- [typescript-node](generators/typescript-node.md)
- [typescript-rxjs](generators/typescript-rxjs.md)
## CLIENT generators
* [ada](generators/ada)
* [android](generators/android)
* [apex](generators/apex)
* [bash](generators/bash)
* [c](generators/c)
* [clojure](generators/clojure)
* [cpp-qt5-client](generators/cpp-qt5-client)
* [cpp-restsdk](generators/cpp-restsdk)
* [cpp-tizen](generators/cpp-tizen)
* [csharp](generators/csharp)
* [csharp-dotnet2 (deprecated)](generators/csharp-dotnet2)
* [csharp-netcore](generators/csharp-netcore)
* [dart](generators/dart)
* [dart-jaguar](generators/dart-jaguar)
* [eiffel](generators/eiffel)
* [elixir](generators/elixir)
* [elm](generators/elm)
* [erlang-client](generators/erlang-client)
* [erlang-proper](generators/erlang-proper)
* [flash](generators/flash)
* [go](generators/go)
* [go-experimental (experimental)](generators/go-experimental)
* [groovy](generators/groovy)
* [haskell-http-client](generators/haskell-http-client)
* [java](generators/java)
* [javascript](generators/javascript)
* [javascript-closure-angular](generators/javascript-closure-angular)
* [javascript-flowtyped](generators/javascript-flowtyped)
* [jaxrs-cxf-client](generators/jaxrs-cxf-client)
* [jmeter](generators/jmeter)
* [kotlin](generators/kotlin)
* [lua](generators/lua)
* [objc](generators/objc)
* [ocaml](generators/ocaml)
* [perl](generators/perl)
* [php](generators/php)
* [powershell](generators/powershell)
* [python](generators/python)
* [python-experimental (experimental)](generators/python-experimental)
* [r](generators/r)
* [ruby](generators/ruby)
* [rust](generators/rust)
* [scala-akka](generators/scala-akka)
* [scala-gatling](generators/scala-gatling)
* [scala-httpclient-deprecated (deprecated)](generators/scala-httpclient-deprecated)
* [scalaz](generators/scalaz)
* [swift2-deprecated (deprecated)](generators/swift2-deprecated)
* [swift3-deprecated (deprecated)](generators/swift3-deprecated)
* [swift4](generators/swift4)
* [typescript-angular](generators/typescript-angular)
* [typescript-angularjs](generators/typescript-angularjs)
* [typescript-aurelia](generators/typescript-aurelia)
* [typescript-axios](generators/typescript-axios)
* [typescript-fetch](generators/typescript-fetch)
* [typescript-inversify](generators/typescript-inversify)
* [typescript-jquery](generators/typescript-jquery)
* [typescript-node](generators/typescript-node)
* [typescript-rxjs](generators/typescript-rxjs)
* SERVER generators:
- [ada-server](generators/ada-server.md)
- [aspnetcore](generators/aspnetcore.md)
- [cpp-pistache-server](generators/cpp-pistache-server.md)
- [cpp-qt5-qhttpengine-server](generators/cpp-qt5-qhttpengine-server.md)
- [cpp-restbed-server](generators/cpp-restbed-server.md)
- [csharp-nancyfx](generators/csharp-nancyfx.md)
- [erlang-server](generators/erlang-server.md)
- [fsharp-giraffe-server](generators/fsharp-giraffe-server.md)
- [go-gin-server](generators/go-gin-server.md)
- [go-server](generators/go-server.md)
- [graphql-nodejs-express-server](generators/graphql-nodejs-express-server.md)
- [haskell](generators/haskell.md)
- [java-inflector](generators/java-inflector.md)
- [java-msf4j](generators/java-msf4j.md)
- [java-pkmst](generators/java-pkmst.md)
- [java-play-framework](generators/java-play-framework.md)
- [java-undertow-server](generators/java-undertow-server.md)
- [java-vertx](generators/java-vertx.md)
- [jaxrs-cxf](generators/jaxrs-cxf.md)
- [jaxrs-cxf-cdi](generators/jaxrs-cxf-cdi.md)
- [jaxrs-cxf-extended](generators/jaxrs-cxf-extended.md)
- [jaxrs-jersey](generators/jaxrs-jersey.md)
- [jaxrs-resteasy](generators/jaxrs-resteasy.md)
- [jaxrs-resteasy-eap](generators/jaxrs-resteasy-eap.md)
- [jaxrs-spec](generators/jaxrs-spec.md)
- [kotlin-server](generators/kotlin-server.md)
- [kotlin-spring](generators/kotlin-spring.md)
- [nodejs-express-server](generators/nodejs-express-server.md) (beta)
- [nodejs-server-deprecated](generators/nodejs-server-deprecated.md) (deprecated)
- [php-laravel](generators/php-laravel.md)
- [php-lumen](generators/php-lumen.md)
- [php-silex](generators/php-silex.md)
- [php-slim](generators/php-slim.md)
- [php-symfony](generators/php-symfony.md)
- [php-ze-ph](generators/php-ze-ph.md)
- [python-aiohttp](generators/python-aiohttp.md)
- [python-blueplanet](generators/python-blueplanet.md)
- [python-flask](generators/python-flask.md)
- [ruby-on-rails](generators/ruby-on-rails.md)
- [ruby-sinatra](generators/ruby-sinatra.md)
- [rust-server](generators/rust-server.md)
- [scala-finch](generators/scala-finch.md)
- [scala-lagom-server](generators/scala-lagom-server.md)
- [scala-play-server](generators/scala-play-server.md)
- [scalatra](generators/scalatra.md)
- [spring](generators/spring.md)
## SERVER generators
* [ada-server](generators/ada-server)
* [aspnetcore](generators/aspnetcore)
* [cpp-pistache-server](generators/cpp-pistache-server)
* [cpp-qt5-qhttpengine-server](generators/cpp-qt5-qhttpengine-server)
* [cpp-restbed-server](generators/cpp-restbed-server)
* [csharp-nancyfx](generators/csharp-nancyfx)
* [erlang-server](generators/erlang-server)
* [fsharp-giraffe-server](generators/fsharp-giraffe-server)
* [go-gin-server](generators/go-gin-server)
* [go-server](generators/go-server)
* [graphql-nodejs-express-server](generators/graphql-nodejs-express-server)
* [haskell](generators/haskell)
* [java-inflector](generators/java-inflector)
* [java-msf4j](generators/java-msf4j)
* [java-pkmst](generators/java-pkmst)
* [java-play-framework](generators/java-play-framework)
* [java-undertow-server](generators/java-undertow-server)
* [java-vertx](generators/java-vertx)
* [jaxrs-cxf](generators/jaxrs-cxf)
* [jaxrs-cxf-cdi](generators/jaxrs-cxf-cdi)
* [jaxrs-cxf-extended](generators/jaxrs-cxf-extended)
* [jaxrs-jersey](generators/jaxrs-jersey)
* [jaxrs-resteasy](generators/jaxrs-resteasy)
* [jaxrs-resteasy-eap](generators/jaxrs-resteasy-eap)
* [jaxrs-spec](generators/jaxrs-spec)
* [kotlin-server](generators/kotlin-server)
* [kotlin-spring](generators/kotlin-spring)
* [nodejs-express-server (beta)](generators/nodejs-express-server)
* [nodejs-server-deprecated (deprecated)](generators/nodejs-server-deprecated)
* [php-laravel](generators/php-laravel)
* [php-lumen](generators/php-lumen)
* [php-silex](generators/php-silex)
* [php-slim](generators/php-slim)
* [php-symfony](generators/php-symfony)
* [php-ze-ph](generators/php-ze-ph)
* [python-aiohttp](generators/python-aiohttp)
* [python-blueplanet](generators/python-blueplanet)
* [python-flask](generators/python-flask)
* [ruby-on-rails](generators/ruby-on-rails)
* [ruby-sinatra](generators/ruby-sinatra)
* [rust-server](generators/rust-server)
* [scala-finch](generators/scala-finch)
* [scala-lagom-server](generators/scala-lagom-server)
* [scala-play-server](generators/scala-play-server)
* [scalatra](generators/scalatra)
* [spring](generators/spring)
* DOCUMENTATION generators:
- [cwiki](generators/cwiki.md)
- [dynamic-html](generators/dynamic-html.md)
- [html](generators/html.md)
- [html2](generators/html2.md)
- [openapi](generators/openapi.md)
- [openapi-yaml](generators/openapi-yaml.md)
## DOCUMENTATION generators
* [cwiki](generators/cwiki)
* [dynamic-html](generators/dynamic-html)
* [html](generators/html)
* [html2](generators/html2)
* [openapi](generators/openapi)
* [openapi-yaml](generators/openapi-yaml)
* SCHEMA generators:
- [mysql-schema](generators/mysql-schema.md)
## SCHEMA generators
* [mysql-schema](generators/mysql-schema)
* CONFIG generators:
- [apache2](generators/apache2.md)
- [graphql-schema](generators/graphql-schema.md)
## CONFIG generators
* [apache2](generators/apache2)
* [graphql-schema](generators/graphql-schema)

View File

@@ -11,12 +11,12 @@ sidebar_label: dart-jaguar
|ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true|
|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false|
|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false|
|browserClient|Is the client browser based| |null|
|browserClient|Is the client browser based (for Dart 1.x only)| |null|
|pubName|Name in generated pubspec| |null|
|pubVersion|Version in generated pubspec| |null|
|pubDescription|Description in generated pubspec| |null|
|useEnumExtension|Allow the 'x-enum-values' extension for enums| |null|
|sourceFolder|source folder for generated code| |null|
|supportDart2|support dart2| |true|
|sourceFolder|Source folder for generated code| |null|
|supportDart2|Support Dart 2.x| |true|
|nullableFields|Is the null fields should be in the JSON payload| |null|
|serialization|Choose serialization format JSON or PROTO is supported| |null|

View File

@@ -11,10 +11,10 @@ sidebar_label: dart
|ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true|
|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false|
|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false|
|browserClient|Is the client browser based| |null|
|browserClient|Is the client browser based (for Dart 1.x only)| |null|
|pubName|Name in generated pubspec| |null|
|pubVersion|Version in generated pubspec| |null|
|pubDescription|Description in generated pubspec| |null|
|useEnumExtension|Allow the 'x-enum-values' extension for enums| |null|
|sourceFolder|source folder for generated code| |null|
|supportDart2|support dart2| |true|
|sourceFolder|Source folder for generated code| |null|
|supportDart2|Support Dart 2.x| |true|

View File

@@ -38,9 +38,15 @@ NAME
openapi-generator-cli list - Lists the available generators
SYNOPSIS
openapi-generator-cli list [(-s | --short)]
openapi-generator-cli list [(-i <include> | --include <include>)]
[(-s | --short)]
OPTIONS
-i <include>, --include <include>
comma-separated list of stability indexes to include (value:
all,beta,stable,experimental,deprecated). Excludes deprecated by
default.
-s, --short
shortened output (suitable for scripting)
@@ -210,13 +216,14 @@ This command takes one or more parameters representing the args list you would o
```bash
openapi-generator completion config-help
--named-header
-o
--output
--named-header
-g
--generator-name
-l
--lang
-f
--format
--markdown-header
```
An example bash completion script can be found in the repo at [scripts/openapi-generator-cli-completion.bash](https://github.com/OpenAPITools/openapi-generator/blob/master/scripts/openapi-generator-cli-completion.bash).
@@ -235,7 +242,6 @@ NAME
SYNOPSIS
openapi-generator-cli generate
[(-a <authorization> | --auth <authorization>)]
[--additional-properties <additional properties>...]
[--api-package <api package>] [--artifact-id <artifact id>]
[--artifact-version <artifact version>]
[(-c <configuration file> | --config <configuration file>)]
@@ -256,15 +262,15 @@ SYNOPSIS
[--model-name-prefix <model name prefix>]
[--model-name-suffix <model name suffix>]
[--model-package <model package>]
[(-o <output directory> | --output <output directory>)]
[(-o <output directory> | --output <output directory>)]
[(-p <additional properties> | --additional-properties <additional properties>)...]
[--package-name <package name>] [--release-note <release note>]
[--remove-operation-id-prefix]
[--reserved-words-mappings <reserved word mappings>...]
[(-s | --skip-overwrite)] [--skip-validate-spec]
[--strict-spec <true/false strict behavior>]
[(-s | --skip-overwrite)] [--server-variables <server variables>...]
[--skip-validate-spec] [--strict-spec <true/false strict behavior>]
[(-t <template directory> | --template-dir <template directory>)]
[--type-mappings <type mappings>...] [(-v | --verbose)]
```
<details>
@@ -277,19 +283,16 @@ OPTIONS
remotely. Pass in a URL-encoded string of name:header with a comma
separating multiple values
--additional-properties <additional properties>
sets additional properties that can be referenced by the mustache
templates in the format of name=value,name=value. You can also have
multiple occurrences of this option.
--api-package <api package>
package for generated api classes
--artifact-id <artifact id>
artifactId in generated pom.xml
artifactId in generated pom.xml. This also becomes part of the
generated library's filename
--artifact-version <artifact version>
artifact version in generated pom.xml
artifact version in generated pom.xml. This also becomes part of the
generated library's filename
-c <configuration file>, --config <configuration file>
Path to configuration file configuration file. It can be json or
@@ -382,6 +385,12 @@ OPTIONS
-o <output directory>, --output <output directory>
where to write the generated files (current dir by default)
-p <additional properties>, --additional-properties <additional
properties>
sets additional properties that can be referenced by the mustache
templates in the format of name=value,name=value. You can also have
multiple occurrences of this option.
--package-name <package name>
package for generated classes (where supported)
@@ -400,6 +409,10 @@ OPTIONS
specifies if the existing files should be overwritten during the
generation.
--server-variables <server variables>
sets server variables for spec documents which support variable
templating of servers.
--skip-validate-spec
Skips the default behavior of validating an input specification.

View File

@@ -4,7 +4,7 @@
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-project</artifactId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<relativePath>../..</relativePath>
</parent>

View File

@@ -18,13 +18,7 @@
package org.openapitools.codegen.cmd;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyAdditionalPropertiesKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyImportMappingsKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyInstantiationTypesKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyLanguageSpecificPrimitivesCsvList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyReservedWordsMappingsKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applySystemPropertiesKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyTypeMappingsKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.*;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.spi.FilterAttachable;
@@ -160,6 +154,12 @@ public class Generate implements Runnable {
+ " You can also have multiple occurrences of this option.")
private List<String> importMappings = new ArrayList<>();
@Option(
name = {"--server-variables"},
title = "server variables",
description = "sets server variables overrides for spec documents which support variable templating of servers.")
private List<String> serverVariableOverrides = new ArrayList<>();
@Option(name = {"--invoker-package"}, title = "invoker package",
description = CodegenConstants.INVOKER_PACKAGE_DESC)
private String invokerPackage;
@@ -393,6 +393,7 @@ public class Generate implements Runnable {
applyAdditionalPropertiesKvpList(additionalProperties, configurator);
applyLanguageSpecificPrimitivesCsvList(languageSpecificPrimitives, configurator);
applyReservedWordsMappingsKvpList(reservedWordsMappings, configurator);
applyServerVariablesKvpList(serverVariableOverrides, configurator);
try {
final ClientOptInput clientOptInput = configurator.toClientOptInput();

View File

@@ -5,15 +5,14 @@ import com.google.common.base.Objects;
import io.airlift.airline.Command;
import io.airlift.airline.Option;
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.CodegenConfig;
import org.openapitools.codegen.CodegenConfigLoader;
import org.openapitools.codegen.CodegenType;
import org.openapitools.codegen.meta.GeneratorMetadata;
import org.openapitools.codegen.meta.Stability;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.*;
import java.util.stream.Collectors;
// NOTE: List can later have subcommands such as list languages, list types, list frameworks, etc.
@@ -26,9 +25,31 @@ public class ListGenerators implements Runnable {
@Option(name = {"-d", "--docsite" }, description = "format for docusaurus site output", hidden = true)
private Boolean docusaurus = false;
@Option(name = {"-i", "--include" },
description = "comma-separated list of stability indexes to include (value: all,beta,stable,experimental,deprecated). Excludes deprecated by default.",
allowedValues = { "all", "beta", "stable", "experimental", "deprecated" })
private String include = "stable,beta,experimental";
@Override
public void run() {
List<CodegenConfig> generators = CodegenConfigLoader.getAll();
List<CodegenConfig> generators = new ArrayList<>();
List<Stability> stabilities = Arrays.asList(Stability.values());
if (!StringUtils.isEmpty(include)) {
List<String> includes = Arrays.asList(include.split(","));
if (includes.size() != 0 && !includes.contains("all")) {
stabilities = includes.stream()
.map(Stability::forDescription)
.collect(Collectors.toList());
}
}
for (CodegenConfig codegenConfig : CodegenConfigLoader.getAll()) {
GeneratorMetadata meta = codegenConfig.getGeneratorMetadata();
if (meta != null && stabilities.contains(meta.getStability())) {
generators.add(codegenConfig);
}
}
StringBuilder sb = new StringBuilder();

View File

@@ -6,7 +6,7 @@
<artifactId>openapi-generator-project</artifactId>
<groupId>org.openapitools</groupId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<relativePath>../..</relativePath>
</parent>

View File

@@ -52,6 +52,7 @@ public final class GeneratorSettings implements Serializable {
private ImmutableMap<String, String> importMappings;
private ImmutableSet<String> languageSpecificPrimitives;
private ImmutableMap<String, String> reservedWordMappings;
private ImmutableMap<String, String> serverVariables;
private String gitUserId;
private String gitRepoId;
@@ -245,6 +246,17 @@ public final class GeneratorSettings implements Serializable {
return reservedWordMappings;
}
/**
* Gets server variable. Values defined here will be attempted to be replaced within a templated server object.
*
* @return the server variables
*/
public Map<String, String> getServerVariables() {
return serverVariables;
}
/**
* Gets git user id. e.g. <strong>openapitools</strong>.
* <p>
@@ -311,6 +323,7 @@ public final class GeneratorSettings implements Serializable {
importMappings = ImmutableMap.copyOf(builder.importMappings);
languageSpecificPrimitives = ImmutableSet.copyOf(builder.languageSpecificPrimitives);
reservedWordMappings = ImmutableMap.copyOf(builder.reservedWordMappings);
serverVariables = ImmutableMap.copyOf(builder.serverVariables);
gitUserId = builder.gitUserId;
gitRepoId = builder.gitRepoId;
releaseNote = builder.releaseNote;
@@ -373,6 +386,7 @@ public final class GeneratorSettings implements Serializable {
importMappings = ImmutableMap.of();
languageSpecificPrimitives = ImmutableSet.of();
reservedWordMappings = ImmutableMap.of();
serverVariables = ImmutableMap.of();
}
private void setDefaults() {
@@ -394,12 +408,6 @@ public final class GeneratorSettings implements Serializable {
return new Builder();
}
/**
* New builder builder.
*
* @param copy the copy
* @return the builder
*/
public static Builder newBuilder(GeneratorSettings copy) {
Builder builder = new Builder();
builder.generatorName = copy.getGeneratorName();
@@ -419,6 +427,7 @@ public final class GeneratorSettings implements Serializable {
builder.importMappings = new HashMap<>(copy.getImportMappings());
builder.languageSpecificPrimitives = new HashSet<>(copy.getLanguageSpecificPrimitives());
builder.reservedWordMappings = new HashMap<>(copy.getReservedWordMappings());
builder.serverVariables = new HashMap<>(copy.getServerVariables());
builder.gitUserId = copy.getGitUserId();
builder.gitRepoId = copy.getGitRepoId();
builder.releaseNote = copy.getReleaseNote();
@@ -449,6 +458,7 @@ public final class GeneratorSettings implements Serializable {
private Map<String, String> importMappings;
private Set<String> languageSpecificPrimitives;
private Map<String, String> reservedWordMappings;
private Map<String, String> serverVariables;
private String gitUserId;
private String gitRepoId;
private String releaseNote;
@@ -464,6 +474,7 @@ public final class GeneratorSettings implements Serializable {
importMappings = new HashMap<>();
languageSpecificPrimitives = new HashSet<>();
reservedWordMappings = new HashMap<>();
serverVariables = new HashMap<>();
gitUserId = DEFAULT_GIT_USER_ID;
gitRepoId = DEFAULT_GIT_REPO_ID;
@@ -617,6 +628,17 @@ public final class GeneratorSettings implements Serializable {
return this;
}
/**
* Sets the {@code serverVariables} and returns a reference to this Builder so that the methods can be chained together.
*
* @param serverVariables the {@code serverVariables} to set
* @return a reference to this Builder
*/
public Builder withServerVariables(Map<String, String> serverVariables) {
this.serverVariables = serverVariables;
return this;
}
/**
* Sets the {@code typeMappings} and returns a reference to this Builder so that the methods can be chained together.
*
@@ -731,6 +753,22 @@ public final class GeneratorSettings implements Serializable {
return this;
}
/**
* Sets a single {@code serverVariables} and returns a reference to this Builder so that the methods can be chained together.
*
* @param key A key for some server variable
* @param value The value of some server variable to be replaced in a templated server object.
* @return a reference to this Builder
*/
public Builder withServerVariable(String key, String value) {
if (this.serverVariables == null) {
this.serverVariables = new HashMap<>();
}
this.serverVariables.put(key, value);
return this;
}
/**
* Sets the {@code gitUserId} and returns a reference to this Builder so that the methods can be chained together.
*

View File

@@ -50,4 +50,14 @@ public enum Stability {
* @return The descriptive value of this enum.
*/
public String value() { return description; }
public static Stability forDescription(String description) {
for (Stability value: values()) {
if (value.description.equals(description)) {
return value;
}
}
throw new IllegalArgumentException("description not found in the available values.");
}
}

View File

@@ -374,6 +374,18 @@ openApiGenerate {
|===
=== openApiGenerators
.Options
|===
|Key |Data Type |Default |Description
|include
|String[]
|None
|A list of stability indexes to include (values: all,beta,stable,experimental,deprecated). Excludes deprecated by default.
|===
== Examples

View File

@@ -1,6 +1,7 @@
buildscript {
ext.kotlin_version = '1.2.61'
repositories {
mavenLocal()
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"

View File

@@ -1,5 +1,5 @@
# RELEASE_VERSION
openApiGeneratorVersion=4.1.0
openApiGeneratorVersion=4.1.1-SNAPSHOT
# /RELEASE_VERSION
# BEGIN placeholders

View File

@@ -4,7 +4,7 @@
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-project</artifactId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<relativePath>../..</relativePath>
</parent>

View File

@@ -19,6 +19,7 @@ package org.openapitools.generator.gradle.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.openapitools.generator.gradle.plugin.extensions.OpenApiGeneratorGenerateExtension
import org.openapitools.generator.gradle.plugin.extensions.OpenApiGeneratorGeneratorsExtension
import org.openapitools.generator.gradle.plugin.extensions.OpenApiGeneratorMetaExtension
import org.openapitools.generator.gradle.plugin.extensions.OpenApiGeneratorValidateExtension
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
@@ -53,12 +54,20 @@ class OpenApiGeneratorPlugin : Plugin<Project> {
project
)
val generators = extensions.create(
"openApiGenerators",
OpenApiGeneratorGeneratorsExtension::class.java,
project
)
generate.outputDir.set("$buildDir/generate-resources/main")
tasks.apply {
create("openApiGenerators", GeneratorsTask::class.java) {
group = pluginGroup
description = "Lists generators available via Open API Generators."
include.set(generators.include)
}
create("openApiMeta", MetaTask::class.java) {
@@ -99,6 +108,7 @@ class OpenApiGeneratorPlugin : Plugin<Project> {
instantiationTypes.set(generate.instantiationTypes)
typeMappings.set(generate.typeMappings)
additionalProperties.set(generate.additionalProperties)
serverVariables.set(generate.serverVariables)
languageSpecificPrimitives.set(generate.languageSpecificPrimitives)
importMappings.set(generate.importMappings)
invokerPackage.set(generate.invokerPackage)

View File

@@ -120,6 +120,11 @@ open class OpenApiGeneratorGenerateExtension(project: Project) {
*/
val additionalProperties = project.objects.property<Map<String, String>>()
/**
* Sets server variable for server URL template substitution, in the format of name=value,name=value.
*/
val serverVariables = project.objects.property<Map<String, String>>()
/**
* Specifies additional language specific primitive types in the format of type1,type2,type3,type3. For example: String,boolean,Boolean,Double.
*/

View File

@@ -0,0 +1,43 @@
/*
* Copyright 2019 OpenAPI-Generator Contributors (https://openapi-generator.tech)
*
* Licensed 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.
*/
package org.openapitools.generator.gradle.plugin.extensions
import org.gradle.api.Project
import org.gradle.api.tasks.Internal
import org.gradle.kotlin.dsl.listProperty
import org.openapitools.codegen.meta.Stability
/**
* Gradle project level extension object definition for the generators task
*
* @author Jim Schubert
*/
open class OpenApiGeneratorGeneratorsExtension(project: Project) {
/**
* A list of stability indexes to include (value: all,beta,stable,experimental,deprecated). Excludes deprecated by default.
*/
val include = project.objects.listProperty<String>()
init {
applyDefaults()
}
@Suppress("MemberVisibilityCanBePrivate")
fun applyDefaults(){
include.set(Stability.values().map { s -> s.value() }.filterNot { it == Stability.DEPRECATED.value() })
}
}

View File

@@ -155,6 +155,13 @@ open class GenerateTask : DefaultTask() {
@get:Internal
val additionalProperties = project.objects.property<Map<String, String>>()
/**
* Sets server variable for server URL template substitution, in the format of name=value,name=value.
* You can also have multiple occurrences of this option.
*/
@get:Internal
val serverVariables = project.objects.property<Map<String, String>>()
/**
* Specifies additional language specific primitive types in the format of type1,type2,type3,type3. For example: String,boolean,Boolean,Double.
*/
@@ -573,6 +580,12 @@ open class GenerateTask : DefaultTask() {
}
}
if (serverVariables.isPresent) {
serverVariables.get().forEach { entry ->
configurator.addServerVariable(entry.key, entry.value)
}
}
if (languageSpecificPrimitives.isPresent) {
languageSpecificPrimitives.get().forEach {
configurator.addLanguageSpecificPrimitive(it)

View File

@@ -17,9 +17,11 @@
package org.openapitools.generator.gradle.plugin.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.internal.logging.text.StyledTextOutput
import org.gradle.internal.logging.text.StyledTextOutputFactory
import org.gradle.kotlin.dsl.listProperty
import org.openapitools.codegen.CodegenConfigLoader
import org.openapitools.codegen.CodegenType
import org.openapitools.codegen.meta.GeneratorMetadata
@@ -35,6 +37,12 @@ import org.openapitools.codegen.meta.Stability
* @author Jim Schubert
*/
open class GeneratorsTask : DefaultTask() {
/**
* A list of stability indexes to include (value: all,beta,stable,experimental,deprecated). Excludes deprecated by default.
*/
@get:Internal
val include = project.objects.listProperty<String>()
@Suppress("unused")
@TaskAction
fun doWork() {
@@ -45,6 +53,15 @@ open class GeneratorsTask : DefaultTask() {
StringBuilder().apply {
val types = CodegenType.values()
val stabilities = if (include.isPresent) {
when {
include.get().contains("all") -> Stability.values().toList()
else -> include.get().map { Stability.forDescription(it) }
}
} else {
Stability.values().filterNot { it == Stability.DEPRECATED }
}
append("The following generators are available:")
append(System.lineSeparator())
@@ -56,21 +73,23 @@ open class GeneratorsTask : DefaultTask() {
generators.filter { it.tag == type }
.sortedBy { it.name }
.forEach({ generator ->
.forEach { generator ->
val meta: GeneratorMetadata? = generator.generatorMetadata
val include = stabilities.contains(meta?.stability)
if (include) {
append(" - ")
append(generator.name)
append(" - ")
append(generator.name)
meta?.stability?.let {
if (it != Stability.STABLE) {
append(" (${it.value()})")
meta?.stability?.let {
if (it != Stability.STABLE) {
append(" (${it.value()})")
}
}
}
append(System.lineSeparator())
})
append(System.lineSeparator())
}
}
append(System.lineSeparator())
append(System.lineSeparator())

View File

@@ -13,7 +13,7 @@
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<executions>
<execution>
@@ -120,7 +120,12 @@
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${jackson-version}</version>
</dependency>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
<!-- Joda time: if you use it -->
<dependency>
@@ -146,6 +151,7 @@
<swagger-annotations-version>1.5.8</swagger-annotations-version>
<jersey-version>2.27</jersey-version>
<jackson-version>2.8.9</jackson-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
<jodatime-version>2.7</jodatime-version>
<maven-plugin-version>1.0.0</maven-plugin-version>
<junit-version>4.8.1</junit-version>

View File

@@ -19,7 +19,7 @@
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<dependencies>
<dependency>
@@ -133,7 +133,12 @@
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${jackson-version}</version>
</dependency>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
<!-- Joda time: if you use it -->
<dependency>

View File

@@ -16,6 +16,7 @@
<swagger-annotations-version>1.5.8</swagger-annotations-version>
<jersey-version>2.27</jersey-version>
<jackson-version>2.8.9</jackson-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
<jodatime-version>2.7</jodatime-version>
<maven-plugin-version>1.0.0</maven-plugin-version>
<junit-version>4.8.1</junit-version>

View File

@@ -5,7 +5,7 @@
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-project</artifactId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<relativePath>../..</relativePath>
</parent>

View File

@@ -17,19 +17,8 @@
package org.openapitools.codegen.plugin;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyAdditionalPropertiesKvp;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyImportMappingsKvp;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyInstantiationTypesKvp;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyLanguageSpecificPrimitivesCsv;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyTypeMappingsKvp;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyReservedWordsMappingsKvp;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyAdditionalPropertiesKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyImportMappingsKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyInstantiationTypesKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyLanguageSpecificPrimitivesCsvList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyTypeMappingsKvpList;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.applyReservedWordsMappingsKvpList;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
import static org.openapitools.codegen.config.CodegenConfiguratorUtils.*;
import java.io.File;
import java.util.HashMap;
@@ -289,6 +278,12 @@ public class CodeGenMojo extends AbstractMojo {
@Parameter(name = "additionalProperties", property = "openapi.generator.maven.plugin.additionalProperties")
private List<String> additionalProperties;
/**
* A map of server variable overrides for specs that support server URL templating
*/
@Parameter(name = "serverVariableOverrides", property = "openapi.generator.maven.plugin.serverVariableOverrides")
private List<String> serverVariableOverrides;
/**
* A map of reserved names and how they should be escaped
*/
@@ -615,6 +610,10 @@ public class CodeGenMojo extends AbstractMojo {
configurator);
}
if (serverVariableOverrides == null && configOptions.containsKey("server-variables")) {
applyServerVariablesKvp(configOptions.get("server-variables").toString(), configurator);
}
// Retained for backwards-compataibility with configOptions -> reserved-words-mappings
if (reservedWordsMappings == null && configOptions.containsKey("reserved-words-mappings")) {
applyReservedWordsMappingsKvp(configOptions.get("reserved-words-mappings")
@@ -648,6 +647,10 @@ public class CodeGenMojo extends AbstractMojo {
applyAdditionalPropertiesKvpList(additionalProperties, configurator);
}
if (serverVariableOverrides != null && (configOptions == null || !configOptions.containsKey("server-variables"))) {
applyServerVariablesKvpList(serverVariableOverrides, configurator);
}
// Apply Reserved Words Mappings
if (reservedWordsMappings != null && (configOptions == null || !configOptions.containsKey("reserved-words-mappings"))) {
applyReservedWordsMappingsKvpList(reservedWordsMappings, configurator);

View File

@@ -4,7 +4,7 @@
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-project</artifactId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<relativePath>../..</relativePath>
</parent>

View File

@@ -4,7 +4,7 @@
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-project</artifactId>
<!-- RELEASE_VERSION -->
<version>4.1.0</version>
<version>4.1.1-SNAPSHOT</version>
<!-- /RELEASE_VERSION -->
<relativePath>../..</relativePath>
</parent>

View File

@@ -43,6 +43,8 @@ public interface CodegenConfig {
Map<String, Object> additionalProperties();
Map<String, String> serverVariableOverrides();
Map<String, Object> vendorExtensions();
String testPackage();

View File

@@ -7,4 +7,5 @@ public class CodegenServerVariable {
public String defaultValue;
public String description;
public List<String> enumValues;
public String value;
}

View File

@@ -97,6 +97,7 @@ public class DefaultCodegen implements CodegenConfig {
protected String embeddedTemplateDir;
protected String commonTemplateDir = "_common";
protected Map<String, Object> additionalProperties = new HashMap<String, Object>();
protected Map<String, String> serverVariables = new HashMap<String, String>();
protected Map<String, Object> vendorExtensions = new HashMap<String, Object>();
protected List<SupportingFile> supportingFiles = new ArrayList<SupportingFile>();
protected List<CliOption> cliOptions = new ArrayList<CliOption>();
@@ -240,13 +241,10 @@ public class DefaultCodegen implements CodegenConfig {
}
if (additionalProperties.containsKey("lambda")) {
LOGGER.warn("A property named 'lambda' already exists. Mustache lambdas renamed from 'lambda' to '_lambda'. " +
"You'll likely need to use a custom template, " +
"see https://github.com/OpenAPITools/openapi-generator/blob/master/docs/templating.md. ");
additionalProperties.put("_lambda", lambdas);
} else {
additionalProperties.put("lambda", lambdas);
LOGGER.error("A property called 'lambda' already exists in additionalProperties");
throw new RuntimeException("A property called 'lambda' already exists in additionalProperties");
}
additionalProperties.put("lambda", lambdas);
}
// override with any special post-processing for all models
@@ -506,12 +504,12 @@ public class DefaultCodegen implements CodegenConfig {
public void postProcessParameter(CodegenParameter parameter) {
}
//override with any special handling of the entire swagger spec
//override with any special handling of the entire OpenAPI spec document
@SuppressWarnings("unused")
public void preprocessOpenAPI(OpenAPI openAPI) {
}
// override with any special handling of the entire swagger spec
// override with any special handling of the entire OpenAPI spec document
@SuppressWarnings("unused")
public void processOpenAPI(OpenAPI openAPI) {
}
@@ -725,6 +723,10 @@ public class DefaultCodegen implements CodegenConfig {
return additionalProperties;
}
public Map<String, String> serverVariableOverrides() {
return serverVariables;
}
public Map<String, Object> vendorExtensions() {
return vendorExtensions;
}
@@ -1825,6 +1827,7 @@ public class DefaultCodegen implements CodegenConfig {
} else {
// composition
addProperties(properties, required, refSchema);
addProperties(allProperties, allRequired, refSchema);
}
}
@@ -4881,41 +4884,54 @@ public class DefaultCodegen implements CodegenConfig {
imports.add(codegenParameter.baseType);
} else {
CodegenProperty codegenProperty = fromProperty("property", schema);
if (ModelUtils.getAdditionalProperties(schema) != null) {// http body is map
LOGGER.error("Map should be supported. Please report to openapi-generator github repo about the issue.");
} else if (codegenProperty != null) {
String codegenModelName, codegenModelDescription;
if (codegenModel != null) {
codegenModelName = codegenModel.classname;
codegenModelDescription = codegenModel.description;
} else {
LOGGER.warn("The following schema has undefined (null) baseType. " +
"It could be due to form parameter defined in OpenAPI v2 spec with incorrect consumes. " +
"A correct 'consumes' for form parameters should be " +
"'application/x-www-form-urlencoded' or 'multipart/form-data'");
LOGGER.warn("schema: " + schema);
LOGGER.warn("codegenModel is null. Default to UNKNOWN_BASE_TYPE");
codegenModelName = "UNKNOWN_BASE_TYPE";
codegenModelDescription = "UNKNOWN_DESCRIPTION";
}
if (StringUtils.isEmpty(bodyParameterName)) {
codegenParameter.baseName = codegenModelName;
} else {
codegenParameter.baseName = bodyParameterName;
}
if (codegenProperty != null && codegenProperty.getComplexType() != null && codegenProperty.getComplexType().contains(" | ")) {
List<String> parts = Arrays.asList(codegenProperty.getComplexType().split(" \\| "));
imports.addAll(parts);
String codegenModelName = codegenProperty.getComplexType();
codegenParameter.baseName = codegenModelName;
codegenParameter.paramName = toParamName(codegenParameter.baseName);
codegenParameter.baseType = codegenModelName;
codegenParameter.baseType = codegenParameter.baseName;
codegenParameter.dataType = getTypeDeclaration(codegenModelName);
codegenParameter.description = codegenModelDescription;
imports.add(codegenParameter.baseType);
codegenParameter.description = codegenProperty.getDescription();
} else {
if (ModelUtils.getAdditionalProperties(schema) != null) {// http body is map
LOGGER.error("Map should be supported. Please report to openapi-generator github repo about the issue.");
} else if (codegenProperty != null) {
String codegenModelName, codegenModelDescription;
if (codegenProperty.complexType != null) {
imports.add(codegenProperty.complexType);
if (codegenModel != null) {
codegenModelName = codegenModel.classname;
codegenModelDescription = codegenModel.description;
} else {
LOGGER.warn("The following schema has undefined (null) baseType. " +
"It could be due to form parameter defined in OpenAPI v2 spec with incorrect consumes. " +
"A correct 'consumes' for form parameters should be " +
"'application/x-www-form-urlencoded' or 'multipart/form-data'");
LOGGER.warn("schema: " + schema);
LOGGER.warn("codegenModel is null. Default to UNKNOWN_BASE_TYPE");
codegenModelName = "UNKNOWN_BASE_TYPE";
codegenModelDescription = "UNKNOWN_DESCRIPTION";
}
if (StringUtils.isEmpty(bodyParameterName)) {
codegenParameter.baseName = codegenModelName;
} else {
codegenParameter.baseName = bodyParameterName;
}
codegenParameter.paramName = toParamName(codegenParameter.baseName);
codegenParameter.baseType = codegenModelName;
codegenParameter.dataType = getTypeDeclaration(codegenModelName);
codegenParameter.description = codegenModelDescription;
imports.add(codegenParameter.baseType);
if (codegenProperty.complexType != null) {
imports.add(codegenProperty.complexType);
}
}
}
setParameterBooleanFlagWithCodegenProperty(codegenParameter, codegenProperty);
// set nullable
setParameterNullable(codegenParameter, codegenProperty);
@@ -5056,14 +5072,34 @@ public class DefaultCodegen implements CodegenConfig {
if (variables == null) {
return Collections.emptyList();
}
Map<String, String> variableOverrides = serverVariableOverrides();
List<CodegenServerVariable> codegenServerVariables = new LinkedList<>();
for (Entry<String, ServerVariable> variableEntry : variables.entrySet()) {
CodegenServerVariable codegenServerVariable = new CodegenServerVariable();
ServerVariable variable = variableEntry.getValue();
List<String> enums = variable.getEnum();
codegenServerVariable.defaultValue = variable.getDefault();
codegenServerVariable.description = escapeText(variable.getDescription());
codegenServerVariable.enumValues = variable.getEnum();
codegenServerVariable.enumValues = enums;
codegenServerVariable.name = variableEntry.getKey();
// Sets the override value for a server variable pattern.
// NOTE: OpenAPI Specification doesn't prevent multiple server URLs with variables. If multiple objects have the same
// variables pattern, user overrides will apply to _all_ of these patterns. We may want to consider indexed overrides.
if (variableOverrides != null && !variableOverrides.isEmpty()) {
String value = variableOverrides.getOrDefault(variableEntry.getKey(), variable.getDefault());
codegenServerVariable.value = value;
if (enums != null && !enums.isEmpty() && !enums.contains(value)) {
LOGGER.warn("Variable override of '{}' is not listed in the enum of allowed values ({}).", value, StringUtils.join(enums, ","));
}
} else {
codegenServerVariable.value = variable.getDefault();
}
codegenServerVariables.add(codegenServerVariable);
}
return codegenServerVariables;

View File

@@ -207,10 +207,12 @@ public class DefaultGenerator extends AbstractGenerator implements Generator {
config.vendorExtensions().putAll(openAPI.getExtensions());
}
URL url = URLPathUtils.getServerURL(openAPI);
// TODO: Allow user to define _which_ servers object in the array to target.
// Configures contextPath/basePath according to api document's servers
URL url = URLPathUtils.getServerURL(openAPI, config.serverVariableOverrides());
contextPath = config.escapeText(url.getPath()).replaceAll("/$", ""); // for backward compatibility
basePathWithoutHost = contextPath;
basePath = config.escapeText(URLPathUtils.getHost(openAPI)).replaceAll("/$", "");
basePath = config.escapeText(URLPathUtils.getHost(openAPI, config.serverVariableOverrides())).replaceAll("/$", "");
}
private void configureOpenAPIInfo() {
@@ -548,7 +550,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator {
}
});
Map<String, Object> operation = processOperations(config, tag, ops, allModels);
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, config.serverVariableOverrides());
operation.put("basePath", basePath);
operation.put("basePathWithoutHost", config.encodePath(url.getPath()).replaceAll("/$", ""));
operation.put("contextPath", contextPath);
@@ -819,7 +821,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator {
Map<String, Object> apis = new HashMap<String, Object>();
apis.put("apis", allOperations);
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, config.serverVariableOverrides());
bundle.put("openAPI", openAPI);
bundle.put("basePath", basePath);
@@ -972,6 +974,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator {
processOperation(resourcePath, "delete", path.getDelete(), ops, path);
processOperation(resourcePath, "patch", path.getPatch(), ops, path);
processOperation(resourcePath, "options", path.getOptions(), ops, path);
processOperation(resourcePath, "trace", path.getTrace(), ops, path);
}
return ops;
}
@@ -1191,7 +1194,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator {
for (String key : definitions.keySet()) {
Schema schema = definitions.get(key);
if (schema == null)
throw new RuntimeException("schema cannot be null in processMoels");
throw new RuntimeException("schema cannot be null in processModels");
CodegenModel cm = config.fromModel(key, schema);
Map<String, Object> mo = new HashMap<String, Object>();
mo.put("model", cm);

View File

@@ -19,6 +19,7 @@ package org.openapitools.codegen;
import io.swagger.v3.core.util.Json;
import io.swagger.v3.oas.models.*;
import io.swagger.v3.oas.models.callbacks.Callback;
import io.swagger.v3.oas.models.media.*;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.RequestBody;
@@ -29,6 +30,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.stream.Collectors;
public class InlineModelResolver {
private OpenAPI openapi;
@@ -64,7 +66,20 @@ public class InlineModelResolver {
for (String pathname : paths.keySet()) {
PathItem path = paths.get(pathname);
List<Operation> operations = new ArrayList<>(path.readOperations());
// Include callback operation as well
for (Operation operation : path.readOperations()) {
Map<String, Callback> callbacks = operation.getCallbacks();
if (callbacks != null) {
operations.addAll(callbacks.values().stream()
.flatMap(callback -> callback.values().stream())
.flatMap(pathItem -> pathItem.readOperations().stream())
.collect(Collectors.toList()));
}
}
for (Operation operation : operations) {
flattenRequestBody(openAPI, pathname, operation);
flattenParameters(openAPI, pathname, operation);
flattenResponses(openAPI, pathname, operation);

View File

@@ -67,6 +67,7 @@ public class CodegenConfigurator {
private Map<String, String> importMappings = new HashMap<>();
private Set<String> languageSpecificPrimitives = new HashSet<>();
private Map<String, String> reservedWordMappings = new HashMap<>();
private Map<String, String> serverVariables = new HashMap<>();
private String auth;
public CodegenConfigurator() {
@@ -98,6 +99,12 @@ public class CodegenConfigurator {
return null;
}
public CodegenConfigurator addServerVariable(String key, String value) {
this.serverVariables.put(key, value);
generatorSettingsBuilder.withServerVariable(key, value);
return this;
}
public CodegenConfigurator addAdditionalProperty(String key, Object value) {
this.additionalProperties.put(key, value);
generatorSettingsBuilder.withAdditionalProperty(key, value);
@@ -146,6 +153,18 @@ public class CodegenConfigurator {
return this;
}
public CodegenConfigurator setServerVariables(Map<String, String> serverVariables) {
this.serverVariables = serverVariables;
generatorSettingsBuilder.withServerVariables(serverVariables);
return this;
}
public CodegenConfigurator setReservedWordsMappings(Map<String, String> reservedWordMappings) {
this.reservedWordMappings = reservedWordMappings;
generatorSettingsBuilder.withReservedWordMappings(reservedWordMappings);
return this;
}
public CodegenConfigurator setApiPackage(String apiPackage) {
generatorSettingsBuilder.withApiPackage(apiPackage);
return this;
@@ -247,6 +266,7 @@ public class CodegenConfigurator {
public CodegenConfigurator setLanguageSpecificPrimitives(
Set<String> languageSpecificPrimitives) {
this.languageSpecificPrimitives = languageSpecificPrimitives;
generatorSettingsBuilder.withLanguageSpecificPrimitives(languageSpecificPrimitives);
return this;
}
@@ -296,12 +316,6 @@ public class CodegenConfigurator {
return this;
}
public CodegenConfigurator setReservedWordsMappings(Map<String, String> reservedWordMappings) {
this.reservedWordMappings = reservedWordMappings;
generatorSettingsBuilder.withReservedWordMappings(reservedWordMappings);
return this;
}
public CodegenConfigurator setSkipOverwrite(boolean skipOverwrite) {
workflowSettingsBuilder.withSkipOverwrite(skipOverwrite);
return this;
@@ -459,6 +473,13 @@ public class CodegenConfigurator {
config.reservedWordsMappings().putAll(generatorSettings.getReservedWordMappings());
config.additionalProperties().putAll(generatorSettings.getAdditionalProperties());
Map<String, String> serverVariables = generatorSettings.getServerVariables();
if (!serverVariables.isEmpty()) {
// This is currently experimental due to vagueness in the specification
LOGGER.warn("user-defined server variable support is experimental.");
config.serverVariableOverrides().putAll(serverVariables);
}
// any other additional properties?
String templateDir = workflowSettings.getTemplateDir();
if (templateDir != null) {

View File

@@ -107,6 +107,19 @@ public final class CodegenConfiguratorUtils {
}
}
public static void applyServerVariablesKvpList(List<String> values, CodegenConfigurator configurator) {
for(String value : values) {
applyServerVariablesKvp(value, configurator);
}
}
public static void applyServerVariablesKvp(String values, CodegenConfigurator configurator) {
final Map<String, String> map = createMapFromKeyValuePairs(values);
for (Map.Entry<String, String> entry : map.entrySet()) {
configurator.addServerVariable(entry.getKey(), entry.getValue());
}
}
public static void applyLanguageSpecificPrimitivesCsvList(List<String> languageSpecificPrimitives, CodegenConfigurator configurator) {
for(String propString : languageSpecificPrimitives) {
applyLanguageSpecificPrimitivesCsv(propString, configurator);

View File

@@ -296,7 +296,7 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg
@Override
public void preprocessOpenAPI(OpenAPI openAPI) {
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
String port = URLPathUtils.getPort(url, "");
String host = url.getHost();
if(!port.isEmpty()) {

View File

@@ -389,6 +389,11 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege
}
}
// import "reflect" package if the parameter is collectionFormat=multi
if (param.isCollectionFormatMulti) {
imports.add(createMapping("import", "reflect"));
}
// import "optionals" package if the parameter is optional
if (!param.required) {
if (!addedOptionalImport) {

View File

@@ -17,6 +17,7 @@
package org.openapitools.codegen.languages;
import com.google.common.base.CaseFormat;
import com.google.common.base.Strings;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
@@ -417,6 +418,8 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
importMapping.put("JsonTypeInfo", "com.fasterxml.jackson.annotation.JsonTypeInfo");
importMapping.put("JsonCreator", "com.fasterxml.jackson.annotation.JsonCreator");
importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue");
importMapping.put("JsonIgnore", "com.fasterxml.jackson.annotation.JsonIgnore");
importMapping.put("JsonInclude", "com.fasterxml.jackson.annotation.JsonInclude");
importMapping.put("SerializedName", "com.google.gson.annotations.SerializedName");
importMapping.put("TypeAdapter", "com.google.gson.TypeAdapter");
importMapping.put("JsonAdapter", "com.google.gson.annotations.JsonAdapter");
@@ -800,7 +803,13 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
}
}
return null;
} else if (ModelUtils.isObjectSchema(p)) {
if (p.getDefault() != null) {
return super.toDefaultValue(p);
}
return null;
}
return super.toDefaultValue(p);
}
@@ -976,6 +985,9 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
model.imports.add("ApiModelProperty");
model.imports.add("ApiModel");
}
// store java constant property name in vendor extension, remove dollar sign from the constant name
property.vendorExtensions.put("x-java-const-name", CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, property.nameInCamelCase.replaceAll("\\$", "")));
}
@Override

View File

@@ -110,7 +110,7 @@ public abstract class AbstractJavaJAXRSServerCodegen extends AbstractJavaCodegen
*/
if (!this.additionalProperties.containsKey(SERVER_PORT)) {
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
// 8080 is the default value for a JEE Server:
this.additionalProperties.put(SERVER_PORT, URLPathUtils.getPort(url, serverPort));
}

View File

@@ -612,6 +612,7 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
StringBuilder instantiationType = new StringBuilder(arrayType);
Schema items = arr.getItems();
String nestedType = getTypeDeclaration(items);
additionalProperties.put("nestedType", nestedType);
// TODO: We may want to differentiate here between generics and primitive arrays.
instantiationType.append("<").append(nestedType).append(">");
return instantiationType.toString();

View File

@@ -268,7 +268,7 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen {
@Override
public void preprocessOpenAPI(OpenAPI openAPI) {
super.preprocessOpenAPI(openAPI);
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
additionalProperties.put("serverHost", url.getHost());
additionalProperties.put("serverPort", URLPathUtils.getPort(url, 8080));
}
@@ -327,6 +327,7 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen {
supportingFiles.add(new SupportingFile("Solution.mustache", "", packageName + ".sln"));
supportingFiles.add(new SupportingFile("gitignore", packageFolder, ".gitignore"));
supportingFiles.add(new SupportingFile("validateModel.mustache", packageFolder + File.separator + "Attributes", "ValidateModelStateAttribute.cs"));
supportingFiles.add(new SupportingFile("typeConverter.mustache", packageFolder + File.separator + "Converters", "CustomEnumConverter.cs"));
supportingFiles.add(new SupportingFile("Project.csproj.mustache", packageFolder, packageName + ".csproj"));
if (!isLibrary) {
supportingFiles.add(new SupportingFile("Dockerfile.mustache", packageFolder, "Dockerfile"));

View File

@@ -359,7 +359,7 @@ public class CSharpNancyFXServerCodegen extends AbstractCSharpCodegen {
@Override
public void preprocessOpenAPI(final OpenAPI openAPI) {
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
String path = URLPathUtils.getPath(url, "/");
final String packageContextOption = (String) additionalProperties.get(PACKAGE_CONTEXT);
additionalProperties.put("packageContext", packageContextOption == null ? sanitizeName(path) : packageContextOption);

View File

@@ -118,13 +118,13 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
typeMapping.put("URI", "String");
typeMapping.put("ByteArray", "String");
cliOptions.add(new CliOption(BROWSER_CLIENT, "Is the client browser based"));
cliOptions.add(new CliOption(BROWSER_CLIENT, "Is the client browser based (for Dart 1.x only)"));
cliOptions.add(new CliOption(PUB_NAME, "Name in generated pubspec"));
cliOptions.add(new CliOption(PUB_VERSION, "Version in generated pubspec"));
cliOptions.add(new CliOption(PUB_DESCRIPTION, "Description in generated pubspec"));
cliOptions.add(new CliOption(USE_ENUM_EXTENSION, "Allow the 'x-enum-values' extension for enums"));
cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, "source folder for generated code"));
cliOptions.add(CliOption.newBoolean(SUPPORT_DART2, "support dart2").defaultValue(Boolean.TRUE.toString()));
cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, "Source folder for generated code"));
cliOptions.add(CliOption.newBoolean(SUPPORT_DART2, "Support Dart 2.x").defaultValue(Boolean.TRUE.toString()));
}
@Override

View File

@@ -23,20 +23,14 @@ import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.CodegenOperation;
import org.openapitools.codegen.CodegenType;
import org.openapitools.codegen.SupportingFile;
import org.openapitools.codegen.CodegenModel;
import org.openapitools.codegen.CodegenProperty;
import org.openapitools.codegen.utils.URLPathUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.List;
import java.util.ArrayList;
import static java.util.UUID.randomUUID;
@@ -165,7 +159,7 @@ public class FsharpGiraffeServerCodegen extends AbstractFSharpCodegen {
@Override
public void preprocessOpenAPI(OpenAPI openAPI) {
super.preprocessOpenAPI(openAPI);
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
additionalProperties.put("serverHost", url.getHost());
additionalProperties.put("serverPort", URLPathUtils.getPort(url, 8080));
}

View File

@@ -19,6 +19,8 @@ package org.openapitools.codegen.languages;
import org.openapitools.codegen.CodegenModel;
import org.openapitools.codegen.CodegenProperty;
import org.openapitools.codegen.SupportingFile;
import org.openapitools.codegen.meta.GeneratorMetadata;
import org.openapitools.codegen.meta.Stability;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,6 +35,10 @@ public class GoClientExperimentalCodegen extends GoClientCodegen {
super();
outputFolder = "generated-code/go-experimental";
embeddedTemplateDir = templateDir = "go-experimental";
generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata)
.stability(Stability.EXPERIMENTAL)
.build();
}
/**

View File

@@ -1065,13 +1065,14 @@ public class HaskellHttpClientCodegen extends DefaultCodegen implements CodegenC
case "tsv":
return "TabSeparated";
case "ssv":
case "space":
return "SpaceSeparated";
case "pipes":
return "PipeSeparated";
case "multi":
return "MultiParamArray";
default:
throw new UnsupportedOperationException();
throw new UnsupportedOperationException(collectionFormat + " (collection format) not supported");
}
}

View File

@@ -549,6 +549,7 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf
return "(QueryList 'CommaSeparated (" + type + "))";
case "tsv":
return "(QueryList 'TabSeparated (" + type + "))";
case "space":
case "ssv":
return "(QueryList 'SpaceSeparated (" + type + "))";
case "pipes":
@@ -556,7 +557,7 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf
case "multi":
return "(QueryList 'MultiParamArray (" + type + "))";
default:
throw new UnsupportedOperationException();
throw new UnsupportedOperationException(collectionFormat + " (collection format) not supported");
}
}

View File

@@ -24,6 +24,7 @@ import org.openapitools.codegen.languages.features.BeanValidationFeatures;
import org.openapitools.codegen.languages.features.GzipFeatures;
import org.openapitools.codegen.languages.features.PerformBeanValidationFeatures;
import org.openapitools.codegen.templating.mustache.CaseFormatLambda;
import org.openapitools.codegen.utils.ModelUtils;
import org.openapitools.codegen.utils.ProcessUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -583,6 +584,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen
if (additionalProperties.containsKey("jackson")) {
model.imports.add("JsonProperty");
model.imports.add("JsonValue");
model.imports.add("JsonInclude");
}
if (additionalProperties.containsKey("gson")) {
model.imports.add("SerializedName");
@@ -623,6 +625,39 @@ public class JavaClientCodegen extends AbstractJavaCodegen
return objs;
}
@Override
public Map<String, Object> postProcessModels(Map<String, Object> objs) {
objs = super.postProcessModels(objs);
if (additionalProperties.containsKey("jackson") && !JERSEY1.equals(getLibrary())) {
List<Map<String, String>> imports = (List<Map<String, String>>) objs.get("imports");
List<Object> models = (List<Object>) objs.get("models");
for (Object _mo : models) {
Map<String, Object> mo = (Map<String, Object>) _mo;
CodegenModel cm = (CodegenModel) mo.get("model");
boolean addImports = false;
for (CodegenProperty var : cm.vars) {
boolean isOptionalNullable = Boolean.FALSE.equals(var.required) && Boolean.TRUE.equals(var.isNullable);
// only add JsonNullable and related imports to optional and nullable values
addImports |= isOptionalNullable;
var.getVendorExtensions().put("isJacksonOptionalNullable", isOptionalNullable);
}
if (addImports) {
cm.imports.add("JsonNullable");
Map<String, String> itemJsonNullable = new HashMap<String, String>();
itemJsonNullable.put("import", "org.openapitools.jackson.nullable.JsonNullable");
imports.add(itemJsonNullable);
cm.imports.add("NoSuchElementException");
Map<String, String> itemExc = new HashMap<String, String>();
itemExc.put("import", "java.util.NoSuchElementException");
imports.add(itemExc);
}
}
}
return objs;
}
public void setUseRxJava(boolean useRxJava) {
this.useRxJava = useRxJava;
doNotUseRx = false;

View File

@@ -538,7 +538,7 @@ public class JavaPKMSTServerCodegen extends AbstractJavaCodegen {
additionalProperties.put(TITLE, this.title);
}
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
this.additionalProperties.put("serverPort", URLPathUtils.getPort(url, 8080));
if (openAPI.getPaths() != null) {

View File

@@ -221,7 +221,7 @@ public class JavaVertXServerCodegen extends AbstractJavaCodegen {
super.preprocessOpenAPI(openAPI);
// add server port from the swagger file, 8080 by default
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
this.additionalProperties.put("serverPort", URLPathUtils.getPort(url, 8080));
// retrieve api version from swagger file, 1.0.0-SNAPSHOT by default

View File

@@ -149,6 +149,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
if (CollectionType.LIST.value.equals(collectionType)) {
typeMapping.put("array", "kotlin.collections.List");
typeMapping.put("list", "kotlin.collections.List");
additionalProperties.put("isList", true);
}
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));

View File

@@ -407,7 +407,7 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen
}
if (!additionalProperties.containsKey(SERVER_PORT)) {
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
this.additionalProperties.put(SERVER_PORT, URLPathUtils.getPort(url, 8080));
}

View File

@@ -300,7 +300,7 @@ public class NodeJSExpressServerCodegen extends DefaultCodegen implements Codege
@Override
public void preprocessOpenAPI(OpenAPI openAPI) {
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
String host = URLPathUtils.getProtocolAndHost(url);
String port = URLPathUtils.getPort(url, defaultServerPort) ;
String basePath = url.getPath();

View File

@@ -358,7 +358,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig
@Override
public void preprocessOpenAPI(OpenAPI openAPI) {
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
String host = URLPathUtils.getProtocolAndHost(url);
String port = URLPathUtils.getPort(url, defaultServerPort) ;
String basePath = url.getPath();

View File

@@ -18,6 +18,9 @@ package org.openapitools.codegen.languages;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import org.openapitools.codegen.meta.GeneratorMetadata;
import org.openapitools.codegen.meta.Stability;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,6 +42,10 @@ public class PythonClientExperimentalCodegen extends PythonClientCodegen {
apiTemplateFiles.put("python-experimental/api.mustache", ".py");
modelDocTemplateFiles.put("python-experimental/model_doc.mustache", ".md");
modelTemplateFiles.put("python-experimental/model.mustache", ".py");
generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata)
.stability(Stability.EXPERIMENTAL)
.build();
}
/**

View File

@@ -24,9 +24,7 @@ import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.FileSchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.media.XML;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.RequestBody;
import io.swagger.v3.oas.models.servers.Server;
import org.apache.commons.lang3.StringUtils;
@@ -291,7 +289,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig {
}
info.setVersion(StringUtils.join(versionComponents, "."));
URL url = URLPathUtils.getServerURL(openAPI);
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
additionalProperties.put("serverHost", url.getHost());
additionalProperties.put("serverPort", URLPathUtils.getPort(url, 80));
}
@@ -617,10 +615,6 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig {
}
for (CodegenParameter param : op.headerParams) {
// If a header uses UUIDs, we need to import the UUID package.
if (param.dataType.equals(uuidType)) {
additionalProperties.put("apiUsesUuid", true);
}
processParam(param, op);
// Give header params a name in camel case. CodegenParameters don't have a nameInCamelCase property.
@@ -756,10 +750,21 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig {
}
if (op.authMethods != null) {
boolean headerAuthMethods = false;
for (CodegenSecurity s : op.authMethods) {
if (s.isApiKey && s.isKeyInHeader) {
s.vendorExtensions.put("x-apiKeyName", toModelName(s.keyParamName));
headerAuthMethods = true;
}
if (s.isBasicBasic || s.isBasicBearer || s.isOAuth) {
headerAuthMethods = true;
}
}
if (headerAuthMethods) {
op.vendorExtensions.put("hasHeaderAuthMethods", "true");
}
}
}
@@ -927,7 +932,15 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig {
String modelName = entry.getKey();
CodegenModel model = entry.getValue();
if (uuidType.equals(model.dataType)) {
additionalProperties.put("apiUsesUuid", true);
}
for (CodegenProperty prop : model.vars) {
if (prop.dataType.equals(uuidType)) {
additionalProperties.put("apiUsesUuid", true);
}
String xmlName = modelXmlNames.get(prop.dataType);
if (xmlName != null) {
prop.vendorExtensions.put("itemXmlName", xmlName);
@@ -1134,6 +1147,11 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig {
private void processParam(CodegenParameter param, CodegenOperation op) {
String example = null;
// If a parameter uses UUIDs, we need to import the UUID package.
if (param.dataType.equals(uuidType)) {
additionalProperties.put("apiUsesUuid", true);
}
if (param.isString) {
param.vendorExtensions.put("formatString", "\\\"{}\\\"");
example = "\"" + ((param.example != null) ? param.example : "") + "\".to_string()";

View File

@@ -515,8 +515,8 @@ public class SpringCodegen extends AbstractJavaCodegen
additionalProperties.put(TITLE, this.title);
}
if (!additionalProperties.containsKey(SERVER_PORT)) {
URL url = URLPathUtils.getServerURL(openAPI);
if(!additionalProperties.containsKey(SERVER_PORT)) {
URL url = URLPathUtils.getServerURL(openAPI, serverVariableOverrides());
this.additionalProperties.put(SERVER_PORT, URLPathUtils.getPort(url, 8080));
}

View File

@@ -209,8 +209,9 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
}
// Set the typescript version compatible to the Angular version
if (ngVersion.atLeast("7.0.0")) {
// Angular v7 requires typescript ">=3.1.1 <3.2.0"
if (ngVersion.atLeast("8.0.0")) {
additionalProperties.put("tsVersion", ">=3.4.0 <3.6.0");
} else if (ngVersion.atLeast("7.0.0")) {
additionalProperties.put("tsVersion", ">=3.1.1 <3.2.0");
} else if (ngVersion.atLeast("6.0.0")) {
additionalProperties.put("tsVersion", ">=2.7.2 and <2.10.0");
@@ -222,7 +223,9 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
}
// Set the rxJS version compatible to the Angular version
if (ngVersion.atLeast("7.0.0")) {
if (ngVersion.atLeast("8.0.0")) {
additionalProperties.put("rxjsVersion", "6.5.0");
} else if (ngVersion.atLeast("7.0.0")) {
additionalProperties.put("rxjsVersion", "6.3.0");
} else if (ngVersion.atLeast("6.0.0")) {
additionalProperties.put("rxjsVersion", "6.1.0");
@@ -250,7 +253,10 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
additionalProperties.put("useOldNgPackagr", !ngVersion.atLeast("5.0.0"));
// Specific ng-packagr configuration
if (ngVersion.atLeast("7.0.0")) {
if (ngVersion.atLeast("8.0.0")) {
additionalProperties.put("ngPackagrVersion", "5.4.0");
additionalProperties.put("tsickleVersion", "0.35.0");
} else if (ngVersion.atLeast("7.0.0")) {
// compatible versions with typescript version
additionalProperties.put("ngPackagrVersion", "5.1.0");
additionalProperties.put("tsickleVersion", "0.34.0");
@@ -268,7 +274,9 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
}
// set zone.js version
if (ngVersion.atLeast("5.0.0")) {
if (ngVersion.atLeast("8.0.0")) {
additionalProperties.put("zonejsVersion", "0.9.1");
} else if (ngVersion.atLeast("5.0.0")) {
// compatible versions to Angular 5+
additionalProperties.put("zonejsVersion", "0.8.26");
} else {
@@ -659,3 +667,4 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
}
}

View File

@@ -17,6 +17,7 @@
package org.openapitools.codegen.utils;
import com.google.common.collect.ImmutableMap;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.oas.models.servers.ServerVariable;
@@ -28,9 +29,7 @@ import org.slf4j.LoggerFactory;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -40,24 +39,28 @@ public class URLPathUtils {
public static final String LOCAL_HOST = "http://localhost";
public static final Pattern VARIABLE_PATTERN = Pattern.compile("\\{([^\\}]+)\\}");
public static URL getServerURL(OpenAPI openAPI) {
// TODO: This should probably be moved into generator/workflow type rather than a static like this.
public static URL getServerURL(OpenAPI openAPI, Map<String, String> userDefinedVariables) {
final List<Server> servers = openAPI.getServers();
if (servers == null || servers.isEmpty()) {
LOGGER.warn("Server information seems not defined in the spec. Default to {}.", LOCAL_HOST);
return getDefaultUrl();
}
// TODO need a way to obtain all server URLs
return getServerURL(servers.get(0));
return getServerURL(servers.get(0), userDefinedVariables);
}
public static URL getServerURL(final Server server) {
public static URL getServerURL(final Server server, final Map<String, String> userDefinedVariables) {
String url = server.getUrl();
ServerVariables variables = server.getVariables();
if (variables == null) {
variables = new ServerVariables();
}
Map<String, String> userVariables = userDefinedVariables == null ? new HashMap<>() : ImmutableMap.copyOf(userDefinedVariables);
if (StringUtils.isNotBlank(url)) {
url = extractUrl(server, url, variables);
url = extractUrl(server, url, variables, userVariables);
url = sanitizeUrl(url);
try {
@@ -69,26 +72,37 @@ public class URLPathUtils {
return getDefaultUrl();
}
private static String extractUrl(Server server, String url, ServerVariables variables) {
private static String extractUrl(Server server, String url, ServerVariables variables, Map<String, String> userVariables) {
Set<String> replacedVariables = new HashSet<>();
Matcher matcher = VARIABLE_PATTERN.matcher(url);
while (matcher.find()) {
if (!replacedVariables.contains(matcher.group())) {
ServerVariable variable = variables.get(matcher.group(1));
String variableName = matcher.group(1);
ServerVariable variable = variables.get(variableName);
String replacement;
if (variable != null) {
if (variable.getDefault() != null) {
replacement = variable.getDefault();
} else if (variable.getEnum() != null && !variable.getEnum().isEmpty()) {
replacement = variable.getEnum().get(0);
} else {
LOGGER.warn("No value found for variable '{}' in server definition '{}', default to empty string.", matcher.group(1), server.getUrl());
replacement = "";
String defaultValue = variable.getDefault();
List<String> enumValues = variable.getEnum() == null ? new ArrayList<>() : variable.getEnum();
if (defaultValue == null && !enumValues.isEmpty()) {
defaultValue = enumValues.get(0);
} else if (defaultValue == null) {
defaultValue = "";
}
replacement = userVariables.getOrDefault(variableName, defaultValue);
if (!enumValues.isEmpty() && !enumValues.contains(replacement)) {
LOGGER.warn("Variable override of '{}' is not listed in the enum of allowed values ({}).", replacement, StringUtils.join(enumValues, ","));
}
} else {
LOGGER.warn("No variable '{}' found in server definition '{}', default to empty string.", matcher.group(1), server.getUrl());
replacement = "";
replacement = userVariables.getOrDefault(variableName, "");
}
if (StringUtils.isEmpty(replacement)) {
replacement = "";
LOGGER.warn("No value found for variable '{}' in server definition '{}' and no user override specified, default to empty string.", variableName, server.getUrl());
}
url = url.replace(matcher.group(), replacement);
replacedVariables.add(matcher.group());
matcher = VARIABLE_PATTERN.matcher(url);
@@ -98,7 +112,7 @@ public class URLPathUtils {
}
public static String getScheme(OpenAPI openAPI, CodegenConfig config) {
URL url = getServerURL(openAPI);
URL url = getServerURL(openAPI, config.serverVariableOverrides());
return getScheme(url, config);
}
@@ -176,11 +190,12 @@ public class URLPathUtils {
* Return the first complete URL from the OpenAPI specification
*
* @param openAPI current OpenAPI specification
* @param userDefinedVariables User overrides for server variable templating
* @return host
*/
public static String getHost(OpenAPI openAPI) {
public static String getHost(OpenAPI openAPI, final Map<String, String> userDefinedVariables) {
if (openAPI.getServers() != null && openAPI.getServers().size() > 0) {
return sanitizeUrl(getServerURL(openAPI.getServers().get(0)).toString());
return sanitizeUrl(getServerURL(openAPI.getServers().get(0), userDefinedVariables).toString());
}
return LOCAL_HOST;
}

View File

@@ -0,0 +1,19 @@
{{!
If this is map and items are nullable, make sure that nulls are included.
To determine what JsonInclude.Include method to use, consider the following:
* If the field is required, always include it, even if it is null.
* Else use custom behaviour, IOW use whatever is defined on the object mapper
}}
@JsonProperty(JSON_PROPERTY_{{vendorExtensions.x-java-const-name}})
@JsonInclude({{#isMapContainer}}{{#items.isNullable}}content = JsonInclude.Include.ALWAYS, {{/items.isNullable}}{{/isMapContainer}}value = JsonInclude.Include.{{#required}}ALWAYS{{/required}}{{^required}}USE_DEFAULTS{{/required}})
{{#withXml}}
{{^isContainer}}
@JacksonXmlProperty({{#isXmlAttribute}}isAttribute = true, {{/isXmlAttribute}}{{#xmlNamespace}}namespace="{{xmlNamespace}}", {{/xmlNamespace}}localName = "{{#xmlName}}{{xmlName}}{{/xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
{{/isContainer}}
{{#isContainer}}
{{#isXmlWrapped}}
// items.xmlName={{items.xmlName}}
@JacksonXmlElementWrapper(useWrapping = {{isXmlWrapped}}, {{#xmlNamespace}}namespace="{{xmlNamespace}}", {{/xmlNamespace}}localName = "{{#items.xmlName}}{{items.xmlName}}{{/items.xmlName}}{{^items.xmlName}}{{items.baseName}}{{/items.xmlName}}")
{{/isXmlWrapped}}
{{/isContainer}}
{{/withXml}}

View File

@@ -12,6 +12,7 @@ import org.threeten.bp.*;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.openapitools.jackson.nullable.JsonNullableModule;
{{#joda}}
import com.fasterxml.jackson.datatype.joda.JodaModule;
{{/joda}}
@@ -177,6 +178,8 @@ public class ApiClient {
module.addDeserializer(ZonedDateTime.class, CustomInstantDeserializer.ZONED_DATE_TIME);
objectMapper.registerModule(module);
{{/threetenbp}}
JsonNullableModule jnm = new JsonNullableModule();
objectMapper.registerModule(jnm);
return objectMapper;
}

View File

@@ -244,6 +244,11 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{#withXml}}
<!-- XML Support -->
@@ -310,6 +315,7 @@
<feign-version>{{#useFeign10}}10.2.3{{/useFeign10}}{{^useFeign10}}9.7.0{{/useFeign10}}</feign-version>
<feign-form-version>2.1.0</feign-form-version>
<jackson-version>2.9.9</jackson-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
<jackson-databind-version>2.9.9</jackson-databind-version>
{{#threetenbp}}
<jackson-threetenbp-version>2.6.4</jackson-threetenbp-version>

View File

@@ -4,6 +4,7 @@ import {{apiPackage}}.*;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.openapitools.jackson.nullable.JsonNullableModule;
{{#joda}}
import com.fasterxml.jackson.datatype.joda.JodaModule;
{{/joda}}
@@ -53,6 +54,8 @@ public class ApiClient {
module.addDeserializer(ZonedDateTime.class, CustomInstantDeserializer.ZONED_DATE_TIME);
objectMapper.registerModule(module);
{{/threetenbp}}
JsonNullableModule jnm = new JsonNullableModule();
objectMapper.registerModule(jnm);
return objectMapper;
}

View File

@@ -104,8 +104,8 @@ public class {{classname}} {
}
}{{/queryParams}}{{/hasQueryParams}}
String url = uriBuilder{{#hasPathParams}}.buildFromMap(uriVariables).toString();{{/hasPathParams}}{{^hasPathParams}}.build().toString();{{/hasPathParams}}
GenericUrl genericUrl = new GenericUrl(url);
String localVarUrl = uriBuilder{{#hasPathParams}}.buildFromMap(uriVariables).toString();{{/hasPathParams}}{{^hasPathParams}}.build().toString();{{/hasPathParams}}
GenericUrl genericUrl = new GenericUrl(localVarUrl);
HttpContent content = {{#isBodyAllowed}}apiClient.new JacksonJsonHttpContent({{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}){{/isBodyAllowed}}{{^isBodyAllowed}}null{{/isBodyAllowed}};
return apiClient.getHttpRequestFactory().buildRequest(HttpMethods.{{httpMethod}}, genericUrl, content).execute();
@@ -135,8 +135,8 @@ public class {{classname}} {
}
}{{/queryParams}}{{/hasQueryParams}}
String url = uriBuilder{{#hasPathParams}}.buildFromMap(uriVariables).toString();{{/hasPathParams}}{{^hasPathParams}}.build().toString();{{/hasPathParams}}
GenericUrl genericUrl = new GenericUrl(url);
String localVarUrl = uriBuilder{{#hasPathParams}}.buildFromMap(uriVariables).toString();{{/hasPathParams}}{{^hasPathParams}}.build().toString();{{/hasPathParams}}
GenericUrl genericUrl = new GenericUrl(localVarUrl);
HttpContent content = {{#bodyParam}}{{paramName}} == null ?
apiClient.new JacksonJsonHttpContent(null) :
@@ -176,8 +176,8 @@ public class {{classname}} {
}
}
String url = uriBuilder{{#hasPathParams}}.buildFromMap(uriVariables).toString();{{/hasPathParams}}{{^hasPathParams}}.build().toString();{{/hasPathParams}}
GenericUrl genericUrl = new GenericUrl(url);
String localVarUrl = uriBuilder{{#hasPathParams}}.buildFromMap(uriVariables).toString();{{/hasPathParams}}{{^hasPathParams}}.build().toString();{{/hasPathParams}}
GenericUrl genericUrl = new GenericUrl(localVarUrl);
HttpContent content = {{#isBodyAllowed}}apiClient.new JacksonJsonHttpContent({{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}){{/isBodyAllowed}}{{^isBodyAllowed}}null{{/isBodyAllowed}};
return apiClient.getHttpRequestFactory().buildRequest(HttpMethods.{{httpMethod}}, genericUrl, content).execute();

View File

@@ -253,6 +253,11 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{#withXml}}
<!-- XML processing: Jackson -->
<dependency>
@@ -303,6 +308,7 @@
<jersey-common-version>2.25.1</jersey-common-version>
<jackson-version>2.9.9</jackson-version>
<jackson-databind-version>2.9.9</jackson-databind-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
{{#joda}}
<jodatime-version>2.9.9</jodatime-version>
{{/joda}}

View File

@@ -721,6 +721,8 @@ public class ApiClient {
response = invocationBuilder.method("PATCH", entity);
} else if ("HEAD".equals(method)) {
response = invocationBuilder.head();
} else if ("TRACE".equals(method)) {
response = invocationBuilder.trace();
} else {
throw new ApiException(500, "unknown method type " + method);
}

View File

@@ -5,6 +5,7 @@ import org.threeten.bp.*;
{{/threetenbp}}
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import org.openapitools.jackson.nullable.JsonNullableModule;
{{#java8}}
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
{{/java8}}
@@ -45,6 +46,8 @@ public class JSON implements ContextResolver<ObjectMapper> {
module.addDeserializer(ZonedDateTime.class, CustomInstantDeserializer.ZONED_DATE_TIME);
mapper.registerModule(module);
{{/threetenbp}}
JsonNullableModule jnm = new JsonNullableModule();
mapper.registerModule(jnm);
}
/**

View File

@@ -276,6 +276,11 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{#withXml}}
<!-- XML processing: JAXB -->
@@ -357,6 +362,7 @@
{{/supportJava6}}
<jackson-version>2.9.9</jackson-version>
<jackson-databind-version>2.9.9</jackson-databind-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
{{#threetenbp}}
<threetenbp-version>2.6.4</threetenbp-version>
{{/threetenbp}}

View File

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.openapitools.jackson.nullable.JsonNullableModule;
import java.net.URI;
import java.net.URLEncoder;
@@ -151,6 +152,8 @@ public class ApiClient {
mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
mapper.registerModule(new JavaTimeModule());
JsonNullableModule jnm = new JsonNullableModule();
mapper.registerModule(jnm);
URI baseURI = URI.create("{{{basePath}}}");
scheme = baseURI.getScheme();
host = baseURI.getHost();

View File

@@ -0,0 +1 @@
{{^hideGenerationTimestamp}}@javax.annotation.processing.Generated(value = "{{generatorClass}}", date = "{{generatedDate}}"){{/hideGenerationTimestamp}}

View File

@@ -188,6 +188,11 @@
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
<!-- @Nullable annotation -->
<dependency>
@@ -210,6 +215,7 @@
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<jackson-version>2.9.9</jackson-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
<junit-version>4.12</junit-version>
</properties>
</project>

View File

@@ -666,6 +666,8 @@ public class ApiClient {
response = invocationBuilder.header("X-HTTP-Method-Override", "PATCH").post(entity);
} else if ("HEAD".equals(method)) {
response = invocationBuilder.head();
} else if ("TRACE".equals(method)) {
response = invocationBuilder.trace();
} else {
throw new ApiException(500, "unknown method type " + method);
}

View File

@@ -2,6 +2,7 @@ package {{invokerPackage}};
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import org.openapitools.jackson.nullable.JsonNullableModule;
{{#java8}}
import com.fasterxml.jackson.datatype.jsr310.*;
{{/java8}}
@@ -26,6 +27,8 @@ public class JSON implements ContextResolver<ObjectMapper> {
mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
mapper.setDateFormat(new RFC3339DateFormat());
JsonNullableModule jnm = new JsonNullableModule();
mapper.registerModule(jnm);
{{#java8}}
mapper.registerModule(new JavaTimeModule());
{{/java8}}

View File

@@ -212,6 +212,11 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{#withXml}}
<!-- XML processing: Jackson -->
@@ -291,6 +296,7 @@
<resteasy-version>3.1.3.Final</resteasy-version>
<jackson-version>2.9.9</jackson-version>
<jackson-databind-version>2.9.9</jackson-databind-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
<threetenbp-version>2.6.4</threetenbp-version>
{{^java8}}
<jodatime-version>2.9.9</jodatime-version>

View File

@@ -39,6 +39,7 @@ import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.openapitools.jackson.nullable.JsonNullableModule;
{{/threetenbp}}
import java.io.BufferedReader;
@@ -661,6 +662,7 @@ public class ApiClient {
messageConverters.add(new MappingJackson2HttpMessageConverter());
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
xmlMapper.registerModule(new JsonNullableModule());
messageConverters.add(new MappingJackson2XmlHttpMessageConverter(xmlMapper));
RestTemplate restTemplate = new RestTemplate(messageConverters);
@@ -674,6 +676,7 @@ public class ApiClient {
module.addDeserializer(OffsetDateTime.class, CustomInstantDeserializer.OFFSET_DATE_TIME);
module.addDeserializer(ZonedDateTime.class, CustomInstantDeserializer.ZONED_DATE_TIME);
mapper.registerModule(module);
mapper.registerModule(new JsonNullableModule());
}
}
{{/threetenbp}}

View File

@@ -255,6 +255,11 @@
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{#withXml}}
<!-- XML processing: Jackson -->
@@ -306,6 +311,7 @@
<spring-web-version>4.3.9.RELEASE</spring-web-version>
<jackson-version>2.9.9</jackson-version>
<jackson-databind-version>2.9.9</jackson-databind-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
{{#joda}}
<jodatime-version>2.9.9</jodatime-version>
{{/joda}}

View File

@@ -35,6 +35,10 @@ public class CollectionFormats {
}
public static class SPACEParams extends SSVParams {
}
public static class SSVParams extends CSVParams {
public SSVParams() {

View File

@@ -35,6 +35,10 @@ public class CollectionFormats {
}
public static class SPACEParams extends SSVParams {
}
public static class SSVParams extends CSVParams {
public SSVParams() {

View File

@@ -8,6 +8,8 @@ import java.util.*;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.openapitools.jackson.nullable.JsonNullableModule;
import play.libs.Json;
import play.libs.ws.WSClient;
@@ -68,10 +70,14 @@ public class ApiClient {
auth.applyToParams(extraQueryParams, extraHeaders);
}
ObjectMapper mapper = Json.mapper();
JsonNullableModule jnm = new JsonNullableModule();
mapper.registerModule(jnm);
return new Retrofit.Builder()
.baseUrl(basePath)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(JacksonConverterFactory.create(Json.mapper()))
.addConverterFactory(JacksonConverterFactory.create(mapper))
.callFactory(new Play24CallFactory(wsClient, extraHeaders, extraQueryParams))
.addCallAdapterFactory(new Play24CallAdapterFactory())
.build()

View File

@@ -8,6 +8,8 @@ import java.util.*;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.openapitools.jackson.nullable.JsonNullableModule;
import play.libs.Json;
import play.libs.ws.WSClient;
@@ -67,10 +69,14 @@ public class ApiClient {
auth.applyToParams(extraQueryParams, extraHeaders);
}
ObjectMapper mapper = Json.mapper();
JsonNullableModule jnm = new JsonNullableModule();
mapper.registerModule(jnm);
return new Retrofit.Builder()
.baseUrl(basePath)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(JacksonConverterFactory.create(Json.mapper()))
.addConverterFactory(JacksonConverterFactory.create(mapper))
.callFactory(new Play25CallFactory(wsClient, extraHeaders, extraQueryParams))
.addCallAdapterFactory(new Play25CallAdapterFactory())
.build()

View File

@@ -13,6 +13,7 @@ import retrofit2.Converter;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
import org.openapitools.jackson.nullable.JsonNullableModule;
import play.libs.Json;
import play.libs.ws.WSClient;
@@ -89,6 +90,8 @@ public class ApiClient {
}
if (defaultMapper == null) {
defaultMapper = Json.mapper();
JsonNullableModule jnm = new JsonNullableModule();
defaultMapper.registerModule(jnm);
}
return new Retrofit.Builder()

View File

@@ -314,6 +314,11 @@
<artifactId>play-java-ws_2.11</artifactId>
<version>${play-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{/play24}}
{{#play25}}
<dependency>
@@ -321,6 +326,11 @@
<artifactId>play-java-ws_2.11</artifactId>
<version>${play-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{/play25}}
{{#play26}}
<dependency>
@@ -333,6 +343,11 @@
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{/play26}}
{{/usePlayWS}}
{{#parcelableModel}}
@@ -373,6 +388,7 @@
<jackson-version>2.9.9</jackson-version>
<play-version>2.6.7</play-version>
{{/play26}}
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
{{/usePlayWS}}
<retrofit-version>2.5.0</retrofit-version>
{{#useRxJava}}

View File

@@ -14,6 +14,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.openapitools.jackson.nullable.JsonNullableModule;
import io.vertx.core.*;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.file.AsyncFile;
@@ -77,6 +78,8 @@ public class ApiClient {
this.objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
this.objectMapper.registerModule(new JavaTimeModule());
this.objectMapper.setDateFormat(dateFormat);
JsonNullableModule jnm = new JsonNullableModule();
this.objectMapper.registerModule(jnm);
// Setup authentications (key: authentication name, value: authentication).
this.authentications = new HashMap<>();{{#authMethods}}{{#isBasic}}{{#isBasicBasic}}

View File

@@ -243,6 +243,11 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{#joda}}
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
@@ -286,6 +291,7 @@
<swagger-annotations-version>1.5.22</swagger-annotations-version>
<jackson-version>{{^threetenbp}}2.9.9{{/threetenbp}}{{#threetenbp}}2.6.4{{/threetenbp}}</jackson-version>
<jackson-databind>{{^threetenbp}}2.9.9{{/threetenbp}}{{#threetenbp}}2.6.4{{/threetenbp}}</jackson-databind>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
<junit-version>4.12</junit-version>
</properties>
</project>

View File

@@ -3,6 +3,7 @@ package {{invokerPackage}};
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.openapitools.jackson.nullable.JsonNullableModule;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.ParameterizedTypeReference;
@@ -96,6 +97,8 @@ public class ApiClient {
mapper.setDateFormat(dateFormat);
mapper.registerModule(new JavaTimeModule());
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonNullableModule jnm = new JsonNullableModule();
mapper.registerModule(jnm);
this.webClient = buildWebClient(mapper);
this.init();

View File

@@ -105,6 +105,11 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind-version}</version>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>${jackson-databind-nullable-version}</version>
</dependency>
{{#java8}}
<dependency>
@@ -140,6 +145,7 @@
<spring-web-version>5.0.7.RELEASE</spring-web-version>
<jackson-version>2.9.9</jackson-version>
<jackson-databind-version>2.9.9</jackson-databind-version>
<jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
<junit-version>4.12</junit-version>
<reactor-version>3.1.8.RELEASE</reactor-version>
<reactor-netty-version>0.7.8.RELEASE</reactor-netty-version>

View File

@@ -19,21 +19,6 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcela
{{/mostInnerItems}}
{{/isContainer}}
{{/isEnum}}
{{#jackson}}
public static final String JSON_PROPERTY_{{nameInSnakeCase}} = "{{baseName}}";
@JsonProperty(JSON_PROPERTY_{{nameInSnakeCase}})
{{#withXml}}
{{^isContainer}}
@JacksonXmlProperty({{#isXmlAttribute}}isAttribute = true, {{/isXmlAttribute}}{{#xmlNamespace}}namespace="{{xmlNamespace}}", {{/xmlNamespace}}localName = "{{#xmlName}}{{xmlName}}{{/xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
{{/isContainer}}
{{#isContainer}}
{{#isXmlWrapped}}
// items.xmlName={{items.xmlName}}
@JacksonXmlElementWrapper(useWrapping = {{isXmlWrapped}}, {{#xmlNamespace}}namespace="{{xmlNamespace}}", {{/xmlNamespace}}localName = "{{#items.xmlName}}{{items.xmlName}}{{/items.xmlName}}{{^items.xmlName}}{{items.baseName}}{{/items.xmlName}}")
{{/isXmlWrapped}}
{{/isContainer}}
{{/withXml}}
{{/jackson}}
{{#withXml}}
{{#isXmlAttribute}}
@XmlAttribute(name = "{{#xmlName}}{{xmlName}}{{/xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
@@ -56,10 +41,28 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcela
{{/isXmlAttribute}}
{{/withXml}}
{{#gson}}
public static final String SERIALIZED_NAME_{{nameInSnakeCase}} = "{{baseName}}";
@SerializedName(SERIALIZED_NAME_{{nameInSnakeCase}})
public static final String SERIALIZED_NAME_{{vendorExtensions.x-java-const-name}} = "{{baseName}}";
@SerializedName(SERIALIZED_NAME_{{vendorExtensions.x-java-const-name}})
{{/gson}}
{{#jackson}}
public static final String JSON_PROPERTY_{{vendorExtensions.x-java-const-name}} = "{{baseName}}";
{{/jackson}}
{{#vendorExtensions.isJacksonOptionalNullable}}
{{#isContainer}}
private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>undefined();
{{/isContainer}}
{{^isContainer}}
private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>{{#defaultValue}}of({{{.}}}){{/defaultValue}}{{^defaultValue}}undefined(){{/defaultValue}};
{{/isContainer}}
{{/vendorExtensions.isJacksonOptionalNullable}}
{{^vendorExtensions.isJacksonOptionalNullable}}
{{#isContainer}}
private {{{datatypeWithEnum}}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}{{^required}} = null{{/required}};
{{/isContainer}}
{{^isContainer}}
private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
{{/isContainer}}
{{/vendorExtensions.isJacksonOptionalNullable}}
{{/vars}}
{{#parcelableModel}}
@@ -84,14 +87,28 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcela
{{/gson}}
{{/parcelableModel}}
{{#vars}}
{{^isReadOnly}}
public {{classname}} {{name}}({{{datatypeWithEnum}}} {{name}}) {
this.{{name}} = {{name}};
{{#vendorExtensions.isJacksonOptionalNullable}}this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});{{/vendorExtensions.isJacksonOptionalNullable}}
{{^vendorExtensions.isJacksonOptionalNullable}}this.{{name}} = {{name}};{{/vendorExtensions.isJacksonOptionalNullable}}
return this;
}
{{#isListContainer}}
public {{classname}} add{{nameInCamelCase}}Item({{{items.datatypeWithEnum}}} {{name}}Item) {
{{#vendorExtensions.isJacksonOptionalNullable}}
if (this.{{name}} == null || !this.{{name}}.isPresent()) {
this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{{defaultValue}}});
}
try {
this.{{name}}.get().add({{name}}Item);
} catch (java.util.NoSuchElementException e) {
// this can never happen, as we make sure above that the value is present
}
return this;
{{/vendorExtensions.isJacksonOptionalNullable}}
{{^vendorExtensions.isJacksonOptionalNullable}}
{{^required}}
if (this.{{name}} == null) {
this.{{name}} = {{{defaultValue}}};
@@ -99,11 +116,24 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcela
{{/required}}
this.{{name}}.add({{name}}Item);
return this;
{{/vendorExtensions.isJacksonOptionalNullable}}
}
{{/isListContainer}}
{{#isMapContainer}}
public {{classname}} put{{nameInCamelCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) {
{{#vendorExtensions.isJacksonOptionalNullable}}
if (this.{{name}} == null || !this.{{name}}.isPresent()) {
this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{{defaultValue}}});
}
try {
this.{{name}}.get().put(key, {{name}}Item);
} catch (java.util.NoSuchElementException e) {
// this can never happen, as we make sure above that the value is present
}
return this;
{{/vendorExtensions.isJacksonOptionalNullable}}
{{^vendorExtensions.isJacksonOptionalNullable}}
{{^required}}
if (this.{{name}} == null) {
this.{{name}} = {{{defaultValue}}};
@@ -111,6 +141,7 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcela
{{/required}}
this.{{name}}.put(key, {{name}}Item);
return this;
{{/vendorExtensions.isJacksonOptionalNullable}}
}
{{/isMapContainer}}
@@ -142,13 +173,43 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcela
{{#vendorExtensions.extraAnnotation}}
{{{vendorExtensions.extraAnnotation}}}
{{/vendorExtensions.extraAnnotation}}
{{^vendorExtensions.isJacksonOptionalNullable}}{{#jackson}}{{> jackson_annotations}}{{/jackson}}{{/vendorExtensions.isJacksonOptionalNullable}}
public {{{datatypeWithEnum}}} {{getter}}() {
{{#vendorExtensions.isJacksonOptionalNullable}}
{{#isReadOnly}}{{! A readonly attribute doesn't have setter => jackson will set null directly if explicitly returned by API, so make sure we have an empty JsonNullable}}
if ({{name}} == null) {
{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>{{#defaultValue}}of({{{.}}}){{/defaultValue}}{{^defaultValue}}undefined(){{/defaultValue}};
}
{{/isReadOnly}}
return {{name}}.orElse(null);
{{/vendorExtensions.isJacksonOptionalNullable}}
{{^vendorExtensions.isJacksonOptionalNullable}}
return {{name}};
{{/vendorExtensions.isJacksonOptionalNullable}}
}
{{#vendorExtensions.isJacksonOptionalNullable}}
{{> jackson_annotations}}
public JsonNullable<{{{datatypeWithEnum}}}> {{getter}}_JsonNullable() {
return {{name}};
}
{{/vendorExtensions.isJacksonOptionalNullable}}
{{^isReadOnly}}
{{#vendorExtensions.isJacksonOptionalNullable}}
@JsonProperty(JSON_PROPERTY_{{vendorExtensions.x-java-const-name}})
public void {{setter}}_JsonNullable(JsonNullable<{{{datatypeWithEnum}}}> {{name}}) {
this.{{name}} = {{name}};
}
{{/vendorExtensions.isJacksonOptionalNullable}}
public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
{{#vendorExtensions.isJacksonOptionalNullable}}
this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});
{{/vendorExtensions.isJacksonOptionalNullable}}
{{^vendorExtensions.isJacksonOptionalNullable}}
this.{{name}} = {{name}};
{{/vendorExtensions.isJacksonOptionalNullable}}
}
{{/isReadOnly}}

View File

@@ -24,7 +24,7 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali
@SerializedName(SERIALIZED_NAME_{{nameInSnakeCase}})
{{/gson}}
{{#isContainer}}
private {{{datatypeWithEnum}}} {{name}}{{#required}} = {{{defaultValue}}}{{/required}}{{^required}} = null{{/required}};
private {{{datatypeWithEnum}}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}{{^required}} = null{{/required}};
{{/isContainer}}
{{^isContainer}}
private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};

View File

@@ -11,7 +11,7 @@
"fs": false
},
"dependencies": {
"superagent": "3.7.0"
"superagent": "5.1.0"
},
"devDependencies": {
"expect.js": "^0.3.1",

Some files were not shown because too many files have changed in this diff Show More