From bd1a6471b64c35af43c75a4a018200c3deb58aea Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sat, 6 Nov 2021 18:11:58 +0800 Subject: [PATCH] [java][Jersey2] add spotless maven, gradle plugins (#10796) * add bunker-holding logo * add spotless plugin to jersey2 java client * add spotless plugin to java jersey2 client * use jdk11 in gradle tests * fix gradle test local spec * setup java 11 * skip spotless in check task --- .github/workflows/gradle-test.yaml | 4 +- README.md | 2 +- bin/utils/release/release_version_update.sh | 1 + .../samples/local-spec/gradle.properties | 2 +- .../libraries/jersey2/build.gradle.mustache | 26 +++++++++++ .../Java/libraries/jersey2/pom.mustache | 41 ++++++++++++++++++ .../jersey2-java8-localdatetime/build.gradle | 26 +++++++++++ .../java/jersey2-java8-localdatetime/pom.xml | 41 ++++++++++++++++++ .../petstore/java/jersey2-java8/build.gradle | 26 +++++++++++ .../petstore/java/jersey2-java8/pom.xml | 41 ++++++++++++++++++ .../java/jersey2-java8/build.gradle | 26 +++++++++++ .../java/jersey2-java8/pom.xml | 41 ++++++++++++++++++ .../build.gradle | 26 +++++++++++ .../jersey2-java8-special-characters/pom.xml | 41 ++++++++++++++++++ .../petstore/java/jersey2-java8/build.gradle | 26 +++++++++++ .../petstore/java/jersey2-java8/pom.xml | 41 ++++++++++++++++++ website/src/dynamic/users.yml | 5 +++ .../static/img/companies/bunker-holding.png | Bin 0 -> 4142 bytes 18 files changed, 412 insertions(+), 4 deletions(-) create mode 100644 website/static/img/companies/bunker-holding.png diff --git a/.github/workflows/gradle-test.yaml b/.github/workflows/gradle-test.yaml index 92c976f55d4..755ca996a15 100644 --- a/.github/workflows/gradle-test.yaml +++ b/.github/workflows/gradle-test.yaml @@ -21,7 +21,7 @@ jobs: build: name: Gradle tests runs-on: ubuntu-latest - container: gradle:jdk8 + container: gradle:jdk11 strategy: fail-fast: true matrix: @@ -37,7 +37,7 @@ jobs: - uses: actions/setup-java@v2 with: distribution: 'adopt' - java-version: 8 + java-version: 11 # Cache Gradle Dependencies - name: Setup Gradle Dependencies Cache uses: actions/cache@v2 diff --git a/README.md b/README.md index 7834f935d07..a70207029e7 100644 --- a/README.md +++ b/README.md @@ -589,6 +589,7 @@ Here are some companies/projects (alphabetical order) using OpenAPI Generator in - [Bithost GmbH](https://www.bithost.ch) - [Bosch Connected Industry](https://www.bosch-connected-industry.com) - [Boxever](https://www.boxever.com/) +- [Bunker Holding Group](https://www.bunker-holding.com/) - [California State University, Northridge](https://www.csun.edu) - [CAM](https://www.cam-inc.co.jp/) - [Camptocamp](https://www.camptocamp.com/en) @@ -683,7 +684,6 @@ Here are some companies/projects (alphabetical order) using OpenAPI Generator in - [YITU Technology](https://www.yitutech.com/) - [Yelp](https://www.yelp.com/) - [Zalando](https://www.zalando.com) -- [Bunker Holding Group](https://www.bunker-holding.com/) ## [5 - Presentations/Videos/Tutorials/Books](#table-of-contents) diff --git a/bin/utils/release/release_version_update.sh b/bin/utils/release/release_version_update.sh index a6f310fe2bd..9026c07afbd 100755 --- a/bin/utils/release/release_version_update.sh +++ b/bin/utils/release/release_version_update.sh @@ -79,6 +79,7 @@ declare -a xml_files=( "${root}/modules/openapi-generator-online/pom.xml" "${root}/modules/openapi-generator/pom.xml" "${root}/modules/openapi-generator-gradle-plugin/gradle.properties" + "${root}/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties" "${root}/modules/openapi-generator-maven-plugin/examples/multi-module/java-client/pom.xml" "${root}/modules/openapi-generator-maven-plugin/examples/java-client.xml" "${root}/modules/openapi-generator-maven-plugin/examples/non-java-invalid-spec.xml" diff --git a/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties b/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties index 4da9eca486b..0d00f845a96 100644 --- a/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties +++ b/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties @@ -1,3 +1,3 @@ # RELEASE_VERSION -openApiGeneratorVersion=5.3.0-SNAPSHOT +openApiGeneratorVersion=5.3.1-SNAPSHOT # /RELEASE_VERSION diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache index 37d60273dee..bb3a427f266 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache @@ -1,5 +1,6 @@ apply plugin: 'idea' apply plugin: 'eclipse' +apply plugin: 'com.diffplug.spotless' group = '{{groupId}}' version = '{{artifactVersion}}' @@ -11,6 +12,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.3.+' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:5.17.1' } } @@ -167,3 +169,27 @@ dependencies { javadoc { options.tags = [ "http.response.details:a:Http Response Details" ] } + +// Use spotless plugin to automatically format code, remove unused import, etc +// To apply changes directly to the file, run `gradlew spotlessApply` +// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle +spotless { + // comment out below to run spotless as part of the `check` task + enforceCheck false + + format 'misc', { + // define the files (e.g. '*.gradle', '*.md') to apply `misc` to + target '.gitignore' + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces() // Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + // don't need to set target, it is inferred from java + // apply a specific flavor of google-java-format + googleJavaFormat('1.8').aosp().reflowLongStrings() + removeUnusedImports() + importOrder() + } +} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache index bd148d89abd..11857cbbcdd 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache @@ -190,6 +190,46 @@ + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + + + + .gitignore + + + + + + true + 4 + + + + + + + + + + 1.8 + + true + + + + + + @@ -366,5 +406,6 @@ {{#hasOAuthMethods}} 8.3.1 {{/hasOAuthMethods}} + 2.17.3 diff --git a/samples/client/petstore/java/jersey2-java8-localdatetime/build.gradle b/samples/client/petstore/java/jersey2-java8-localdatetime/build.gradle index 40621886ce3..7618c2e444b 100644 --- a/samples/client/petstore/java/jersey2-java8-localdatetime/build.gradle +++ b/samples/client/petstore/java/jersey2-java8-localdatetime/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'idea' apply plugin: 'eclipse' +apply plugin: 'com.diffplug.spotless' group = 'org.openapitools' version = '1.0.0' @@ -11,6 +12,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.3.+' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:5.17.1' } } @@ -127,3 +129,27 @@ dependencies { javadoc { options.tags = [ "http.response.details:a:Http Response Details" ] } + +// Use spotless plugin to automatically format code, remove unused import, etc +// To apply changes directly to the file, run `gradlew spotlessApply` +// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle +spotless { + // comment out below to run spotless as part of the `check` task + enforceCheck false + + format 'misc', { + // define the files (e.g. '*.gradle', '*.md') to apply `misc` to + target '.gitignore' + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces() // Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + // don't need to set target, it is inferred from java + // apply a specific flavor of google-java-format + googleJavaFormat('1.8').aosp().reflowLongStrings() + removeUnusedImports() + importOrder() + } +} diff --git a/samples/client/petstore/java/jersey2-java8-localdatetime/pom.xml b/samples/client/petstore/java/jersey2-java8-localdatetime/pom.xml index 8a771818fa1..b850beee9e1 100644 --- a/samples/client/petstore/java/jersey2-java8-localdatetime/pom.xml +++ b/samples/client/petstore/java/jersey2-java8-localdatetime/pom.xml @@ -183,6 +183,46 @@ + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + + + + .gitignore + + + + + + true + 4 + + + + + + + + + + 1.8 + + true + + + + + + @@ -306,5 +346,6 @@ 1.3.5 4.13.2 8.3.1 + 2.17.3 diff --git a/samples/client/petstore/java/jersey2-java8/build.gradle b/samples/client/petstore/java/jersey2-java8/build.gradle index 9cf958ea4ed..57f7cc9b703 100644 --- a/samples/client/petstore/java/jersey2-java8/build.gradle +++ b/samples/client/petstore/java/jersey2-java8/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'idea' apply plugin: 'eclipse' +apply plugin: 'com.diffplug.spotless' group = 'org.openapitools' version = '1.0.0' @@ -11,6 +12,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.3.+' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:5.17.1' } } @@ -127,3 +129,27 @@ dependencies { javadoc { options.tags = [ "http.response.details:a:Http Response Details" ] } + +// Use spotless plugin to automatically format code, remove unused import, etc +// To apply changes directly to the file, run `gradlew spotlessApply` +// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle +spotless { + // comment out below to run spotless as part of the `check` task + enforceCheck false + + format 'misc', { + // define the files (e.g. '*.gradle', '*.md') to apply `misc` to + target '.gitignore' + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces() // Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + // don't need to set target, it is inferred from java + // apply a specific flavor of google-java-format + googleJavaFormat('1.8').aosp().reflowLongStrings() + removeUnusedImports() + importOrder() + } +} diff --git a/samples/client/petstore/java/jersey2-java8/pom.xml b/samples/client/petstore/java/jersey2-java8/pom.xml index 5fb184b6803..2fc62928ae5 100644 --- a/samples/client/petstore/java/jersey2-java8/pom.xml +++ b/samples/client/petstore/java/jersey2-java8/pom.xml @@ -183,6 +183,46 @@ + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + + + + .gitignore + + + + + + true + 4 + + + + + + + + + + 1.8 + + true + + + + + + @@ -306,5 +346,6 @@ 1.3.5 4.13.2 8.3.1 + 2.17.3 diff --git a/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/build.gradle b/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/build.gradle index 24d7c0eb341..b33e0d64186 100644 --- a/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/build.gradle +++ b/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'idea' apply plugin: 'eclipse' +apply plugin: 'com.diffplug.spotless' group = 'org.openapitools' version = '1.0.0' @@ -11,6 +12,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.3.+' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:5.17.1' } } @@ -127,3 +129,27 @@ dependencies { javadoc { options.tags = [ "http.response.details:a:Http Response Details" ] } + +// Use spotless plugin to automatically format code, remove unused import, etc +// To apply changes directly to the file, run `gradlew spotlessApply` +// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle +spotless { + // comment out below to run spotless as part of the `check` task + enforceCheck false + + format 'misc', { + // define the files (e.g. '*.gradle', '*.md') to apply `misc` to + target '.gitignore' + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces() // Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + // don't need to set target, it is inferred from java + // apply a specific flavor of google-java-format + googleJavaFormat('1.8').aosp().reflowLongStrings() + removeUnusedImports() + importOrder() + } +} diff --git a/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/pom.xml b/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/pom.xml index bf885a5080c..dbeb9684fd3 100644 --- a/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/pom.xml +++ b/samples/openapi3/client/extensions/x-auth-id-alias/java/jersey2-java8/pom.xml @@ -183,6 +183,46 @@ + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + + + + .gitignore + + + + + + true + 4 + + + + + + + + + + 1.8 + + true + + + + + + @@ -306,5 +346,6 @@ 2.9.10 1.3.5 4.13.2 + 2.17.3 diff --git a/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/build.gradle b/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/build.gradle index 79e4c46e4c3..c39ff494aa6 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/build.gradle +++ b/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'idea' apply plugin: 'eclipse' +apply plugin: 'com.diffplug.spotless' group = 'org.openapitools' version = '1.0.0' @@ -11,6 +12,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.3.+' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:5.17.1' } } @@ -125,3 +127,27 @@ dependencies { javadoc { options.tags = [ "http.response.details:a:Http Response Details" ] } + +// Use spotless plugin to automatically format code, remove unused import, etc +// To apply changes directly to the file, run `gradlew spotlessApply` +// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle +spotless { + // comment out below to run spotless as part of the `check` task + enforceCheck false + + format 'misc', { + // define the files (e.g. '*.gradle', '*.md') to apply `misc` to + target '.gitignore' + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces() // Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + // don't need to set target, it is inferred from java + // apply a specific flavor of google-java-format + googleJavaFormat('1.8').aosp().reflowLongStrings() + removeUnusedImports() + importOrder() + } +} diff --git a/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/pom.xml b/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/pom.xml index 744e22b67e3..8feb1611f5e 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/pom.xml +++ b/samples/openapi3/client/petstore/java/jersey2-java8-special-characters/pom.xml @@ -183,6 +183,46 @@ + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + + + + .gitignore + + + + + + true + 4 + + + + + + + + + + 1.8 + + true + + + + + + @@ -300,5 +340,6 @@ 0.2.1 1.3.5 4.13.2 + 2.17.3 diff --git a/samples/openapi3/client/petstore/java/jersey2-java8/build.gradle b/samples/openapi3/client/petstore/java/jersey2-java8/build.gradle index dc5f013f2a8..6ffa4c5ad7a 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8/build.gradle +++ b/samples/openapi3/client/petstore/java/jersey2-java8/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'idea' apply plugin: 'eclipse' +apply plugin: 'com.diffplug.spotless' group = 'org.openapitools' version = '1.0.0' @@ -11,6 +12,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.3.+' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:5.17.1' } } @@ -129,3 +131,27 @@ dependencies { javadoc { options.tags = [ "http.response.details:a:Http Response Details" ] } + +// Use spotless plugin to automatically format code, remove unused import, etc +// To apply changes directly to the file, run `gradlew spotlessApply` +// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle +spotless { + // comment out below to run spotless as part of the `check` task + enforceCheck false + + format 'misc', { + // define the files (e.g. '*.gradle', '*.md') to apply `misc` to + target '.gitignore' + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces() // Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + // don't need to set target, it is inferred from java + // apply a specific flavor of google-java-format + googleJavaFormat('1.8').aosp().reflowLongStrings() + removeUnusedImports() + importOrder() + } +} diff --git a/samples/openapi3/client/petstore/java/jersey2-java8/pom.xml b/samples/openapi3/client/petstore/java/jersey2-java8/pom.xml index fae535e28b0..0a3a077b03b 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8/pom.xml +++ b/samples/openapi3/client/petstore/java/jersey2-java8/pom.xml @@ -183,6 +183,46 @@ + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + + + + .gitignore + + + + + + true + 4 + + + + + + + + + + 1.8 + + true + + + + + + @@ -312,5 +352,6 @@ 4.13.2 1.7 8.3.1 + 2.17.3 diff --git a/website/src/dynamic/users.yml b/website/src/dynamic/users.yml index 5e114596222..6c8d8667df5 100644 --- a/website/src/dynamic/users.yml +++ b/website/src/dynamic/users.yml @@ -73,6 +73,11 @@ image: "img/companies/boxever.svg" infoLink: "https://www.boxever.com/" pinned: false +- + caption: Bunker Holding Group + image: "img/companies/bunker-holding.png" + infoLink: "https://www.bunker-holding.com/" + pinned: false - caption: "California State University, Northridge" image: "img/companies/CSUNS.png" diff --git a/website/static/img/companies/bunker-holding.png b/website/static/img/companies/bunker-holding.png new file mode 100644 index 0000000000000000000000000000000000000000..de849d342fdd1535512d767f7c11fa9828c73fb6 GIT binary patch literal 4142 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