diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 5ace4600..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" diff --git a/.github/workflows/broken_links_checker.yml b/.github/workflows/broken_links_checker.yml index 90488caa..ee8df765 100644 --- a/.github/workflows/broken_links_checker.yml +++ b/.github/workflows/broken_links_checker.yml @@ -1,35 +1,44 @@ -# Generated by Project Keeper -# https://github.com/exasol/project-keeper/blob/main/project-keeper/src/main/resources/templates/.github/workflows/broken_links_checker.yml +# This file was generated by Project Keeper. name: Broken Links Checker - on: schedule: - - cron: "0 5 * * 0" - + - { + cron: 0 5 * * 0 + } + workflow_dispatch: null jobs: linkChecker: runs-on: ubuntu-latest - permissions: + permissions: { contents: read + } defaults: - run: - shell: "bash" - concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + run: { + shell: bash + } + concurrency: { + group: '${{ github.workflow }}-${{ github.ref }}', cancel-in-progress: true + } steps: - - uses: actions/checkout@v4 - - name: Configure broken links checker + - { + id: checkout, + uses: actions/checkout@v5 + } + - id: configure-broken-links-checker + name: Configure broken links checker run: | mkdir -p ./target echo '{"aliveStatusCodes": [429, 200], "ignorePatterns": [' \ - '{"pattern": "^https?://(www|dev).mysql.com/"},' \ - '{"pattern": "^https?://(www.)?opensource.org"}' \ - '{"pattern": "^https?://(www.)?eclipse.org"}' \ - '{"pattern": "^https?://projects.eclipse.org"}' \ - ']}' > ./target/broken_links_checker.json - - uses: gaurav-nelson/github-action-markdown-link-check@v1 - with: - use-quiet-mode: "yes" - use-verbose-mode: "yes" + '{"pattern": "^https?://(www|dev).mysql.com/"},' \ + '{"pattern": "^https?://(www.)?opensource.org"}' \ + '{"pattern": "^https?://(www.)?eclipse.org"}' \ + '{"pattern": "^https?://projects.eclipse.org"}' \ + ']}' > ./target/broken_links_checker.json + - id: run-broken-links-checker + uses: tcort/github-action-markdown-link-check@v1 + with: { + use-quiet-mode: yes, + use-verbose-mode: yes, config-file: ./target/broken_links_checker.json + } diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 7c087e95..aa273bf5 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -3,7 +3,8 @@ name: CI Build on: push: branches: [ - main + main, + release/* ] pull_request: @@ -42,19 +43,22 @@ jobs: sudo rm -rf /usr/share/dotnet - name: Checkout the repository id: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: { fetch-depth: 0 } - name: Set up JDKs id: setup-java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: temurin java-version: |- 11 17 cache: maven + server-id: ossindex + server-username: OSSINDEX_USERNAME + server-password: OSSINDEX_API_TOKEN - name: Cache SonarCloud packages id: cache-sonar uses: actions/cache@v4 @@ -74,6 +78,10 @@ jobs: mvn --batch-mode clean verify \ -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \ -DtrimStackTrace=false + env: { + OSSINDEX_USERNAME: '${{ secrets.OSSINDEX_USERNAME }}', + OSSINDEX_API_TOKEN: '${{ secrets.OSSINDEX_API_TOKEN }}' + } - name: Sonar analysis id: sonar-analysis if: ${{ env.SONAR_TOKEN != null }} @@ -110,7 +118,7 @@ jobs: '{"pattern": "^https?://(www.)?eclipse.org"}' \ '{"pattern": "^https?://projects.eclipse.org"}' \ ']}' > ./target/broken_links_checker.json - - uses: gaurav-nelson/github-action-markdown-link-check@v1 + - uses: tcort/github-action-markdown-link-check@v1 id: run-link-check with: { use-quiet-mode: yes, @@ -133,23 +141,28 @@ jobs: steps: - name: Checkout the repository id: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: { fetch-depth: 0 } - name: Set up JDK 17 id: setup-java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: { distribution: temurin, java-version: '17', - cache: maven + cache: maven, + server-id: ossindex, + server-username: OSSINDEX_USERNAME, + server-password: OSSINDEX_API_TOKEN } - - { - name: Run tests and build with Maven 17, - id: build-next-java, + - name: Run tests and build with Maven 17 + id: build-next-java run: mvn --batch-mode clean package -DtrimStackTrace=false -Djava.version=17 - } + env: { + OSSINDEX_USERNAME: '${{ secrets.OSSINDEX_USERNAME }}', + OSSINDEX_API_TOKEN: '${{ secrets.OSSINDEX_API_TOKEN }}' + } build: needs: [ build-and-test, @@ -170,13 +183,13 @@ jobs: steps: - name: Checkout the repository id: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: { fetch-depth: 0 } - name: Set up JDKs id: setup-java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: temurin java-version: |- @@ -185,7 +198,7 @@ jobs: cache: maven - name: Check if release is needed id: check-release - if: ${{ github.ref == 'refs/heads/main' }} + if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') }} run: | if mvn --batch-mode com.exasol:project-keeper-maven-plugin:verify-release --projects .; then echo "### ✅ Release preconditions met, start release" >> "$GITHUB_STEP_SUMMARY" @@ -200,7 +213,7 @@ jobs: } start_release: needs: build - if: ${{ github.ref == 'refs/heads/main' && needs.build.outputs.release-required == 'true' }} + if: ${{ needs.build.outputs.release-required == 'true' }} concurrency: { cancel-in-progress: false, group: release @@ -213,5 +226,6 @@ jobs: } uses: ./.github/workflows/release.yml with: { - started-from-ci: true + started-from-ci: true, + maven-central-auto-publish: true } diff --git a/.github/workflows/dependencies_check.yml b/.github/workflows/dependencies_check.yml index 02c5aa06..b0877fcc 100644 --- a/.github/workflows/dependencies_check.yml +++ b/.github/workflows/dependencies_check.yml @@ -18,7 +18,7 @@ jobs: issues: write } outputs: { - created-issues: '${{ steps.security-issues.outputs.created-issues }}' + created-issues: '${{ steps.create-security-issues.outputs.created-issues }}' } concurrency: { group: '${{ github.workflow }}-report_security_issues', @@ -28,17 +28,20 @@ jobs: - { name: Checkout, id: checkout, - uses: actions/checkout@v4 + uses: actions/checkout@v5 } - name: Set up JDKs id: setup-jdks - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: temurin java-version: |- 11 17 cache: maven + server-id: ossindex + server-username: OSSINDEX_USERNAME + server-password: OSSINDEX_API_TOKEN - name: Generate ossindex report id: ossindex-report run: | @@ -46,9 +49,13 @@ jobs: org.sonatype.ossindex.maven:ossindex-maven-plugin:audit-aggregate \ -Dossindex.reportFile=$(pwd)/ossindex-report.json \ -Dossindex.fail=false - - name: Report Security Issues - id: security-issues - uses: exasol/python-toolbox/.github/actions/security-issues@main + env: { + OSSINDEX_USERNAME: '${{ secrets.OSSINDEX_USERNAME }}', + OSSINDEX_API_TOKEN: '${{ secrets.OSSINDEX_API_TOKEN }}' + } + - name: Create GitHub Issues + id: create-security-issues + uses: exasol/python-toolbox/.github/actions/security-issues@1.9.0 with: { format: maven, command: cat ossindex-report.json, @@ -60,7 +67,7 @@ jobs: echo "$CREATED_ISSUES" > test.jsonl cat test.jsonl env: { - CREATED_ISSUES: '${{ steps.security-issues.outputs.created-issues }}' + CREATED_ISSUES: '${{ steps.create-security-issues.outputs.created-issues }}' } start_dependency_udpate: needs: report_security_issues diff --git a/.github/workflows/dependencies_update.yml b/.github/workflows/dependencies_update.yml index c9015062..2ba27856 100644 --- a/.github/workflows/dependencies_update.yml +++ b/.github/workflows/dependencies_update.yml @@ -8,6 +8,15 @@ on: required: true, type: string } + secrets: + INTEGRATION_TEAM_SLACK_NOTIFICATION_WEBHOOK: { + description: Slack webhook URL for notifications about failed builds., + required: true + } + INTEGRATION_TEAM_SECURITY_UPDATES_WEBHOOK: { + description: Slack webhook URL for notifications about new Pull Requests., + required: true + } workflow_dispatch: null jobs: update_dependencies: @@ -25,14 +34,14 @@ jobs: cancel-in-progress: false } steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 id: checkout with: { fetch-depth: 0 } - name: Set up JDKs id: setup-jdks - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: temurin java-version: |- @@ -49,7 +58,7 @@ jobs: - name: Fail if not running on a branch id: check-branch if: ${{ !startsWith(github.ref, 'refs/heads/') }} - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | core.setFailed('Not running on a branch, github.ref is ${{ github.ref }}. Please start this workflow only on main or a branch') @@ -172,5 +181,5 @@ jobs: message_format: '{workflow} created Pull Request ${{ steps.create-pr.outputs.pr_url }}' } env: { - SLACK_WEBHOOK_URL: '${{ secrets.INTEGRATION_TEAM_SLACK_NOTIFICATION_WEBHOOK }}' + SLACK_WEBHOOK_URL: '${{ secrets.INTEGRATION_TEAM_SECURITY_UPDATES_WEBHOOK }}' } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e4682a32..dbc1ea24 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,6 +9,33 @@ on: required: true, default: false } + maven-central-auto-publish: { + description: 'Automatically publish to Maven Central. Deactivate to manually publish at https://central.sonatype.com/publishing/deployments', + required: true, + type: boolean, + default: true + } + secrets: + OSSRH_GPG_SECRET_KEY: { + description: Base64 encoded GPG secret key for signing artifacts for deployment to Maven Central., + required: false + } + OSSRH_GPG_SECRET_KEY_PASSWORD: { + description: 'Password for the GPG key. Must not contain special characters, only letters and numbers.', + required: false + } + MAVEN_CENTRAL_PORTAL_USERNAME: { + description: Username for the Maven Central Portal., + required: false + } + MAVEN_CENTRAL_PORTAL_TOKEN: { + description: Password for the Maven Central Portal., + required: false + } + INTEGRATION_TEAM_SLACK_NOTIFICATION_WEBHOOK: { + description: Slack webhook URL for notifications about failed and succesful releases., + required: true + } workflow_dispatch: inputs: skip-maven-central: { @@ -17,6 +44,12 @@ on: type: boolean, default: false } + maven-central-auto-publish: { + description: 'Automatically publish to Maven Central. Deactivate to manually publish at https://central.sonatype.com/publishing/deployments', + required: true, + type: boolean, + default: true + } skip-github-release: { description: Skip creating the GitHub release, required: true, @@ -42,21 +75,21 @@ jobs: steps: - name: Checkout the repository id: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: { fetch-depth: 0 } - name: Set up Maven Central Repository id: configure-maven-central-credentials if: ${{ true }} - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: temurin java-version: |- 11 17 cache: maven - server-id: ossrh + server-id: maven-central-portal server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD gpg-private-key: ${{ secrets.OSSRH_GPG_SECRET_KEY }} @@ -64,27 +97,28 @@ jobs: - name: Set up JDKs id: setup-jdks if: ${{ ! true }} - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: temurin java-version: |- 11 17 cache: maven - - name: Fail if not running on main branch - id: check-main-branch - if: ${{ github.ref != 'refs/heads/main' }} - uses: actions/github-script@v7 + - name: Fail if not running on main or release branch + id: check-main-or-release-branch + if: ${{ github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/heads/release/') }} + uses: actions/github-script@v8 with: script: | - core.setFailed('Not running on main branch, github.ref is ${{ github.ref }}. Please start this workflow only on main') + core.setFailed('Not running on main or release branch, github.ref is ${{ github.ref }}. Please start this workflow only on main or a branch starting with release/') - name: Check CI build of this commit succeeded id: check-ci-build-status if: ${{ ! inputs.started-from-ci }} run: | echo "Commit SHA: $COMMIT_SHA" - gh run list --workflow ci-build.yml --branch main --event push --commit $COMMIT_SHA - ci_build_status=$(gh run list --workflow ci-build.yml --branch main --event push --commit $COMMIT_SHA --json conclusion --template '{{range .}}{{.conclusion}}{{"\n"}}{{end}}') + echo "Branch: $BRANCH_NAME" + gh run list --workflow ci-build.yml --branch $BRANCH_NAME --event push --commit $COMMIT_SHA + ci_build_status=$(gh run list --workflow ci-build.yml --branch $BRANCH_NAME --event push --commit $COMMIT_SHA --json conclusion --template '{{range .}}{{.conclusion}}{{"\n"}}{{end}}') echo "CI build status at commit $COMMIT_SHA was '$ci_build_status'" if [[ "$ci_build_status" != "success" ]]; then gh run list --workflow ci-build.yml --commit $COMMIT_SHA >> $GITHUB_STEP_SUMMARY @@ -94,7 +128,8 @@ jobs: fi env: { COMMIT_SHA: '${{ github.sha }}', - GH_TOKEN: '${{ github.token }}' + GH_TOKEN: '${{ github.token }}', + BRANCH_NAME: '${{ github.ref_name }}' } - name: Verify release preconditions id: verify-release @@ -107,7 +142,7 @@ jobs: - { name: Build project, id: build, - run: mvn --batch-mode -DskipTests clean verify + run: mvn --batch-mode -DskipTests -Dossindex.skip=true clean verify } - { name: List secret GPG keys, @@ -120,11 +155,18 @@ jobs: if: ${{ true && (! inputs.skip-maven-central) }} run: | echo "#### Maven Central Release" >> "$GITHUB_STEP_SUMMARY" - mvn --batch-mode -Dgpg.skip=false -DskipTests deploy - echo "Published to Maven Central ✅" >> "$GITHUB_STEP_SUMMARY" + mvn --batch-mode -Dgpg.skip=false -DskipTests -Dossindex.skip=true deploy \ + -Dcentral-publishing.deploymentName="Auto release of repo ${{ github.repository }} using PK release.yml" \ + -Dcentral-publishing.autoPublish=${{ inputs.maven-central-auto-publish }} + if [[ "${{ inputs.maven-central-auto-publish }}" == "true" ]]; then + echo "Published to Maven Central ✅" >> "$GITHUB_STEP_SUMMARY" + else + echo "Uploaded to Maven Central ✅" >> "$GITHUB_STEP_SUMMARY" + echo "⚠️ Go to https://central.sonatype.com/publishing/deployments to publish the release ⚠️" >> "$GITHUB_STEP_SUMMARY" + fi env: { - MAVEN_USERNAME: '${{ secrets.OSSRH_USERNAME }}', - MAVEN_PASSWORD: '${{ secrets.OSSRH_PASSWORD }}', + MAVEN_USERNAME: '${{ secrets.MAVEN_CENTRAL_PORTAL_USERNAME }}', + MAVEN_PASSWORD: '${{ secrets.MAVEN_CENTRAL_PORTAL_TOKEN }}', MAVEN_GPG_PASSPHRASE: '${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}' } - name: Calculate Artifact Checksums @@ -166,7 +208,7 @@ jobs: echo "* \`$file\`" >> "$GITHUB_STEP_SUMMARY" done echo "" >> "$GITHUB_STEP_SUMMARY" - release_url=$(gh release create --latest --title "$TITLE" --notes "$NOTES" --target main $TAG "${artifacts_array[@]}") + release_url=$(gh release create --latest --title "$TITLE" --notes "$NOTES" --target $BRANCH_NAME $TAG "${artifacts_array[@]}") echo "Created release $TAG with title '$TITLE' at $release_url ✅" >> "$GITHUB_STEP_SUMMARY" echo "release-url=$release_url" >> "$GITHUB_OUTPUT" @@ -188,7 +230,8 @@ jobs: ADDITIONAL_TAGS: '${{ steps.verify-release.outputs.additional-release-tags }}', NOTES: '${{ steps.verify-release.outputs.release-notes }}', TITLE: '${{ steps.verify-release.outputs.release-title }}', - ARTIFACTS: '${{ steps.artifact-checksum.outputs.artifacts }}' + ARTIFACTS: '${{ steps.artifact-checksum.outputs.artifacts }}', + BRANCH_NAME: '${{ github.ref_name }}' } - name: Report failure Status to Slack channel id: report-failure-status-slack diff --git a/.project-keeper.yml b/.project-keeper.yml index 8171b782..3fce6773 100644 --- a/.project-keeper.yml +++ b/.project-keeper.yml @@ -4,4 +4,3 @@ sources: modules: - maven_central linkReplacements: - - "https://www.mojohaus.org/flatten-maven-plugin/flatten-maven-plugin|https://www.mojohaus.org/flatten-maven-plugin/" diff --git a/.vscode/settings.json b/.vscode/settings.json index f938933d..08394ad7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,21 @@ { - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": true, - "source.generate.finalModifiers": true, - "source.fixAll": true - }, - "java.codeGeneration.useBlocks": true, - "java.saveActions.organizeImports": true, - "java.sources.organizeImports.starThreshold": 3, - "java.sources.organizeImports.staticStarThreshold": 3, - "java.test.config": { - "vmArgs": [ - "-Djava.util.logging.config.file=src/test/resources/logging.properties" - ] - } + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit", + "source.generate.finalModifiers": "explicit", + "source.fixAll": "explicit" + }, + "java.codeGeneration.useBlocks": true, + "java.saveActions.organizeImports": true, + "java.sources.organizeImports.starThreshold": 3, + "java.sources.organizeImports.staticStarThreshold": 3, + "java.test.config": { + "vmArgs": [ + "-Djava.util.logging.config.file=src/test/resources/logging.properties" + ] + }, + "sonarlint.connectedMode.project": { + "connectionId": "exasol", + "projectKey": "com.exasol:sql-statement-builder" + } } diff --git a/dependencies.md b/dependencies.md index 40e4e3e4..f2ed4025 100644 --- a/dependencies.md +++ b/dependencies.md @@ -5,9 +5,8 @@ | Dependency | License | | ----------------------------------------- | -------------------------------- | -| [JUnit Jupiter (Aggregator)][0] | [Eclipse Public License v2.0][1] | +| [JUnit Jupiter Params][0] | [Eclipse Public License v2.0][1] | | [Hamcrest][2] | [BSD-3-Clause][3] | -| [mockito-core][4] | [MIT][5] | | [mockito-junit-jupiter][4] | [MIT][5] | | [EqualsVerifier \| release normal jar][6] | [Apache License, Version 2.0][7] | @@ -23,7 +22,7 @@ | [Apache Maven Toolchains Plugin][14] | [Apache-2.0][7] | | [Apache Maven Compiler Plugin][15] | [Apache-2.0][7] | | [Apache Maven Enforcer Plugin][16] | [Apache-2.0][7] | -| [Maven Flatten Plugin][17] | [Apache Software Licenese][7] | +| [Maven Flatten Plugin][17] | [Apache Software License][7] | | [org.sonatype.ossindex.maven:ossindex-maven-plugin][18] | [ASL2][19] | | [Maven Surefire Plugin][20] | [Apache-2.0][7] | | [Versions Maven Plugin][21] | [Apache License, Version 2.0][7] | @@ -33,15 +32,15 @@ | [Apache Maven GPG Plugin][26] | [Apache-2.0][7] | | [Apache Maven Source Plugin][27] | [Apache License, Version 2.0][7] | | [Apache Maven Javadoc Plugin][28] | [Apache-2.0][7] | -| [Nexus Staging Maven Plugin][29] | [Eclipse Public License][30] | -| [JaCoCo :: Maven Plugin][31] | [EPL-2.0][32] | -| [Quality Summarizer Maven Plugin][33] | [MIT License][34] | -| [error-code-crawler-maven-plugin][35] | [MIT License][36] | -| [Git Commit Id Maven Plugin][37] | [GNU Lesser General Public License 3.0][38] | -| [OpenFastTrace Maven Plugin][39] | [GNU General Public License v3.0][40] | -| [Project Keeper Maven plugin][41] | [The MIT License][42] | +| [Central Publishing Maven Plugin][29] | [The Apache License, Version 2.0][7] | +| [JaCoCo :: Maven Plugin][30] | [EPL-2.0][31] | +| [Quality Summarizer Maven Plugin][32] | [MIT License][33] | +| [error-code-crawler-maven-plugin][34] | [MIT License][35] | +| [Git Commit Id Maven Plugin][36] | [GNU Lesser General Public License 3.0][37] | +| [OpenFastTrace Maven Plugin][38] | [GNU General Public License v3.0][39] | +| [Project Keeper Maven plugin][40] | [The MIT License][41] | -[0]: https://junit.org/junit5/ +[0]: https://junit.org/ [1]: https://www.eclipse.org/legal/epl-v20.html [2]: http://hamcrest.org/JavaHamcrest/ [3]: https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE @@ -53,7 +52,7 @@ [9]: https://maven.apache.org/plugins/maven-install-plugin/ [10]: https://maven.apache.org/plugins/maven-resources-plugin/ [11]: https://maven.apache.org/plugins/maven-site-plugin/ -[12]: http://docs.sonarqube.org/display/PLUG/Plugin+Library/sonar-maven-plugin +[12]: http://docs.sonarqube.org/display/PLUG/Plugin+Library/sonar-scanner-maven/sonar-maven-plugin [13]: http://www.gnu.org/licenses/lgpl.txt [14]: https://maven.apache.org/plugins/maven-toolchains-plugin/ [15]: https://maven.apache.org/plugins/maven-compiler-plugin/ @@ -70,17 +69,16 @@ [26]: https://maven.apache.org/plugins/maven-gpg-plugin/ [27]: https://maven.apache.org/plugins/maven-source-plugin/ [28]: https://maven.apache.org/plugins/maven-javadoc-plugin/ -[29]: http://www.sonatype.com/public-parent/nexus-maven-plugins/nexus-staging/nexus-staging-maven-plugin/ -[30]: http://www.eclipse.org/legal/epl-v10.html -[31]: https://www.jacoco.org/jacoco/trunk/doc/maven.html -[32]: https://www.eclipse.org/legal/epl-2.0/ -[33]: https://github.com/exasol/quality-summarizer-maven-plugin/ -[34]: https://github.com/exasol/quality-summarizer-maven-plugin/blob/main/LICENSE -[35]: https://github.com/exasol/error-code-crawler-maven-plugin/ -[36]: https://github.com/exasol/error-code-crawler-maven-plugin/blob/main/LICENSE -[37]: https://github.com/git-commit-id/git-commit-id-maven-plugin -[38]: http://www.gnu.org/licenses/lgpl-3.0.txt -[39]: https://github.com/itsallcode/openfasttrace-maven-plugin -[40]: https://www.gnu.org/licenses/gpl-3.0.html -[41]: https://github.com/exasol/project-keeper/ -[42]: https://github.com/exasol/project-keeper/blob/main/LICENSE +[29]: https://central.sonatype.org +[30]: https://www.jacoco.org/jacoco/trunk/doc/maven.html +[31]: https://www.eclipse.org/legal/epl-2.0/ +[32]: https://github.com/exasol/quality-summarizer-maven-plugin/ +[33]: https://github.com/exasol/quality-summarizer-maven-plugin/blob/main/LICENSE +[34]: https://github.com/exasol/error-code-crawler-maven-plugin/ +[35]: https://github.com/exasol/error-code-crawler-maven-plugin/blob/main/LICENSE +[36]: https://github.com/git-commit-id/git-commit-id-maven-plugin +[37]: http://www.gnu.org/licenses/lgpl-3.0.txt +[38]: https://github.com/itsallcode/openfasttrace-maven-plugin +[39]: https://www.gnu.org/licenses/gpl-3.0.html +[40]: https://github.com/exasol/project-keeper/ +[41]: https://github.com/exasol/project-keeper/blob/main/LICENSE diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md index ab4953a2..a3ab54ae 100644 --- a/doc/changes/changelog.md +++ b/doc/changes/changelog.md @@ -1,5 +1,6 @@ # Changes +* [4.6.1](changes_4.6.1.md) * [4.6.0](changes_4.6.0.md) * [4.5.3](changes_4.5.3.md) * [4.5.2](changes_4.5.2.md) diff --git a/doc/changes/changes_4.6.1.md b/doc/changes/changes_4.6.1.md new file mode 100644 index 00000000..5e545c39 --- /dev/null +++ b/doc/changes/changes_4.6.1.md @@ -0,0 +1,37 @@ +# Exasol SQL Statement Builder 4.6.1, released 2025-10-30 + +Code name: Upgrade Project Keeper + +## Summary + +This release upgrades Project Keeper and dependencies. + +## Dependency Updates + +### Test Dependency Updates + +* Added `org.junit.jupiter:junit-jupiter-params:5.13.4` +* Removed `org.junit.jupiter:junit-jupiter:5.12.2` +* Removed `org.mockito:mockito-core:5.17.0` +* Updated `org.mockito:mockito-junit-jupiter:5.17.0` to `5.20.0` + +### Plugin Dependency Updates + +* Updated `com.exasol:error-code-crawler-maven-plugin:2.0.3` to `2.0.5` +* Updated `com.exasol:project-keeper-maven-plugin:5.0.1` to `5.4.3` +* Updated `com.exasol:quality-summarizer-maven-plugin:0.2.0` to `0.2.1` +* Updated `io.github.git-commit-id:git-commit-id-maven-plugin:9.0.1` to `9.0.2` +* Updated `org.apache.maven.plugins:maven-artifact-plugin:3.6.0` to `3.6.1` +* Updated `org.apache.maven.plugins:maven-clean-plugin:3.4.1` to `3.5.0` +* Updated `org.apache.maven.plugins:maven-compiler-plugin:3.14.0` to `3.14.1` +* Updated `org.apache.maven.plugins:maven-enforcer-plugin:3.5.0` to `3.6.2` +* Updated `org.apache.maven.plugins:maven-gpg-plugin:3.2.7` to `3.2.8` +* Updated `org.apache.maven.plugins:maven-javadoc-plugin:3.11.2` to `3.12.0` +* Updated `org.apache.maven.plugins:maven-surefire-plugin:3.5.2` to `3.5.4` +* Updated `org.codehaus.mojo:flatten-maven-plugin:1.7.0` to `1.7.3` +* Updated `org.codehaus.mojo:versions-maven-plugin:2.18.0` to `2.19.1` +* Updated `org.itsallcode:openfasttrace-maven-plugin:1.6.1` to `2.3.0` +* Updated `org.jacoco:jacoco-maven-plugin:0.8.12` to `0.8.14` +* Updated `org.sonarsource.scanner.maven:sonar-maven-plugin:5.0.0.4389` to `5.2.0.4988` +* Added `org.sonatype.central:central-publishing-maven-plugin:0.9.0` +* Removed `org.sonatype.plugins:nexus-staging-maven-plugin:1.7.0` diff --git a/pk_generated_parent.pom b/pk_generated_parent.pom index 83486be5..d0b3a0aa 100644 --- a/pk_generated_parent.pom +++ b/pk_generated_parent.pom @@ -3,7 +3,7 @@ 4.0.0 com.exasol sql-statement-builder-generated-parent - 4.6.0 + 4.6.1 pom UTF-8 @@ -14,17 +14,11 @@ https://sonarcloud.io true + false + false + validated + Manual deployment of repo sql-statement-builder - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - MIT License @@ -51,7 +45,7 @@ org.apache.maven.plugins maven-clean-plugin - 3.4.1 + 3.5.0 org.apache.maven.plugins @@ -71,7 +65,7 @@ org.sonarsource.scanner.maven sonar-maven-plugin - 5.0.0.4389 + 5.2.0.4988 org.apache.maven.plugins @@ -95,7 +89,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.0 + 3.14.1 ${java.version} ${java.version} @@ -109,7 +103,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.5.0 + 3.6.2 enforce-maven @@ -132,7 +126,7 @@ org.codehaus.mojo flatten-maven-plugin - 1.7.0 + 1.7.3 true oss @@ -158,6 +152,9 @@ org.sonatype.ossindex.maven ossindex-maven-plugin 3.2.0 + + ossindex + audit @@ -171,7 +168,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.2 + 3.5.4 @@ -182,7 +179,7 @@ org.codehaus.mojo versions-maven-plugin - 2.18.0 + 2.19.1 display-updates @@ -237,7 +234,7 @@ org.apache.maven.plugins maven-artifact-plugin - 3.6.0 + 3.6.1 check-build-plan @@ -259,7 +256,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.2.7 + 3.2.8 sign-artifacts @@ -279,9 +276,9 @@ org.apache.maven.plugins maven-source-plugin - + 3.2.1 @@ -295,7 +292,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.11.2 + 3.12.0 attach-javadocs @@ -315,30 +312,23 @@ - org.sonatype.plugins - nexus-staging-maven-plugin - 1.7.0 + org.sonatype.central + central-publishing-maven-plugin + 0.9.0 + true - true - ossrh - https://oss.sonatype.org/ - 15 - 30 + maven-central-portal + + ${central-publishing.autoPublish} + ${central-publishing.waitUntil} + ${central-publishing.deploymentName} + ${central-publishing.skipPublishing} - - - default-deploy - deploy - - deploy - - - org.jacoco jacoco-maven-plugin - 0.8.12 + 0.8.14 prepare-agent @@ -379,7 +369,7 @@ com.exasol quality-summarizer-maven-plugin - 0.2.0 + 0.2.1 summarize-metrics @@ -392,7 +382,7 @@ com.exasol error-code-crawler-maven-plugin - 2.0.3 + 2.0.5 verify @@ -405,7 +395,7 @@ io.github.git-commit-id git-commit-id-maven-plugin - 9.0.1 + 9.0.2 get-the-git-infos diff --git a/pom.xml b/pom.xml index 43a4be76..af660035 100644 --- a/pom.xml +++ b/pom.xml @@ -3,20 +3,18 @@ 4.0.0 com.exasol sql-statement-builder - 4.6.0 + 4.6.1 Exasol SQL Statement Builder This module provides a Builder for SQL statements that helps to create the correct structure and validates variable parts of the statements. https://github.com/exasol/sql-statement-builder/ 2018 - - 5.17.0 - org.junit.jupiter - junit-jupiter - 5.12.2 + junit-jupiter-params + + 5.13.4 test @@ -25,21 +23,16 @@ 3.0 test - - org.mockito - mockito-core - ${mockito.version} - test - org.mockito mockito-junit-jupiter - ${mockito.version} + 5.20.0 test nl.jqno.equalsverifier equalsverifier + 3.19.4 test @@ -49,7 +42,7 @@ org.itsallcode openfasttrace-maven-plugin - 1.6.1 + 2.3.0 trace-requirements @@ -62,7 +55,7 @@ com.exasol project-keeper-maven-plugin - 5.0.1 + 5.4.3 @@ -76,7 +69,7 @@ sql-statement-builder-generated-parent com.exasol - 4.6.0 + 4.6.1 pk_generated_parent.pom diff --git a/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java b/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java index 04c4a49f..6e2e77e9 100644 --- a/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java +++ b/src/test/java/com/exasol/sql/dql/select/rendering/TestSelectRendering.java @@ -29,73 +29,74 @@ import com.exasol.sql.rendering.StringRendererConfig; class TestSelectRendering { - private Select select; + private Select selectFactory; @BeforeEach void beforeEach() { - this.select = StatementFactory.getInstance().select(); + this.selectFactory = StatementFactory.getInstance().select(); } @Test // Not a requirement, just to see what happens void testSelectWithoutFields() { - assertThat(this.select, rendersTo("SELECT ")); + assertThat(this.selectFactory, rendersTo("SELECT ")); } // [utest->dsn~rendering.sql.select~1] @Test void testSelectAll() { - assertThat(this.select.all(), rendersTo("SELECT *")); + assertThat(this.selectFactory.all(), rendersTo("SELECT *")); } // [utest->dsn~rendering.sql.configurable-case~1] @Test void testSelectAllLowerCase() { - assertThat(this.select.all(), + assertThat(this.selectFactory.all(), rendersWithConfigTo(StringRendererConfig.builder().lowerCase(true).build(), "select *")); } // [utest->dsn~rendering.sql.select~1] @Test void testSelectFieldNames() { - assertThat(this.select.field("a", "b"), rendersTo("SELECT a, b")); + assertThat(this.selectFactory.field("a", "b"), rendersTo("SELECT a, b")); } // [utest->dsn~rendering.sql.select~1] @Test void testSelectChainOfFieldNames() { - assertThat(this.select.field("a", "b").field("c"), rendersTo("SELECT a, b, c")); + assertThat(this.selectFactory.field("a", "b").field("c"), rendersTo("SELECT a, b, c")); } // [utest->dsn~rendering.sql.select~1] @Test void testSelectFromTable() { - assertThat(this.select.all().from().table("persons"), rendersTo("SELECT * FROM persons")); + assertThat(this.selectFactory.all().from().table("persons"), rendersTo("SELECT * FROM persons")); } // [utest->dsn~rendering.sql.select~1] @Test void testSelectFromMultipleTable() { - assertThat(this.select.all().from().table("table1").table("table2"), rendersTo("SELECT * FROM table1, table2")); + assertThat(this.selectFactory.all().from().table("table1").table("table2"), + rendersTo("SELECT * FROM table1, table2")); } // [utest->dsn~rendering.sql.select~1] @Test void testSelectFromTableAs() { - assertThat(this.select.all().from().tableAs("table", "t"), rendersTo("SELECT * FROM table AS t")); + assertThat(this.selectFactory.all().from().tableAs("table", "t"), rendersTo("SELECT * FROM table AS t")); } // [utest->dsn~rendering.sql.select~1] @Test void testSelectFromMultipleTableAs() { - assertThat(this.select.all().from().tableAs("table1", "t1").tableAs("table2", "t2"), + assertThat(this.selectFactory.all().from().tableAs("table1", "t1").tableAs("table2", "t2"), rendersTo("SELECT * FROM table1 AS t1, table2 AS t2")); } // [utest->dsn~select-statement.out-of-order-clauses~1] @Test void testAddClausesInRandomOrder() { - assertThat(this.select.limit(1).all().where(not(true)).from().join("A", "A.aa = B.bb").table("B"), + assertThat(this.selectFactory.limit(1).all().where(not(true)).from().join("A", "A.aa = B.bb").table("B"), rendersTo("SELECT * FROM B JOIN A ON A.aa = B.bb WHERE NOT(TRUE) LIMIT 1")); } @@ -103,7 +104,7 @@ void testAddClausesInRandomOrder() { @Test void testSelectWithQuotedIdentifiers() { final StringRendererConfig config = StringRendererConfig.builder().quoteIdentifiers(true).build(); - assertThat(this.select.field("fieldA", "tableA.fieldB", "tableB.*").from().table("schemaA.tableA"), + assertThat(this.selectFactory.field("fieldA", "tableA.fieldB", "tableB.*").from().table("schemaA.tableA"), rendersWithConfigTo(config, "SELECT \"fieldA\", \"tableA\".\"fieldB\", \"tableB\".* FROM \"schemaA\".\"tableA\"")); } @@ -111,14 +112,14 @@ void testSelectWithQuotedIdentifiers() { @Test void testSelectWithQuotedIdentifiersDoesNotAddExtraQuotes() { final StringRendererConfig config = StringRendererConfig.builder().quoteIdentifiers(true).build(); - assertThat(this.select.field("\"fieldA\"", "\"tableA\".fieldB"), + assertThat(this.selectFactory.field("\"fieldA\"", "\"tableA\".fieldB"), rendersWithConfigTo(config, "SELECT \"fieldA\", \"tableA\".\"fieldB\"")); } @Test void testQuotedIdentifiers() { final StringRendererConfig config = StringRendererConfig.builder().quoteIdentifiers(true).build(); - final Select select = this.select.all(); + final Select select = this.selectFactory.all(); select.from().table("person"); select.where(eq(stringLiteral("foo"), ColumnReference.of("test"))); assertThat(select, rendersWithConfigTo(config, "SELECT * FROM \"person\" WHERE 'foo' = \"test\"")); @@ -128,19 +129,19 @@ void testQuotedIdentifiers() { void testSelectFromSubSelect() { final Select innerSelect = StatementFactory.getInstance().select(); innerSelect.all().from().table("t"); - this.select.all().from().select(innerSelect); - assertThat(this.select, rendersTo("SELECT * FROM (SELECT * FROM t)")); + this.selectFactory.all().from().select(innerSelect); + assertThat(this.selectFactory, rendersTo("SELECT * FROM (SELECT * FROM t)")); } @Test void testSelectFromSubSelectInvalid() { final Select innerSelect = StatementFactory.getInstance().select(); innerSelect.all().from().table("t"); - final ValueTable values = new ValueTable(this.select); - this.select.all().from().select(innerSelect).valueTable(values); + final ValueTable values = new ValueTable(this.selectFactory); + this.selectFactory.all().from().select(innerSelect).valueTable(values); final SelectRenderer renderer = SelectRenderer.create(); final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, - () -> this.select.accept(renderer)); + () -> this.selectFactory.accept(renderer)); assertThat(exception.getMessage(), containsString("SELECT statement cannot combine sub-select and value table")); } @@ -150,8 +151,8 @@ void testSelectFromSubSelectInvalid() { void testSelectWithLikePredicate() { final BooleanExpression like1 = notLike(stringLiteral("abcd"), stringLiteral("a_d")); final BooleanExpression like2 = like(stringLiteral("%bcd"), stringLiteral("\\%%d")); - this.select.valueExpression(like1, "res1").valueExpression(like2, "res2"); - assertThat(this.select, rendersTo("SELECT 'abcd' NOT LIKE 'a_d' res1, '%bcd' LIKE '\\%%d' res2")); + this.selectFactory.valueExpression(like1, "res1").valueExpression(like2, "res2"); + assertThat(this.selectFactory, rendersTo("SELECT 'abcd' NOT LIKE 'a_d' res1, '%bcd' LIKE '\\%%d' res2")); } @Test @@ -321,4 +322,4 @@ void testSelectTwoScalarFunctions() { assertThat(select, rendersTo("SELECT ADD_YEARS('2000-02-29', 1) AY1, ADD_YEARS('2005-01-31 12:00:00', -1) AY2")); } -} \ No newline at end of file +}