mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-12-06 10:26:14 +00:00
Compare commits
61 Commits
Nuglif-kot
...
skip-form-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f235f0854 | ||
|
|
d6695056fe | ||
|
|
196c2b1642 | ||
|
|
c6d355e8d4 | ||
|
|
ad589c7700 | ||
|
|
cd0fde41f1 | ||
|
|
8b15d4820e | ||
|
|
1901bf23ea | ||
|
|
78f3b19b58 | ||
|
|
5ee18156db | ||
|
|
14cfca7b06 | ||
|
|
c354bf86ff | ||
|
|
4e15e1a813 | ||
|
|
18df6ed85f | ||
|
|
128d9da8a1 | ||
|
|
75c2e934da | ||
|
|
c614b9d9b1 | ||
|
|
026fa514c3 | ||
|
|
6ea8ff3a17 | ||
|
|
005566c6e3 | ||
|
|
dee536f7f7 | ||
|
|
fbff32c5d7 | ||
|
|
d1808405ca | ||
|
|
3817e40f47 | ||
|
|
270238e060 | ||
|
|
75ac4a2f58 | ||
|
|
acb798b58b | ||
|
|
b1ec110aa3 | ||
|
|
b34a10aee7 | ||
|
|
0192baed42 | ||
|
|
ecb56f1e88 | ||
|
|
1b32088c2d | ||
|
|
4b7a808a9f | ||
|
|
065b48177b | ||
|
|
8608103c9f | ||
|
|
a9301a6c16 | ||
|
|
29f0d22713 | ||
|
|
f3eb07408d | ||
|
|
4418b59b47 | ||
|
|
616e8df8d0 | ||
|
|
74cd73bd6c | ||
|
|
c510ea4b3d | ||
|
|
09704951f0 | ||
|
|
47a85e880b | ||
|
|
b59719a6ea | ||
|
|
dad677f63d | ||
|
|
6434c86afd | ||
|
|
ebc9bcda44 | ||
|
|
69c3f567ce | ||
|
|
8c2de11ac2 | ||
|
|
a2177570b3 | ||
|
|
40731ed52d | ||
|
|
c0abeceb85 | ||
|
|
c74ed98282 | ||
|
|
71b33db7ee | ||
|
|
07a5920b2f | ||
|
|
72da3b2c76 | ||
|
|
5954daea18 | ||
|
|
4a1c70f2f1 | ||
|
|
e73143d777 | ||
|
|
a0350c6533 |
2
.github/workflows/docker.yaml
vendored
2
.github/workflows/docker.yaml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Test run-in-docker.sh
|
||||
shell: bash
|
||||
|
||||
2
.github/workflows/gradle-plugin-tests.yaml
vendored
2
.github/workflows/gradle-plugin-tests.yaml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
name: Gradle plugin tests
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
|
||||
2
.github/workflows/gradle-test.yaml
vendored
2
.github/workflows/gradle-test.yaml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
- samples/client/petstore/java/okhttp-gson-group-parameter
|
||||
- samples/client/petstore/java/webclient-swagger2
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
4
.github/workflows/linux.yaml
vendored
4
.github/workflows/linux.yaml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
os: [ubuntu-latest]
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up JDK ${{ matrix.java }}
|
||||
uses: actions/setup-java@v3
|
||||
@@ -85,7 +85,7 @@ jobs:
|
||||
os: [ubuntu-latest]
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup Maven
|
||||
uses: s4u/setup-maven-action@v1.9.0
|
||||
with:
|
||||
|
||||
2
.github/workflows/maven-plugin-tests.yaml
vendored
2
.github/workflows/maven-plugin-tests.yaml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
name: Maven plugin tests
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
|
||||
2
.github/workflows/misc-test.yaml
vendored
2
.github/workflows/misc-test.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
name: Misc tests
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '2.6'
|
||||
|
||||
8
.github/workflows/openapi-generator.yaml
vendored
8
.github/workflows/openapi-generator.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
needs:
|
||||
- build
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
@@ -90,7 +90,7 @@ jobs:
|
||||
needs:
|
||||
- build
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
@@ -129,7 +129,7 @@ jobs:
|
||||
- build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
name: Build c libcurl client
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Prepare
|
||||
run: |
|
||||
sudo apt-get update
|
||||
|
||||
2
.github/workflows/samples-cpp-qt-client.yaml
vendored
2
.github/workflows/samples-cpp-qt-client.yaml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
tools: 'tools_openssl_x64'
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
version: ${{ matrix.qt-version }}
|
||||
|
||||
2
.github/workflows/samples-dart.yaml
vendored
2
.github/workflows/samples-dart.yaml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
name: Tests Dart
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
# clients
|
||||
- samples/client/petstore/csharp/OpenAPIClient-generichost-netstandard2.0
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-dotnet@v3.2.0
|
||||
with:
|
||||
dotnet-version: 3.1.*
|
||||
|
||||
2
.github/workflows/samples-dotnet.yaml
vendored
2
.github/workflows/samples-dotnet.yaml
vendored
@@ -42,7 +42,7 @@ jobs:
|
||||
- samples/server/petstore/aspnetcore-6.0-NewtonsoftFalse
|
||||
- samples/server/petstore/aspnetcore-6.0-nullableReferenceTypes
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-dotnet@v3.2.0
|
||||
with:
|
||||
dotnet-version: '7.0.x'
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
# clients
|
||||
- samples/client/echo_api/csharp-restsharp/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-dotnet@v3.2.0
|
||||
with:
|
||||
dotnet-version: '6.0.x'
|
||||
|
||||
@@ -72,7 +72,7 @@ jobs:
|
||||
# build C# API client (property, parameter name mappings)
|
||||
- samples/client/petstore/csharp-restsharp-name-parameter-mappings
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-dotnet@v3.2.0
|
||||
with:
|
||||
dotnet-version: '6.0.x'
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
- samples/server/petstore/aspnetcore-6.0-NewtonsoftFalse
|
||||
- samples/server/petstore/aspnetcore-6.0-nullableReferenceTypes
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-dotnet@v3.2.0
|
||||
with:
|
||||
dotnet-version: '6.0.x'
|
||||
|
||||
2
.github/workflows/samples-elm.yaml
vendored
2
.github/workflows/samples-elm.yaml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
- samples/client/petstore/elm
|
||||
- samples/openapi3/client/elm
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: jorelali/setup-elm@v5
|
||||
with:
|
||||
elm-version: 0.19.1
|
||||
|
||||
2
.github/workflows/samples-erlang.yaml
vendored
2
.github/workflows/samples-erlang.yaml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
- samples/client/petstore/erlang-client/
|
||||
- samples/client/petstore/erlang-proper/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: '22.2'
|
||||
|
||||
2
.github/workflows/samples-go.yaml
vendored
2
.github/workflows/samples-go.yaml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
- samples/server/petstore/go-api-server/
|
||||
- samples/server/petstore/go-chi-server/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: "stable"
|
||||
|
||||
2
.github/workflows/samples-groovy.yaml
vendored
2
.github/workflows/samples-groovy.yaml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
sample:
|
||||
- samples/client/petstore/groovy
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-haskell.yaml
vendored
2
.github/workflows/samples-haskell.yaml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
- samples/server/petstore/haskell-servant/
|
||||
- samples/client/petstore/haskell-http-client/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: haskell/actions/setup@v2
|
||||
with:
|
||||
# ghc-version: '8.8.4' # Exact version of ghc to use
|
||||
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
- samples/client/echo_api/java/native
|
||||
- samples/client/echo_api/java/feign-gson
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
- samples/client/echo_api/java/feign-gson
|
||||
- samples/client/echo_api/java/okhttp-gson
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
@@ -43,7 +43,6 @@ jobs:
|
||||
- samples/client/petstore/java/webclient-swagger2
|
||||
- samples/client/petstore/java/vertx
|
||||
- samples/client/petstore/java/jersey2-java8-localdatetime
|
||||
- samples/client/petstore/java/resteasy
|
||||
- samples/client/petstore/java/google-api-client
|
||||
- samples/client/petstore/java/rest-assured
|
||||
- samples/client/petstore/java/rest-assured-jackson
|
||||
@@ -63,7 +62,7 @@ jobs:
|
||||
- samples/client/petstore/java/resttemplate-swagger2/
|
||||
- samples/openapi3/client/petstore/java/jersey2-java8-swagger2/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
@@ -78,4 +77,4 @@ jobs:
|
||||
key: ${{ runner.os }}-${{ github.job }}-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }}
|
||||
- name: Build
|
||||
working-directory: ${{ matrix.sample }}
|
||||
run: mvn clean package
|
||||
run: mvn clean package
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
- samples/client/petstore/java/resttemplate-jakarta
|
||||
- samples/client/petstore/java/webclient-jakarta
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-java-helidon.yaml
vendored
2
.github/workflows/samples-java-helidon.yaml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
- samples/server/petstore/java-helidon-server/se
|
||||
version: [17]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
- samples/server/petstore/java-play-framework-no-swagger-ui
|
||||
- samples/server/petstore/java-play-framework-no-wrap-calls
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
- samples/server/petstore/java-pkmst/
|
||||
- samples/server/petstore/java-undertow/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-jaxrs.yaml
vendored
2
.github/workflows/samples-jaxrs.yaml
vendored
@@ -40,7 +40,7 @@ jobs:
|
||||
- samples/server/petstore/jaxrs-cxf-non-spring-app
|
||||
- samples/server/petstore/jaxrs-spec-microprofile-openapi-annotations
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-jdk17.yaml
vendored
2
.github/workflows/samples-jdk17.yaml
vendored
@@ -45,7 +45,7 @@ jobs:
|
||||
- samples/client/petstore/spring-http-interface-reactive
|
||||
- samples/client/petstore/spring-http-interface
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-julia.yaml
vendored
2
.github/workflows/samples-julia.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
name: Tests Julia
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: julia-actions/setup-julia@v1
|
||||
with:
|
||||
version: 1.8
|
||||
|
||||
2
.github/workflows/samples-kotlin-client.yaml
vendored
2
.github/workflows/samples-kotlin-client.yaml
vendored
@@ -65,7 +65,7 @@ jobs:
|
||||
- samples/client/petstore/kotlin-name-parameter-mappings
|
||||
- samples/client/others/kotlin-jvm-okhttp-parameter-tests
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
# comment out due to gradle build failure
|
||||
# - samples/server/petstore/kotlin-spring-default/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-kotlin-server.yaml
vendored
2
.github/workflows/samples-kotlin-server.yaml
vendored
@@ -43,7 +43,7 @@ jobs:
|
||||
# no build.gradle file
|
||||
#- samples/server/petstore/kotlin-vertx-modelMutable
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-php7.yaml
vendored
2
.github/workflows/samples-php7.yaml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
# servers
|
||||
- samples/server/petstore/php-laravel/lib/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup PHP with tools
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
|
||||
2
.github/workflows/samples-php8.yaml
vendored
2
.github/workflows/samples-php8.yaml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
# servers
|
||||
- samples/server/petstore/php-symfony/SymfonyBundle-php/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup PHP with tools
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
# clients
|
||||
- samples/client/echo_api/python
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.7'
|
||||
|
||||
2
.github/workflows/samples-python-server.yaml
vendored
2
.github/workflows/samples-python-server.yaml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
# servers
|
||||
- samples/server/petstore/python-aiohttp/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.7'
|
||||
|
||||
2
.github/workflows/samples-rust.yaml
vendored
2
.github/workflows/samples-rust.yaml
vendored
@@ -25,7 +25,7 @@ jobs:
|
||||
- samples/client/petstore/rust/
|
||||
- samples/server/petstore/rust-server/
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
toolchain: stable
|
||||
|
||||
2
.github/workflows/samples-scala.yaml
vendored
2
.github/workflows/samples-scala.yaml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
- samples/server/petstore/scalatra
|
||||
- samples/server/petstore/scala-finch # cannot be tested with jdk11
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-spring-jdk17.yaml
vendored
2
.github/workflows/samples-spring-jdk17.yaml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
# clients
|
||||
- samples/openapi3/client/petstore/spring-cloud-3-with-optional
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
9
.github/workflows/samples-spring.yaml
vendored
9
.github/workflows/samples-spring.yaml
vendored
@@ -3,10 +3,16 @@ name: Samples Java Spring
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
# clients
|
||||
- 'samples/client/petstore/spring*/**'
|
||||
# servers
|
||||
- 'samples/server/petstore/spring*/**'
|
||||
- 'samples/openapi3/server/petstore/spring*/**'
|
||||
pull_request:
|
||||
paths:
|
||||
# clients
|
||||
- 'samples/client/petstore/spring*/**'
|
||||
# servers
|
||||
- 'samples/server/petstore/spring*/**'
|
||||
- 'samples/openapi3/server/petstore/spring*/**'
|
||||
jobs:
|
||||
@@ -27,6 +33,7 @@ jobs:
|
||||
- samples/openapi3/client/petstore/spring-cloud-async
|
||||
- samples/openapi3/client/petstore/spring-cloud-spring-pageable
|
||||
- samples/client/petstore/spring-cloud-tags
|
||||
- samples/client/petstore/spring-cloud-deprecated
|
||||
# servers
|
||||
- samples/server/petstore/springboot
|
||||
- samples/openapi3/server/petstore/springboot
|
||||
@@ -49,7 +56,7 @@ jobs:
|
||||
- samples/server/petstore/springboot-spring-pageable-without-j8
|
||||
- samples/server/petstore/springboot-spring-pageable
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
|
||||
2
.github/workflows/samples-swift.yaml
vendored
2
.github/workflows/samples-swift.yaml
vendored
@@ -40,7 +40,7 @@ jobs:
|
||||
name: Build Swift samples
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: swift-actions/setup-swift@v1
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
with:
|
||||
|
||||
2
.github/workflows/samples-zapier.yaml
vendored
2
.github/workflows/samples-zapier.yaml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
sample:
|
||||
- samples/client/petstore/zapier
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup node
|
||||
uses: actions/setup-node@v3
|
||||
- name: Install dependencies
|
||||
|
||||
2
.github/workflows/sonar.yml
vendored
2
.github/workflows/sonar.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.repository_owner == 'OpenAPITools' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
|
||||
2
.github/workflows/windows.yaml
vendored
2
.github/workflows/windows.yaml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
matrix:
|
||||
java: [11, 17]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK ${{ matrix.java }}
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -89,6 +89,7 @@ samples/client/petstore/cpp-restsdk/cmake_install.cmake
|
||||
**/.gradle
|
||||
samples/client/petstore/java/hello.txt
|
||||
samples/client/petstore/java/okhttp-gson/hello.txt
|
||||
samples/client/petstore/java/okhttp-gson-3.1/hello.txt
|
||||
samples/client/petstore/java/jersey1/hello.txt
|
||||
samples/client/petstore/java/jersey2-java8/hello.txt
|
||||
samples/client/petstore/java/jersey2/hello.txt
|
||||
@@ -183,6 +184,7 @@ samples/client/petstore/python-asyncio/.pytest_cache/
|
||||
|
||||
# PHP
|
||||
samples/client/petstore/php/OpenAPIClient-php/composer.lock
|
||||
samples/client/petstore/php-nextgen/OpenAPIClient-php/composer.lock
|
||||
samples/client/petstore/php-dt/composer.lock
|
||||
samples/client/petstore/php-dt-modern/composer.lock
|
||||
samples/openapi3/server/petstore/php-symfony/SymfonyBundle-php/composer.lock
|
||||
|
||||
@@ -1168,7 +1168,7 @@ If you want to join the committee, please kindly apply by sending an email to te
|
||||
| Perl | @wing328 (2017/07) [:heart:](https://www.patreon.com/wing328) @yue9944882 (2019/06) |
|
||||
| PHP | @jebentier (2017/07), @dkarlovi (2017/07), @mandrean (2017/08), @jfastnacht (2017/09), [@ybelenko](https://github.com/ybelenko) (2018/07), @renepardon (2018/12) |
|
||||
| PowerShell | @wing328 (2020/05) |
|
||||
| Python | @spacether (2019/11) [:heart:][spacether sponsorship] @krjakbrjak (2023/02) |
|
||||
| Python | @krjakbrjak (2023/02) |
|
||||
| R | @Ramanth (2019/07) @saigiridhar21 (2019/07) |
|
||||
| Ruby | @cliffano (2017/07) @zlx (2017/09) @autopp (2019/02) |
|
||||
| Rust | @frol (2017/07) @farcaller (2017/08) @richardwhiuk (2019/07) @paladinzh (2020/05) @jacob-pro (2022/10) |
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# for csharp generichost
|
||||
generatorName: csharp
|
||||
outputDir: samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt-useSourceGeneration
|
||||
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml
|
||||
library: generichost
|
||||
templateDir: modules/openapi-generator/src/main/resources/csharp
|
||||
additionalProperties:
|
||||
packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}'
|
||||
useCompareNetObjects: true
|
||||
disallowAdditionalPropertiesIfNotPresent: false
|
||||
useSourceGeneration: true
|
||||
packageName: UseSourceGeneration
|
||||
16
bin/configs/java-okhttp-gson-3.1.yaml
Normal file
16
bin/configs/java-okhttp-gson-3.1.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
generatorName: java
|
||||
outputDir: samples/client/petstore/java/okhttp-gson-3.1
|
||||
library: okhttp-gson
|
||||
inputSpec: modules/openapi-generator/src/test/resources/3_1/java/petstore.yaml
|
||||
templateDir: modules/openapi-generator/src/main/resources/Java
|
||||
nameMappings:
|
||||
_type: underscoreType
|
||||
type_: typeWithUnderscore
|
||||
parameterNameMappings:
|
||||
_type: underscoreType
|
||||
type_: typeWithUnderscore
|
||||
additionalProperties:
|
||||
artifactId: petstore-okhttp-gson-31
|
||||
hideGenerationTimestamp: "true"
|
||||
useOneOfDiscriminatorLookup: "true"
|
||||
disallowAdditionalPropertiesIfNotPresent: false
|
||||
@@ -4,3 +4,5 @@ inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
|
||||
templateDir: modules/openapi-generator/src/main/resources/lua
|
||||
additionalProperties:
|
||||
packageName: petstore
|
||||
nameMappings:
|
||||
phone: mobile
|
||||
|
||||
@@ -4,3 +4,7 @@ inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-fake-e
|
||||
templateDir: modules/openapi-generator/src/main/resources/perl
|
||||
additionalProperties:
|
||||
hideGenerationTimestamp: "true"
|
||||
nameMappings:
|
||||
NullableMessage: system_message
|
||||
modelNameMappings:
|
||||
DeprecatedObject: DeprecatedModel
|
||||
|
||||
4
bin/configs/php-nextgen.yaml
Normal file
4
bin/configs/php-nextgen.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
generatorName: php-nextgen
|
||||
outputDir: samples/client/petstore/php-nextgen/OpenAPIClient-php
|
||||
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-fake-endpoints-models-for-testing.yaml
|
||||
templateDir: modules/openapi-generator/src/main/resources/php-nextgen
|
||||
@@ -14,3 +14,7 @@ additionalProperties:
|
||||
projectUri: https://github.com/OpenAPITools/openapi-generator
|
||||
releaseNotes: 'This is a sample project'
|
||||
tags: 'PetStore,powershell,sdk'
|
||||
nameMappings:
|
||||
name_mapping: SomethingElse
|
||||
modelNameMappings:
|
||||
model-mapping: NewModel
|
||||
|
||||
13
bin/configs/spring-cloud-deprecated-oas3.yaml
Normal file
13
bin/configs/spring-cloud-deprecated-oas3.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
generatorName: spring
|
||||
library: spring-cloud
|
||||
outputDir: samples/client/petstore/spring-cloud-deprecated
|
||||
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-deprecated-fields.yaml
|
||||
templateDir: modules/openapi-generator/src/main/resources/JavaSpring
|
||||
additionalProperties:
|
||||
groupId: org.openapitools.openapi3
|
||||
documentationProvider: springdoc
|
||||
artifactId: spring-cloud-deprecated
|
||||
interfaceOnly: "true"
|
||||
singleContentTypes: "true"
|
||||
hideGenerationTimestamp: "true"
|
||||
useTags: "true"
|
||||
@@ -50,6 +50,7 @@ The following generators are available:
|
||||
* [perl](generators/perl.md)
|
||||
* [php](generators/php.md)
|
||||
* [php-dt (beta)](generators/php-dt.md)
|
||||
* [php-nextgen (beta)](generators/php-nextgen.md)
|
||||
* [powershell (beta)](generators/powershell.md)
|
||||
* [python](generators/python.md)
|
||||
* [r](generators/r.md)
|
||||
|
||||
@@ -49,6 +49,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|
||||
|useCollection|Deserialize array types to Collection<T> instead of List<T>.| |false|
|
||||
|useDateTimeOffset|Use DateTimeOffset to model date-time properties| |false|
|
||||
|useOneOfDiscriminatorLookup|Use the discriminator's mapping in oneOf to speed up the model lookup. IMPORTANT: Validation (e.g. one and only one match in oneOf's schemas) will be skipped.| |false|
|
||||
|useSourceGeneration|Use source generation where available (only `generichost` library supports this option).| |false|
|
||||
|validatable|Generates self-validatable models.| |true|
|
||||
|zeroBasedEnums|Enumerations with string values will start from 0 when true, 1 when false. If not set, enumerations with string values will start from 0 if the first value is 'unknown', case insensitive.| |null|
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|
||||
|interfaceOnly|Whether to generate only API interface stubs without the server files. This option is currently supported only when using jaxrs-spec library.| |false|
|
||||
|library|library template (sub-template)|<dl><dt>**ktor**</dt><dd>ktor framework</dd><dt>**jaxrs-spec**</dt><dd>JAX-RS spec only</dd></dl>|ktor|
|
||||
|modelMutable|Create mutable models| |false|
|
||||
|omitGradleWrapper|Whether to omit Gradle wrapper for creating a sub project.| |false|
|
||||
|packageName|Generated artifact package name.| |org.openapitools.server|
|
||||
|parcelizeModels|toggle "@Parcelize" for generated models| |null|
|
||||
|returnResponse|Whether generate API interface should return javax.ws.rs.core.Response instead of a deserialized entity. Only useful if interfaceOnly is true. This option is currently supported only when using jaxrs-spec library.| |false|
|
||||
|
||||
269
docs/generators/php-nextgen.md
Normal file
269
docs/generators/php-nextgen.md
Normal file
@@ -0,0 +1,269 @@
|
||||
---
|
||||
title: Documentation for the php-nextgen Generator
|
||||
---
|
||||
|
||||
## METADATA
|
||||
|
||||
| Property | Value | Notes |
|
||||
| -------- | ----- | ----- |
|
||||
| generator name | php-nextgen | pass this to the generate command after -g |
|
||||
| generator stability | BETA | |
|
||||
| generator type | CLIENT | |
|
||||
| generator language | PHP | |
|
||||
| generator default templating engine | mustache | |
|
||||
| helpTxt | Generates a PHP client library (beta). | |
|
||||
|
||||
## CONFIG OPTIONS
|
||||
These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details.
|
||||
|
||||
| Option | Description | Values | Default |
|
||||
| ------ | ----------- | ------ | ------- |
|
||||
|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false|
|
||||
|apiPackage|package for generated api classes| |null|
|
||||
|artifactUrl|artifact URL in generated pom.xml| |null|
|
||||
|artifactVersion|The version to use in the composer package version field. e.g. 1.2.3| |null|
|
||||
|composerPackageName|The name to use in the composer package name field. e.g. `vendor/project` (must be lowercase and consist of words separated by `-`, `.` or `_`).| |null|
|
||||
|developerOrganization|developer organization in generated pom.xml| |null|
|
||||
|developerOrganizationUrl|developer organization URL in generated pom.xml| |null|
|
||||
|disallowAdditionalPropertiesIfNotPresent|If false, the 'additionalProperties' implementation (set to true by default) is compliant with the OAS and JSON schema specifications. If true (default), keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.|<dl><dt>**false**</dt><dd>The 'additionalProperties' implementation is compliant with the OAS and JSON schema specifications.</dd><dt>**true**</dt><dd>Keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.</dd></dl>|true|
|
||||
|ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true|
|
||||
|enumUnknownDefaultCase|If the server adds new enum cases, that are unknown by an old spec/client, the client will fail to parse the network response.With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the server sends an enum case that is not known by the client/spec, they can safely fallback to this case.|<dl><dt>**false**</dt><dd>No changes to the enum's are made, this is the default option.</dd><dt>**true**</dt><dd>With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the enum case sent by the server is not known by the client/spec, can safely be decoded to this case.</dd></dl>|false|
|
||||
|hideGenerationTimestamp|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |true|
|
||||
|invokerPackage|The main namespace to use for all classes. e.g. Yay\Pets| |null|
|
||||
|legacyDiscriminatorBehavior|Set to false for generators with better support for discriminators. (Python, Java, Go, PowerShell, C# have this enabled by default).|<dl><dt>**true**</dt><dd>The mapping in the discriminator includes descendent schemas that allOf inherit from self and the discriminator mapping schemas in the OAS document.</dd><dt>**false**</dt><dd>The mapping in the discriminator includes any descendent schemas that allOf inherit from self, any oneOf schemas, any anyOf schemas, any x-discriminator-values, and the discriminator mapping schemas in the OAS document AND Codegen validates that oneOf and anyOf schemas contain the required discriminator and throws an error if the discriminator is missing.</dd></dl>|true|
|
||||
|licenseName|The name of the license| |null|
|
||||
|modelPackage|package for generated models| |null|
|
||||
|packageName|The main package name for classes. e.g. GeneratedPetstore| |null|
|
||||
|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false|
|
||||
|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true|
|
||||
|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true|
|
||||
|srcBasePath|The directory to serve as source root.| |null|
|
||||
|variableNamingConvention|naming convention of variable name, e.g. camelCase.| |snake_case|
|
||||
|
||||
## IMPORT MAPPING
|
||||
|
||||
| Type/Alias | Imports |
|
||||
| ---------- | ------- |
|
||||
|
||||
|
||||
## INSTANTIATION TYPES
|
||||
|
||||
| Type/Alias | Instantiated By |
|
||||
| ---------- | --------------- |
|
||||
|array|array|
|
||||
|map|array|
|
||||
|
||||
|
||||
## LANGUAGE PRIMITIVES
|
||||
|
||||
<ul class="column-ul">
|
||||
<li>\DateTime</li>
|
||||
<li>\SplFileObject</li>
|
||||
<li>array</li>
|
||||
<li>bool</li>
|
||||
<li>boolean</li>
|
||||
<li>byte</li>
|
||||
<li>float</li>
|
||||
<li>int</li>
|
||||
<li>integer</li>
|
||||
<li>mixed</li>
|
||||
<li>number</li>
|
||||
<li>object</li>
|
||||
<li>string</li>
|
||||
<li>void</li>
|
||||
</ul>
|
||||
|
||||
## RESERVED WORDS
|
||||
|
||||
<ul class="column-ul">
|
||||
<li>__halt_compiler</li>
|
||||
<li>_header_accept</li>
|
||||
<li>_tempbody</li>
|
||||
<li>abstract</li>
|
||||
<li>and</li>
|
||||
<li>array</li>
|
||||
<li>as</li>
|
||||
<li>break</li>
|
||||
<li>callable</li>
|
||||
<li>case</li>
|
||||
<li>catch</li>
|
||||
<li>class</li>
|
||||
<li>clone</li>
|
||||
<li>const</li>
|
||||
<li>continue</li>
|
||||
<li>declare</li>
|
||||
<li>default</li>
|
||||
<li>die</li>
|
||||
<li>do</li>
|
||||
<li>echo</li>
|
||||
<li>else</li>
|
||||
<li>elseif</li>
|
||||
<li>empty</li>
|
||||
<li>enddeclare</li>
|
||||
<li>endfor</li>
|
||||
<li>endforeach</li>
|
||||
<li>endif</li>
|
||||
<li>endswitch</li>
|
||||
<li>endwhile</li>
|
||||
<li>eval</li>
|
||||
<li>exit</li>
|
||||
<li>extends</li>
|
||||
<li>final</li>
|
||||
<li>for</li>
|
||||
<li>foreach</li>
|
||||
<li>formparams</li>
|
||||
<li>function</li>
|
||||
<li>global</li>
|
||||
<li>goto</li>
|
||||
<li>headerparams</li>
|
||||
<li>httpbody</li>
|
||||
<li>if</li>
|
||||
<li>implements</li>
|
||||
<li>include</li>
|
||||
<li>include_once</li>
|
||||
<li>instanceof</li>
|
||||
<li>insteadof</li>
|
||||
<li>interface</li>
|
||||
<li>isset</li>
|
||||
<li>list</li>
|
||||
<li>namespace</li>
|
||||
<li>new</li>
|
||||
<li>or</li>
|
||||
<li>print</li>
|
||||
<li>private</li>
|
||||
<li>protected</li>
|
||||
<li>public</li>
|
||||
<li>queryparams</li>
|
||||
<li>require</li>
|
||||
<li>require_once</li>
|
||||
<li>resourcepath</li>
|
||||
<li>return</li>
|
||||
<li>static</li>
|
||||
<li>switch</li>
|
||||
<li>throw</li>
|
||||
<li>trait</li>
|
||||
<li>try</li>
|
||||
<li>unset</li>
|
||||
<li>use</li>
|
||||
<li>var</li>
|
||||
<li>while</li>
|
||||
<li>xor</li>
|
||||
</ul>
|
||||
|
||||
## FEATURE SET
|
||||
|
||||
|
||||
### Client Modification Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|BasePath|✗|ToolingExtension
|
||||
|Authorizations|✗|ToolingExtension
|
||||
|UserAgent|✗|ToolingExtension
|
||||
|MockServer|✗|ToolingExtension
|
||||
|
||||
### Data Type Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Custom|✗|OAS2,OAS3
|
||||
|Int32|✓|OAS2,OAS3
|
||||
|Int64|✓|OAS2,OAS3
|
||||
|Float|✓|OAS2,OAS3
|
||||
|Double|✓|OAS2,OAS3
|
||||
|Decimal|✓|ToolingExtension
|
||||
|String|✓|OAS2,OAS3
|
||||
|Byte|✓|OAS2,OAS3
|
||||
|Binary|✓|OAS2,OAS3
|
||||
|Boolean|✓|OAS2,OAS3
|
||||
|Date|✓|OAS2,OAS3
|
||||
|DateTime|✓|OAS2,OAS3
|
||||
|Password|✓|OAS2,OAS3
|
||||
|File|✓|OAS2
|
||||
|Uuid|✗|
|
||||
|Array|✓|OAS2,OAS3
|
||||
|Null|✗|OAS3
|
||||
|AnyType|✗|OAS2,OAS3
|
||||
|Object|✓|OAS2,OAS3
|
||||
|Maps|✓|ToolingExtension
|
||||
|CollectionFormat|✓|OAS2
|
||||
|CollectionFormatMulti|✓|OAS2
|
||||
|Enum|✓|OAS2,OAS3
|
||||
|ArrayOfEnum|✓|ToolingExtension
|
||||
|ArrayOfModel|✓|ToolingExtension
|
||||
|ArrayOfCollectionOfPrimitives|✓|ToolingExtension
|
||||
|ArrayOfCollectionOfModel|✓|ToolingExtension
|
||||
|ArrayOfCollectionOfEnum|✓|ToolingExtension
|
||||
|MapOfEnum|✓|ToolingExtension
|
||||
|MapOfModel|✓|ToolingExtension
|
||||
|MapOfCollectionOfPrimitives|✓|ToolingExtension
|
||||
|MapOfCollectionOfModel|✓|ToolingExtension
|
||||
|MapOfCollectionOfEnum|✓|ToolingExtension
|
||||
|
||||
### Documentation Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Readme|✓|ToolingExtension
|
||||
|Model|✓|ToolingExtension
|
||||
|Api|✓|ToolingExtension
|
||||
|
||||
### Global Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Host|✓|OAS2,OAS3
|
||||
|BasePath|✓|OAS2,OAS3
|
||||
|Info|✓|OAS2,OAS3
|
||||
|Schemes|✗|OAS2,OAS3
|
||||
|PartialSchemes|✓|OAS2,OAS3
|
||||
|Consumes|✓|OAS2
|
||||
|Produces|✓|OAS2
|
||||
|ExternalDocumentation|✓|OAS2,OAS3
|
||||
|Examples|✓|OAS2,OAS3
|
||||
|XMLStructureDefinitions|✗|OAS2,OAS3
|
||||
|MultiServer|✗|OAS3
|
||||
|ParameterizedServer|✗|OAS3
|
||||
|ParameterStyling|✗|OAS3
|
||||
|Callbacks|✗|OAS3
|
||||
|LinkObjects|✗|OAS3
|
||||
|
||||
### Parameter Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Path|✓|OAS2,OAS3
|
||||
|Query|✓|OAS2,OAS3
|
||||
|Header|✓|OAS2,OAS3
|
||||
|Body|✓|OAS2
|
||||
|FormUnencoded|✓|OAS2
|
||||
|FormMultipart|✓|OAS2
|
||||
|Cookie|✓|OAS3
|
||||
|
||||
### Schema Support Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|Simple|✓|OAS2,OAS3
|
||||
|Composite|✓|OAS2,OAS3
|
||||
|Polymorphism|✗|OAS2,OAS3
|
||||
|Union|✗|OAS3
|
||||
|allOf|✗|OAS2,OAS3
|
||||
|anyOf|✗|OAS3
|
||||
|oneOf|✗|OAS3
|
||||
|not|✗|OAS3
|
||||
|
||||
### Security Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|BasicAuth|✗|OAS2,OAS3
|
||||
|ApiKey|✗|OAS2,OAS3
|
||||
|OpenIDConnect|✗|OAS3
|
||||
|BearerToken|✗|OAS3
|
||||
|OAuth2_Implicit|✗|OAS2,OAS3
|
||||
|OAuth2_Password|✗|OAS2,OAS3
|
||||
|OAuth2_ClientCredentials|✗|OAS2,OAS3
|
||||
|OAuth2_AuthorizationCode|✗|OAS2,OAS3
|
||||
|SignatureAuth|✗|OAS3
|
||||
|
||||
### Wire Format Feature
|
||||
| Name | Supported | Defined By |
|
||||
| ---- | --------- | ---------- |
|
||||
|JSON|✓|OAS2,OAS3
|
||||
|XML|✓|OAS2,OAS3
|
||||
|PROTOBUF|✗|ToolingExtension
|
||||
|Custom|✗|OAS2,OAS3
|
||||
@@ -14,9 +14,9 @@ title: Global Properties
|
||||
| verbose | Defines the verbosity | `true` or `false` |
|
||||
| generateAliasAsModel | Defines whether primitive types defined at the model/schema level will be wrapped in a model | `true` or `false` |
|
||||
| org.openapitools.codegen.utils.oncelogger.enabled | Enable/disable the "OnceLogger" which reduces noise for select repeated logs | `true` or `false` |
|
||||
| supportingFiles | Allows the user to define which supporting files will be generated. Prefer using the more robust `.openapi-generator-ignore`. | no value, or a comma-separated string of file names |
|
||||
| models | Allows the user to define which models will be generated. Prefer using the more robust `.openapi-generator-ignore`. | no value, or a comma-separated string of model names |
|
||||
| apis | Allows the user to define which apis will be generated. Prefer using the more robust `.openapi-generator-ignore`. | no value, or a comma-separated string of api names |
|
||||
| supportingFiles | Allows the user to define which supporting files will be generated. Prefer using the more robust `.openapi-generator-ignore`. | no value, or a colon-separated string of file names |
|
||||
| models | Allows the user to define which models will be generated. Prefer using the more robust `.openapi-generator-ignore`. | no value, or a colon-separated string of model names |
|
||||
| apis | Allows the user to define which apis will be generated. Prefer using the more robust `.openapi-generator-ignore`. | no value, or a colon-separated string of api names |
|
||||
| apiDocs | Allows the user to define if api docs will be generated. Prefer using the more robust `.openapi-generator-ignore`. | `true` or `false` |
|
||||
| modelDocs | Allows the user to define if model docs will be generated. Prefer using the more robust `.openapi-generator-ignore`. | `true` or `false` |
|
||||
| apiTests | Allows the user to define if api tests will be generated. Prefer using the more robust `.openapi-generator-ignore`. | `true` or `false` |
|
||||
@@ -40,4 +40,4 @@ and
|
||||
java {jar} generate {opts} --global-property=models
|
||||
```
|
||||
|
||||
Why the two differing ways to provide the same properties? We previously accepted a `-D` tooling option which resembled Java System Property declaration. In older versions of OpenAPI Generator, the option modified the SystemProperties collection directly and was truly a "system property". This option changed during the 4.x release in an effort to make OpenAPI Generator thread-safe and isolate its configuration via thread locals. We no longer mutate System Properties. In the 4.x release and earlier, specifying the tooling `-D` option with system properties intended for other tools like swagger-parser rather than passing them as true Java System Properties would lead to unexpected behavior for the user; if our tool set the system property _after_ invoking certain code, it would seem to the user like Java System Properties weren't working!
|
||||
Why the two differing ways to provide the same properties? We previously accepted a `-D` tooling option which resembled Java System Property declaration. In older versions of OpenAPI Generator, the option modified the SystemProperties collection directly and was truly a "system property". This option changed during the 4.x release in an effort to make OpenAPI Generator thread-safe and isolate its configuration via thread locals. We no longer mutate System Properties. In the 4.x release and earlier, specifying the tooling `-D` option with system properties intended for other tools like swagger-parser rather than passing them as true Java System Properties would lead to unexpected behavior for the user; if our tool set the system property _after_ invoking certain code, it would seem to the user like Java System Properties weren't working!
|
||||
|
||||
@@ -520,15 +520,6 @@ public class CodeGenMojo extends AbstractMojo {
|
||||
"generated-test-sources/openapi" : "generated-sources/openapi");
|
||||
}
|
||||
|
||||
if (cleanupOutput) {
|
||||
try {
|
||||
FileUtils.deleteDirectory(output);
|
||||
LOGGER.info("Previous run output is removed from {}", output);
|
||||
} catch (IOException e) {
|
||||
LOGGER.warn("Failed to clean-up output directory {}", output, e);
|
||||
}
|
||||
}
|
||||
|
||||
addCompileSourceRootIfConfigured();
|
||||
|
||||
try {
|
||||
@@ -566,10 +557,19 @@ public class CodeGenMojo extends AbstractMojo {
|
||||
}
|
||||
}
|
||||
|
||||
if (cleanupOutput) {
|
||||
try {
|
||||
FileUtils.deleteDirectory(output);
|
||||
LOGGER.info("Previous run output is removed from {}", output);
|
||||
} catch (IOException e) {
|
||||
LOGGER.warn("Failed to clean up output directory {}", output, e);
|
||||
}
|
||||
}
|
||||
|
||||
// attempt to read from config file
|
||||
CodegenConfigurator configurator = CodegenConfigurator.fromFile(configurationFile);
|
||||
|
||||
// if a config file wasn't specified or we were unable to read it
|
||||
// if a config file wasn't specified, or we were unable to read it
|
||||
if (configurator == null) {
|
||||
configurator = new CodegenConfigurator();
|
||||
}
|
||||
@@ -938,8 +938,8 @@ public class CodeGenMojo extends AbstractMojo {
|
||||
/**
|
||||
* Calculate openapi specification file hash. If specification is hosted on remote resource it is downloaded first
|
||||
*
|
||||
* @param inputSpecFile - Openapi specification input file to calculate it's hash.
|
||||
* Does not taken into account if input spec is hosted on remote resource
|
||||
* @param inputSpecFile - Openapi specification input file to calculate its hash.
|
||||
* Does not take into account if input spec is hosted on remote resource
|
||||
* @return openapi specification file hash
|
||||
* @throws IOException
|
||||
*/
|
||||
@@ -991,8 +991,8 @@ public class CodeGenMojo extends AbstractMojo {
|
||||
|
||||
/**
|
||||
* Get specification hash file
|
||||
* @param inputSpecFile - Openapi specification input file to calculate it's hash.
|
||||
* Does not taken into account if input spec is hosted on remote resource
|
||||
* @param inputSpecFile - Openapi specification input file to calculate its hash.
|
||||
* Does not take into account if input spec is hosted on remote resource
|
||||
* @return a file with previously calculated hash
|
||||
*/
|
||||
private File getHashFile(File inputSpecFile) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
package org.openapitools.codegen;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.github.benmanes.caffeine.cache.Cache;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.Ticker;
|
||||
@@ -446,10 +447,13 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
.put("titlecase", new TitlecaseLambda())
|
||||
.put("camelcase", new CamelCaseLambda(true).generator(this))
|
||||
.put("pascalcase", new CamelCaseLambda(false).generator(this))
|
||||
.put("forwardslash", new ForwardSlashLambda())
|
||||
.put("backslash", new BackSlashLambda())
|
||||
.put("indented", new IndentedLambda())
|
||||
.put("indented_8", new IndentedLambda(8, " ", false))
|
||||
.put("indented_12", new IndentedLambda(12, " ", false))
|
||||
.put("indented_16", new IndentedLambda(16, " ", false));
|
||||
|
||||
}
|
||||
|
||||
private void registerMustacheLambdas() {
|
||||
@@ -791,6 +795,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
Map<String, Object> allowableValues = cm.allowableValues;
|
||||
List<Object> values = (List<Object>) allowableValues.get("values");
|
||||
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
|
||||
postProcessEnumVars(enumVars);
|
||||
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
|
||||
updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions(), cm.dataType);
|
||||
cm.allowableValues.put("enumVars", enumVars);
|
||||
@@ -1031,23 +1036,23 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
if (ModelUtils.isComposedSchema(s)) {
|
||||
if (e.getKey().contains("/")) {
|
||||
// if this is property schema, we also need to generate the oneOf interface model
|
||||
addOneOfNameExtension((ComposedSchema) s, nOneOf);
|
||||
addOneOfInterfaceModel((ComposedSchema) s, nOneOf);
|
||||
addOneOfNameExtension(s, nOneOf);
|
||||
addOneOfInterfaceModel(s, nOneOf);
|
||||
} else {
|
||||
// else this is a component schema, so we will just use that as the oneOf interface model
|
||||
addOneOfNameExtension((ComposedSchema) s, n);
|
||||
addOneOfNameExtension(s, n);
|
||||
}
|
||||
} else if (ModelUtils.isArraySchema(s)) {
|
||||
Schema items = ((ArraySchema) s).getItems();
|
||||
if (ModelUtils.isComposedSchema(items)) {
|
||||
addOneOfNameExtension((ComposedSchema) items, nOneOf);
|
||||
addOneOfInterfaceModel((ComposedSchema) items, nOneOf);
|
||||
addOneOfNameExtension(items, nOneOf);
|
||||
addOneOfInterfaceModel(items, nOneOf);
|
||||
}
|
||||
} else if (ModelUtils.isMapSchema(s)) {
|
||||
Schema addProps = ModelUtils.getAdditionalProperties(s);
|
||||
if (addProps != null && ModelUtils.isComposedSchema(addProps)) {
|
||||
addOneOfNameExtension((ComposedSchema) addProps, nOneOf);
|
||||
addOneOfInterfaceModel((ComposedSchema) addProps, nOneOf);
|
||||
addOneOfNameExtension(addProps, nOneOf);
|
||||
addOneOfInterfaceModel(addProps, nOneOf);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2269,10 +2274,9 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
**/
|
||||
@SuppressWarnings("static-method")
|
||||
public String getSchemaType(Schema schema) {
|
||||
if (schema instanceof ComposedSchema) { // composed schema
|
||||
ComposedSchema cs = (ComposedSchema) schema;
|
||||
if (ModelUtils.isComposedSchema(schema)) { // composed schema
|
||||
// Get the interfaces, i.e. the set of elements under 'allOf', 'anyOf' or 'oneOf'.
|
||||
List<Schema> schemas = ModelUtils.getInterfaces(cs);
|
||||
List<Schema> schemas = ModelUtils.getInterfaces(schema);
|
||||
|
||||
List<String> names = new ArrayList<>();
|
||||
// Build a list of the schema types under each interface.
|
||||
@@ -2282,12 +2286,12 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
names.add(getSingleSchemaType(s));
|
||||
}
|
||||
|
||||
if (cs.getAllOf() != null) {
|
||||
return toAllOfName(names, cs);
|
||||
} else if (cs.getAnyOf() != null) { // anyOf
|
||||
return toAnyOfName(names, cs);
|
||||
} else if (cs.getOneOf() != null) { // oneOf
|
||||
return toOneOfName(names, cs);
|
||||
if (schema.getAllOf() != null) {
|
||||
return toAllOfName(names, schema);
|
||||
} else if (schema.getAnyOf() != null) { // anyOf
|
||||
return toAnyOfName(names, schema);
|
||||
} else if (schema.getOneOf() != null) { // oneOf
|
||||
return toOneOfName(names, schema);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2323,7 +2327,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
* @return name of the allOf schema
|
||||
*/
|
||||
@SuppressWarnings("static-method")
|
||||
public String toAllOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toAllOfName(List<String> names, Schema composedSchema) {
|
||||
Map<String, Object> exts = composedSchema.getExtensions();
|
||||
if (exts != null && exts.containsKey("x-all-of-name")) {
|
||||
return (String) exts.get("x-all-of-name");
|
||||
@@ -2347,7 +2351,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
* @return name of the anyOf schema
|
||||
*/
|
||||
@SuppressWarnings("static-method")
|
||||
public String toAnyOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toAnyOfName(List<String> names, Schema composedSchema) {
|
||||
return "anyOf<" + String.join(",", names) + ">";
|
||||
}
|
||||
|
||||
@@ -2365,7 +2369,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
* @return name of the oneOf schema
|
||||
*/
|
||||
@SuppressWarnings("static-method")
|
||||
public String toOneOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toOneOfName(List<String> names, Schema composedSchema) {
|
||||
Map<String, Object> exts = composedSchema.getExtensions();
|
||||
if (exts != null && exts.containsKey("x-one-of-name")) {
|
||||
return (String) exts.get("x-one-of-name");
|
||||
@@ -2670,7 +2674,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
Map<NamedSchema, CodegenProperty> schemaCodegenPropertyCache = new HashMap<>();
|
||||
|
||||
protected void updateModelForComposedSchema(CodegenModel m, Schema schema, Map<String, Schema> allDefinitions) {
|
||||
final ComposedSchema composed = (ComposedSchema) schema;
|
||||
final Schema composed = schema;
|
||||
Map<String, Schema> properties = new LinkedHashMap<>();
|
||||
List<String> required = new ArrayList<>();
|
||||
Map<String, Schema> allProperties = new LinkedHashMap<>();
|
||||
@@ -2696,17 +2700,17 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
if (composed.getAllOf() != null) {
|
||||
int modelImplCnt = 0; // only one inline object allowed in a ComposedModel
|
||||
int modelDiscriminators = 0; // only one discriminator allowed in a ComposedModel
|
||||
for (Schema innerSchema : composed.getAllOf()) { // TODO need to work with anyOf, oneOf as well
|
||||
if (m.discriminator == null && innerSchema.getDiscriminator() != null) {
|
||||
for (Object innerSchema : composed.getAllOf()) { // TODO need to work with anyOf, oneOf as well
|
||||
if (m.discriminator == null && ((Schema) innerSchema).getDiscriminator() != null) {
|
||||
LOGGER.debug("discriminator is set to null (not correctly set earlier): {}", m.name);
|
||||
m.setDiscriminator(createDiscriminator(m.name, innerSchema));
|
||||
m.setDiscriminator(createDiscriminator(m.name, (Schema) innerSchema));
|
||||
modelDiscriminators++;
|
||||
}
|
||||
|
||||
if (innerSchema.getXml() != null) {
|
||||
m.xmlPrefix = innerSchema.getXml().getPrefix();
|
||||
m.xmlNamespace = innerSchema.getXml().getNamespace();
|
||||
m.xmlName = innerSchema.getXml().getName();
|
||||
if (((Schema) innerSchema).getXml() != null) {
|
||||
m.xmlPrefix = ((Schema) innerSchema).getXml().getPrefix();
|
||||
m.xmlNamespace = ((Schema) innerSchema).getXml().getNamespace();
|
||||
m.xmlName = ((Schema) innerSchema).getXml().getName();
|
||||
}
|
||||
if (modelDiscriminators > 1) {
|
||||
LOGGER.error("Allof composed schema is inheriting >1 discriminator. Only use one discriminator: {}", composed);
|
||||
@@ -2884,7 +2888,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
}
|
||||
|
||||
protected void updateModelForObject(CodegenModel m, Schema schema) {
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(schema instanceof ComposedSchema)) {
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(ModelUtils.isComposedSchema(schema))) {
|
||||
// passing null to allProperties and allRequired as there's no parent
|
||||
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
|
||||
}
|
||||
@@ -2913,7 +2917,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
addAdditionPropertiesToCodeGenModel(m, schema);
|
||||
m.isMap = true;
|
||||
}
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(schema instanceof ComposedSchema)) {
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(ModelUtils.isComposedSchema(schema))) {
|
||||
// passing null to allProperties and allRequired as there's no parent
|
||||
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
|
||||
}
|
||||
@@ -3118,7 +3122,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
m.setRef(schema.get$ref());
|
||||
}
|
||||
|
||||
if (schema instanceof ComposedSchema) {
|
||||
if (ModelUtils.isComposedSchema(schema)) {
|
||||
updateModelForComposedSchema(m, schema, allDefinitions);
|
||||
}
|
||||
|
||||
@@ -3252,11 +3256,11 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
return cp;
|
||||
}
|
||||
if (ModelUtils.isComposedSchema(refSchema)) {
|
||||
ComposedSchema composedSchema = (ComposedSchema) refSchema;
|
||||
Schema composedSchema = refSchema;
|
||||
if (composedSchema.getAllOf() != null) {
|
||||
// If our discriminator is in one of the allOf schemas break when we find it
|
||||
for (Schema allOf : composedSchema.getAllOf()) {
|
||||
CodegenProperty cp = discriminatorFound(composedSchemaName, allOf, discPropName, visitedSchemas);
|
||||
for (Object allOf : composedSchema.getAllOf()) {
|
||||
CodegenProperty cp = discriminatorFound(composedSchemaName, (Schema) allOf, discPropName, visitedSchemas);
|
||||
if (cp != null) {
|
||||
return cp;
|
||||
}
|
||||
@@ -3265,9 +3269,9 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
if (composedSchema.getOneOf() != null && composedSchema.getOneOf().size() != 0) {
|
||||
// All oneOf definitions must contain the discriminator
|
||||
CodegenProperty cp = new CodegenProperty();
|
||||
for (Schema oneOf : composedSchema.getOneOf()) {
|
||||
String modelName = ModelUtils.getSimpleRef(oneOf.get$ref());
|
||||
CodegenProperty thisCp = discriminatorFound(composedSchemaName, oneOf, discPropName, visitedSchemas);
|
||||
for (Object oneOf : composedSchema.getOneOf()) {
|
||||
String modelName = ModelUtils.getSimpleRef(((Schema) oneOf).get$ref());
|
||||
CodegenProperty thisCp = discriminatorFound(composedSchemaName, (Schema) oneOf, discPropName, visitedSchemas);
|
||||
if (thisCp == null) {
|
||||
LOGGER.warn(
|
||||
"'{}' defines discriminator '{}', but the referenced OneOf schema '{}' is missing {}",
|
||||
@@ -3288,9 +3292,9 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
if (composedSchema.getAnyOf() != null && composedSchema.getAnyOf().size() != 0) {
|
||||
// All anyOf definitions must contain the discriminator because a min of one must be selected
|
||||
CodegenProperty cp = new CodegenProperty();
|
||||
for (Schema anyOf : composedSchema.getAnyOf()) {
|
||||
String modelName = ModelUtils.getSimpleRef(anyOf.get$ref());
|
||||
CodegenProperty thisCp = discriminatorFound(composedSchemaName, anyOf, discPropName, visitedSchemas);
|
||||
for (Object anyOf : composedSchema.getAnyOf()) {
|
||||
String modelName = ModelUtils.getSimpleRef(((Schema) anyOf).get$ref());
|
||||
CodegenProperty thisCp = discriminatorFound(composedSchemaName, (Schema) anyOf, discPropName, visitedSchemas);
|
||||
if (thisCp == null) {
|
||||
LOGGER.warn(
|
||||
"'{}' defines discriminator '{}', but the referenced AnyOf schema '{}' is missing {}",
|
||||
@@ -3339,11 +3343,11 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
|
||||
Discriminator disc = new Discriminator();
|
||||
if (ModelUtils.isComposedSchema(refSchema)) {
|
||||
ComposedSchema composedSchema = (ComposedSchema) refSchema;
|
||||
Schema composedSchema = refSchema;
|
||||
if (composedSchema.getAllOf() != null) {
|
||||
// If our discriminator is in one of the allOf schemas break when we find it
|
||||
for (Schema allOf : composedSchema.getAllOf()) {
|
||||
foundDisc = recursiveGetDiscriminator(allOf, visitedSchemas);
|
||||
for (Object allOf : composedSchema.getAllOf()) {
|
||||
foundDisc = recursiveGetDiscriminator((Schema) allOf, visitedSchemas);
|
||||
if (foundDisc != null) {
|
||||
disc.setPropertyName(foundDisc.getPropertyName());
|
||||
disc.setMapping(foundDisc.getMapping());
|
||||
@@ -3356,13 +3360,13 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
Integer hasDiscriminatorCnt = 0;
|
||||
Integer hasNullTypeCnt = 0;
|
||||
Set<String> discriminatorsPropNames = new HashSet<>();
|
||||
for (Schema oneOf : composedSchema.getOneOf()) {
|
||||
if (ModelUtils.isNullType(oneOf)) {
|
||||
for (Object oneOf : composedSchema.getOneOf()) {
|
||||
if (ModelUtils.isNullType((Schema) oneOf)) {
|
||||
// The null type does not have a discriminator. Skip.
|
||||
hasNullTypeCnt++;
|
||||
continue;
|
||||
}
|
||||
foundDisc = recursiveGetDiscriminator(oneOf, visitedSchemas);
|
||||
foundDisc = recursiveGetDiscriminator((Schema) oneOf, visitedSchemas);
|
||||
if (foundDisc != null) {
|
||||
discriminatorsPropNames.add(foundDisc.getPropertyName());
|
||||
hasDiscriminatorCnt++;
|
||||
@@ -3385,13 +3389,13 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
Integer hasDiscriminatorCnt = 0;
|
||||
Integer hasNullTypeCnt = 0;
|
||||
Set<String> discriminatorsPropNames = new HashSet<>();
|
||||
for (Schema anyOf : composedSchema.getAnyOf()) {
|
||||
if (ModelUtils.isNullType(anyOf)) {
|
||||
for (Object anyOf : composedSchema.getAnyOf()) {
|
||||
if (ModelUtils.isNullType((Schema) anyOf)) {
|
||||
// The null type does not have a discriminator. Skip.
|
||||
hasNullTypeCnt++;
|
||||
continue;
|
||||
}
|
||||
foundDisc = recursiveGetDiscriminator(anyOf, visitedSchemas);
|
||||
foundDisc = recursiveGetDiscriminator((Schema) anyOf, visitedSchemas);
|
||||
if (foundDisc != null) {
|
||||
discriminatorsPropNames.add(foundDisc.getPropertyName());
|
||||
hasDiscriminatorCnt++;
|
||||
@@ -3426,7 +3430,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
* @param c The ComposedSchema that contains the discriminator and oneOf/anyOf schemas
|
||||
* @return the list of oneOf and anyOf MappedModel that need to be added to the discriminator map
|
||||
*/
|
||||
protected List<MappedModel> getOneOfAnyOfDescendants(String composedSchemaName, String discPropName, ComposedSchema c) {
|
||||
protected List<MappedModel> getOneOfAnyOfDescendants(String composedSchemaName, String discPropName, Schema c) {
|
||||
ArrayList<List<Schema>> listOLists = new ArrayList<>();
|
||||
listOLists.add(c.getOneOf());
|
||||
listOLists.add(c.getAnyOf());
|
||||
@@ -3506,8 +3510,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
}
|
||||
Schema child = schemas.get(childName);
|
||||
if (ModelUtils.isComposedSchema(child)) {
|
||||
ComposedSchema composedChild = (ComposedSchema) child;
|
||||
List<Schema> parents = composedChild.getAllOf();
|
||||
List<Schema> parents = child.getAllOf();
|
||||
if (parents != null) {
|
||||
for (Schema parent : parents) {
|
||||
String ref = parent.get$ref();
|
||||
@@ -3620,7 +3623,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
}
|
||||
// if there are composed oneOf/anyOf schemas, add them to this discriminator
|
||||
if (ModelUtils.isComposedSchema(schema) && !this.getLegacyDiscriminatorBehavior()) {
|
||||
List<MappedModel> otherDescendants = getOneOfAnyOfDescendants(schemaName, discriminatorPropertyName, (ComposedSchema) schema);
|
||||
List<MappedModel> otherDescendants = getOneOfAnyOfDescendants(schemaName, discriminatorPropertyName, schema);
|
||||
for (MappedModel otherDescendant : otherDescendants) {
|
||||
if (!uniqueDescendants.contains(otherDescendant)) {
|
||||
uniqueDescendants.add(otherDescendant);
|
||||
@@ -3654,15 +3657,18 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
* @param visitedSchemas circuit-breaker - the schemas with which the method was called before for recursive structures
|
||||
*/
|
||||
protected void addProperties(Map<String, Schema> properties, List<String> required, Schema schema, Set<Schema> visitedSchemas) {
|
||||
if (schema == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!visitedSchemas.add(schema)) {
|
||||
return;
|
||||
}
|
||||
if (schema instanceof ComposedSchema) {
|
||||
ComposedSchema composedSchema = (ComposedSchema) schema;
|
||||
if (ModelUtils.isComposedSchema(schema)) {
|
||||
|
||||
if (composedSchema.getAllOf() != null) {
|
||||
for (Schema component : composedSchema.getAllOf()) {
|
||||
addProperties(properties, required, component, visitedSchemas);
|
||||
if (schema.getAllOf() != null) {
|
||||
for (Object component : schema.getAllOf()) {
|
||||
addProperties(properties, required, (Schema) component, visitedSchemas);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3670,15 +3676,15 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
required.addAll(schema.getRequired());
|
||||
}
|
||||
|
||||
if (composedSchema.getOneOf() != null) {
|
||||
for (Schema component : composedSchema.getOneOf()) {
|
||||
addProperties(properties, required, component, visitedSchemas);
|
||||
if (schema.getOneOf() != null) {
|
||||
for (Object component : schema.getOneOf()) {
|
||||
addProperties(properties, required, (Schema) component, visitedSchemas);
|
||||
}
|
||||
}
|
||||
|
||||
if (composedSchema.getAnyOf() != null) {
|
||||
for (Schema component : composedSchema.getAnyOf()) {
|
||||
addProperties(properties, required, component, visitedSchemas);
|
||||
if (schema.getAnyOf() != null) {
|
||||
for (Object component : schema.getAnyOf()) {
|
||||
addProperties(properties, required, (Schema) component, visitedSchemas);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3762,10 +3768,11 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
if (Boolean.FALSE.equals(p.getNullable())) {
|
||||
LOGGER.warn("Schema '{}' is any type, which includes the 'null' value. 'nullable' cannot be set to 'false'", p.getName());
|
||||
}
|
||||
ComposedSchema composedSchema = p instanceof ComposedSchema
|
||||
? (ComposedSchema) p
|
||||
: null;
|
||||
property.isNullable = property.isNullable || composedSchema == null || composedSchema.getAllOf() == null || composedSchema.getAllOf().size() == 0;
|
||||
|
||||
property.isNullable = property.isNullable ||
|
||||
!(ModelUtils.isComposedSchema(p)) ||
|
||||
p.getAllOf() == null ||
|
||||
p.getAllOf().size() == 0;
|
||||
if (languageSpecificPrimitives.contains(property.dataType)) {
|
||||
property.isPrimitiveType = true;
|
||||
}
|
||||
@@ -5742,7 +5749,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
* @param model codegen model
|
||||
* @param modelName model name
|
||||
*/
|
||||
protected void addImport(ComposedSchema composed, Schema childSchema, CodegenModel model, String modelName ) {
|
||||
protected void addImport(Schema composed, Schema childSchema, CodegenModel model, String modelName ) {
|
||||
if (composed == null || childSchema == null) {
|
||||
return;
|
||||
}
|
||||
@@ -6524,6 +6531,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
.findFirst();
|
||||
String dataType = (referencedSchema.isPresent()) ? getTypeDeclaration(referencedSchema.get()) : varDataType;
|
||||
List<Map<String, Object>> enumVars = buildEnumVars(values, dataType);
|
||||
postProcessEnumVars(enumVars);
|
||||
|
||||
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
|
||||
Map<String, Object> extensions = var.mostInnerItems != null ? var.mostInnerItems.getVendorExtensions() : var.getVendorExtensions();
|
||||
@@ -6562,26 +6570,23 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
|
||||
protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
|
||||
List<Map<String, Object>> enumVars = new ArrayList<>();
|
||||
int truncateIdx = 0;
|
||||
|
||||
if (isRemoveEnumValuePrefix()) {
|
||||
String commonPrefix = findCommonPrefixOfVars(values);
|
||||
truncateIdx = commonPrefix.length();
|
||||
}
|
||||
int truncateIdx = isRemoveEnumValuePrefix()
|
||||
? findCommonPrefixOfVars(values).length()
|
||||
: 0;
|
||||
|
||||
for (Object value : values) {
|
||||
Map<String, Object> enumVar = new HashMap<>();
|
||||
String enumName;
|
||||
if (truncateIdx == 0) {
|
||||
enumName = String.valueOf(value);
|
||||
} else {
|
||||
enumName = value.toString().substring(truncateIdx);
|
||||
if (enumName.isEmpty()) {
|
||||
enumName = value.toString();
|
||||
}
|
||||
String enumName = truncateIdx == 0
|
||||
? String.valueOf(value)
|
||||
: value.toString().substring(truncateIdx);
|
||||
|
||||
if (enumName.isEmpty()) {
|
||||
enumName = value.toString();
|
||||
}
|
||||
|
||||
enumVar.put("name", toEnumVarName(enumName, dataType));
|
||||
final String finalEnumName = toEnumVarName(enumName, dataType);
|
||||
|
||||
enumVar.put("name", finalEnumName);
|
||||
enumVar.put("value", toEnumValue(String.valueOf(value), dataType));
|
||||
enumVar.put("isString", isDataTypeString(dataType));
|
||||
enumVars.add(enumVar);
|
||||
@@ -6593,18 +6598,15 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
Map<String, Object> enumVar = new HashMap<>();
|
||||
String enumName = enumUnknownDefaultCaseName;
|
||||
|
||||
String enumValue;
|
||||
if (isDataTypeString(dataType)) {
|
||||
enumValue = enumUnknownDefaultCaseName;
|
||||
} else {
|
||||
// This is a dummy value that attempts to avoid collisions with previously specified cases.
|
||||
// Int.max / 192
|
||||
// The number 192 that is used to calculate this random value, is the Swift Evolution proposal for frozen/non-frozen enums.
|
||||
// [SE-0192](https://github.com/apple/swift-evolution/blob/master/proposals/0192-non-exhaustive-enums.md)
|
||||
// Since this functionality was born in the Swift 5 generator and latter on broth to all generators
|
||||
// https://github.com/OpenAPITools/openapi-generator/pull/11013
|
||||
enumValue = String.valueOf(11184809);
|
||||
}
|
||||
String enumValue = isDataTypeString(dataType)
|
||||
? enumUnknownDefaultCaseName
|
||||
: // This is a dummy value that attempts to avoid collisions with previously specified cases.
|
||||
// Int.max / 192
|
||||
// The number 192 that is used to calculate this random value, is the Swift Evolution proposal for frozen/non-frozen enums.
|
||||
// [SE-0192](https://github.com/apple/swift-evolution/blob/master/proposals/0192-non-exhaustive-enums.md)
|
||||
// Since this functionality was born in the Swift 5 generator and latter on broth to all generators
|
||||
// https://github.com/OpenAPITools/openapi-generator/pull/11013
|
||||
String.valueOf(11184809);
|
||||
|
||||
enumVar.put("name", toEnumVarName(enumName, dataType));
|
||||
enumVar.put("value", toEnumValue(enumValue, dataType));
|
||||
@@ -6615,6 +6617,27 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
return enumVars;
|
||||
}
|
||||
|
||||
protected void postProcessEnumVars(List<Map<String, Object>> enumVars) {
|
||||
Collections.reverse(enumVars);
|
||||
enumVars.forEach(v -> {
|
||||
String name = (String) v.get("name");
|
||||
long count = enumVars.stream().filter(v1 -> v1.get("name").equals(name)).count();
|
||||
if (count > 1) {
|
||||
String uniqueEnumName = getUniqueEnumName(name, enumVars);
|
||||
LOGGER.debug("Changing duplicate enumeration name from " + v.get("name") + " to " + uniqueEnumName);
|
||||
v.put("name", uniqueEnumName);
|
||||
}
|
||||
});
|
||||
Collections.reverse(enumVars);
|
||||
}
|
||||
|
||||
private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars) {
|
||||
long count = enumVars.stream().filter(v -> v.get("name").equals(name)).count();
|
||||
return count > 1
|
||||
? getUniqueEnumName(name + count, enumVars)
|
||||
: name;
|
||||
}
|
||||
|
||||
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
|
||||
if (vendorExtensions != null) {
|
||||
updateEnumVarsWithExtensions(enumVars, vendorExtensions, "x-enum-varnames", "name");
|
||||
@@ -6905,6 +6928,13 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
LOGGER.debug("debugging fromRequestBodyToFormParameters= {}", body);
|
||||
Schema schema = ModelUtils.getSchemaFromRequestBody(body);
|
||||
schema = ModelUtils.getReferencedSchema(this.openAPI, schema);
|
||||
if(ModelUtils.isMapSchema(schema)) {
|
||||
LOGGER.error("Form parameters with additionalProperties are not supported by OpenAPI Generator. Please report the issue to https://github.com/openapitools/openapi-generator if you need help.");
|
||||
}
|
||||
if(ModelUtils.isArraySchema(schema)) {
|
||||
LOGGER.error("Array form parameters are not supported by OpenAPI Generator. Please report the issue to https://github.com/openapitools/openapi-generator if you need help.");
|
||||
}
|
||||
|
||||
List<String> allRequired = new ArrayList<>();
|
||||
Map<String, Schema> properties = new LinkedHashMap<>();
|
||||
// this traverses a composed schema and extracts all properties in each schema into properties
|
||||
@@ -6913,6 +6943,8 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
// https://github.com/OpenAPITools/openapi-generator/issues/10415
|
||||
addProperties(properties, allRequired, schema, new HashSet<>());
|
||||
|
||||
boolean isOneOfOrAnyOf = ModelUtils.isOneOf(schema) || ModelUtils.isAnyOf(schema);
|
||||
|
||||
if (!properties.isEmpty()) {
|
||||
for (Map.Entry<String, Schema> entry : properties.entrySet()) {
|
||||
CodegenParameter codegenParameter;
|
||||
@@ -6920,14 +6952,14 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
// value => property schema
|
||||
String propertyName = entry.getKey();
|
||||
Schema propertySchema = entry.getValue();
|
||||
if (ModelUtils.isMapSchema(propertySchema)) {
|
||||
LOGGER.error("Map of form parameters not supported. Please report the issue to https://github.com/openapitools/openapi-generator if you need help.");
|
||||
continue;
|
||||
}
|
||||
codegenParameter = fromFormProperty(propertyName, propertySchema, imports);
|
||||
|
||||
// Set 'required' flag defined in the schema element
|
||||
if (!codegenParameter.required && schema.getRequired() != null) {
|
||||
if (isOneOfOrAnyOf) {
|
||||
// for oneOf/anyOf, mark all the properties collected from the sub-schemas as optional
|
||||
// so that users can choose which property to include in the form parameters
|
||||
codegenParameter.required = false;
|
||||
} else if (!codegenParameter.required && schema.getRequired() != null) {
|
||||
// Set 'required' flag defined in the schema element
|
||||
codegenParameter.required = schema.getRequired().contains(entry.getKey());
|
||||
} else if (!codegenParameter.required) {
|
||||
// Set 'required' flag for properties declared inside the allOf
|
||||
@@ -7900,12 +7932,12 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
/**
|
||||
* Add "x-one-of-name" extension to a given oneOf schema (assuming it has at least 1 oneOf elements)
|
||||
*
|
||||
* @param s schema to add the extension to
|
||||
* @param name name of the parent oneOf schema
|
||||
* @param schema schema to add the extension to
|
||||
* @param name name of the parent oneOf schema
|
||||
*/
|
||||
public void addOneOfNameExtension(ComposedSchema s, String name) {
|
||||
if (s.getOneOf() != null && s.getOneOf().size() > 0) {
|
||||
s.addExtension("x-one-of-name", name);
|
||||
public void addOneOfNameExtension(Schema schema, String name) {
|
||||
if (schema.getOneOf() != null && schema.getOneOf().size() > 0) {
|
||||
schema.addExtension("x-one-of-name", name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7915,7 +7947,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
* @param cs ComposedSchema object to create as interface model
|
||||
* @param type name to use for the generated interface model
|
||||
*/
|
||||
public void addOneOfInterfaceModel(ComposedSchema cs, String type) {
|
||||
public void addOneOfInterfaceModel(Schema cs, String type) {
|
||||
if (cs.getOneOf() == null) {
|
||||
return;
|
||||
}
|
||||
@@ -7924,9 +7956,9 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
|
||||
cm.setDiscriminator(createDiscriminator("", cs));
|
||||
|
||||
for (Schema o : Optional.ofNullable(cs.getOneOf()).orElse(Collections.emptyList())) {
|
||||
if (o.get$ref() == null) {
|
||||
if (cm.discriminator != null && o.get$ref() == null) {
|
||||
for (Object o : Optional.ofNullable(cs.getOneOf()).orElse(Collections.emptyList())) {
|
||||
if (((Schema) o).get$ref() == null) {
|
||||
if (cm.discriminator != null && ((Schema) o).get$ref() == null) {
|
||||
// OpenAPI spec states that inline objects should not be considered when discriminator is used
|
||||
// https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#discriminatorObject
|
||||
LOGGER.warn("Ignoring inline object in oneOf definition of {}, since discriminator is used", type);
|
||||
@@ -7935,7 +7967,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
}
|
||||
continue;
|
||||
}
|
||||
cm.oneOf.add(toModelName(ModelUtils.getSimpleRef(o.get$ref())));
|
||||
cm.oneOf.add(toModelName(ModelUtils.getSimpleRef(((Schema) o).get$ref())));
|
||||
}
|
||||
cm.name = type;
|
||||
cm.classname = type;
|
||||
@@ -8106,7 +8138,7 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
}
|
||||
|
||||
private CodegenComposedSchemas getComposedSchemas(Schema schema) {
|
||||
if (!(schema instanceof ComposedSchema) && schema.getNot() == null) {
|
||||
if (!(ModelUtils.isComposedSchema(schema)) && schema.getNot() == null) {
|
||||
return null;
|
||||
}
|
||||
Schema notSchema = schema.getNot();
|
||||
@@ -8117,11 +8149,10 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
List<CodegenProperty> allOf = new ArrayList<>();
|
||||
List<CodegenProperty> oneOf = new ArrayList<>();
|
||||
List<CodegenProperty> anyOf = new ArrayList<>();
|
||||
if (schema instanceof ComposedSchema) {
|
||||
ComposedSchema cs = (ComposedSchema) schema;
|
||||
allOf = getComposedProperties(cs.getAllOf(), "all_of");
|
||||
oneOf = getComposedProperties(cs.getOneOf(), "one_of");
|
||||
anyOf = getComposedProperties(cs.getAnyOf(), "any_of");
|
||||
if (ModelUtils.isComposedSchema(schema)) {
|
||||
allOf = getComposedProperties(schema.getAllOf(), "all_of");
|
||||
oneOf = getComposedProperties(schema.getOneOf(), "one_of");
|
||||
anyOf = getComposedProperties(schema.getAnyOf(), "any_of");
|
||||
}
|
||||
return new CodegenComposedSchemas(
|
||||
allOf,
|
||||
|
||||
@@ -58,6 +58,7 @@ import org.openapitools.codegen.utils.ImplementationVersion;
|
||||
import org.openapitools.codegen.utils.ModelUtils;
|
||||
import org.openapitools.codegen.utils.ProcessUtils;
|
||||
import org.openapitools.codegen.utils.URLPathUtils;
|
||||
import org.openapitools.codegen.utils.SemVer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -262,6 +263,10 @@ public class DefaultGenerator implements Generator {
|
||||
// normalize the spec
|
||||
try {
|
||||
if (config.getUseOpenAPINormalizer()) {
|
||||
SemVer version = new SemVer(openAPI.getOpenapi());
|
||||
if (version.atLeast("3.1.0")) {
|
||||
config.openapiNormalizer().put("NORMALIZE_31SPEC", "true");
|
||||
}
|
||||
OpenAPINormalizer openapiNormalizer = new OpenAPINormalizer(openAPI, config.openapiNormalizer());
|
||||
openapiNormalizer.normalize();
|
||||
}
|
||||
@@ -461,7 +466,7 @@ public class DefaultGenerator implements Generator {
|
||||
|
||||
Boolean skipFormModel = GlobalSettings.getProperty(CodegenConstants.SKIP_FORM_MODEL) != null ?
|
||||
Boolean.valueOf(GlobalSettings.getProperty(CodegenConstants.SKIP_FORM_MODEL)) :
|
||||
getGeneratorPropertyDefaultSwitch(CodegenConstants.SKIP_FORM_MODEL, true);
|
||||
getGeneratorPropertyDefaultSwitch(CodegenConstants.SKIP_FORM_MODEL, false);
|
||||
|
||||
// process models only
|
||||
for (String name : modelKeys) {
|
||||
@@ -483,9 +488,9 @@ public class DefaultGenerator implements Generator {
|
||||
if (unusedModels.contains(name)) {
|
||||
if (Boolean.FALSE.equals(skipFormModel)) {
|
||||
// if skipFormModel sets to true, still generate the model and log the result
|
||||
LOGGER.info("Model {} (marked as unused due to form parameters) is generated due to the global property `skipFormModel` set to false", name);
|
||||
LOGGER.info("Model {} (marked as unused due to form parameters) is generated due to the global property `skipFormModel` set to false (default)", name);
|
||||
} else {
|
||||
LOGGER.info("Model {} not generated since it's marked as unused (due to form parameters) and `skipFormModel` (global property) set to true (default)", name);
|
||||
LOGGER.info("Model {} not generated since it's marked as unused (due to form parameters) and `skipFormModel` (global property) set to true", name);
|
||||
// TODO: Should this be added to dryRun? If not, this seems like a weird place to return early from processing.
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -216,32 +216,30 @@ public class InlineModelResolver {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (schema instanceof ComposedSchema) {
|
||||
if (ModelUtils.isComposedSchema(schema)) {
|
||||
// allOf, anyOf, oneOf
|
||||
ComposedSchema m = (ComposedSchema) schema;
|
||||
|
||||
boolean isSingleAllOf = m.getAllOf() != null && m.getAllOf().size() == 1;
|
||||
boolean isReadOnly = m.getReadOnly() != null && m.getReadOnly();
|
||||
boolean isNullable = m.getNullable() != null && m.getNullable();
|
||||
boolean isSingleAllOf = schema.getAllOf() != null && schema.getAllOf().size() == 1;
|
||||
boolean isReadOnly = schema.getReadOnly() != null && schema.getReadOnly();
|
||||
boolean isNullable = schema.getNullable() != null && schema.getNullable();
|
||||
|
||||
if (isSingleAllOf && (isReadOnly || isNullable)) {
|
||||
// Check if this composed schema only contains an allOf and a readOnly or nullable.
|
||||
ComposedSchema c = new ComposedSchema();
|
||||
c.setAllOf(m.getAllOf());
|
||||
c.setReadOnly(m.getReadOnly());
|
||||
c.setNullable(m.getNullable());
|
||||
if (m.equals(c)) {
|
||||
return isModelNeeded(m.getAllOf().get(0), visitedSchemas);
|
||||
c.setAllOf(schema.getAllOf());
|
||||
c.setReadOnly(schema.getReadOnly());
|
||||
c.setNullable(schema.getNullable());
|
||||
if (schema.equals(c)) {
|
||||
return isModelNeeded((Schema) schema.getAllOf().get(0), visitedSchemas);
|
||||
}
|
||||
} else if (isSingleAllOf && StringUtils.isNotEmpty(m.getAllOf().get(0).get$ref())) {
|
||||
} else if (isSingleAllOf && StringUtils.isNotEmpty(((Schema) schema.getAllOf().get(0)).get$ref())) {
|
||||
// single allOf and it's a ref
|
||||
return isModelNeeded(m.getAllOf().get(0), visitedSchemas);
|
||||
return isModelNeeded((Schema) schema.getAllOf().get(0), visitedSchemas);
|
||||
}
|
||||
|
||||
if (m.getAllOf() != null && !m.getAllOf().isEmpty()) {
|
||||
if (schema.getAllOf() != null && !schema.getAllOf().isEmpty()) {
|
||||
// check to ensure at least one of the allOf item is model
|
||||
for (Schema inner : m.getAllOf()) {
|
||||
if (isModelNeeded(ModelUtils.getReferencedSchema(openAPI, inner), visitedSchemas)) {
|
||||
for (Object inner : schema.getAllOf()) {
|
||||
if (isModelNeeded(ModelUtils.getReferencedSchema(openAPI, (Schema) inner), visitedSchemas)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -249,10 +247,10 @@ public class InlineModelResolver {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m.getAnyOf() != null && !m.getAnyOf().isEmpty()) {
|
||||
if (schema.getAnyOf() != null && !schema.getAnyOf().isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
if (m.getOneOf() != null && !m.getOneOf().isEmpty()) {
|
||||
if (schema.getOneOf() != null && !schema.getOneOf().isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -273,7 +271,7 @@ public class InlineModelResolver {
|
||||
// any to catch OpenAPI violations
|
||||
if (isModelNeeded(schema) || "object".equals(schema.getType()) ||
|
||||
schema.getProperties() != null || schema.getAdditionalProperties() != null ||
|
||||
schema instanceof ComposedSchema) {
|
||||
ModelUtils.isComposedSchema(schema)) {
|
||||
LOGGER.error("Illegal schema found with $ref combined with other properties," +
|
||||
" no properties should be defined alongside a $ref:\n " + schema.toString());
|
||||
}
|
||||
@@ -295,13 +293,13 @@ public class InlineModelResolver {
|
||||
// If this schema should be split into its own model, do so
|
||||
Schema refSchema = this.makeSchemaInComponents(schemaName, prop);
|
||||
props.put(propName, refSchema);
|
||||
} else if (prop instanceof ComposedSchema) {
|
||||
ComposedSchema m = (ComposedSchema) prop;
|
||||
if (m.getAllOf() != null && m.getAllOf().size() == 1 &&
|
||||
!(m.getAllOf().get(0).getType() == null || "object".equals(m.getAllOf().get(0).getType()))) {
|
||||
} else if (ModelUtils.isComposedSchema(prop)) {
|
||||
if (prop.getAllOf() != null && prop.getAllOf().size() == 1 &&
|
||||
!(((Schema) prop.getAllOf().get(0)).getType() == null ||
|
||||
"object".equals(((Schema) prop.getAllOf().get(0)).getType()))) {
|
||||
// allOf with only 1 type (non-model)
|
||||
LOGGER.info("allOf schema used by the property `{}` replaced by its only item (a type)", propName);
|
||||
props.put(propName, m.getAllOf().get(0));
|
||||
props.put(propName, (Schema) prop.getAllOf().get(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -357,71 +355,69 @@ public class InlineModelResolver {
|
||||
}
|
||||
}
|
||||
// Check allOf, anyOf, oneOf for inline models
|
||||
if (schema instanceof ComposedSchema) {
|
||||
ComposedSchema m = (ComposedSchema) schema;
|
||||
if (m.getAllOf() != null) {
|
||||
if (ModelUtils.isComposedSchema(schema)) {
|
||||
if (schema.getAllOf() != null) {
|
||||
List<Schema> newAllOf = new ArrayList<Schema>();
|
||||
boolean atLeastOneModel = false;
|
||||
for (Schema inner : m.getAllOf()) {
|
||||
String schemaName = resolveModelName(inner.getTitle(), modelPrefix + "_allOf");
|
||||
for (Object inner : schema.getAllOf()) {
|
||||
String schemaName = resolveModelName(((Schema) inner).getTitle(), modelPrefix + "_allOf");
|
||||
// Recurse to create $refs for inner models
|
||||
gatherInlineModels(inner, schemaName);
|
||||
if (isModelNeeded(inner)) {
|
||||
gatherInlineModels((Schema) inner, schemaName);
|
||||
if (isModelNeeded((Schema) inner)) {
|
||||
if (Boolean.TRUE.equals(this.refactorAllOfInlineSchemas)) {
|
||||
Schema refSchema = this.makeSchemaInComponents(schemaName, inner);
|
||||
Schema refSchema = this.makeSchemaInComponents(schemaName, (Schema) inner);
|
||||
newAllOf.add(refSchema); // replace with ref
|
||||
atLeastOneModel = true;
|
||||
} else { // do not refactor allOf inline schemas
|
||||
newAllOf.add(inner);
|
||||
newAllOf.add((Schema) inner);
|
||||
atLeastOneModel = true;
|
||||
}
|
||||
} else {
|
||||
newAllOf.add(inner);
|
||||
newAllOf.add((Schema) inner);
|
||||
}
|
||||
}
|
||||
if (atLeastOneModel) {
|
||||
m.setAllOf(newAllOf);
|
||||
schema.setAllOf(newAllOf);
|
||||
} else {
|
||||
// allOf is just one or more types only so do not generate the inline allOf model
|
||||
if (m.getAllOf().size() == 1) {
|
||||
if (schema.getAllOf().size() == 1) {
|
||||
// handle earlier in this function when looping through properties
|
||||
} else if (m.getAllOf().size() > 1) {
|
||||
} else if (schema.getAllOf().size() > 1) {
|
||||
LOGGER.warn("allOf schema `{}` containing multiple types (not model) is not supported at the moment.", schema.getName());
|
||||
} else {
|
||||
LOGGER.error("allOf schema `{}` contains no items.", schema.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m.getAnyOf() != null) {
|
||||
if (schema.getAnyOf() != null) {
|
||||
List<Schema> newAnyOf = new ArrayList<Schema>();
|
||||
for (Schema inner : m.getAnyOf()) {
|
||||
String schemaName = resolveModelName(inner.getTitle(), modelPrefix + "_anyOf");
|
||||
for (Object inner : schema.getAnyOf()) {
|
||||
String schemaName = resolveModelName(((Schema) inner).getTitle(), modelPrefix + "_anyOf");
|
||||
// Recurse to create $refs for inner models
|
||||
gatherInlineModels(inner, schemaName);
|
||||
if (isModelNeeded(inner)) {
|
||||
Schema refSchema = this.makeSchemaInComponents(schemaName, inner);
|
||||
gatherInlineModels((Schema) inner, schemaName);
|
||||
if (isModelNeeded((Schema) inner)) {
|
||||
Schema refSchema = this.makeSchemaInComponents(schemaName, (Schema) inner);
|
||||
newAnyOf.add(refSchema); // replace with ref
|
||||
} else {
|
||||
newAnyOf.add(inner);
|
||||
newAnyOf.add((Schema) inner);
|
||||
}
|
||||
}
|
||||
m.setAnyOf(newAnyOf);
|
||||
|
||||
schema.setAnyOf(newAnyOf);
|
||||
}
|
||||
if (m.getOneOf() != null) {
|
||||
if (schema.getOneOf() != null) {
|
||||
List<Schema> newOneOf = new ArrayList<Schema>();
|
||||
for (Schema inner : m.getOneOf()) {
|
||||
String schemaName = resolveModelName(inner.getTitle(), modelPrefix + "_oneOf");
|
||||
for (Object inner : schema.getOneOf()) {
|
||||
String schemaName = resolveModelName(((Schema) inner).getTitle(), modelPrefix + "_oneOf");
|
||||
// Recurse to create $refs for inner models
|
||||
gatherInlineModels(inner, schemaName);
|
||||
if (isModelNeeded(inner)) {
|
||||
Schema refSchema = this.makeSchemaInComponents(schemaName, inner);
|
||||
gatherInlineModels((Schema) inner, schemaName);
|
||||
if (isModelNeeded((Schema) inner)) {
|
||||
Schema refSchema = this.makeSchemaInComponents(schemaName, (Schema) inner);
|
||||
newOneOf.add(refSchema); // replace with ref
|
||||
} else {
|
||||
newOneOf.add(inner);
|
||||
newOneOf.add((Schema) inner);
|
||||
}
|
||||
}
|
||||
m.setOneOf(newOneOf);
|
||||
schema.setOneOf(newOneOf);
|
||||
}
|
||||
}
|
||||
// Check not schema
|
||||
@@ -638,11 +634,10 @@ public class InlineModelResolver {
|
||||
} else if (ModelUtils.isOneOf(model)) { // contains oneOf only
|
||||
gatherInlineModels(model, modelName);
|
||||
} else if (ModelUtils.isComposedSchema(model)) {
|
||||
ComposedSchema m = (ComposedSchema) model;
|
||||
// inline child schemas
|
||||
flattenComposedChildren(modelName + "_allOf", m.getAllOf(), !Boolean.TRUE.equals(this.refactorAllOfInlineSchemas));
|
||||
flattenComposedChildren(modelName + "_anyOf", m.getAnyOf(), false);
|
||||
flattenComposedChildren(modelName + "_oneOf", m.getOneOf(), false);
|
||||
flattenComposedChildren(modelName + "_allOf", model.getAllOf(), !Boolean.TRUE.equals(this.refactorAllOfInlineSchemas));
|
||||
flattenComposedChildren(modelName + "_anyOf", model.getAnyOf(), false);
|
||||
flattenComposedChildren(modelName + "_oneOf", model.getOneOf(), false);
|
||||
} else {
|
||||
gatherInlineModels(model, modelName);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.openapitools.codegen;
|
||||
|
||||
import io.swagger.v3.oas.models.*;
|
||||
import io.swagger.v3.oas.models.callbacks.Callback;
|
||||
import io.swagger.v3.oas.models.headers.Header;
|
||||
import io.swagger.v3.oas.models.media.*;
|
||||
import io.swagger.v3.oas.models.parameters.Parameter;
|
||||
import io.swagger.v3.oas.models.parameters.RequestBody;
|
||||
@@ -87,6 +88,9 @@ public class OpenAPINormalizer {
|
||||
// the allOf contains a new schema containing the properties in the top level
|
||||
final String REFACTOR_ALLOF_WITH_PROPERTIES_ONLY = "REFACTOR_ALLOF_WITH_PROPERTIES_ONLY";
|
||||
|
||||
// when set to true, normalize OpenAPI 3.1 spec to make it work with the generator
|
||||
final String NORMALIZE_31SPEC = "NORMALIZE_31SPEC";
|
||||
|
||||
// ============= end of rules =============
|
||||
|
||||
/**
|
||||
@@ -115,6 +119,7 @@ public class OpenAPINormalizer {
|
||||
ruleNames.add(SET_TAGS_FOR_ALL_OPERATIONS);
|
||||
ruleNames.add(ADD_UNSIGNED_TO_INTEGER_WITH_INVALID_MAX_VALUE);
|
||||
ruleNames.add(REFACTOR_ALLOF_WITH_PROPERTIES_ONLY);
|
||||
ruleNames.add(NORMALIZE_31SPEC);
|
||||
|
||||
// rules that are default to true
|
||||
rules.put(SIMPLIFY_ONEOF_ANYOF, true);
|
||||
@@ -148,7 +153,7 @@ public class OpenAPINormalizer {
|
||||
|
||||
// loop through all the rules
|
||||
for (Map.Entry<String, String> rule : inputRules.entrySet()) {
|
||||
LOGGER.info("processing rule {} => {}", rule.getKey(), rule.getValue());
|
||||
LOGGER.debug("processing rule {} => {}", rule.getKey(), rule.getValue());
|
||||
if (!ruleNames.contains(rule.getKey())) { // invalid rule name
|
||||
LOGGER.warn("Invalid openapi-normalizer rule name: ", rule.getKey());
|
||||
} else if (enableAll) {
|
||||
@@ -247,11 +252,13 @@ public class OpenAPINormalizer {
|
||||
} else if (mediaType.getSchema() == null) {
|
||||
continue;
|
||||
} else {
|
||||
normalizeSchema(mediaType.getSchema(), new HashSet<>());
|
||||
Schema newSchema = normalizeSchema(mediaType.getSchema(), new HashSet<>());
|
||||
mediaType.setSchema(newSchema);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Normalizes schemas in RequestBody
|
||||
*
|
||||
@@ -291,7 +298,8 @@ public class OpenAPINormalizer {
|
||||
if (parameter.getSchema() == null) {
|
||||
continue;
|
||||
} else {
|
||||
normalizeSchema(parameter.getSchema(), new HashSet<>());
|
||||
Schema newSchema = normalizeSchema(parameter.getSchema(), new HashSet<>());
|
||||
parameter.setSchema(newSchema);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -312,10 +320,29 @@ public class OpenAPINormalizer {
|
||||
continue;
|
||||
} else {
|
||||
normalizeContent(responsesEntry.getValue().getContent());
|
||||
normalizeHeaders(responsesEntry.getValue().getHeaders());
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes schemas in headers
|
||||
*
|
||||
* @param headers a map of headers
|
||||
*/
|
||||
private void normalizeHeaders(Map<String, Header> headers) {
|
||||
if (headers == null || headers.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (String headerKey : headers.keySet()) {
|
||||
Header h = headers.get(headerKey);
|
||||
Schema updatedHeader = normalizeSchema(h.getSchema(), new HashSet<>());
|
||||
h.setSchema(updatedHeader);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes schemas in components
|
||||
*/
|
||||
@@ -408,7 +435,7 @@ public class OpenAPINormalizer {
|
||||
} else if (schema instanceof IntegerSchema) {
|
||||
normalizeIntegerSchema(schema, visitedSchemas);
|
||||
} else if (schema instanceof Schema) {
|
||||
normalizeSchemaWithOnlyProperties(schema, visitedSchemas);
|
||||
return normalizeSimpleSchema(schema, visitedSchemas);
|
||||
} else {
|
||||
throw new RuntimeException("Unknown schema type found in normalizer: " + schema);
|
||||
}
|
||||
@@ -416,6 +443,10 @@ public class OpenAPINormalizer {
|
||||
return schema;
|
||||
}
|
||||
|
||||
private Schema normalizeSimpleSchema(Schema schema, Set<Schema> visitedSchemas) {
|
||||
return processNormalize31Spec(schema, visitedSchemas);
|
||||
}
|
||||
|
||||
private void normalizeBooleanSchema(Schema schema, Set<Schema> visitedSchemas) {
|
||||
processSimplifyBooleanEnum(schema);
|
||||
}
|
||||
@@ -424,10 +455,6 @@ public class OpenAPINormalizer {
|
||||
processAddUnsignedToIntegerWithInvalidMaxValue(schema);
|
||||
}
|
||||
|
||||
private void normalizeSchemaWithOnlyProperties(Schema schema, Set<Schema> visitedSchemas) {
|
||||
// normalize non-composed schema (e.g. schema with only properties)
|
||||
}
|
||||
|
||||
private void normalizeProperties(Map<String, Schema> properties, Set<Schema> visitedSchemas) {
|
||||
if (properties == null) {
|
||||
return;
|
||||
@@ -670,9 +697,9 @@ public class OpenAPINormalizer {
|
||||
|
||||
/**
|
||||
* Check if the schema is of type 'null'
|
||||
*
|
||||
* <p>
|
||||
* Return true if the schema's type is 'null' or not specified
|
||||
*
|
||||
*
|
||||
* @param schema Schema
|
||||
*/
|
||||
private boolean isNullTypeSchema(Schema schema) {
|
||||
@@ -803,7 +830,7 @@ public class OpenAPINormalizer {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* When set to true, refactor schema with allOf and properties in the same level to a schema with allOf only and
|
||||
* the allOf contains a new schema containing the properties in the top level.
|
||||
*
|
||||
@@ -844,5 +871,75 @@ public class OpenAPINormalizer {
|
||||
return schema;
|
||||
}
|
||||
|
||||
/**
|
||||
* When set to true, normalize schema so that it works well with the generator.
|
||||
*
|
||||
* @param schema Schema
|
||||
* @param visitedSchemas a set of visited schemas
|
||||
* @return Schema
|
||||
*/
|
||||
private Schema processNormalize31Spec(Schema schema, Set<Schema> visitedSchemas) {
|
||||
if (!getRule(NORMALIZE_31SPEC)) {
|
||||
return schema;
|
||||
}
|
||||
|
||||
if (schema == null || schema.getTypes() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// process null
|
||||
if (schema.getTypes().contains("null")) {
|
||||
schema.setNullable(true);
|
||||
schema.getTypes().remove("null");
|
||||
}
|
||||
|
||||
// only one item (type) left
|
||||
if (schema.getTypes().size() == 1) {
|
||||
String type = String.valueOf(schema.getTypes().iterator().next());
|
||||
if ("array".equals(type)) {
|
||||
ArraySchema as = new ArraySchema();
|
||||
as.setXml(schema.getXml());
|
||||
// `items` is also a json schema
|
||||
if (StringUtils.isNotEmpty(schema.getItems().get$ref())) {
|
||||
Schema ref = new Schema();
|
||||
ref.set$ref(schema.getItems().get$ref());
|
||||
as.setItems(ref);
|
||||
} else { // inline schema (e.g. model, string, etc)
|
||||
Schema updatedItems = normalizeSchema(schema.getItems(), visitedSchemas);
|
||||
as.setItems(updatedItems);
|
||||
}
|
||||
|
||||
return as;
|
||||
} else { // other primitive type such as string
|
||||
// set type (3.0 spec) directly
|
||||
schema.setType(type);
|
||||
}
|
||||
} else { // more than 1 item
|
||||
// convert to anyOf and keep all other attributes (e.g. nullable, description)
|
||||
// the same. No need to handle null as it should have been removed at this point.
|
||||
for (Object type : schema.getTypes()) {
|
||||
switch (String.valueOf(type)) {
|
||||
case "string":
|
||||
schema.addAnyOfItem(new StringSchema());
|
||||
break;
|
||||
case "integer":
|
||||
schema.addAnyOfItem(new IntegerSchema());
|
||||
break;
|
||||
case "number":
|
||||
schema.addAnyOfItem(new NumberSchema());
|
||||
break;
|
||||
case "boolean":
|
||||
schema.addAnyOfItem(new BooleanSchema());
|
||||
break;
|
||||
default:
|
||||
LOGGER.error("Type {} not yet supported in openapi-normalizer to process OpenAPI 3.1 spec with multiple types.");
|
||||
LOGGER.error("Please report the issue via https://github.com/OpenAPITools/openapi-generator/issues/new/.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return schema;
|
||||
}
|
||||
|
||||
// ===================== end of rules =====================
|
||||
}
|
||||
|
||||
@@ -287,10 +287,8 @@ public class ExampleGenerator {
|
||||
return "https://openapi-generator.tech";
|
||||
} else if (ModelUtils.isStringSchema(property)) {
|
||||
LOGGER.debug("String property");
|
||||
String defaultValue = (String) property.getDefault();
|
||||
if (defaultValue != null && !defaultValue.isEmpty()) {
|
||||
LOGGER.debug("Default value found: '{}'", defaultValue);
|
||||
return defaultValue;
|
||||
if (property.getDefault() != null) {
|
||||
return String.valueOf(property.getDefault());
|
||||
}
|
||||
List<String> enumValues = property.getEnum();
|
||||
if (enumValues != null && !enumValues.isEmpty()) {
|
||||
|
||||
@@ -262,7 +262,7 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code
|
||||
return "null";
|
||||
} else if (ModelUtils.isStringSchema(p)) {
|
||||
if (p.getDefault() != null) {
|
||||
String _default = (String) p.getDefault();
|
||||
String _default = String.valueOf(p.getDefault());
|
||||
if (p.getEnum() == null) {
|
||||
return "\"" + escapeText(_default) + "\"";
|
||||
} else {
|
||||
|
||||
@@ -26,6 +26,7 @@ import io.swagger.v3.oas.models.media.ArraySchema;
|
||||
import io.swagger.v3.oas.models.media.Schema;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.text.StringEscapeUtils;
|
||||
import org.openapitools.codegen.*;
|
||||
import org.openapitools.codegen.model.ModelMap;
|
||||
import org.openapitools.codegen.model.ModelsMap;
|
||||
@@ -58,6 +59,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
protected boolean returnICollection = false;
|
||||
protected boolean netCoreProjectFileFlag = false;
|
||||
protected boolean nullReferenceTypesFlag = false;
|
||||
protected boolean useSourceGeneration = false;
|
||||
|
||||
protected String modelPropertyNaming = CodegenConstants.MODEL_PROPERTY_NAMING_TYPE.PascalCase.name();
|
||||
|
||||
@@ -415,12 +417,15 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
.put("required", new RequiredParameterLambda())
|
||||
.put("optional", new OptionalParameterLambda().generator(this))
|
||||
.put("joinWithComma", new JoinWithCommaLambda())
|
||||
.put("joinLinesWithComma", new JoinWithCommaLambda(false, "\n", ",\n"))
|
||||
.put("trimLineBreaks", new TrimLineBreaksLambda())
|
||||
.put("trimTrailingWithNewLine", new TrimTrailingWhiteSpaceLambda(true))
|
||||
.put("trimTrailing", new TrimTrailingWhiteSpaceLambda(false))
|
||||
.put("first", new FirstLambda(" "))
|
||||
.put("firstDot", new FirstLambda("\\."))
|
||||
.put("indent3", new IndentedLambda(12, " ", false))
|
||||
.put("indent4", new IndentedLambda(16, " ", false));
|
||||
.put("indent4", new IndentedLambda(16, " ", false))
|
||||
.put("uniqueLinesWithNewLine", new UniqueLambda("\n", true));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1349,6 +1354,14 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
return this.nullReferenceTypesFlag;
|
||||
}
|
||||
|
||||
public void setUseSourceGeneration(final Boolean useSourceGeneration) {
|
||||
this.useSourceGeneration = useSourceGeneration;
|
||||
}
|
||||
|
||||
public boolean getUseSourceGeneration() {
|
||||
return this.useSourceGeneration;
|
||||
}
|
||||
|
||||
public void setInterfacePrefix(final String interfacePrefix) {
|
||||
this.interfacePrefix = interfacePrefix;
|
||||
}
|
||||
@@ -1381,7 +1394,13 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
return value;
|
||||
}
|
||||
|
||||
return escapeText(value);
|
||||
final String partiallyEscaped = value
|
||||
.replace("\n", "\\n")
|
||||
.replace("\t", "\\t")
|
||||
.replace("\r", "\\r")
|
||||
.replaceAll("(?<!\\\\)\"", "\\\\\"");
|
||||
|
||||
return escapeUnsafeCharacters(partiallyEscaped);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -795,7 +795,7 @@ public abstract class AbstractFSharpCodegen extends DefaultCodegen implements Co
|
||||
}
|
||||
} else if (ModelUtils.isStringSchema(p)) {
|
||||
if (p.getDefault() != null) {
|
||||
String _default = (String) p.getDefault();
|
||||
String _default = String.valueOf(p.getDefault());
|
||||
if (p.getEnum() == null) {
|
||||
return "\"" + _default + "\"";
|
||||
} else {
|
||||
@@ -1133,5 +1133,7 @@ public abstract class AbstractFSharpCodegen extends DefaultCodegen implements Co
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeneratorLanguage generatorLanguage() { return GeneratorLanguage.F_SHARP; }
|
||||
public GeneratorLanguage generatorLanguage() {
|
||||
return GeneratorLanguage.F_SHARP;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1062,7 +1062,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
||||
} else { // has default value
|
||||
return toArrayDefaultValue(cp, schema);
|
||||
}
|
||||
} else if (ModelUtils.isMapSchema(schema) && !(schema instanceof ComposedSchema)) {
|
||||
} else if (ModelUtils.isMapSchema(schema) && !(ModelUtils.isComposedSchema(schema))) {
|
||||
if (schema.getProperties() != null && schema.getProperties().size() > 0) {
|
||||
// object is complex object with free-form additional properties
|
||||
if (schema.getDefault() != null) {
|
||||
@@ -1349,8 +1349,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
||||
if (example == null) {
|
||||
example = "null";
|
||||
} else if (Boolean.TRUE.equals(p.isArray)) {
|
||||
|
||||
if (p.items.defaultValue != null) {
|
||||
if (p.items != null && p.items.defaultValue != null) {
|
||||
String innerExample;
|
||||
if ("String".equals(p.items.dataType)) {
|
||||
innerExample = "\"" + p.items.defaultValue + "\"";
|
||||
@@ -1646,11 +1645,11 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
||||
.map(Schema::getProperties))
|
||||
.forEach(schemas -> schemas.replaceAll(
|
||||
(name, s) -> Stream.of(s)
|
||||
.filter(schema -> schema instanceof ComposedSchema)
|
||||
.map(schema -> (ComposedSchema) schema)
|
||||
.filter(schema -> Objects.nonNull(schema.getAnyOf()))
|
||||
.flatMap(schema -> schema.getAnyOf().stream())
|
||||
.filter(schema -> Objects.nonNull(schema.getEnum()))
|
||||
.filter(schema -> ModelUtils.isComposedSchema((Schema) schema))
|
||||
//.map(schema -> (ComposedSchema) schema)
|
||||
.filter(schema -> Objects.nonNull(((Schema) schema).getAnyOf()))
|
||||
.flatMap(schema -> ((Schema) schema).getAnyOf().stream())
|
||||
.filter(schema -> Objects.nonNull(((Schema) schema).getEnum()))
|
||||
.findFirst()
|
||||
.orElse((Schema) s)));
|
||||
}
|
||||
|
||||
@@ -1143,7 +1143,7 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
|
||||
* ModelUtils.isMapSchema
|
||||
* In other generators, isMap is true for all type object schemas
|
||||
*/
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(schema instanceof ComposedSchema)) {
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(ModelUtils.isComposedSchema(schema))) {
|
||||
// passing null to allProperties and allRequired as there's no parent
|
||||
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
|
||||
}
|
||||
|
||||
@@ -454,6 +454,10 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg
|
||||
this.srcBasePath = srcBasePath;
|
||||
}
|
||||
|
||||
public void setTestBasePath(String testBasePath) {
|
||||
this.testBasePath = testBasePath;
|
||||
}
|
||||
|
||||
public void setParameterNamingConvention(String variableNamingConvention) {
|
||||
this.variableNamingConvention = variableNamingConvention;
|
||||
}
|
||||
|
||||
@@ -353,7 +353,7 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
|
||||
|
||||
// correct "'"s into "'"s after toString()
|
||||
if (ModelUtils.isStringSchema(schema) && schema.getDefault() != null && !ModelUtils.isDateSchema(schema) && !ModelUtils.isDateTimeSchema(schema)) {
|
||||
example = (String) schema.getDefault();
|
||||
example = String.valueOf(schema.getDefault());
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(example) && !"null".equals(example)) {
|
||||
@@ -1747,6 +1747,7 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
|
||||
@Override
|
||||
public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<ModelMap> allModels) {
|
||||
hasModelsToImport = false;
|
||||
boolean importAnnotated = false;
|
||||
TreeSet<String> typingImports = new TreeSet<>();
|
||||
TreeSet<String> pydanticImports = new TreeSet<>();
|
||||
TreeSet<String> datetimeImports = new TreeSet<>();
|
||||
@@ -1807,6 +1808,7 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
|
||||
param.vendorExtensions.put("x-py-typing", typing);
|
||||
} else {
|
||||
param.vendorExtensions.put("x-py-typing", String.format(Locale.ROOT, "Annotated[%s, %s]", typing, fieldCustomization));
|
||||
importAnnotated = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1838,6 +1840,12 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
|
||||
|
||||
List<Map<String, String>> newImports = new ArrayList<>();
|
||||
|
||||
if (importAnnotated) {
|
||||
Map<String, String> item = new HashMap<>();
|
||||
item.put("import", String.format(Locale.ROOT, String.format(Locale.ROOT, "from typing_extensions import Annotated")));
|
||||
newImports.add(item);
|
||||
}
|
||||
|
||||
// need datetime import
|
||||
if (!datetimeImports.isEmpty()) {
|
||||
Map<String, String> item = new HashMap<>();
|
||||
|
||||
@@ -204,6 +204,20 @@ abstract public class AbstractRubyCodegen extends DefaultCodegen implements Code
|
||||
return addRegularExpressionDelimiter(pattern);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String addRegularExpressionDelimiter(String pattern) {
|
||||
if (StringUtils.isEmpty(pattern)) {
|
||||
return pattern;
|
||||
}
|
||||
|
||||
if (!pattern.matches("^/.*")) {
|
||||
// Perform a negative lookbehind on each `/` to ensure that it is escaped.
|
||||
return "/" + pattern.replaceAll("(?<!\\\\)\\/", "\\\\/") + "/";
|
||||
}
|
||||
|
||||
return pattern;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toParamName(String name) {
|
||||
// obtain the name from parameterNameMapping directly if provided
|
||||
|
||||
@@ -1135,21 +1135,21 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toAnyOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toAnyOfName(List<String> names, Schema composedSchema) {
|
||||
List<String> types = getTypesFromSchemas(composedSchema.getAnyOf());
|
||||
|
||||
return String.join(" | ", types);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toOneOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toOneOfName(List<String> names, Schema composedSchema) {
|
||||
List<String> types = getTypesFromSchemas(composedSchema.getOneOf());
|
||||
|
||||
return String.join(" | ", types);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toAllOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toAllOfName(List<String> names, Schema composedSchema) {
|
||||
List<String> types = getTypesFromSchemas(composedSchema.getAllOf());
|
||||
|
||||
return String.join(" & ", types);
|
||||
|
||||
@@ -233,8 +233,10 @@ public class ApexClientCodegen extends AbstractApexCodegen {
|
||||
// true => "true", false => "false", null => "null"
|
||||
out = String.valueOf(p.getDefault());
|
||||
} else if (ModelUtils.isLongSchema(p)) {
|
||||
Long def = (Long) p.getDefault();
|
||||
out = def == null ? out : def + "L";
|
||||
if (p.getDefault() != null) {
|
||||
Long def = Long.parseLong(String.valueOf(p.getDefault()));
|
||||
out = def == null ? out : def + "L";
|
||||
}
|
||||
} else if (ModelUtils.isMapSchema(p)) {
|
||||
Schema inner = ModelUtils.getAdditionalProperties(p);
|
||||
String s = inner == null ? "Object" : getTypeDeclaration(inner);
|
||||
@@ -313,7 +315,7 @@ public class ApexClientCodegen extends AbstractApexCodegen {
|
||||
supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore"));
|
||||
|
||||
supportingFiles.add(new SupportingFile("README_ant.mustache", "README.md")
|
||||
.doNotOverwrite());
|
||||
.doNotOverwrite());
|
||||
|
||||
}
|
||||
|
||||
@@ -323,10 +325,12 @@ public class ApexClientCodegen extends AbstractApexCodegen {
|
||||
supportingFiles.add(new SupportingFile("sfdx-project.json.mustache", "sfdx-project.json"));
|
||||
|
||||
supportingFiles.add(new SupportingFile("README_sfdx.mustache", "README.md")
|
||||
.doNotOverwrite());
|
||||
.doNotOverwrite());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeneratorLanguage generatorLanguage() { return GeneratorLanguage.APEX; }
|
||||
public GeneratorLanguage generatorLanguage() {
|
||||
return GeneratorLanguage.APEX;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -426,7 +426,7 @@ public class CLibcurlClientCodegen extends DefaultCodegen implements CodegenConf
|
||||
}
|
||||
} else if (ModelUtils.isStringSchema(p)) {
|
||||
if (p.getDefault() != null) {
|
||||
return "'" + escapeText((String) p.getDefault()) + "'";
|
||||
return "'" + escapeText(String.valueOf(p.getDefault())) + "'";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -444,7 +444,7 @@ public class CLibcurlClientCodegen extends DefaultCodegen implements CodegenConf
|
||||
}
|
||||
// correct "'"s into "'"s after toString()
|
||||
if (ModelUtils.isStringSchema(schema) && schema.getDefault() != null) {
|
||||
example = (String) schema.getDefault();
|
||||
example = String.valueOf(schema.getDefault());
|
||||
}
|
||||
if (StringUtils.isNotBlank(example) && !"null".equals(example)) {
|
||||
if (ModelUtils.isStringSchema(schema)) {
|
||||
@@ -939,5 +939,7 @@ public class CLibcurlClientCodegen extends DefaultCodegen implements CodegenConf
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeneratorLanguage generatorLanguage() { return GeneratorLanguage.C; }
|
||||
public GeneratorLanguage generatorLanguage() {
|
||||
return GeneratorLanguage.C;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,6 +322,10 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
CodegenConstants.EQUATABLE_DESC,
|
||||
this.equatable);
|
||||
|
||||
addSwitch("useSourceGeneration",
|
||||
"Use source generation where available (only `generichost` library supports this option).",
|
||||
this.getUseSourceGeneration());
|
||||
|
||||
supportedLibraries.put(GENERICHOST, "HttpClient with Generic Host dependency injection (https://docs.microsoft.com/en-us/dotnet/core/extensions/generic-host) "
|
||||
+ "(Experimental. Subject to breaking changes without notice.)");
|
||||
supportedLibraries.put(HTTPCLIENT, "HttpClient (https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient) "
|
||||
@@ -788,6 +792,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
syncBooleanProperty(additionalProperties, CodegenConstants.NON_PUBLIC_API, this::setNonPublicApi, isNonPublicApi());
|
||||
syncBooleanProperty(additionalProperties, CodegenConstants.USE_ONEOF_DISCRIMINATOR_LOOKUP, this::setUseOneOfDiscriminatorLookup, this.useOneOfDiscriminatorLookup);
|
||||
syncBooleanProperty(additionalProperties, "supportsFileParameters", this::setSupportsFileParameters, this.supportsFileParameters);
|
||||
syncBooleanProperty(additionalProperties, "useSourceGeneration", this::setUseSourceGeneration, this.useSourceGeneration);
|
||||
|
||||
final String testPackageName = testPackageName();
|
||||
String packageFolder = sourceFolder + File.separator + packageName;
|
||||
@@ -855,6 +860,14 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
this.setTypeMapping();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUseSourceGeneration(final Boolean useSourceGeneration) {
|
||||
if (useSourceGeneration && !this.additionalProperties.containsKey(NET_70_OR_LATER)) {
|
||||
throw new RuntimeException("Source generation is only compatible with .Net 7 or later.");
|
||||
}
|
||||
this.useSourceGeneration = useSourceGeneration;
|
||||
}
|
||||
|
||||
public void setClientPackage(String clientPackage) {
|
||||
this.clientPackage = clientPackage;
|
||||
}
|
||||
@@ -1618,7 +1631,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
* ModelUtils.isMapSchema
|
||||
* In other generators, isMap is true for all type object schemas
|
||||
*/
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(schema instanceof ComposedSchema)) {
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(ModelUtils.isComposedSchema(schema))) {
|
||||
// passing null to allProperties and allRequired as there's no parent
|
||||
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
|
||||
}
|
||||
|
||||
@@ -1142,7 +1142,7 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
|
||||
* ModelUtils.isMapSchema
|
||||
* In other generators, isMap is true for all type object schemas
|
||||
*/
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(schema instanceof ComposedSchema)) {
|
||||
if (schema.getProperties() != null || schema.getRequired() != null && !(ModelUtils.isComposedSchema(schema))) {
|
||||
// passing null to allProperties and allRequired as there's no parent
|
||||
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
|
||||
}
|
||||
|
||||
@@ -413,10 +413,7 @@ public class GoClientCodegen extends AbstractGoCodegen {
|
||||
if (ModelUtils.isStringSchema(p) || isAllOfStringSchema(p)) {
|
||||
Object defaultObj = p.getDefault();
|
||||
if (defaultObj != null) {
|
||||
if (defaultObj instanceof java.lang.String) {
|
||||
return "\"" + escapeText((String) defaultObj) + "\"";
|
||||
}
|
||||
return "\"" + escapeText(defaultObj.toString()) + "\"";
|
||||
return "\"" + escapeText(String.valueOf(defaultObj)) + "\"";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1233,7 +1233,7 @@ public class JavascriptApolloClientCodegen extends DefaultCodegen implements Cod
|
||||
public GeneratorLanguage generatorLanguage() { return GeneratorLanguage.JAVASCRIPT; }
|
||||
|
||||
@Override
|
||||
protected void addImport(ComposedSchema composed, Schema childSchema, CodegenModel model, String modelName ) {
|
||||
protected void addImport(Schema composed, Schema childSchema, CodegenModel model, String modelName ) {
|
||||
// import everything (including child schema of a composed schema)
|
||||
addImport(model, modelName);
|
||||
}
|
||||
|
||||
@@ -1242,7 +1242,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addImport(ComposedSchema composed, Schema childSchema, CodegenModel model, String modelName) {
|
||||
protected void addImport(Schema composed, Schema childSchema, CodegenModel model, String modelName) {
|
||||
// import everything (including child schema of a composed schema)
|
||||
addImport(model, modelName);
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
|
||||
private boolean useCoroutines = false;
|
||||
private boolean useMutiny = false;
|
||||
private boolean returnResponse = false;
|
||||
private boolean omitGradleWrapper = false;
|
||||
|
||||
// This is here to potentially warn the user when an option is not supported by the target framework.
|
||||
private Map<String, List<String>> optionsSupportedPerFramework = new ImmutableMap.Builder<String, List<String>>()
|
||||
@@ -60,7 +61,8 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
|
||||
Constants.CORS,
|
||||
Constants.COMPRESSION,
|
||||
Constants.RESOURCES,
|
||||
Constants.METRICS
|
||||
Constants.METRICS,
|
||||
Constants.OMIT_GRADLE_WRAPPER
|
||||
))
|
||||
.put(Constants.JAXRS_SPEC, Arrays.asList(
|
||||
USE_BEANVALIDATION,
|
||||
@@ -132,6 +134,7 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
|
||||
addSwitch(Constants.USE_COROUTINES, Constants.USE_COROUTINES_DESC, useCoroutines);
|
||||
addSwitch(Constants.USE_MUTINY, Constants.USE_MUTINY_DESC, useMutiny);
|
||||
addSwitch(Constants.RETURN_RESPONSE, Constants.RETURN_RESPONSE_DESC, returnResponse);
|
||||
addSwitch(Constants.OMIT_GRADLE_WRAPPER, Constants.OMIT_GRADLE_WRAPPER_DESC, omitGradleWrapper);
|
||||
addSwitch(USE_JAKARTA_EE, Constants.USE_JAKARTA_EE_DESC, useJakartaEe);
|
||||
}
|
||||
|
||||
@@ -183,6 +186,14 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
|
||||
return resourcesFeatureEnabled;
|
||||
}
|
||||
|
||||
public boolean getOmitGradleWrapper() {
|
||||
return omitGradleWrapper;
|
||||
}
|
||||
|
||||
public void setOmitGradleWrapper(boolean omitGradleWrapper) {
|
||||
this.omitGradleWrapper = omitGradleWrapper;
|
||||
}
|
||||
|
||||
public void setResourcesFeatureEnabled(Boolean resourcesFeatureEnabled) {
|
||||
this.resourcesFeatureEnabled = resourcesFeatureEnabled;
|
||||
}
|
||||
@@ -247,6 +258,10 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
|
||||
setUseBeanValidation(convertPropertyToBoolean(USE_BEANVALIDATION));
|
||||
}
|
||||
|
||||
if (additionalProperties.containsKey(Constants.OMIT_GRADLE_WRAPPER)) {
|
||||
setOmitGradleWrapper(Boolean.parseBoolean(additionalProperties.get(Constants.OMIT_GRADLE_WRAPPER).toString()));
|
||||
}
|
||||
|
||||
writePropertyBack(USE_BEANVALIDATION, useBeanValidation);
|
||||
|
||||
// set default library to "ktor"
|
||||
@@ -360,6 +375,8 @@ public class KotlinServerCodegen extends AbstractKotlinCodegen implements BeanVa
|
||||
public static final String USE_JAKARTA_EE_DESC = "whether to use Jakarta EE namespace instead of javax";
|
||||
public static final String USE_MUTINY = "useMutiny";
|
||||
public static final String USE_MUTINY_DESC = "Whether to use Mutiny (should not be used with useCoroutines). This option is currently supported only when using jaxrs-spec library.";
|
||||
public static final String OMIT_GRADLE_WRAPPER = "omitGradleWrapper";
|
||||
public static final String OMIT_GRADLE_WRAPPER_DESC = "Whether to omit Gradle wrapper for creating a sub project.";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -239,6 +239,11 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig {
|
||||
|
||||
@Override
|
||||
public String toVarName(String name) {
|
||||
// obtain the name from nameMapping directly if provided
|
||||
if (nameMapping.containsKey(name)) {
|
||||
return nameMapping.get(name);
|
||||
}
|
||||
|
||||
// replace - with _ e.g. created-at => created_at
|
||||
name = sanitizeName(name.replaceAll("-", "_"));
|
||||
|
||||
@@ -263,6 +268,11 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig {
|
||||
|
||||
@Override
|
||||
public String toParamName(String name) {
|
||||
// obtain the name from parameterNameMapping directly if provided
|
||||
if (parameterNameMapping.containsKey(name)) {
|
||||
return parameterNameMapping.get(name);
|
||||
}
|
||||
|
||||
return toVarName(name);
|
||||
}
|
||||
|
||||
@@ -273,6 +283,11 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig {
|
||||
|
||||
@Override
|
||||
public String toModelFilename(String name) {
|
||||
// obtain the name from modelNameMapping directly if provided
|
||||
if (modelNameMapping.containsKey(name)) {
|
||||
return modelNameMapping.get(name);
|
||||
}
|
||||
|
||||
if (!StringUtils.isEmpty(modelNamePrefix)) {
|
||||
name = modelNamePrefix + "_" + name;
|
||||
}
|
||||
|
||||
@@ -266,19 +266,19 @@ public class N4jsClientCodegen extends DefaultCodegen implements CodegenConfig {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toAnyOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toAnyOfName(List<String> names, Schema composedSchema) {
|
||||
List<String> types = getTypesFromSchemas(composedSchema.getAnyOf());
|
||||
return String.join(" | ", types);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toOneOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toOneOfName(List<String> names, Schema composedSchema) {
|
||||
List<String> types = getTypesFromSchemas(composedSchema.getOneOf());
|
||||
return String.join(" | ", types);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toAllOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toAllOfName(List<String> names, Schema composedSchema) {
|
||||
List<String> types = getTypesFromSchemas(composedSchema.getAllOf());
|
||||
return String.join(" & ", types);
|
||||
}
|
||||
|
||||
@@ -317,6 +317,11 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig {
|
||||
|
||||
@Override
|
||||
public String toVarName(String name) {
|
||||
// obtain the name from nameMapping directly if provided
|
||||
if (nameMapping.containsKey(name)) {
|
||||
return nameMapping.get(name);
|
||||
}
|
||||
|
||||
// return the name in underscore style
|
||||
// PhoneNumber => phone_number
|
||||
name = underscore(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'.
|
||||
@@ -331,12 +336,22 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig {
|
||||
|
||||
@Override
|
||||
public String toParamName(String name) {
|
||||
// obtain the name from parameterNameMapping directly if provided
|
||||
if (parameterNameMapping.containsKey(name)) {
|
||||
return parameterNameMapping.get(name);
|
||||
}
|
||||
|
||||
// should be the same as variable name
|
||||
return toVarName(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toModelName(String name) {
|
||||
// obtain the name from modelNameMapping directly if provided
|
||||
if (modelNameMapping.containsKey(name)) {
|
||||
return modelNameMapping.get(name);
|
||||
}
|
||||
|
||||
// We need to check if schema-mapping has a different model for this class, so we use it
|
||||
// instead of the auto-generated one.
|
||||
if (schemaMapping.containsKey(name)) {
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
|
||||
* Copyright 2018 SmartBear Software
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openapitools.codegen.languages;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.openapitools.codegen.CliOption;
|
||||
import org.openapitools.codegen.CodegenConstants;
|
||||
import org.openapitools.codegen.CodegenModel;
|
||||
import org.openapitools.codegen.CodegenType;
|
||||
import org.openapitools.codegen.SupportingFile;
|
||||
import org.openapitools.codegen.meta.GeneratorMetadata;
|
||||
import org.openapitools.codegen.meta.Stability;
|
||||
import org.openapitools.codegen.meta.features.*;
|
||||
import org.openapitools.codegen.model.ModelMap;
|
||||
import org.openapitools.codegen.model.ModelsMap;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class PhpNextgenClientCodegen extends AbstractPhpCodegen {
|
||||
@SuppressWarnings("hiding")
|
||||
private final Logger LOGGER = LoggerFactory.getLogger(PhpNextgenClientCodegen.class);
|
||||
|
||||
public PhpNextgenClientCodegen() {
|
||||
super();
|
||||
|
||||
// override default src and test folders to comply PSD skeleton
|
||||
setSrcBasePath("src");
|
||||
setTestBasePath("tests");
|
||||
|
||||
// mark as beta so far
|
||||
this.generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata)
|
||||
.stability(Stability.BETA).build();
|
||||
|
||||
modifyFeatureSet(features -> features
|
||||
.includeDocumentationFeatures(DocumentationFeature.Readme)
|
||||
.wireFormatFeatures(EnumSet.of(WireFormatFeature.JSON, WireFormatFeature.XML))
|
||||
.securityFeatures(EnumSet.noneOf(SecurityFeature.class))
|
||||
.excludeGlobalFeatures(
|
||||
GlobalFeature.XMLStructureDefinitions,
|
||||
GlobalFeature.Callbacks,
|
||||
GlobalFeature.LinkObjects,
|
||||
GlobalFeature.ParameterStyling
|
||||
)
|
||||
.excludeSchemaSupportFeatures(
|
||||
SchemaSupportFeature.Polymorphism
|
||||
)
|
||||
);
|
||||
|
||||
// clear import mapping (from default generator) as php does not use it
|
||||
// at the moment
|
||||
importMapping.clear();
|
||||
|
||||
setInvokerPackage("OpenAPI\\Client");
|
||||
setApiPackage(getInvokerPackage() + "\\" + apiDirName);
|
||||
setModelPackage(getInvokerPackage() + "\\" + modelDirName);
|
||||
setPackageName("OpenAPIClient-php");
|
||||
supportsInheritance = true;
|
||||
setOutputDir("generated-code" + File.separator + "php");
|
||||
modelTestTemplateFiles.put("model_test.mustache", ".php");
|
||||
embeddedTemplateDir = templateDir = "php-nextgen";
|
||||
|
||||
// default HIDE_GENERATION_TIMESTAMP to true
|
||||
hideGenerationTimestamp = Boolean.TRUE;
|
||||
|
||||
// provide primitives to mustache template
|
||||
List sortedLanguageSpecificPrimitives = new ArrayList(languageSpecificPrimitives);
|
||||
Collections.sort(sortedLanguageSpecificPrimitives);
|
||||
String primitives = "'" + StringUtils.join(sortedLanguageSpecificPrimitives, "', '") + "'";
|
||||
additionalProperties.put("primitives", primitives);
|
||||
|
||||
cliOptions.add(new CliOption(CodegenConstants.HIDE_GENERATION_TIMESTAMP, CodegenConstants.ALLOW_UNICODE_IDENTIFIERS_DESC)
|
||||
.defaultValue(Boolean.TRUE.toString()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CodegenType getTag() {
|
||||
return CodegenType.CLIENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "php-nextgen";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp() {
|
||||
return "Generates a PHP client library (beta).";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processOpts() {
|
||||
super.processOpts();
|
||||
|
||||
supportingFiles.add(new SupportingFile("ApiException.mustache", toSrcPath(invokerPackage, srcBasePath), "ApiException.php"));
|
||||
supportingFiles.add(new SupportingFile("Configuration.mustache", toSrcPath(invokerPackage, srcBasePath), "Configuration.php"));
|
||||
supportingFiles.add(new SupportingFile("ObjectSerializer.mustache", toSrcPath(invokerPackage, srcBasePath), "ObjectSerializer.php"));
|
||||
supportingFiles.add(new SupportingFile("ModelInterface.mustache", toSrcPath(modelPackage, srcBasePath), "ModelInterface.php"));
|
||||
supportingFiles.add(new SupportingFile("HeaderSelector.mustache", toSrcPath(invokerPackage, srcBasePath), "HeaderSelector.php"));
|
||||
supportingFiles.add(new SupportingFile("composer.mustache", "", "composer.json"));
|
||||
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
|
||||
supportingFiles.add(new SupportingFile("phpunit.xml.mustache", "", "phpunit.xml.dist"));
|
||||
supportingFiles.add(new SupportingFile(".travis.yml", "", ".travis.yml"));
|
||||
supportingFiles.add(new SupportingFile(".php-cs-fixer.dist.php", "", ".php-cs-fixer.dist.php"));
|
||||
supportingFiles.add(new SupportingFile(".phplint.mustache", "", ".phplint.yml"));
|
||||
supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs) {
|
||||
final Map<String, ModelsMap> processed = super.postProcessAllModels(objs);
|
||||
|
||||
for (Map.Entry<String, ModelsMap> entry : processed.entrySet()) {
|
||||
entry.setValue(postProcessModelsMap(entry.getValue()));
|
||||
}
|
||||
|
||||
return processed;
|
||||
}
|
||||
|
||||
private ModelsMap postProcessModelsMap(ModelsMap objs) {
|
||||
for (ModelMap m : objs.getModels()) {
|
||||
CodegenModel model = m.getModel();
|
||||
|
||||
if (model.isEnum) {
|
||||
for (Map<String, Object> enumVars : (List<Map<String, Object>>) model.getAllowableValues().get("enumVars")) {
|
||||
if ((Boolean) enumVars.get("isString")) {
|
||||
model.vendorExtensions.putIfAbsent("x-php-enum-type", "string");
|
||||
} else {
|
||||
model.vendorExtensions.putIfAbsent("x-php-enum-type", "int");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return objs;
|
||||
}
|
||||
}
|
||||
@@ -43,9 +43,9 @@ import static org.openapitools.codegen.utils.StringUtils.camelize;
|
||||
|
||||
public class PowerShellClientCodegen extends DefaultCodegen implements CodegenConfig {
|
||||
private final Logger LOGGER = LoggerFactory.getLogger(PowerShellClientCodegen.class);
|
||||
|
||||
private String packageGuid = "{" + randomUUID().toString().toUpperCase(Locale.ROOT) + "}";
|
||||
|
||||
|
||||
protected String sourceFolder = "src";
|
||||
protected String packageName = "PSOpenAPITools";
|
||||
protected String packageVersion = "0.1.2";
|
||||
@@ -910,6 +910,11 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo
|
||||
*/
|
||||
@Override
|
||||
public String toModelName(String name) {
|
||||
// obtain the name from modelNameMapping directly if provided
|
||||
if (modelNameMapping.containsKey(name)) {
|
||||
return modelNameMapping.get(name);
|
||||
}
|
||||
|
||||
// check if schema-mapping has a different model for this class, so we can use it
|
||||
// instead of the auto-generated one.
|
||||
if (schemaMapping.containsKey(name)) {
|
||||
@@ -1016,6 +1021,11 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo
|
||||
|
||||
@Override
|
||||
public String toParamName(String name) {
|
||||
// obtain the name from parameterNameMapping directly if provided
|
||||
if (parameterNameMapping.containsKey(name)) {
|
||||
return parameterNameMapping.get(name);
|
||||
}
|
||||
|
||||
// sanitize and camelize parameter name
|
||||
// pet_id => PetId
|
||||
name = camelize(sanitizeName(name));
|
||||
@@ -1148,6 +1158,11 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo
|
||||
|
||||
@Override
|
||||
public String toVarName(String name) {
|
||||
// obtain the name from nameMapping directly if provided
|
||||
if (nameMapping.containsKey(name)) {
|
||||
return nameMapping.get(name);
|
||||
}
|
||||
|
||||
// sanitize name
|
||||
name = sanitizeName(name);
|
||||
|
||||
|
||||
@@ -235,9 +235,9 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf
|
||||
}
|
||||
|
||||
if (allowableValues.containsKey("values")) {
|
||||
List<String> values = (List<String>) allowableValues.get("values");
|
||||
for (String value : values) {
|
||||
value = prefix + "_" + value;
|
||||
List<Object> values = (List<Object>) allowableValues.get("values");
|
||||
for (Object value : values) {
|
||||
value = prefix + "_" + String.valueOf(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -435,7 +435,7 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf
|
||||
}
|
||||
} else if (ModelUtils.isStringSchema(p)) {
|
||||
if (p.getDefault() != null) {
|
||||
if (Pattern.compile("\r\n|\r|\n").matcher((String) p.getDefault()).find())
|
||||
if (Pattern.compile("\r\n|\r|\n").matcher(String.valueOf(p.getDefault())).find())
|
||||
return "'''" + p.getDefault() + "'''";
|
||||
else
|
||||
return "'" + p.getDefault() + "'";
|
||||
|
||||
@@ -1236,7 +1236,7 @@ public class RustServerCodegen extends AbstractRustCodegen implements CodegenCon
|
||||
}
|
||||
} else if (ModelUtils.isStringSchema(p)) {
|
||||
if (p.getDefault() != null) {
|
||||
defaultValue = "\"" + (String) p.getDefault() + "\".to_string()";
|
||||
defaultValue = "\"" + String.valueOf(p.getDefault()) + "\".to_string()";
|
||||
}
|
||||
}
|
||||
if ((defaultValue != null) && (ModelUtils.isNullable(p)))
|
||||
@@ -1245,7 +1245,7 @@ public class RustServerCodegen extends AbstractRustCodegen implements CodegenCon
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toOneOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toOneOfName(List<String> names, Schema composedSchema) {
|
||||
List<Schema> schemas = ModelUtils.getInterfaces(composedSchema);
|
||||
|
||||
List<String> types = new ArrayList<>();
|
||||
@@ -1256,7 +1256,7 @@ public class RustServerCodegen extends AbstractRustCodegen implements CodegenCon
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toAnyOfName(List<String> names, ComposedSchema composedSchema) {
|
||||
public String toAnyOfName(List<String> names, Schema composedSchema) {
|
||||
List<Schema> schemas = ModelUtils.getInterfaces(composedSchema);
|
||||
|
||||
List<String> types = new ArrayList<>();
|
||||
|
||||
@@ -396,9 +396,9 @@ public class SwiftCombineClientCodegen extends DefaultCodegen implements Codegen
|
||||
if (p.getEnum() != null && !p.getEnum().isEmpty()) {
|
||||
if (p.getDefault() != null) {
|
||||
if (ModelUtils.isStringSchema(p)) {
|
||||
return "." + toEnumVarName(escapeText((String) p.getDefault()), p.getType());
|
||||
return "." + toEnumVarName(escapeText(String.valueOf(p.getDefault())), p.getType());
|
||||
} else {
|
||||
return "." + toEnumVarName(escapeText(p.getDefault().toString()), p.getType());
|
||||
return "." + toEnumVarName(escapeText(String.valueOf(p.getDefault())), p.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -412,9 +412,9 @@ public class SwiftCombineClientCodegen extends DefaultCodegen implements Codegen
|
||||
long epochMicro = TimeUnit.SECONDS.toMicros(instant.getEpochSecond()) + (instant.get(ChronoField.MICRO_OF_SECOND));
|
||||
return "Date(timeIntervalSince1970: " + String.valueOf(epochMicro) + ".0 / 1_000_000)";
|
||||
} else if (ModelUtils.isUUIDSchema(p)) {
|
||||
return "\"" + escapeText(p.getDefault().toString()) + "\"";
|
||||
return "\"" + escapeText(String.valueOf(p.getDefault())) + "\"";
|
||||
} else if (ModelUtils.isStringSchema(p)) {
|
||||
return "\"" + escapeText((String) p.getDefault()) + "\"";
|
||||
return "\"" + escapeText(String.valueOf(p.getDefault())) + "\"";
|
||||
}
|
||||
// TODO: Handle more cases from `ModelUtils`, such as Date
|
||||
}
|
||||
|
||||
@@ -313,7 +313,7 @@ public class TypeScriptAxiosClientCodegen extends AbstractTypeScriptClientCodege
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addImport(ComposedSchema composed, Schema childSchema, CodegenModel model, String modelName) {
|
||||
protected void addImport(Schema composed, Schema childSchema, CodegenModel model, String modelName) {
|
||||
// import everything (including child schema of a composed schema)
|
||||
addImport(model, modelName);
|
||||
}
|
||||
|
||||
@@ -502,7 +502,7 @@ public class TypeScriptClientCodegen extends AbstractTypeScriptClientCodegen imp
|
||||
|
||||
@Override
|
||||
protected void addAdditionPropertiesToCodeGenModel(CodegenModel codegenModel, Schema schema) {
|
||||
codegenModel.additionalPropertiesType = getTypeDeclaration((Schema) schema.getAdditionalProperties());
|
||||
codegenModel.additionalPropertiesType = getSchemaType(ModelUtils.getAdditionalProperties(schema));
|
||||
addImport(codegenModel, codegenModel.additionalPropertiesType);
|
||||
}
|
||||
|
||||
|
||||
@@ -423,7 +423,7 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addImport(ComposedSchema composed, Schema childSchema, CodegenModel model, String modelName) {
|
||||
protected void addImport(Schema composed, Schema childSchema, CodegenModel model, String modelName) {
|
||||
// import everything (including child schema of a composed schema)
|
||||
addImport(model, modelName);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2018 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
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openapitools.codegen.templating.mustache;
|
||||
|
||||
import com.samskivert.mustache.Mustache;
|
||||
import com.samskivert.mustache.Template;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import static org.openapitools.codegen.utils.StringUtils.underscore;
|
||||
|
||||
/**
|
||||
* Replaces forward slash with backslash in the text.
|
||||
*
|
||||
* Register:
|
||||
* <pre>
|
||||
* additionalProperties.put("backslash", new BackSlashLambda());
|
||||
* </pre>
|
||||
*
|
||||
* Use:
|
||||
* <pre>
|
||||
* {{#backslash}}{{summary}}{{/backslash}}
|
||||
* </pre>
|
||||
*/
|
||||
public class BackSlashLambda implements Mustache.Lambda {
|
||||
@Override
|
||||
public void execute(Template.Fragment fragment, Writer writer) throws IOException {
|
||||
writer.write(fragment.execute()
|
||||
.replace("/", "\\"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright 2018 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
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openapitools.codegen.templating.mustache;
|
||||
|
||||
import com.samskivert.mustache.Mustache;
|
||||
import com.samskivert.mustache.Template;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import static org.openapitools.codegen.utils.StringUtils.underscore;
|
||||
|
||||
/**
|
||||
* Replaces backslash with forward slash in the text.
|
||||
*
|
||||
* Register:
|
||||
* <pre>
|
||||
* additionalProperties.put("forwardslash", new ForwardSlashLambda());
|
||||
* </pre>
|
||||
*
|
||||
* Use:
|
||||
* <pre>
|
||||
* {{#fforwardslash}}{{summary}}{{/forwardslash}}
|
||||
* </pre>
|
||||
*/
|
||||
public class ForwardSlashLambda implements Mustache.Lambda {
|
||||
@Override
|
||||
public void execute(Template.Fragment fragment, Writer writer) throws IOException {
|
||||
writer.write(fragment.execute()
|
||||
.replace("\\/", "/")
|
||||
.replace("\\", "/")
|
||||
.replace("//", "/"));
|
||||
}
|
||||
}
|
||||
@@ -109,7 +109,8 @@ public class IndentedLambda implements Mustache.Lambda {
|
||||
|
||||
String prefixedIndention = StringUtils.repeat(new String(Character.toChars(spaceCode)), prefixSpaceCount);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String[] lines = text.split(System.lineSeparator());
|
||||
// use \n instead of System.lineSeparator (e.g. \r\n in Windows) as templates use \n
|
||||
String[] lines = text.split("\n");
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
String line = lines[i];
|
||||
// Mustache will apply correct indentation to the first line of a template (to match declaration location).
|
||||
@@ -121,9 +122,9 @@ public class IndentedLambda implements Mustache.Lambda {
|
||||
|
||||
sb.append(line);
|
||||
|
||||
// We've split on the system's line separator. We don't want to add an additional trailing line.
|
||||
// We've split on \n. We don't want to add an additional trailing line.
|
||||
if (i < lines.length - 1) {
|
||||
sb.append(System.lineSeparator());
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
writer.write(sb.toString());
|
||||
|
||||
@@ -38,15 +38,29 @@ import java.io.Writer;
|
||||
*/
|
||||
public class JoinWithCommaLambda implements Mustache.Lambda {
|
||||
|
||||
public JoinWithCommaLambda() {
|
||||
private final String delimit;
|
||||
private final String coalesce;
|
||||
private final boolean trimInput;
|
||||
|
||||
public JoinWithCommaLambda() {
|
||||
this.delimit = " ";
|
||||
this.coalesce = ", ";
|
||||
this.trimInput = true;
|
||||
}
|
||||
|
||||
public JoinWithCommaLambda(boolean trimInput, String delimit, String coalesce) {
|
||||
this.delimit = delimit;
|
||||
this.coalesce = coalesce;
|
||||
this.trimInput = trimInput;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void execute(Template.Fragment fragment, Writer writer) throws IOException {
|
||||
String[] substr = fragment.execute().trim().split(" ");
|
||||
String[] input = this.trimInput
|
||||
? fragment.execute().trim().split(delimit)
|
||||
: fragment.execute().split(delimit);
|
||||
|
||||
writer.write(String.join(", ", substr));
|
||||
writer.write(String.join(coalesce, input));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 2018 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
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.openapitools.codegen.templating.mustache;
|
||||
|
||||
import com.samskivert.mustache.Mustache;
|
||||
import com.samskivert.mustache.Template;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Split text by the delimiter and then write only the unique entries
|
||||
*
|
||||
* Register:
|
||||
* <pre>
|
||||
* additionalProperties.put("unique", new UniqueLambda());
|
||||
* </pre>
|
||||
*
|
||||
* Use:
|
||||
* <pre>
|
||||
* {{#unique}}{{name}}{{/unique}}
|
||||
* </pre>
|
||||
*/
|
||||
public class UniqueLambda implements Mustache.Lambda {
|
||||
private final String delimiter;
|
||||
private final boolean withNewLine;
|
||||
|
||||
public UniqueLambda(String delimiter, boolean withNewLine)
|
||||
{
|
||||
this.delimiter = delimiter;
|
||||
this.withNewLine = withNewLine;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Template.Fragment fragment, Writer writer) throws IOException {
|
||||
|
||||
String[] parts = fragment.execute().split(this.delimiter);
|
||||
|
||||
List<String> uniqueLines = Arrays.stream(parts).distinct().collect(Collectors.toList());
|
||||
|
||||
writer.write(String.join(delimiter, uniqueLines));
|
||||
|
||||
if (withNewLine) {
|
||||
writer.write("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -331,20 +331,20 @@ public class ModelUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (schema instanceof ComposedSchema) {
|
||||
List<Schema> oneOf = ((ComposedSchema) schema).getOneOf();
|
||||
if (isComposedSchema(schema)) {
|
||||
List<Schema> oneOf = schema.getOneOf();
|
||||
if (oneOf != null) {
|
||||
for (Schema s : oneOf) {
|
||||
visitSchema(openAPI, s, mimeType, visitedSchemas, visitor);
|
||||
}
|
||||
}
|
||||
List<Schema> allOf = ((ComposedSchema) schema).getAllOf();
|
||||
List<Schema> allOf = schema.getAllOf();
|
||||
if (allOf != null) {
|
||||
for (Schema s : allOf) {
|
||||
visitSchema(openAPI, s, mimeType, visitedSchemas, visitor);
|
||||
}
|
||||
}
|
||||
List<Schema> anyOf = ((ComposedSchema) schema).getAnyOf();
|
||||
List<Schema> anyOf = schema.getAnyOf();
|
||||
if (anyOf != null) {
|
||||
for (Schema s : anyOf) {
|
||||
visitSchema(openAPI, s, mimeType, visitedSchemas, visitor);
|
||||
@@ -367,7 +367,7 @@ public class ModelUtils {
|
||||
Map<String, Schema> properties = schema.getProperties();
|
||||
if (properties != null) {
|
||||
for (Schema property : properties.values()) {
|
||||
visitSchema(openAPI, property, mimeType, visitedSchemas, visitor);
|
||||
visitSchema(openAPI, property, null, visitedSchemas, visitor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -453,7 +453,32 @@ public class ModelUtils {
|
||||
* @return true if the specified schema is a Composed schema.
|
||||
*/
|
||||
public static boolean isComposedSchema(Schema schema) {
|
||||
return schema instanceof ComposedSchema;
|
||||
if (schema == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// in 3.0, ComposeSchema is used for anyOf/oneOf/allOf
|
||||
// in 3.1, it's not the case so we need more checks below
|
||||
if (schema instanceof ComposedSchema) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// has oneOf
|
||||
if (schema.getOneOf() != null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// has anyOf
|
||||
if (schema.getAnyOf() != null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// has allOf
|
||||
if (schema.getAllOf() != null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -678,7 +703,8 @@ public class ModelUtils {
|
||||
// has properties
|
||||
((null != schema.getProperties() && !schema.getProperties().isEmpty())
|
||||
// composed schema is a model, consider very simple ObjectSchema a model
|
||||
|| (schema instanceof ComposedSchema || schema instanceof ObjectSchema));
|
||||
|| isComposedSchema(schema)
|
||||
|| schema instanceof ObjectSchema);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -752,9 +778,8 @@ public class ModelUtils {
|
||||
}
|
||||
|
||||
// not free-form if allOf, anyOf, oneOf is not empty
|
||||
if (schema instanceof ComposedSchema) {
|
||||
ComposedSchema cs = (ComposedSchema) schema;
|
||||
List<Schema> interfaces = ModelUtils.getInterfaces(cs);
|
||||
if (isComposedSchema(schema)) {
|
||||
List<Schema> interfaces = ModelUtils.getInterfaces(schema);
|
||||
if (interfaces != null && !interfaces.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
@@ -1053,8 +1078,8 @@ public class ModelUtils {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (schema instanceof ComposedSchema) {
|
||||
List<Schema> oneOf = ((ComposedSchema) schema).getOneOf();
|
||||
if (isComposedSchema(schema)) {
|
||||
List<Schema> oneOf = schema.getOneOf();
|
||||
if (oneOf != null) {
|
||||
for (Schema s : oneOf) {
|
||||
if (hasSelfReference(openAPI, s, visitedSchemaNames)) {
|
||||
@@ -1062,7 +1087,7 @@ public class ModelUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
List<Schema> allOf = ((ComposedSchema) schema).getAllOf();
|
||||
List<Schema> allOf = schema.getAllOf();
|
||||
if (allOf != null) {
|
||||
for (Schema s : allOf) {
|
||||
if (hasSelfReference(openAPI, s, visitedSchemaNames)) {
|
||||
@@ -1070,7 +1095,7 @@ public class ModelUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
List<Schema> anyOf = ((ComposedSchema) schema).getAnyOf();
|
||||
List<Schema> anyOf = schema.getAnyOf();
|
||||
if (anyOf != null) {
|
||||
for (Schema s : anyOf) {
|
||||
if (hasSelfReference(openAPI, s, visitedSchemaNames)) {
|
||||
@@ -1270,8 +1295,8 @@ public class ModelUtils {
|
||||
|
||||
Map<String, List<Entry<String, Schema>>> groupedByParent = allSchemas.entrySet().stream()
|
||||
.filter(entry -> isComposedSchema(entry.getValue()))
|
||||
.filter(entry -> getParentName((ComposedSchema) entry.getValue(), allSchemas) != null)
|
||||
.collect(Collectors.groupingBy(entry -> getParentName((ComposedSchema) entry.getValue(), allSchemas)));
|
||||
.filter(entry -> getParentName((Schema) entry.getValue(), allSchemas) != null)
|
||||
.collect(Collectors.groupingBy(entry -> getParentName((Schema) entry.getValue(), allSchemas)));
|
||||
|
||||
return groupedByParent.entrySet().stream()
|
||||
.collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue().stream().map(e -> e.getKey()).collect(Collectors.toList())));
|
||||
@@ -1283,7 +1308,7 @@ public class ModelUtils {
|
||||
* @param composed schema (alias or direct reference)
|
||||
* @return a list of schema defined in allOf, anyOf or oneOf
|
||||
*/
|
||||
public static List<Schema> getInterfaces(ComposedSchema composed) {
|
||||
public static List<Schema> getInterfaces(Schema composed) {
|
||||
if (composed.getAllOf() != null && !composed.getAllOf().isEmpty()) {
|
||||
return composed.getAllOf();
|
||||
} else if (composed.getAnyOf() != null && !composed.getAnyOf().isEmpty()) {
|
||||
@@ -1324,7 +1349,7 @@ public class ModelUtils {
|
||||
* @param allSchemas all schemas
|
||||
* @return the name of the parent model
|
||||
*/
|
||||
public static String getParentName(ComposedSchema composedSchema, Map<String, Schema> allSchemas) {
|
||||
public static String getParentName(Schema composedSchema, Map<String, Schema> allSchemas) {
|
||||
List<Schema> interfaces = getInterfaces(composedSchema);
|
||||
int nullSchemaChildrenCount = 0;
|
||||
boolean hasAmbiguousParents = false;
|
||||
@@ -1376,7 +1401,7 @@ public class ModelUtils {
|
||||
* @param includeAncestors if true, include the indirect ancestors in the return value. If false, return the direct parents.
|
||||
* @return the name of the parent model
|
||||
*/
|
||||
public static List<String> getAllParentsName(ComposedSchema composedSchema, Map<String, Schema> allSchemas, boolean includeAncestors) {
|
||||
public static List<String> getAllParentsName(Schema composedSchema, Map<String, Schema> allSchemas, boolean includeAncestors) {
|
||||
List<Schema> interfaces = getInterfaces(composedSchema);
|
||||
List<String> names = new ArrayList<String>();
|
||||
|
||||
@@ -1392,8 +1417,8 @@ public class ModelUtils {
|
||||
} else if (hasOrInheritsDiscriminator(s, allSchemas, new ArrayList<Schema>())) {
|
||||
// discriminator.propertyName is used or x-parent is used
|
||||
names.add(parentName);
|
||||
if (includeAncestors && s instanceof ComposedSchema) {
|
||||
names.addAll(getAllParentsName((ComposedSchema) s, allSchemas, true));
|
||||
if (includeAncestors && isComposedSchema(s)) {
|
||||
names.addAll(getAllParentsName(s, allSchemas, true));
|
||||
}
|
||||
} else {
|
||||
// not a parent since discriminator.propertyName is not set
|
||||
@@ -1433,9 +1458,8 @@ public class ModelUtils {
|
||||
} else {
|
||||
LOGGER.error("Failed to obtain schema from {}", parentName);
|
||||
}
|
||||
} else if (schema instanceof ComposedSchema) {
|
||||
final ComposedSchema composed = (ComposedSchema) schema;
|
||||
final List<Schema> interfaces = getInterfaces(composed);
|
||||
} else if (isComposedSchema(schema)) {
|
||||
final List<Schema> interfaces = getInterfaces(schema);
|
||||
for (Schema i : interfaces) {
|
||||
if (hasOrInheritsDiscriminator(i, allSchemas, visitedSchemas)) {
|
||||
return true;
|
||||
@@ -1502,8 +1526,8 @@ public class ModelUtils {
|
||||
return Boolean.parseBoolean(schema.getExtensions().get("x-nullable").toString());
|
||||
}
|
||||
// In OAS 3.1, the recommended way to define a nullable property or object is to use oneOf.
|
||||
if (schema instanceof ComposedSchema) {
|
||||
return isNullableComposedSchema(((ComposedSchema) schema));
|
||||
if (isComposedSchema(schema)) {
|
||||
return isNullableComposedSchema(schema);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1524,7 +1548,7 @@ public class ModelUtils {
|
||||
* @param schema the OAS composed schema.
|
||||
* @return true if the composed schema is nullable.
|
||||
*/
|
||||
public static boolean isNullableComposedSchema(ComposedSchema schema) {
|
||||
public static boolean isNullableComposedSchema(Schema schema) {
|
||||
List<Schema> oneOf = schema.getOneOf();
|
||||
if (oneOf != null && oneOf.size() <= 2) {
|
||||
for (Schema s : oneOf) {
|
||||
|
||||
@@ -69,13 +69,12 @@ class OpenApiSchemaValidations extends GenericValidator<SchemaWrapper> {
|
||||
Schema schema = schemaWrapper.getSchema();
|
||||
ValidationRule.Result result = ValidationRule.Pass.empty();
|
||||
|
||||
if (schema instanceof ComposedSchema) {
|
||||
final ComposedSchema composed = (ComposedSchema) schema;
|
||||
if (ModelUtils.isComposedSchema(schema)) {
|
||||
// check for loosely defined oneOf extension requirements.
|
||||
// This is a recommendation because the 3.0.x spec is not clear enough on usage of oneOf.
|
||||
// see https://json-schema.org/draft/2019-09/json-schema-core.html#rfc.section.9.2.1.3 and the OAS section on 'Composition and Inheritance'.
|
||||
if (composed.getOneOf() != null && composed.getOneOf().size() > 0) {
|
||||
if (composed.getProperties() != null && composed.getProperties().size() >= 1 && composed.getProperties().get("discriminator") == null) {
|
||||
if (schema.getOneOf() != null && schema.getOneOf().size() > 0) {
|
||||
if (schema.getProperties() != null && schema.getProperties().size() >= 1 && schema.getProperties().get("discriminator") == null) {
|
||||
// not necessarily "invalid" here, but we trigger the recommendation which requires the method to return false.
|
||||
result = ValidationRule.Fail.empty();
|
||||
}
|
||||
@@ -91,7 +90,7 @@ class OpenApiSchemaValidations extends GenericValidator<SchemaWrapper> {
|
||||
* Note: the validator invokes checkNullType() for every top-level schema in the OAS document. The method
|
||||
* is not called for nested schemas that are defined inline.
|
||||
*
|
||||
* @param schema An input schema, regardless of the type of schema.
|
||||
* @param schemaWrapper An input schema, regardless of the type of schema.
|
||||
* @return {@link ValidationRule.Pass} if the check succeeds, otherwise {@link ValidationRule.Fail}
|
||||
*/
|
||||
private static ValidationRule.Result checkNullType(SchemaWrapper schemaWrapper) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user