diff --git a/.gitattributes b/.gitattributes index fda8f9c..a74e6e6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,11 @@ -poetry.lock linguist-generated +/poetry.lock linguist-generated +/exasol/python_extension_common/version.py linguist-generated +/.github/workflows/build-and-publish.yml linguist-generated +/.github/workflows/cd.yml linguist-generated +/.github/workflows/check-release-tag.yml linguist-generated +/.github/workflows/checks.yml linguist-generated +/.github/workflows/ci.yml linguist-generated +/.github/workflows/gh-pages.yml linguist-generated +/.github/workflows/merge-gate.yml linguist-generated +/.github/workflows/pr-merge.yml linguist-generated +/.github/workflows/report.yml linguist-generated diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index ccd2989..9ba56f8 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -4,35 +4,42 @@ on: workflow_call: secrets: PYPI_TOKEN: - required: true + required: true jobs: - - cd-job: - name: Continuous Delivery - runs-on: ubuntu-24.04 + build-and-publish: + name: Build & Publish + runs-on: "ubuntu-24.04" permissions: contents: write steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Artifacts + id: build-artifacts run: poetry build - - name: PyPi Release + - name: Publish Release to PyPi + id: publish-release-to-pypi env: POETRY_HTTP_BASIC_PYPI_USERNAME: "__token__" POETRY_HTTP_BASIC_PYPI_PASSWORD: "${{ secrets.PYPI_TOKEN }}" run: poetry publish - - name: GitHub Release + - name: Publish Release to GitHub + id: publish-release-to-github env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: > + run: >- gh release create ${GITHUB_REF_NAME} --title ${GITHUB_REF_NAME} --notes-file ./doc/changes/changes_${GITHUB_REF_NAME}.md diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1fb0e2e..2317690 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -7,16 +7,16 @@ on: - '!v*' jobs: - - check-tag-version-job: + check-release-tag: name: Check Release Tag uses: ./.github/workflows/check-release-tag.yml permissions: contents: read - cd-job: - needs: [ check-tag-version-job ] - name: Continuous Delivery + build-and-publish: + needs: + - check-release-tag + name: Build & Publish uses: ./.github/workflows/build-and-publish.yml permissions: contents: write @@ -24,7 +24,8 @@ jobs: PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} publish-docs: - needs: [ cd-job ] + needs: + - build-and-publish name: Publish Documentation uses: ./.github/workflows/gh-pages.yml permissions: diff --git a/.github/workflows/check-release-tag.yml b/.github/workflows/check-release-tag.yml index f24e34f..5423c11 100644 --- a/.github/workflows/check-release-tag.yml +++ b/.github/workflows/check-release-tag.yml @@ -5,18 +5,24 @@ on: jobs: - check-tag-version-job: - name: Check Tag Version - runs-on: ubuntu-24.04 + check-release-tag: + name: Check Release Tag + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Check Tag Version + - name: Check Release Tag + id: check-release-tag # make sure the pushed/created tag matched the project version run: "[[ `poetry version --short` == ${{ github.ref_name }} ]]" diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 68ce669..2941275 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -4,187 +4,242 @@ on: workflow_call: jobs: - Version-Check: - name: Version - runs-on: ubuntu-24.04 + check-version: + name: Check Version + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Check Version(s) + - name: Check Version + id: check-version run: poetry run -- nox -s version:check - Documentation: + build-documentation-and-check-links: name: Docs - needs: [ Version-Check ] - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Documentation - run: | - poetry run -- nox -s docs:build - - - name: Link Check - run: | - poetry run -- nox -s links:check + id: build-documentation + run: poetry run -- nox -s docs:build - build-matrix: - name: Generate Build Matrix - uses: ./.github/workflows/matrix-python.yml - permissions: - contents: read + - name: Check Links + id: check-links + run: poetry run -- nox -s links:check - Changelog: - name: Changelog Update Check - runs-on: ubuntu-24.04 + check-changelog-was-updated: + name: Check Changelog was Updated + runs-on: "ubuntu-24.04" permissions: contents: read if: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/master' }} steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Run changelog update check + - name: Check Changelog was Updated + id: check-changelog-was-updated run: poetry run -- nox -s changelog:updated - Lint: - name: Linting (Python-${{ matrix.python-version }}) - needs: [ Version-Check, build-matrix ] - runs-on: ubuntu-24.04 + lint-code: + name: Lint Code (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run lint + - name: Lint Code + id: lint-code run: poetry run -- nox -s lint:code - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: - name: lint-python${{ matrix.python-version }} + name: lint-python${{ matrix.python-versions }} path: | .lint.txt .lint.json include-hidden-files: true - Type-Check: - name: Type Checking (Python-${{ matrix.python-version }}) - needs: [ Version-Check, build-matrix ] - runs-on: ubuntu-24.04 + lint-typing: + name: Lint Typing (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run type-check + - name: Lint Typing + id: lint-typing run: poetry run -- nox -s lint:typing - Security: - name: Security Checks (Python-${{ matrix.python-version }}) - needs: [ Version-Check, build-matrix ] - runs-on: ubuntu-24.04 + audit-security: + name: Audit Security (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run security linter + - name: Audit Security + id: audit-security run: poetry run -- nox -s lint:security - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: - name: security-python${{ matrix.python-version }} + name: security-python${{ matrix.python-versions }} path: .security.json include-hidden-files: true - Format: - name: Format Check - runs-on: ubuntu-24.04 + check-format: + name: Check Format + runs-on: "ubuntu-24.04" + permissions: + contents: read + steps: + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 + + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" + + - name: Check Format + id: check-format + run: poetry run -- nox -s format:check + + + build-package: + name: Build Package + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - - name: Run format check - run: poetry run -- nox -s project:format + - name: Build Package + id: build-package + run: poetry run -- nox -s package:check - Tests: - name: Unit-Tests (Python-${{ matrix.python-version }}) - needs: [ Documentation, Lint, Type-Check, Security, Format, build-matrix ] - runs-on: ubuntu-24.04 + run-unit-tests: + name: Run Unit Tests (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - - name: Run Tests and Collect Coverage + - name: Run Unit Tests + id: run-unit-tests run: poetry run -- nox -s test:unit -- --coverage - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: - name: coverage-python${{ matrix.python-version }}-fast + name: coverage-python${{ matrix.python-versions }}-fast path: .coverage include-hidden-files: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d7f0a0f..b529c2b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,21 +2,21 @@ name: CI on: pull_request: - types: [opened, synchronize, reopened] + types: [opened, synchronize, reopened] schedule: # At 00:00 on every 7th day-of-month from 1 through 31. (https://crontab.guru) - cron: "0 0 1/7 * *" jobs: - - CI: + merge-gate: uses: ./.github/workflows/merge-gate.yml secrets: inherit permissions: contents: read - Metrics: - needs: [ CI ] + report: + needs: + - merge-gate uses: ./.github/workflows/report.yml secrets: inherit permissions: diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 9b349dc..5616ebd 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -7,30 +7,38 @@ on: jobs: build-documentation: - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 with: fetch-depth: 0 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Documentation + id: build-documentation run: | poetry run -- nox -s docs:multiversion - rm -r .html-documentation/*/.doctrees + mv .html-documentation html-documentation - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + - name: Upload Artifact + id: upload-artifact + uses: actions/upload-pages-artifact@v4 with: - path: .html-documentation + path: html-documentation deploy-documentation: - needs: [ build-documentation ] + needs: + - build-documentation permissions: contents: read pages: write @@ -38,8 +46,8 @@ jobs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" steps: - name: Deploy to GitHub Pages - id: deployment + id: deploy-to-github-pages uses: actions/deploy-pages@v4 diff --git a/.github/workflows/matrix-all.yml b/.github/workflows/matrix-all.yml deleted file mode 100644 index 469eb8a..0000000 --- a/.github/workflows/matrix-all.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Build Matrix (All Versions) - -on: - workflow_call: - outputs: - matrix: - description: "Generates the all versions build matrix" - value: ${{ jobs.all_versions.outputs.matrix }} - -jobs: - all_versions: - runs-on: ubuntu-24.04 - permissions: - contents: read - steps: - - name: SCM Checkout - uses: actions/checkout@v4 - - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 - - - name: Generate matrix - run: poetry run -- nox -s matrix:all - - - id: set-matrix - run: | - echo "matrix=$(poetry run -- nox -s matrix:all)" >> $GITHUB_OUTPUT - - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} diff --git a/.github/workflows/matrix-exasol.yml b/.github/workflows/matrix-exasol.yml deleted file mode 100644 index 454754d..0000000 --- a/.github/workflows/matrix-exasol.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Build Matrix (Exasol) - -on: - workflow_call: - outputs: - matrix: - description: "Generates the exasol version build matrix" - value: ${{ jobs.exasol_versions.outputs.matrix }} - -jobs: - exasol_versions: - runs-on: ubuntu-24.04 - permissions: - contents: read - steps: - - name: SCM Checkout - uses: actions/checkout@v4 - - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 - - - name: Generate matrix - run: poetry run -- nox -s matrix:exasol - - - id: set-matrix - run: | - echo "matrix=$(poetry run -- nox -s matrix:exasol)" >> $GITHUB_OUTPUT - - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} diff --git a/.github/workflows/matrix-python.yml b/.github/workflows/matrix-python.yml deleted file mode 100644 index a9e48a4..0000000 --- a/.github/workflows/matrix-python.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Build Matrix (Python) - -on: - workflow_call: - outputs: - matrix: - description: "Generates the python version build matrix" - value: ${{ jobs.python_versions.outputs.matrix }} - -jobs: - python_versions: - runs-on: ubuntu-24.04 - permissions: - contents: read - steps: - - name: SCM Checkout - uses: actions/checkout@v4 - - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 - - - name: Generate matrix - run: poetry run -- nox -s matrix:python - - - id: set-matrix - run: | - echo "matrix=$(poetry run -- nox -s matrix:python)" >> $GITHUB_OUTPUT - - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} diff --git a/.github/workflows/merge-gate.yml b/.github/workflows/merge-gate.yml index 9caa3ce..46753e3 100644 --- a/.github/workflows/merge-gate.yml +++ b/.github/workflows/merge-gate.yml @@ -4,19 +4,17 @@ on: workflow_call: jobs: - - fast-checks: - name: Fast + run-fast-checks: + name: Run Fast Checks uses: ./.github/workflows/checks.yml permissions: contents: read - run-slow-tests: - name: Run Slow Tests - runs-on: ubuntu-24.04 + approve-run-slow-tests: + name: Approve Running Slow Tests? + runs-on: "ubuntu-24.04" permissions: contents: read - # Even though the environment "manual-approval" will be created automatically, # it still needs to be configured to require interactive review. # See project settings on GitHub (Settings / Environments / manual-approval). @@ -25,25 +23,26 @@ jobs: - name: Tests run: echo "Slow tests approved" - slow-checks: - name: Slow - needs: [ run-slow-tests ] + run-slow-checks: + name: Run Slow Checks + needs: + - approve-run-slow-tests uses: ./.github/workflows/slow-checks.yml secrets: inherit permissions: contents: read # This job ensures inputs have been executed successfully. - approve-merge: + allow-merge: name: Allow Merge - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read # If you need additional jobs to be part of the merge gate, add them below - needs: [ fast-checks, slow-checks ] - + needs: + - run-fast-checks + - run-slow-checks # Each job requires a step, so we added this dummy step. steps: - name: Approve - run: | - echo "Merge Approved" + run: echo "Merge Approved" diff --git a/.github/workflows/pr-merge.yml b/.github/workflows/pr-merge.yml index a95cee5..482647e 100644 --- a/.github/workflows/pr-merge.yml +++ b/.github/workflows/pr-merge.yml @@ -7,12 +7,10 @@ on: - 'master' jobs: - # This job can be removed if certain preconditions are met. See # https://exasol.github.io/python-toolbox/user_guide/workflows.html#pr-merge-workflow - - ci-job: - name: Checks + run-fast-checks: + name: Run Fast Checks uses: ./.github/workflows/checks.yml permissions: contents: read @@ -25,8 +23,9 @@ jobs: pages: write id-token: write - metrics: - needs: [ ci-job ] + report: + needs: + - run-fast-checks uses: ./.github/workflows/report.yml secrets: inherit permissions: diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index 7a6ac75..7748487 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -6,48 +6,59 @@ on: jobs: report: - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 with: fetch-depth: 0 - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Download Artifacts - uses: actions/download-artifact@v5.0.0 + id: download-artifacts + uses: actions/download-artifact@v7 with: path: ./artifacts - name: Copy Artifacts into Root Folder + id: copy-artifacts-into-root-folder run: poetry run -- nox -s artifacts:copy -- artifacts - name: Validate Artifacts + id: validate-artifacts run: poetry run -- nox -s artifacts:validate - - name: Upload to sonar + - name: Upload to Sonar + id: upload-to-sonar env: SONAR_TOKEN: "${{ secrets.SONAR_TOKEN }}" run: poetry run -- nox -s sonar:check - name: Generate Report + id: generate-report run: poetry run -- nox -s project:report -- --format json | tee metrics.json - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: name: metrics.json path: metrics.json - name: Generate GitHub Summary - run: | + id: generate-github-summary + run: |- echo -e "# Summary\n" >> $GITHUB_STEP_SUMMARY poetry run -- nox -s project:report -- --format markdown >> $GITHUB_STEP_SUMMARY poetry run -- nox -s dependency:licenses >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml index 6de30d3..3d9e77c 100644 --- a/.github/workflows/slow-checks.yml +++ b/.github/workflows/slow-checks.yml @@ -4,33 +4,31 @@ on: workflow_call: jobs: - build-matrix: - name: Generate Build Matrix - uses: ./.github/workflows/matrix-all.yml - permissions: - contents: read - tests: - name: Integration-Tests (Python-${{ matrix.python-version }}, Exasol-${{ matrix.exasol-version}}) - needs: [ build-matrix ] - runs-on: ubuntu-24.04 + run-integration-tests: + name: Integration Tests (${{ matrix.backend }}, ${{ matrix.exasol-version}}) + runs-on: "ubuntu-24.04" permissions: contents: read - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} strategy: fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} + matrix: + include: + - backend: saas + exasol-version: provided + - backend: onprem + exasol-version: "2025.1.8" steps: - - name: SCM Checkout - uses: actions/checkout@v4 + - name: Allow unprivileged user namespaces + run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - name: Free disk space uses: jlumbroso/free-disk-space@main with: tool-cache: true large-packages: false + - name: Free disk space by removing large directories run: | sudo rm -rf /usr/local/graalvm/ @@ -40,27 +38,32 @@ jobs: sudo rm -rf /usr/local/lib/node_modules sudo rm -rf /opt/ghc - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@v1 - with: - python-version: ${{ matrix.python-version }} + - name: Check out Repository + id: check-out-repository + uses: actions/checkout@v6 - - name: Allow unprivileged user namespaces - run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 + - name: Set up Python & Poetry Environment + id: set-up-python-and-poetry-environment + uses: exasol/python-toolbox/.github/actions/python-environment@v6 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Run Tests and Collect Coverage + id: run-integration-tests run: > - poetry run -- nox -s test:integration -- - --coverage --db-version ${{ matrix.exasol-version }} - --backend all + poetry run -- nox -s test:integration -- --coverage + --backend ${{ matrix.backend }} + --db-version ${{ matrix.exasol-version }} env: SAAS_HOST: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_HOST }} SAAS_ACCOUNT_ID: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_ACCOUNT_ID }} SAAS_PAT: ${{ secrets.INTEGRATION_TEAM_SAAS_STAGING_PAT }} - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + id: upload-artifacts + uses: actions/upload-artifact@v6 with: - name: coverage-python${{ matrix.python-version }}-slow + name: coverage-python3.10-${{ matrix.backend }}-${{ matrix.exasol-version }} path: .coverage include-hidden-files: true diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md index 3e52c96..b37841d 100644 --- a/doc/changes/changelog.md +++ b/doc/changes/changelog.md @@ -1,6 +1,7 @@ # 📝 Changes * [unreleased](unreleased.md) +* [0.13.0](changes_0.13.0.md) * [0.12.1](changes_0.12.1.md) * [0.12.0](changes_0.12.0.md) * [0.11.0](changes_0.11.0.md) @@ -21,6 +22,7 @@ hidden: --- unreleased +changes_0.13.0 changes_0.12.1 changes_0.12.0 changes_0.11.0 diff --git a/doc/changes/changes_0.13.0.md b/doc/changes/changes_0.13.0.md new file mode 100644 index 0000000..f7492d6 --- /dev/null +++ b/doc/changes/changes_0.13.0.md @@ -0,0 +1,28 @@ +# 0.13.0 - 2026-02-27 + +## Summary + +This release updates dependencies incl. updating the PTB to version ≥6 and re-generating the GitHub workflows. + +## Dependency Updates + +* #130: Poetry relock + +## Refactorings + +* #133: Updated Dependencies + +## Dependency Updates + +### `main` + +* Updated dependency `click:8.3.0` to `8.2.1` +* Updated dependency `exasol-bucketfs:2.0.0` to `2.1.0` +* Updated dependency `exasol-saas-api:2.4.0` to `2.8.0` +* Updated dependency `exasol-script-languages-container-tool:3.4.1` to `3.6.1` +* Updated dependency `pyexasol:1.2.0` to `2.0.0` + +### `dev` + +* Updated dependency `exasol-toolbox:1.10.0` to `6.0.0` +* Updated dependency `pytest-exasol-backend:1.2.1` to `1.3.0` diff --git a/doc/changes/unreleased.md b/doc/changes/unreleased.md index 7d9e5f6..fb47370 100644 --- a/doc/changes/unreleased.md +++ b/doc/changes/unreleased.md @@ -1,6 +1,3 @@ # Unreleased - -## Dependency Updates - -* #130: Poetry relock \ No newline at end of file +## Summary diff --git a/exasol/python_extension_common/cli/std_options.py b/exasol/python_extension_common/cli/std_options.py index 15421ca..c43d9b1 100644 --- a/exasol/python_extension_common/cli/std_options.py +++ b/exasol/python_extension_common/cli/std_options.py @@ -32,7 +32,7 @@ class ParameterFormatters: the update if the value of the parameter dressed with the callback is None. """ - def __init__(self): + def __init__(self) -> None: self._formatters: dict[str, str] = {} def __call__(self, ctx: click.Context, param: click.Parameter, value: Any | None) -> Any | None: @@ -224,7 +224,7 @@ def create_std_option(std_param: StdParamOrName, **kwargs) -> click.Option: The option properties. """ param_decls = [ - get_bool_opt_name(std_param) if kwargs.get("type") == bool else get_opt_name(std_param) + get_bool_opt_name(std_param) if kwargs.get("type") is bool else get_opt_name(std_param) ] if kwargs.get("hide_input", False): make_option_secret(kwargs, prompt=_get_param_name(std_param).replace("_", " ")) diff --git a/exasol/python_extension_common/connections/pyexasol_connection.py b/exasol/python_extension_common/connections/pyexasol_connection.py index 1c0023c..ab254d0 100644 --- a/exasol/python_extension_common/connections/pyexasol_connection.py +++ b/exasol/python_extension_common/connections/pyexasol_connection.py @@ -21,7 +21,7 @@ def open_pyexasol_connection(**kwargs) -> pyexasol.ExaConnection: """ # Fix the compatibility issue - if ("db_pass" in kwargs) and not (StdParams.db_password.name in kwargs): + if ("db_pass" in kwargs) and (StdParams.db_password.name not in kwargs): kwargs[StdParams.db_password.name] = kwargs["db_pass"] # Infer where the database is - On-Prem or SaaS. diff --git a/exasol/python_extension_common/deployment/extract_validator.py b/exasol/python_extension_common/deployment/extract_validator.py index bab0c91..1833988 100644 --- a/exasol/python_extension_common/deployment/extract_validator.py +++ b/exasol/python_extension_common/deployment/extract_validator.py @@ -1,4 +1,3 @@ -import re from datetime import ( datetime, timedelta, @@ -6,7 +5,6 @@ from textwrap import dedent from typing import ( Callable, - List, ) import exasol.bucketfs as bfs # type: ignore diff --git a/exasol/python_extension_common/deployment/language_container_deployer.py b/exasol/python_extension_common/deployment/language_container_deployer.py index 2f36045..d3bc16b 100644 --- a/exasol/python_extension_common/deployment/language_container_deployer.py +++ b/exasol/python_extension_common/deployment/language_container_deployer.py @@ -10,8 +10,6 @@ ) from textwrap import dedent from typing import ( - Dict, - List, Optional, ) diff --git a/exasol/python_extension_common/deployment/language_container_validator.py b/exasol/python_extension_common/deployment/language_container_validator.py index 9fec027..861e977 100644 --- a/exasol/python_extension_common/deployment/language_container_validator.py +++ b/exasol/python_extension_common/deployment/language_container_validator.py @@ -1,4 +1,6 @@ # This file is only for providing backwards compatibility. # As function temp_schema() has been moved to file temp_schema.py. -from exasol.python_extension_common.deployment.temp_schema import temp_schema +from exasol.python_extension_common.deployment.temp_schema import ( + temp_schema as temp_schema, +) diff --git a/exasol/python_extension_common/deployment/temp_schema.py b/exasol/python_extension_common/deployment/temp_schema.py index 660a97a..9c58ee0 100644 --- a/exasol/python_extension_common/deployment/temp_schema.py +++ b/exasol/python_extension_common/deployment/temp_schema.py @@ -22,7 +22,7 @@ def _create_random_schema(conn: pyexasol.ExaConnection, schema_name_length: int) def get_schema(conn: pyexasol.ExaConnection) -> str | None: - return conn.execute(f"SELECT CURRENT_SCHEMA;").fetchval() + return conn.execute("SELECT CURRENT_SCHEMA;").fetchval() def set_schema(conn: pyexasol.ExaConnection, schema: str | None): diff --git a/version.py b/exasol/python_extension_common/version.py similarity index 83% rename from version.py rename to exasol/python_extension_common/version.py index 524597b..b6ec939 100644 --- a/version.py +++ b/exasol/python_extension_common/version.py @@ -1,7 +1,7 @@ """ ATTENTION: This file is generated by exasol/toolbox/nox/_package_version.py when using: - * either "poetry run -- nox -s project:fix" + * either "poetry run -- nox -s format:fix" * or "poetry run -- nox -s version:check -- --fix" Do not edit this file manually! If you need to change the version, do so in the pyproject.toml, e.g. by using @@ -9,7 +9,7 @@ """ MAJOR = 0 -MINOR = 12 -PATCH = 1 +MINOR = 13 +PATCH = 0 VERSION = f"{MAJOR}.{MINOR}.{PATCH}" __version__ = VERSION diff --git a/noxconfig.py b/noxconfig.py index 9cc7565..07b8efd 100644 --- a/noxconfig.py +++ b/noxconfig.py @@ -1,20 +1,9 @@ -from collections.abc import Iterable -from dataclasses import dataclass from pathlib import Path -ROOT_DIR = Path(__file__).parent +from exasol.toolbox.config import BaseConfig - -@dataclass(frozen=True) -class Config: - root: Path = ROOT_DIR - doc: Path = ROOT_DIR / "doc" - version_file: Path = ROOT_DIR / "version.py" - path_filters: Iterable[str] = ("dist", ".eggs", "venv", "metrics-schema", ".poetry") - source: Path = Path("exasol/python_extension_common") - - exasol_versions = ["7.1.9"] - python_versions = ["3.10", "3.11"] - - -PROJECT_CONFIG = Config() +PROJECT_CONFIG = BaseConfig( + root_path=Path(__file__).parent, + project_name="python_extension_common", + python_versions=("3.10", "3.11", "3.12", "3.13"), +) diff --git a/noxfile.py b/noxfile.py index 0f085cb..6847efb 100644 --- a/noxfile.py +++ b/noxfile.py @@ -3,7 +3,7 @@ import nox # imports all nox task provided by the toolbox -from exasol.toolbox.nox.tasks import * # pylint: disable=wildcard-import disable=unused-wildcard-import +from exasol.toolbox.nox.tasks import * # noqa: F403, pylint: disable=wildcard-import disable=unused-wildcard-import # default actions to be run if nothing is explicitly specified with the -s option -nox.options.sessions = ["project:fix"] +nox.options.sessions = ["format:fix"] diff --git a/poetry.lock b/poetry.lock index e6c5a09..e754b29 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -204,14 +204,14 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch [[package]] name = "bandit" -version = "1.9.3" +version = "1.9.4" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "bandit-1.9.3-py3-none-any.whl", hash = "sha256:4745917c88d2246def79748bde5e08b9d5e9b92f877863d43fab70cd8814ce6a"}, - {file = "bandit-1.9.3.tar.gz", hash = "sha256:ade4b9b7786f89ef6fc7344a52b34558caec5da74cb90373aed01de88472f774"}, + {file = "bandit-1.9.4-py3-none-any.whl", hash = "sha256:f89ffa663767f5a0585ea075f01020207e966a9c0f2b9ef56a57c7963a3f6f8e"}, + {file = "bandit-1.9.4.tar.gz", hash = "sha256:b589e5de2afe70bd4d53fa0c1da6199f4085af666fde00e8a034f152a52cd628"}, ] [package.dependencies] @@ -423,14 +423,14 @@ redis = ["redis (>=2.10.5)"] [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "dev"] files = [ - {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, - {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, ] [[package]] @@ -1222,14 +1222,14 @@ simplejson = ">=3.16.0" [[package]] name = "exasol-saas-api" -version = "2.7.0" +version = "2.8.0" description = "API enabling Python applications connecting to Exasol database SaaS instances and using their SaaS services" optional = false python-versions = "<4.0,>=3.10.0" groups = ["main", "dev"] files = [ - {file = "exasol_saas_api-2.7.0-py3-none-any.whl", hash = "sha256:242193a17d9bd5277838b6f1fb837a390d4d5dea5fb017bcdd6c856149154a76"}, - {file = "exasol_saas_api-2.7.0.tar.gz", hash = "sha256:0a0398f66b45d823c821fa8b4293f8c8b1209633eadd43b5b985b21c6bffc031"}, + {file = "exasol_saas_api-2.8.0-py3-none-any.whl", hash = "sha256:fa2628e7d058f0a378d880c55ec36155507c326daa013ee33ec2d75773290998"}, + {file = "exasol_saas_api-2.8.0.tar.gz", hash = "sha256:7cc31f01737749f464b9032d14631a5e4189f006021197a201b1786740ead238"}, ] [package.dependencies] @@ -1288,44 +1288,48 @@ pydantic = ">=2.10.2,<3.0.0" [[package]] name = "exasol-toolbox" -version = "1.13.0" +version = "6.0.0" description = "Your one-stop solution for managing all standard tasks and core workflows of your Python project." optional = false -python-versions = "<4.0,>=3.9.2" +python-versions = "<4.0,>=3.10" groups = ["dev"] files = [ - {file = "exasol_toolbox-1.13.0-py3-none-any.whl", hash = "sha256:bcc228149695a439948956645c0e1eb8894847f7ee303072ae4533e9db6220dd"}, - {file = "exasol_toolbox-1.13.0.tar.gz", hash = "sha256:3ddec24123a9e8a00d3f90df3e6d14c5a1919f5d741b100f730106359bb27b1d"}, + {file = "exasol_toolbox-6.0.0-py3-none-any.whl", hash = "sha256:327a743938fb4fd78701068480ed5bda9f466b434de769a251f6294647e3ec92"}, + {file = "exasol_toolbox-6.0.0.tar.gz", hash = "sha256:cac9f5b847feaf53a3808f14ba2ebc03a533865aa3c1ea7754c14c001e8945e5"}, ] [package.dependencies] -bandit = {version = ">=1.7.9,<2.0.0", extras = ["toml"]} +bandit = {version = ">=1.7.9,<2", extras = ["toml"]} black = ">=24.1.0,<26" coverage = ">=6.4.4,<8.0.0" furo = ">=2022.9.15" -import-linter = ">=2.0,<3.0" +import-linter = ">=2.0,<3" importlib-resources = ">=5.12.0" -isort = ">=6.0.1,<7.0.0" -jinja2 = ">=3.1.6,<4.0.0" +isort = ">=7.0.0,<8" +jinja2 = ">=3.1.6,<4" mypy = ">=0.971" myst-parser = ">=2.0.0,<4" nox = ">=2022.8.7" -pip-audit = ">=2.7.3,<3.0.0" -pip-licenses = ">=5.0.0,<6.0.0" -pluggy = ">=1.5.0,<2.0.0" +pip-audit = ">=2.7.3,<3" +pip-licenses = ">=5.0.0,<6" +pluggy = ">=1.5.0,<2" pre-commit = ">=4,<5" -pydantic = ">=2.11.5,<3.0.0" +pydantic = ">=2.11.5,<3" pylint = ">=2.15.4" -pysonar = ">=1.0.1.1548,<2.0.0.0" -pytest = ">=7.2.2,<9" +pysonar = ">=1.0.1.1548,<2" +pytest = ">=7.2.2,<10" pyupgrade = ">=2.38.2,<4.0.0" +ruamel-yaml = ">=0.18.0,<=0.18.16" +ruff = ">=0.14.5,<0.15" shibuya = ">=2024.5.14" sphinx = ">=5.3,<8" -sphinx-copybutton = ">=0.5.0,<0.6.0" +sphinx-copybutton = ">=0.5.0,<0.6" sphinx-design = ">=0.5.0,<1" -sphinx-inline-tabs = ">=2023.4.21,<2024.0.0" -sphinx-toolbox = ">=4.0.0,<5.0.0" -twine = ">=6.1.0,<7.0.0" +sphinx-inline-tabs = ">=2023.4.21,<2024" +sphinx-toolbox = ">=4.0.0,<5" +sphinxcontrib-mermaid = ">=2.0.0,<3.0.0" +structlog = ">=25.5.0,<26.0.0" +twine = ">=6.1.0,<7" typer = {version = ">=0.7.0", extras = ["all"]} [[package]] @@ -1370,38 +1374,38 @@ pytest = ["pytest (>=7)"] [[package]] name = "fastapi" -version = "0.129.0" +version = "0.133.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "fastapi-0.129.0-py3-none-any.whl", hash = "sha256:b4946880e48f462692b31c083be0432275cbfb6e2274566b1be91479cc1a84ec"}, - {file = "fastapi-0.129.0.tar.gz", hash = "sha256:61315cebd2e65df5f97ec298c888f9de30430dd0612d59d6480beafbc10655af"}, + {file = "fastapi-0.133.1-py3-none-any.whl", hash = "sha256:658f34ba334605b1617a65adf2ea6461901bdb9af3a3080d63ff791ecf7dc2e2"}, + {file = "fastapi-0.133.1.tar.gz", hash = "sha256:ed152a45912f102592976fde6cbce7dae1a8a1053da94202e51dd35d184fadd6"}, ] [package.dependencies] annotated-doc = ">=0.0.2" pydantic = ">=2.7.0" -starlette = ">=0.40.0,<1.0.0" +starlette = ">=0.40.0" typing-extensions = ">=4.8.0" typing-inspection = ">=0.4.2" [package.extras] -all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.9.3)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=5.8.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "uvicorn[standard] (>=0.12.0)"] standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "filelock" -version = "3.21.2" +version = "3.24.3" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.21.2-py3-none-any.whl", hash = "sha256:d6cd4dbef3e1bb63bc16500fc5aa100f16e405bbff3fb4231711851be50c1560"}, - {file = "filelock-3.21.2.tar.gz", hash = "sha256:cfd218cfccf8b947fce7837da312ec3359d10ef2a47c8602edd59e0bacffb708"}, + {file = "filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d"}, + {file = "filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa"}, ] [[package]] @@ -1421,7 +1425,7 @@ accessible-pygments = ">=0.0.5" beautifulsoup4 = "*" pygments = ">=2.7" sphinx = ">=7.0,<10.0" -sphinx-basic-ng = ">=1.0.0.beta2" +sphinx-basic-ng = ">=1.0.0b2" [[package]] name = "gitdb" @@ -1852,14 +1856,14 @@ files = [ [[package]] name = "isort" -version = "6.1.0" +version = "7.0.0" description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.10.0" groups = ["dev"] files = [ - {file = "isort-6.1.0-py3-none-any.whl", hash = "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784"}, - {file = "isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481"}, + {file = "isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1"}, + {file = "isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187"}, ] [package.extras] @@ -2017,7 +2021,7 @@ files = [ [package.dependencies] attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" +jsonschema-specifications = ">=2023.3.6" referencing = ">=0.28.4" rpds-py = ">=0.25.0" @@ -2073,103 +2077,103 @@ type = ["pygobject-stubs", "pytest-mypy (>=1.0.1)", "shtab", "types-pywin32"] [[package]] name = "librt" -version = "0.8.0" +version = "0.8.1" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "librt-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db63cf3586a24241e89ca1ce0b56baaec9d371a328bd186c529b27c914c9a1ef"}, - {file = "librt-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba9d9e60651615bc614be5e21a82cdb7b1769a029369cf4b4d861e4f19686fb6"}, - {file = "librt-0.8.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb4b3ad543084ed79f186741470b251b9d269cd8b03556f15a8d1a99a64b7de5"}, - {file = "librt-0.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d2720335020219197380ccfa5c895f079ac364b4c429e96952cd6509934d8eb"}, - {file = "librt-0.8.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726305d3e53419d27fc8cdfcd3f9571f0ceae22fa6b5ea1b3662c2e538f833e"}, - {file = "librt-0.8.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3d107f603b5ee7a79b6aa6f166551b99b32fb4a5303c4dfcb4222fc6a0335e"}, - {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41064a0c07b4cc7a81355ccc305cb097d6027002209ffca51306e65ee8293630"}, - {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c6e4c10761ddbc0d67d2f6e2753daf99908db85d8b901729bf2bf5eaa60e0567"}, - {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ba581acad5ac8f33e2ff1746e8a57e001b47c6721873121bf8bbcf7ba8bd3aa4"}, - {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bdab762e2c0b48bab76f1a08acb3f4c77afd2123bedac59446aeaaeed3d086cf"}, - {file = "librt-0.8.0-cp310-cp310-win32.whl", hash = "sha256:6a3146c63220d814c4a2c7d6a1eacc8d5c14aed0ff85115c1dfea868080cd18f"}, - {file = "librt-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:bbebd2bba5c6ae02907df49150e55870fdd7440d727b6192c46b6f754723dde9"}, - {file = "librt-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ce33a9778e294507f3a0e3468eccb6a698b5166df7db85661543eca1cfc5369"}, - {file = "librt-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8070aa3368559de81061ef752770d03ca1f5fc9467d4d512d405bd0483bfffe6"}, - {file = "librt-0.8.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:20f73d4fecba969efc15cdefd030e382502d56bb6f1fc66b580cce582836c9fa"}, - {file = "librt-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a512c88900bdb1d448882f5623a0b1ad27ba81a9bd75dacfe17080b72272ca1f"}, - {file = "librt-0.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:015e2dde6e096d27c10238bf9f6492ba6c65822dfb69d2bf74c41a8e88b7ddef"}, - {file = "librt-0.8.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c25a131013eadd3c600686a0c0333eb2896483cbc7f65baa6a7ee761017aef9"}, - {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:21b14464bee0b604d80a638cf1ee3148d84ca4cc163dcdcecb46060c1b3605e4"}, - {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05a3dd3f116747f7e1a2b475ccdc6fb637fd4987126d109e03013a79d40bf9e6"}, - {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fa37f99bff354ff191c6bcdffbc9d7cdd4fc37faccfc9be0ef3a4fd5613977da"}, - {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1566dbb9d1eb0987264c9b9460d212e809ba908d2f4a3999383a84d765f2f3f1"}, - {file = "librt-0.8.0-cp311-cp311-win32.whl", hash = "sha256:70defb797c4d5402166787a6b3c66dfb3fa7f93d118c0509ffafa35a392f4258"}, - {file = "librt-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:db953b675079884ffda33d1dca7189fb961b6d372153750beb81880384300817"}, - {file = "librt-0.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:75d1a8cab20b2043f03f7aab730551e9e440adc034d776f15f6f8d582b0a5ad4"}, - {file = "librt-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:17269dd2745dbe8e42475acb28e419ad92dfa38214224b1b01020b8cac70b645"}, - {file = "librt-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f4617cef654fca552f00ce5ffdf4f4b68770f18950e4246ce94629b789b92467"}, - {file = "librt-0.8.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5cb11061a736a9db45e3c1293cfcb1e3caf205912dfa085734ba750f2197ff9a"}, - {file = "librt-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4bb00bd71b448f16749909b08a0ff16f58b079e2261c2e1000f2bbb2a4f0a45"}, - {file = "librt-0.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95a719a049f0eefaf1952673223cf00d442952273cbd20cf2ed7ec423a0ef58d"}, - {file = "librt-0.8.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bd32add59b58fba3439d48d6f36ac695830388e3da3e92e4fc26d2d02670d19c"}, - {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4f764b2424cb04524ff7a486b9c391e93f93dc1bd8305b2136d25e582e99aa2f"}, - {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f04ca50e847abc486fa8f4107250566441e693779a5374ba211e96e238f298b9"}, - {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9ab3a3475a55b89b87ffd7e6665838e8458e0b596c22e0177e0f961434ec474a"}, - {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e36a8da17134ffc29373775d88c04832f9ecfab1880470661813e6c7991ef79"}, - {file = "librt-0.8.0-cp312-cp312-win32.whl", hash = "sha256:4eb5e06ebcc668677ed6389164f52f13f71737fc8be471101fa8b4ce77baeb0c"}, - {file = "librt-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:0a33335eb59921e77c9acc05d0e654e4e32e45b014a4d61517897c11591094f8"}, - {file = "librt-0.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:24a01c13a2a9bdad20997a4443ebe6e329df063d1978bbe2ebbf637878a46d1e"}, - {file = "librt-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7f820210e21e3a8bf8fde2ae3c3d10106d4de9ead28cbfdf6d0f0f41f5b12fa1"}, - {file = "librt-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4831c44b8919e75ca0dfb52052897c1ef59fdae19d3589893fbd068f1e41afbf"}, - {file = "librt-0.8.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:88c6e75540f1f10f5e0fc5e87b4b6c290f0e90d1db8c6734f670840494764af8"}, - {file = "librt-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9646178cd794704d722306c2c920c221abbf080fede3ba539d5afdec16c46dad"}, - {file = "librt-0.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e1af31a710e17891d9adf0dbd9a5fcd94901a3922a96499abdbf7ce658f4e01"}, - {file = "librt-0.8.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:507e94f4bec00b2f590fbe55f48cd518a208e2474a3b90a60aa8f29136ddbada"}, - {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f1178e0de0c271231a660fbef9be6acdfa1d596803464706862bef6644cc1cae"}, - {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:71fc517efc14f75c2f74b1f0a5d5eb4a8e06aa135c34d18eaf3522f4a53cd62d"}, - {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:0583aef7e9a720dd40f26a2ad5a1bf2ccbb90059dac2b32ac516df232c701db3"}, - {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d0f76fc73480d42285c609c0ea74d79856c160fa828ff9aceab574ea4ecfd7b"}, - {file = "librt-0.8.0-cp313-cp313-win32.whl", hash = "sha256:e79dbc8f57de360f0ed987dc7de7be814b4803ef0e8fc6d3ff86e16798c99935"}, - {file = "librt-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:25b3e667cbfc9000c4740b282df599ebd91dbdcc1aa6785050e4c1d6be5329ab"}, - {file = "librt-0.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:e9a3a38eb4134ad33122a6d575e6324831f930a771d951a15ce232e0237412c2"}, - {file = "librt-0.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:421765e8c6b18e64d21c8ead315708a56fc24f44075059702e421d164575fdda"}, - {file = "librt-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:48f84830a8f8ad7918afd743fd7c4eb558728bceab7b0e38fd5a5cf78206a556"}, - {file = "librt-0.8.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9f09d4884f882baa39a7e36bbf3eae124c4ca2a223efb91e567381d1c55c6b06"}, - {file = "librt-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:693697133c3b32aa9b27f040e3691be210e9ac4d905061859a9ed519b1d5a376"}, - {file = "librt-0.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5512aae4648152abaf4d48b59890503fcbe86e85abc12fb9b096fe948bdd816"}, - {file = "librt-0.8.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:995d24caa6bbb34bcdd4a41df98ac6d1af637cfa8975cb0790e47d6623e70e3e"}, - {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b9aef96d7593584e31ef6ac1eb9775355b0099fee7651fae3a15bc8657b67b52"}, - {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4f6e975377fbc4c9567cb33ea9ab826031b6c7ec0515bfae66a4fb110d40d6da"}, - {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:daae5e955764be8fd70a93e9e5133c75297f8bce1e802e1d3683b98f77e1c5ab"}, - {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7bd68cebf3131bb920d5984f75fe302d758db33264e44b45ad139385662d7bc3"}, - {file = "librt-0.8.0-cp314-cp314-win32.whl", hash = "sha256:1e6811cac1dcb27ca4c74e0ca4a5917a8e06db0d8408d30daee3a41724bfde7a"}, - {file = "librt-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:178707cda89d910c3b28bf5aa5f69d3d4734e0f6ae102f753ad79edef83a83c7"}, - {file = "librt-0.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3e8b77b5f54d0937b26512774916041756c9eb3e66f1031971e626eea49d0bf4"}, - {file = "librt-0.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:789911e8fa40a2e82f41120c936b1965f3213c67f5a483fc5a41f5839a05dcbb"}, - {file = "librt-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2b37437e7e4ef5e15a297b36ba9e577f73e29564131d86dd75875705e97402b5"}, - {file = "librt-0.8.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:671a6152edf3b924d98a5ed5e6982ec9cb30894085482acadce0975f031d4c5c"}, - {file = "librt-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8992ca186a1678107b0af3d0c9303d8c7305981b9914989b9788319ed4d89546"}, - {file = "librt-0.8.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:001e5330093d887b8b9165823eca6c5c4db183fe4edea4fdc0680bbac5f46944"}, - {file = "librt-0.8.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d920789eca7ef71df7f31fd547ec0d3002e04d77f30ba6881e08a630e7b2c30e"}, - {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:82fb4602d1b3e303a58bfe6165992b5a78d823ec646445356c332cd5f5bbaa61"}, - {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4d3e38797eb482485b486898f89415a6ab163bc291476bd95712e42cf4383c05"}, - {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a905091a13e0884701226860836d0386b88c72ce5c2fdfba6618e14c72be9f25"}, - {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:375eda7acfce1f15f5ed56cfc960669eefa1ec8732e3e9087c3c4c3f2066759c"}, - {file = "librt-0.8.0-cp314-cp314t-win32.whl", hash = "sha256:2ccdd20d9a72c562ffb73098ac411de351b53a6fbb3390903b2d33078ef90447"}, - {file = "librt-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:25e82d920d4d62ad741592fcf8d0f3bda0e3fc388a184cb7d2f566c681c5f7b9"}, - {file = "librt-0.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:92249938ab744a5890580d3cb2b22042f0dce71cdaa7c1369823df62bedf7cbc"}, - {file = "librt-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b705f85311ee76acec5ee70806990a51f0deb519ea0c29c1d1652d79127604d"}, - {file = "librt-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7ce0a8cb67e702dcb06342b2aaaa3da9fb0ddc670417879adfa088b44cf7b3b6"}, - {file = "librt-0.8.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:aaadec87f45a3612b6818d1db5fbfe93630669b7ee5d6bdb6427ae08a1aa2141"}, - {file = "librt-0.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56901f1eec031396f230db71c59a01d450715cbbef9856bf636726994331195d"}, - {file = "librt-0.8.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b055bb3abaf69abed25743d8fc1ab691e4f51a912ee0a6f9a6c84f4bbddb283d"}, - {file = "librt-0.8.0-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ef3bd856373cf8e7382402731f43bfe978a8613b4039e49e166e1e0dc590216"}, - {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e0ffe88ebb5962f8fb0ddcbaaff30f1ea06a79501069310e1e030eafb1ad787"}, - {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82e61cd1c563745ad495387c3b65806bfd453badb4adbc019df3389dddee1bf6"}, - {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:667e2513cf69bfd1e1ed9a00d6c736d5108714ec071192afb737987955888a25"}, - {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b6caff69e25d80c269b1952be8493b4d94ef745f438fa619d7931066bdd26de"}, - {file = "librt-0.8.0-cp39-cp39-win32.whl", hash = "sha256:02a9fe85410cc9bef045e7cb7fd26fdde6669e6d173f99df659aa7f6335961e9"}, - {file = "librt-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:de076eaba208d16efb5962f99539867f8e2c73480988cb513fcf1b5dbb0c9dcf"}, - {file = "librt-0.8.0.tar.gz", hash = "sha256:cb74cdcbc0103fc988e04e5c58b0b31e8e5dd2babb9182b6f9490488eb36324b"}, + {file = "librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc"}, + {file = "librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7"}, + {file = "librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6"}, + {file = "librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0"}, + {file = "librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b"}, + {file = "librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05"}, + {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891"}, + {file = "librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7"}, + {file = "librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2"}, + {file = "librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd"}, + {file = "librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965"}, + {file = "librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da"}, + {file = "librt-0.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:747328be0c5b7075cde86a0e09d7a9196029800ba75a1689332348e998fb85c0"}, + {file = "librt-0.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0af2bd2bc204fa27f3d6711d0f360e6b8c684a035206257a81673ab924aa11e"}, + {file = "librt-0.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d480de377f5b687b6b1bc0c0407426da556e2a757633cc7e4d2e1a057aa688f3"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d0ee06b5b5291f609ddb37b9750985b27bc567791bc87c76a569b3feed8481ac"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e2c6f77b9ad48ce5603b83b7da9ee3e36b3ab425353f695cba13200c5d96596"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:439352ba9373f11cb8e1933da194dcc6206daf779ff8df0ed69c5e39113e6a99"}, + {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82210adabbc331dbb65d7868b105185464ef13f56f7f76688565ad79f648b0fe"}, + {file = "librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb"}, + {file = "librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b"}, + {file = "librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9"}, + {file = "librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a"}, + {file = "librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9"}, + {file = "librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb"}, + {file = "librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d"}, + {file = "librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7"}, + {file = "librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921"}, + {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0"}, + {file = "librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a"}, + {file = "librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444"}, + {file = "librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d"}, + {file = "librt-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e6bad1cd94f6764e1e21950542f818a09316645337fd5ab9a7acc45d99a8f35"}, + {file = "librt-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf450f498c30af55551ba4f66b9123b7185362ec8b625a773b3d39aa1a717583"}, + {file = "librt-0.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eca45e982fa074090057132e30585a7e8674e9e885d402eae85633e9f449ce6c"}, + {file = "librt-0.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c3811485fccfda840861905b8c70bba5ec094e02825598bb9d4ca3936857a04"}, + {file = "librt-0.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363"}, + {file = "librt-0.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5212a5bd7fae98dae95710032902edcd2ec4dc994e883294f75c857b83f9aba0"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e692aa2d1d604e6ca12d35e51fdc36f4cda6345e28e36374579f7ef3611b3012"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4be2a5c926b9770c9e08e717f05737a269b9d0ebc5d2f0060f0fe3fe9ce47acb"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fd1a720332ea335ceb544cf0a03f81df92abd4bb887679fd1e460976b0e6214b"}, + {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2af9e01e0ef80d95ae3c720be101227edae5f2fe7e3dc63d8857fadfc5a1d"}, + {file = "librt-0.8.1-cp313-cp313-win32.whl", hash = "sha256:086a32dbb71336627e78cc1d6ee305a68d038ef7d4c39aaff41ae8c9aa46e91a"}, + {file = "librt-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:e11769a1dbda4da7b00a76cfffa67aa47cfa66921d2724539eee4b9ede780b79"}, + {file = "librt-0.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:924817ab3141aca17893386ee13261f1d100d1ef410d70afe4389f2359fea4f0"}, + {file = "librt-0.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6cfa7fe54fd4d1f47130017351a959fe5804bda7a0bc7e07a2cdbc3fdd28d34f"}, + {file = "librt-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:228c2409c079f8c11fb2e5d7b277077f694cb93443eb760e00b3b83cb8b3176c"}, + {file = "librt-0.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7aae78ab5e3206181780e56912d1b9bb9f90a7249ce12f0e8bf531d0462dd0fc"}, + {file = "librt-0.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:172d57ec04346b047ca6af181e1ea4858086c80bdf455f61994c4aa6fc3f866c"}, + {file = "librt-0.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3"}, + {file = "librt-0.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10c42e1f6fd06733ef65ae7bebce2872bcafd8d6e6b0a08fe0a05a23b044fb14"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4c8dfa264b9193c4ee19113c985c95f876fae5e51f731494fc4e0cf594990ba7"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:01170b6729a438f0dedc4a26ed342e3dc4f02d1000b4b19f980e1877f0c297e6"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7b02679a0d783bdae30d443025b94465d8c3dc512f32f5b5031f93f57ac32071"}, + {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:190b109bb69592a3401fe1ffdea41a2e73370ace2ffdc4a0e8e2b39cdea81b78"}, + {file = "librt-0.8.1-cp314-cp314-win32.whl", hash = "sha256:e70a57ecf89a0f64c24e37f38d3fe217a58169d2fe6ed6d70554964042474023"}, + {file = "librt-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:7e2f3edca35664499fbb36e4770650c4bd4a08abc1f4458eab9df4ec56389730"}, + {file = "librt-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0d2f82168e55ddefd27c01c654ce52379c0750ddc31ee86b4b266bcf4d65f2a3"}, + {file = "librt-0.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c74a2da57a094bd48d03fa5d196da83d2815678385d2978657499063709abe1"}, + {file = "librt-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a355d99c4c0d8e5b770313b8b247411ed40949ca44e33e46a4789b9293a907ee"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2eb345e8b33fb748227409c9f1233d4df354d6e54091f0e8fc53acdb2ffedeb7"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9be2f15e53ce4e83cc08adc29b26fb5978db62ef2a366fbdf716c8a6c8901040"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:785ae29c1f5c6e7c2cde2c7c0e148147f4503da3abc5d44d482068da5322fd9e"}, + {file = "librt-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d3a7da44baf692f0c6aeb5b2a09c5e6fc7a703bca9ffa337ddd2e2da53f7732"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fc48998000cbc39ec0d5311312dda93ecf92b39aaf184c5e817d5d440b29624"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e96baa6820280077a78244b2e06e416480ed859bbd8e5d641cf5742919d8beb4"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:31362dbfe297b23590530007062c32c6f6176f6099646bb2c95ab1b00a57c382"}, + {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3656283d11540ab0ea01978378e73e10002145117055e03722417aeab30994"}, + {file = "librt-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:738f08021b3142c2918c03692608baed43bc51144c29e35807682f8070ee2a3a"}, + {file = "librt-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:89815a22daf9c51884fb5dbe4f1ef65ee6a146e0b6a8df05f753e2e4a9359bf4"}, + {file = "librt-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bf512a71a23504ed08103a13c941f763db13fb11177beb3d9244c98c29fb4a61"}, + {file = "librt-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3dff3d3ca8db20e783b1bc7de49c0a2ab0b8387f31236d6a026597d07fcd68ac"}, + {file = "librt-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08eec3a1fc435f0d09c87b6bf1ec798986a3544f446b864e4099633a56fcd9ed"}, + {file = "librt-0.8.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e3f0a41487fd5fad7e760b9e8a90e251e27c2816fbc2cff36a22a0e6bcbbd9dd"}, + {file = "librt-0.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bacdb58d9939d95cc557b4dbaa86527c9db2ac1ed76a18bc8d26f6dc8647d851"}, + {file = "librt-0.8.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d7ab1f01aa753188605b09a51faa44a3327400b00b8cce424c71910fc0a128"}, + {file = "librt-0.8.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4998009e7cb9e896569f4be7004f09d0ed70d386fa99d42b6d363f6d200501ac"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2cc68eeeef5e906839c7bb0815748b5b0a974ec27125beefc0f942715785b551"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0bf69d79a23f4f40b8673a947a234baeeb133b5078b483b7297c5916539cf5d5"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:22b46eabd76c1986ee7d231b0765ad387d7673bbd996aa0d0d054b38ac65d8f6"}, + {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:237796479f4d0637d6b9cbcb926ff424a97735e68ade6facf402df4ec93375ed"}, + {file = "librt-0.8.1-cp39-cp39-win32.whl", hash = "sha256:4beb04b8c66c6ae62f8c1e0b2f097c1ebad9295c929a8d5286c05eae7c2fc7dc"}, + {file = "librt-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:64548cde61b692dc0dc379f4b5f59a2f582c2ebe7890d09c1ae3b9e66fa015b7"}, + {file = "librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73"}, ] [[package]] @@ -2708,38 +2712,39 @@ test-extras = ["pytest-mpl", "pytest-randomly"] [[package]] name = "nh3" -version = "0.3.2" +version = "0.3.3" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "nh3-0.3.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d18957a90806d943d141cc5e4a0fefa1d77cf0d7a156878bf9a66eed52c9cc7d"}, - {file = "nh3-0.3.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45c953e57028c31d473d6b648552d9cab1efe20a42ad139d78e11d8f42a36130"}, - {file = "nh3-0.3.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c9850041b77a9147d6bbd6dbbf13eeec7009eb60b44e83f07fcb2910075bf9b"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:403c11563e50b915d0efdb622866d1d9e4506bce590ef7da57789bf71dd148b5"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0dca4365db62b2d71ff1620ee4f800c4729849906c5dd504ee1a7b2389558e31"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0fe7ee035dd7b2290715baf29cb27167dddd2ff70ea7d052c958dbd80d323c99"}, - {file = "nh3-0.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a40202fd58e49129764f025bbaae77028e420f1d5b3c8e6f6fd3a6490d513868"}, - {file = "nh3-0.3.2-cp314-cp314t-win32.whl", hash = "sha256:1f9ba555a797dbdcd844b89523f29cdc90973d8bd2e836ea6b962cf567cadd93"}, - {file = "nh3-0.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:dce4248edc427c9b79261f3e6e2b3ecbdd9b88c267012168b4a7b3fc6fd41d13"}, - {file = "nh3-0.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:019ecbd007536b67fdf76fab411b648fb64e2257ca3262ec80c3425c24028c80"}, - {file = "nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7064ccf5ace75825bd7bf57859daaaf16ed28660c1c6b306b649a9eda4b54b1e"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8745454cdd28bbbc90861b80a0111a195b0e3961b9fa2e672be89eb199fa5d8"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72d67c25a84579f4a432c065e8b4274e53b7cf1df8f792cf846abfe2c3090866"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:13398e676a14d6233f372c75f52d5ae74f98210172991f7a3142a736bd92b131"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03d617e5c8aa7331bd2659c654e021caf9bba704b109e7b2b28b039a00949fe5"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f55c4d2d5a207e74eefe4d828067bbb01300e06e2a7436142f915c5928de07"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb18403f02b655a1bbe4e3a4696c2ae1d6ae8f5991f7cacb684b1ae27e6c9f7"}, - {file = "nh3-0.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d66f41672eb4060cf87c037f760bdbc6847852ca9ef8e9c5a5da18f090abf87"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f97f8b25cb2681d25e2338148159447e4d689aafdccfcf19e61ff7db3905768a"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:2ab70e8c6c7d2ce953d2a58102eefa90c2d0a5ed7aa40c7e29a487bc5e613131"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:1710f3901cd6440ca92494ba2eb6dc260f829fa8d9196b659fa10de825610ce0"}, - {file = "nh3-0.3.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91e9b001101fb4500a2aafe3e7c92928d85242d38bf5ac0aba0b7480da0a4cd6"}, - {file = "nh3-0.3.2-cp38-abi3-win32.whl", hash = "sha256:169db03df90da63286e0560ea0efa9b6f3b59844a9735514a1d47e6bb2c8c61b"}, - {file = "nh3-0.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:562da3dca7a17f9077593214a9781a94b8d76de4f158f8c895e62f09573945fe"}, - {file = "nh3-0.3.2-cp38-abi3-win_arm64.whl", hash = "sha256:cf5964d54edd405e68583114a7cba929468bcd7db5e676ae38ee954de1cfc104"}, - {file = "nh3-0.3.2.tar.gz", hash = "sha256:f394759a06df8b685a4ebfb1874fb67a9cbfd58c64fc5ed587a663c0e63ec376"}, + {file = "nh3-0.3.3-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:21b058cd20d9f0919421a820a2843fdb5e1749c0bf57a6247ab8f4ba6723c9fc"}, + {file = "nh3-0.3.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4400a73c2a62859e769f9d36d1b5a7a5c65c4179d1dddd2f6f3095b2db0cbfc"}, + {file = "nh3-0.3.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ef87f8e916321a88b45f2d597f29bd56e560ed4568a50f0f1305afab86b7189"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a446eae598987f49ee97ac2f18eafcce4e62e7574bd1eb23782e4702e54e217d"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0d5eb734a78ac364af1797fef718340a373f626a9ff6b4fb0b4badf7927e7b81"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:92a958e6f6d0100e025a5686aafd67e3c98eac67495728f8bb64fbeb3e474493"}, + {file = "nh3-0.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9ed40cf8449a59a03aa465114fedce1ff7ac52561688811d047917cc878b19ca"}, + {file = "nh3-0.3.3-cp314-cp314t-win32.whl", hash = "sha256:b50c3770299fb2a7c1113751501e8878d525d15160a4c05194d7fe62b758aad8"}, + {file = "nh3-0.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:21a63ccb18ddad3f784bb775955839b8b80e347e597726f01e43ca1abcc5c808"}, + {file = "nh3-0.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f508ddd4e2433fdcb78c790fc2d24e3a349ba775e5fa904af89891321d4844a3"}, + {file = "nh3-0.3.3-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e8ee96156f7dfc6e30ecda650e480c5ae0a7d38f0c6fafc3c1c655e2500421d9"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45fe0d6a607264910daec30360c8a3b5b1500fd832d21b2da608256287bcb92d"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5bc1d4b30ba1ba896669d944b6003630592665974bd11a3dc2f661bde92798a7"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f433a2dd66545aad4a720ad1b2150edcdca75bfff6f4e6f378ade1ec138d5e77"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52e973cb742e95b9ae1b35822ce23992428750f4b46b619fe86eba4205255b30"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c730617bdc15d7092dcc0469dc2826b914c8f874996d105b4bc3842a41c1cd9"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e98fa3dbfd54e25487e36ba500bc29bca3a4cab4ffba18cfb1a35a2d02624297"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:3a62b8ae7c235481715055222e54c682422d0495a5c73326807d4e44c5d14691"}, + {file = "nh3-0.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc305a2264868ec8fa16548296f803d8fd9c1fa66cd28b88b605b1bd06667c0b"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:90126a834c18af03bfd6ff9a027bfa6bbf0e238527bc780a24de6bd7cc1041e2"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:24769a428e9e971e4ccfb24628f83aaa7dc3c8b41b130c8ddc1835fa1c924489"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:b7a18ee057761e455d58b9d31445c3e4b2594cff4ddb84d2e331c011ef46f462"}, + {file = "nh3-0.3.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5a4b2c1f3e6f3cbe7048e17f4fefad3f8d3e14cc0fd08fb8599e0d5653f6b181"}, + {file = "nh3-0.3.3-cp38-abi3-win32.whl", hash = "sha256:e974850b131fdffa75e7ad8e0d9c7a855b96227b093417fdf1bd61656e530f37"}, + {file = "nh3-0.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:2efd17c0355d04d39e6d79122b42662277ac10a17ea48831d90b46e5ef7e4fc0"}, + {file = "nh3-0.3.3-cp38-abi3-win_arm64.whl", hash = "sha256:b838e619f483531483d26d889438e53a880510e832d2aafe73f93b7b1ac2bce2"}, + {file = "nh3-0.3.3.tar.gz", hash = "sha256:185ed41b88c910b9ca8edc89ca3b4be688a12cb9de129d84befa2f74a0039fee"}, ] [[package]] @@ -2799,6 +2804,19 @@ lint = ["black", "isort", "mypy"] sqlalchemy = ["sqlalchemy (>=2.0.0)"] test = ["pytest"] +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +markers = "python_version < \"3.12\"" +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + [[package]] name = "packaging" version = "26.0" @@ -2806,6 +2824,7 @@ description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main", "dev"] +markers = "python_version >= \"3.12\"" files = [ {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, @@ -2949,14 +2968,14 @@ testing = ["aboutcode-toolkit (>=6.0.0)", "black", "pytest (>=6,!=7.0.0)", "pyte [[package]] name = "platformdirs" -version = "4.7.0" +version = "4.9.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "platformdirs-4.7.0-py3-none-any.whl", hash = "sha256:1ed8db354e344c5bb6039cd727f096af975194b508e37177719d562b2b540ee6"}, - {file = "platformdirs-4.7.0.tar.gz", hash = "sha256:fd1a5f8599c85d49b9ac7d6e450bc2f1aaf4a23f1fe86d09952fe20ad365cf36"}, + {file = "platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd"}, + {file = "platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291"}, ] [[package]] @@ -3054,6 +3073,7 @@ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs optional = false python-versions = ">=3.8" groups = ["main"] +markers = "python_version >= \"3.12\"" files = [ {file = "pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf"}, {file = "pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b"}, @@ -3257,6 +3277,7 @@ description = "Exasol python driver with extra features" optional = false python-versions = "<4,>=3.9.2" groups = ["main"] +markers = "python_version >= \"3.12\"" files = [ {file = "pyexasol-1.3.0-py3-none-any.whl", hash = "sha256:0bb076346dcb33b36031a2633d6e7b9982f8411b95e770ad8017801ee438a689"}, {file = "pyexasol-1.3.0.tar.gz", hash = "sha256:44e5be7245b92343634b0b66a81b62be2fb4b1ca485d4e0f86c0583d5a2cf6b5"}, @@ -3278,6 +3299,34 @@ pyarrow = ["pyarrow (>=21.0.0,<22.0.0)"] rapidjson = ["python-rapidjson"] ujson = ["ujson"] +[[package]] +name = "pyexasol" +version = "2.0.0" +description = "Exasol python driver with extra features" +optional = false +python-versions = "<3.15,>=3.10" +groups = ["main"] +markers = "python_version < \"3.12\"" +files = [ + {file = "pyexasol-2.0.0-py3-none-any.whl", hash = "sha256:348dacb2df8286ca13676d933f63c714e792369b967c603bb04d08ba641c3526"}, + {file = "pyexasol-2.0.0.tar.gz", hash = "sha256:fdb0b98a246dbdc3746b9ad8f5012bd3166daad76c136e9839a841e0abe24bac"}, +] + +[package.dependencies] +cryptography = ">=45.0.7" +packaging = ">=24.1.0,<26.0.0" +websocket-client = ">=1.0.1,<1.9.0" + +[package.extras] +all = ["orjson (>=3.6,<4.0)", "pandas (>=2.0.0,<3.0.0)", "polars (>=1.10.0,<2.0.0)", "pproxy", "pyarrow (>=21.0.0)", "python-rapidjson (>=1.21.0,<2.0.0)", "ujson (>=5.10.0,<6.0.0)"] +examples = ["pproxy"] +orjson = ["orjson (>=3.6,<4.0)"] +pandas = ["pandas (>=2.0.0,<3.0.0)"] +polars = ["polars (>=1.10.0,<2.0.0)"] +pyarrow = ["pyarrow (>=21.0.0)"] +rapidjson = ["python-rapidjson (>=1.21.0,<2.0.0)"] +ujson = ["ujson (>=5.10.0,<6.0.0)"] + [[package]] name = "pyfakefs" version = "5.9.3" @@ -3322,14 +3371,14 @@ pygments = "*" [[package]] name = "pylint" -version = "4.0.4" +version = "4.0.5" description = "python code static checker" optional = false python-versions = ">=3.10.0" groups = ["dev"] files = [ - {file = "pylint-4.0.4-py3-none-any.whl", hash = "sha256:63e06a37d5922555ee2c20963eb42559918c20bd2b21244e4ef426e7c43b92e0"}, - {file = "pylint-4.0.4.tar.gz", hash = "sha256:d9b71674e19b1c36d79265b5887bf8e55278cbe236c9e95d22dc82cf044fdbd2"}, + {file = "pylint-4.0.5-py3-none-any.whl", hash = "sha256:00f51c9b14a3b3ae08cff6b2cdd43f28165c78b165b628692e428fb1f8dc2cf2"}, + {file = "pylint-4.0.5.tar.gz", hash = "sha256:8cd6a618df75deb013bd7eb98327a95f02a6fb839205a6bbf5456ef96afb317c"}, ] [package.dependencies] @@ -3340,7 +3389,7 @@ dill = [ {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version == \"3.11\""}, ] -isort = ">=5,<5.13 || >5.13,<8" +isort = ">=5,<5.13 || >5.13,<9" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2" tomli = {version = ">=1.1", markers = "python_version < \"3.11\""} @@ -3485,20 +3534,20 @@ pytest = ">=7,<9" [[package]] name = "pytest-exasol-backend" -version = "1.2.5" +version = "1.3.0" description = "" optional = false python-versions = "<3.14,>=3.10" groups = ["dev"] markers = "python_version < \"3.12\"" files = [ - {file = "pytest_exasol_backend-1.2.5-py3-none-any.whl", hash = "sha256:3adf673df3774f088e6f50e2b8fea8258d753590361b462f6df66ad05d642f27"}, - {file = "pytest_exasol_backend-1.2.5.tar.gz", hash = "sha256:b47fa38f44fa6e4a0354eaa3b39e10f6870ae0f22a05aeeca9c13f5e74e00ada"}, + {file = "pytest_exasol_backend-1.3.0-py3-none-any.whl", hash = "sha256:cd38f3061cb101d22376c64ba712058b0171d954999bc546a59767c38be760d0"}, + {file = "pytest_exasol_backend-1.3.0.tar.gz", hash = "sha256:d24544c6a9e25c2e3e4ca45bba412654a0a012e43bf6f4e93edd96d05b493e91"}, ] [package.dependencies] -exasol-integration-test-docker-environment = ">=4.3,<6" -exasol-saas-api = ">=2.3,<3" +exasol-integration-test-docker-environment = ">=4.3,<7" +exasol-saas-api = ">=2.8,<3" pytest = ">=7,<9" [[package]] @@ -3557,6 +3606,26 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-discovery" +version = "1.1.0" +description = "Python interpreter discovery" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "python_discovery-1.1.0-py3-none-any.whl", hash = "sha256:a162893b8809727f54594a99ad2179d2ede4bf953e12d4c7abc3cc9cdbd1437b"}, + {file = "python_discovery-1.1.0.tar.gz", hash = "sha256:447941ba1aed8cc2ab7ee3cb91be5fc137c5bdbb05b7e6ea62fbdcb66e50b268"}, +] + +[package.dependencies] +filelock = ">=3.15.4" +platformdirs = ">=4.3.6,<5" + +[package.extras] +docs = ["furo (>=2025.12.19)", "sphinx (>=9.1)", "sphinx-autodoc-typehints (>=3.6.3)", "sphinxcontrib-mermaid (>=2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.5.4)", "pytest (>=8.3.5)", "pytest-mock (>=3.14)", "setuptools (>=75.1)"] + [[package]] name = "pytokens" version = "0.4.1" @@ -3865,14 +3934,14 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "14.3.2" +version = "14.3.3" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" groups = ["dev"] files = [ - {file = "rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69"}, - {file = "rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8"}, + {file = "rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d"}, + {file = "rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"}, ] [package.dependencies] @@ -4026,6 +4095,7 @@ description = "Pure-Python RSA implementation" optional = false python-versions = "<4,>=3.6" groups = ["main"] +markers = "python_version >= \"3.12\"" files = [ {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, @@ -4125,6 +4195,35 @@ files = [ {file = "ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600"}, ] +[[package]] +name = "ruff" +version = "0.14.14" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed"}, + {file = "ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c"}, + {file = "ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974"}, + {file = "ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3"}, + {file = "ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b"}, + {file = "ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167"}, + {file = "ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd"}, + {file = "ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c"}, + {file = "ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b"}, +] + [[package]] name = "secretstorage" version = "3.5.0" @@ -4719,6 +4818,26 @@ files = [ [package.extras] test = ["flake8", "mypy", "pytest"] +[[package]] +name = "sphinxcontrib-mermaid" +version = "2.0.0" +description = "Mermaid diagrams in your Sphinx-powered docs" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "sphinxcontrib_mermaid-2.0.0-py3-none-any.whl", hash = "sha256:59a73249bbee2c74b1a4db036f8e8899ade65982bdda6712cf22b4f4e9874bb5"}, + {file = "sphinxcontrib_mermaid-2.0.0.tar.gz", hash = "sha256:cf4f7d453d001132eaba5d1fdf53d42049f02e913213cf8337427483bfca26f4"}, +] + +[package.dependencies] +jinja2 = "*" +pyyaml = "*" +sphinx = "*" + +[package.extras] +test = ["defusedxml", "myst-parser", "pytest", "ruff", "sphinx"] + [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" @@ -4787,14 +4906,14 @@ full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart [[package]] name = "stevedore" -version = "5.6.0" +version = "5.7.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "stevedore-5.6.0-py3-none-any.whl", hash = "sha256:4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820"}, - {file = "stevedore-5.6.0.tar.gz", hash = "sha256:f22d15c6ead40c5bbfa9ca54aa7e7b4a07d59b36ae03ed12ced1a54cf0b51945"}, + {file = "stevedore-5.7.0-py3-none-any.whl", hash = "sha256:fd25efbb32f1abb4c9e502f385f0018632baac11f9ee5d1b70f88cc5e22ad4ed"}, + {file = "stevedore-5.7.0.tar.gz", hash = "sha256:31dd6fe6b3cbe921e21dcefabc9a5f1cf848cf538a1f27543721b8ca09948aa3"}, ] [[package]] @@ -4809,6 +4928,21 @@ files = [ {file = "stopwatch.py-2.0.1.tar.gz", hash = "sha256:8cc94ba0f6469d434eabd8b227166e595fd42350e7f66dbf1a1a80697f60cc79"}, ] +[[package]] +name = "structlog" +version = "25.5.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "structlog-25.5.0-py3-none-any.whl", hash = "sha256:a8453e9b9e636ec59bd9e79bbd4a72f025981b3ba0f5837aebf48f02f37a7f9f"}, + {file = "structlog-25.5.0.tar.gz", hash = "sha256:098522a3bebed9153d4570c6d0288abf80a031dfdb2048d59a49e9dc2190fc98"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.11\""} + [[package]] name = "tabulate" version = "0.9.0" @@ -4968,20 +5102,20 @@ keyring = ["keyring (>=21.2.0)"] [[package]] name = "typer" -version = "0.23.1" +version = "0.24.1" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e"}, - {file = "typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134"}, + {file = "typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e"}, + {file = "typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45"}, ] [package.dependencies] annotated-doc = ">=0.0.2" -click = ">=8.0.0" -rich = ">=10.11.0" +click = ">=8.2.1" +rich = ">=12.3.0" shellingham = ">=1.3.0" [[package]] @@ -5046,14 +5180,14 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "uvicorn" -version = "0.40.0" +version = "0.41.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee"}, - {file = "uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea"}, + {file = "uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187"}, + {file = "uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a"}, ] [package.dependencies] @@ -5062,30 +5196,27 @@ h11 = ">=0.8" typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] -standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.20)", "websockets (>=10.4)"] [[package]] name = "virtualenv" -version = "20.36.1" +version = "21.0.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f"}, - {file = "virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba"}, + {file = "virtualenv-21.0.0-py3-none-any.whl", hash = "sha256:d44e70637402c7f4b10f48491c02a6397a3a187152a70cba0b6bc7642d69fb05"}, + {file = "virtualenv-21.0.0.tar.gz", hash = "sha256:e8efe4271b4a5efe7a4dce9d60a05fd11859406c0d6aa8464f4cf451bc132889"}, ] [package.dependencies] distlib = ">=0.3.7,<1" -filelock = {version = ">=3.20.1,<4", markers = "python_version >= \"3.10\""} +filelock = {version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" +python-discovery = ">=1" typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} -[package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] - [[package]] name = "wcwidth" version = "0.6.0" @@ -5238,4 +5369,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" -content-hash = "6de54cfcbf60a4e055a429b8d4f2e146fd2ee68f117bb5f125f37b2c2334bf74" +content-hash = "f3cdc1b3f91a2da747de1242fc2e5f429192eff32bc85d23ff83c289f726d585" diff --git a/pyproject.toml b/pyproject.toml index ad0ee12..877eb91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "exasol-python-extension-common" -version = "0.12.1" +version = "0.13.0" requires-python = ">=3.10,<4.0" description = "A collection of common utilities for Exasol extensions." authors = [ @@ -15,17 +15,17 @@ requires-poetry = ">=2.1.0" packages = [ {include = "exasol"}, ] [tool.poetry.dependencies] -pyexasol = ">=0.25.0,<2" -exasol-bucketfs = ">=0.10.0,<3" +pyexasol = ">=0.25.0, <3" +exasol-bucketfs = ">=0.10.0, <3" click = "^8.1.7" -exasol-saas-api = ">=1.1.0,<3" +exasol-saas-api = ">=1.1.0, <3" requests = ">=2.32.4" tenacity = "^8.3.0" -exasol-script-languages-container-tool = ">=3,<4" +exasol-script-languages-container-tool = ">=3, <4" [tool.poetry.group.dev.dependencies] pytest = "^7.2.0" -exasol-toolbox = "^1.6.0" +exasol-toolbox = ">=6, <7" pytest-exasol-backend = ">=0.4.0,<2" [tool.poetry.requires-plugins] @@ -76,4 +76,4 @@ markers = [ [tool.sonar] projectKey = "com.exasol:python-extension-common" hostUrl = "https://sonarcloud.io" -organization = "exasol" \ No newline at end of file +organization = "exasol" diff --git a/test/integration/deployment/test_language_container_builder.py b/test/integration/deployment/test_language_container_builder.py index c2f3753..a0bcddf 100644 --- a/test/integration/deployment/test_language_container_builder.py +++ b/test/integration/deployment/test_language_container_builder.py @@ -1,4 +1,3 @@ -from contextlib import ExitStack from pathlib import Path from test.utils.db_utils import assert_udf_running diff --git a/test/integration/deployment/test_language_container_deployer.py b/test/integration/deployment/test_language_container_deployer.py index e070752..f47d502 100644 --- a/test/integration/deployment/test_language_container_deployer.py +++ b/test/integration/deployment/test_language_container_deployer.py @@ -52,7 +52,7 @@ def test_cert_failure(backend, exasol_config, bucketfs_config, language_alias): ) parsed_url = urlparse(bucketfs_config.url) with pytest.raises(pyexasol.ExaConnectionFailedError, match="[SSL: CERTIFICATE_VERIFY_FAILED]"): - deployer = LanguageContainerDeployer.create( + LanguageContainerDeployer.create( language_alias=language_alias, dsn=f"{exasol_config.host}:{exasol_config.port}", db_user=exasol_config.username, diff --git a/test/unit/cli/test_bucketfs_conn_object_cli.py b/test/unit/cli/test_bucketfs_conn_object_cli.py index 98351e1..637ac13 100644 --- a/test/unit/cli/test_bucketfs_conn_object_cli.py +++ b/test/unit/cli/test_bucketfs_conn_object_cli.py @@ -1,4 +1,7 @@ -from unittest.mock import patch +from unittest.mock import ( + call, + patch, +) from exasol.python_extension_common.cli.bucketfs_conn_object_cli import ( BucketfsConnObjectCli, @@ -11,4 +14,4 @@ def test_bucketfs_conn_object_cli(create_con_object_mock): fake_params = {"x": "xxx", "y": "yyy"} conn_object_callback = BucketfsConnObjectCli("conn_name") conn_object_callback(conn_name=conn_name, **fake_params) - assert create_con_object_mock.called_once_with(conn_name, **fake_params) + assert create_con_object_mock.call_args_list == [call(conn_name=conn_name, **fake_params)] diff --git a/test/unit/deployment/test_cli.py b/test/unit/deployment/test_cli.py index 5d9942f..c757165 100644 --- a/test/unit/deployment/test_cli.py +++ b/test/unit/deployment/test_cli.py @@ -1,13 +1,7 @@ import os -from contextlib import ( - ExitStack, - contextmanager, -) +import re +from contextlib import ExitStack from datetime import timedelta -from typing import ( - Dict, - List, -) from unittest.mock import ( Mock, create_autospec, @@ -139,9 +133,6 @@ def test_parameter_formatters_2params(): assert ctx.params[CustomizableParameters.container_name.name] == "downloaded-1.3.2" -import re - - def test_deployer_cli_with_missing_container_option(): result = click.testing.CliRunner().invoke( language_container_deployer_main, @@ -248,7 +239,7 @@ def test_cli_options_passed_to_create(container_file): def keys_and_values(): for o in options: - if o.value == False: + if not o.value: yield "--no-" + o.cli[2:] continue yield o.cli diff --git a/test/unit/deployment/test_extract_validator.py b/test/unit/deployment/test_extract_validator.py index 89a1d46..1fabf9c 100644 --- a/test/unit/deployment/test_extract_validator.py +++ b/test/unit/deployment/test_extract_validator.py @@ -2,11 +2,7 @@ import logging import re from datetime import timedelta -from typing import ( - Any, - Dict, - List, -) +from typing import Any from unittest.mock import ( Mock, call, @@ -15,8 +11,6 @@ import exasol.bucketfs as bfs # type: ignore import pytest -from pyexasol import ExaConnection -from tenacity import RetryError from exasol.python_extension_common.deployment.extract_validator import ( ExtractException, @@ -146,7 +140,7 @@ def test_udf_name(schema, expected): def test_create_script_failure(archive_bucket_path): create_script = Mock(side_effect=Exception("failed to create UDF script")) sim = Simulator(nodes=4, udf_results=[], create_script=create_script) - with pytest.raises(Exception, match="failed to create UDF script") as ex: + with pytest.raises(Exception, match="failed to create UDF script"): with mock_tenacity_wait([1]): sim.testee.verify_all_nodes("alias", "schema", archive_bucket_path) diff --git a/test/unit/deployment/test_language_container_builder.py b/test/unit/deployment/test_language_container_builder.py index 2b59e30..d7185c9 100644 --- a/test/unit/deployment/test_language_container_builder.py +++ b/test/unit/deployment/test_language_container_builder.py @@ -1,4 +1,3 @@ -import re from unittest.mock import ( MagicMock, call, @@ -44,9 +43,9 @@ def test_copy_slc_flavor(tmp_path): @pytest.fixture def mock_export(monkeypatch: MonkeyPatch) -> MagicMock: - mock_function_to_mock = MagicMock() - monkeypatch.setattr(api, "export", mock_function_to_mock) - return mock_function_to_mock + mock = MagicMock() + monkeypatch.setattr(api, "export", mock) + return mock @pytest.mark.parametrize( @@ -69,4 +68,4 @@ def test_export(mock_export, tmp_path, compression_strategy): compression_strategy=compression_strategy, ), ] - assert mock_export.has_calls(expected_calls) + assert mock_export.call_args_list == expected_calls diff --git a/test/unit/deployment/test_language_container_deployer.py b/test/unit/deployment/test_language_container_deployer.py index 312aba7..649a2e7 100644 --- a/test/unit/deployment/test_language_container_deployer.py +++ b/test/unit/deployment/test_language_container_deployer.py @@ -14,7 +14,6 @@ import pytest from pyexasol import ExaConnection -from exasol.python_extension_common.deployment.extract_validator import ExtractValidator from exasol.python_extension_common.deployment.language_container_deployer import ( LanguageActivationLevel, LanguageContainerDeployer, diff --git a/test/utils/revert_language_settings.py b/test/utils/revert_language_settings.py index 3f36976..af3a1e6 100644 --- a/test/utils/revert_language_settings.py +++ b/test/utils/revert_language_settings.py @@ -5,7 +5,7 @@ @contextlib.contextmanager def revert_language_settings(connection: ExaConnection): - query = f""" + query = """ SELECT "SYSTEM_VALUE", "SESSION_VALUE" FROM SYS.EXA_PARAMETERS WHERE PARAMETER_NAME='SCRIPT_LANGUAGES'"""