diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index e4b5f2a0..b9ea2c00 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -4,21 +4,24 @@ on: workflow_call: secrets: PYPI_TOKEN: - required: true + required: true jobs: cd-job: name: Continuous Delivery - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: write steps: - name: SCM Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Artifacts run: poetry build @@ -32,7 +35,7 @@ jobs: - name: GitHub Release 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 835095da..98a11f62 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -4,6 +4,7 @@ on: push: tags: - '**' + - '!v*' jobs: @@ -14,6 +15,8 @@ jobs: contents: read cd-job: + needs: + - check-tag-version-job name: Continuous Delivery uses: ./.github/workflows/build-and-publish.yml permissions: @@ -22,11 +25,11 @@ jobs: PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} publish-docs: - needs: [ cd-job ] + needs: + - cd-job name: Publish Documentation uses: ./.github/workflows/gh-pages.yml permissions: contents: read pages: write id-token: write - diff --git a/.github/workflows/check-api-outdated.yml b/.github/workflows/check-api-outdated.yml index fce0ca60..b019b1e9 100644 --- a/.github/workflows/check-api-outdated.yml +++ b/.github/workflows/check-api-outdated.yml @@ -26,12 +26,13 @@ jobs: steps: - name: SCM Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.5.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 with: python-version: "3.10" + poetry-version: "2.3.0" - name: Run Nox Task api:check-outdated run: poetry run -- nox -s api:check-outdated @@ -50,7 +51,7 @@ jobs: - name: Upload openapi.json if: ${{ failure() }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: openapi.json path: openapi.json diff --git a/.github/workflows/check-release-tag.yml b/.github/workflows/check-release-tag.yml index a3d0350a..d5b9cee3 100644 --- a/.github/workflows/check-release-tag.yml +++ b/.github/workflows/check-release-tag.yml @@ -7,15 +7,18 @@ jobs: check-tag-version-job: name: Check Tag Version - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - name: SCM Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Check Tag Version # make sure the pushed/created tag matched the project version diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index dfb7eebf..4509e0c9 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -6,169 +6,211 @@ on: jobs: Version-Check: name: Version - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - name: SCM Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Check Version(s) run: poetry run -- nox -s version:check Documentation: 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 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Build Documentation - run: | - poetry run -- nox -s docs:build + run: poetry run -- nox -s docs:build - name: Link Check - run: | - poetry run -- nox -s links:check - - build-matrix: - name: Generate Build Matrix - uses: ./.github/workflows/matrix-python.yml - permissions: - contents: read + run: poetry run -- nox -s links:check Changelog: name: Changelog Update Check - runs-on: ubuntu-24.04 + 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 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Run changelog update check run: poetry run -- nox -s changelog:updated Lint: - name: Linting (Python-${{ matrix.python-version }}) - needs: [ Version-Check, build-matrix ] - runs-on: ubuntu-24.04 + name: Linting (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 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - name: Run lint run: poetry run -- nox -s lint:code - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + 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 + name: Type Checking (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 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - name: Run type-check 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 + name: Security Checks (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 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 with: - python-version: ${{ matrix.python-version }} + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" - name: Run security linter run: poetry run -- nox -s lint:security - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + 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 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - name: SCM Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Run format check - run: poetry run -- nox -s project:format + run: poetry run -- nox -s format:check + + + Build-Packages: + name: Build Package Check + runs-on: "ubuntu-24.04" + permissions: + contents: read + steps: + - name: SCM Checkout + uses: actions/checkout@v6 + + - name: Setup Python & Poetry Environment + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" + + - name: Run Distribution Check + run: poetry run -- nox -s package:check Tests: - name: Tests (Python-${{ matrix.python-version }}) - needs: [ Documentation, Lint, Type-Check, Security, Format, build-matrix ] - strategy: - fail-fast: false - matrix: ${{ fromJson(needs.build-matrix.outputs.matrix) }} - uses: ./.github/workflows/run-tests.yml - secrets: inherit + name: Unit-Tests (Python-${{ matrix.python-versions }}) + runs-on: "ubuntu-24.04" permissions: contents: read - with: - python-version: ${{ matrix.python-version }} + strategy: + fail-fast: false + matrix: + python-versions: ["3.10", "3.11", "3.12", "3.13"] + + steps: + - name: SCM Checkout + uses: actions/checkout@v6 + + - name: Setup Python & Poetry Environment + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: ${{ matrix.python-versions }} + poetry-version: "2.3.0" + + - name: Run Tests and Collect Coverage + run: poetry run -- nox -s test:unit -- --coverage + + - name: Upload Artifacts + uses: actions/upload-artifact@v6 + with: + 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 25693b53..5cba3e81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,65 +2,23 @@ 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-job: - name: Checks - uses: ./.github/workflows/checks.yml + CI: + uses: ./.github/workflows/merge-gate.yml secrets: inherit permissions: contents: read - gate-1: - name: Gate 1 - Regular CI - needs: [ ci-job ] - runs-on: ubuntu-24.04 - permissions: - contents: read - steps: - - name: Branch Protection - run: true - - slow-test-detection: - name: Run Slow or Expensive Tests (e.g. SaaS)? - runs-on: ubuntu-24.04 - permissions: - contents: read - steps: - - name: Detect Slow Tests - run: true - environment: - slow-tests - - run-slow-tests: - name: Run Slow or Expensive Tests (e.g. SaaS) if Requested - uses: ./.github/workflows/run-tests.yml - needs: [ slow-test-detection ] - secrets: inherit - permissions: - contents: read - with: - slow-tests: true - python-version: "3.10" - - metrics: - needs: [ ci-job, run-slow-tests ] + Metrics: + needs: + - CI uses: ./.github/workflows/report.yml secrets: inherit permissions: contents: read - - gate-2: - name: Gate 2 - Allow Merge - runs-on: ubuntu-24.04 - needs: [ run-slow-tests ] - permissions: - contents: read - steps: - - name: Branch Protection - run: true diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 233cf2b1..99a91659 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -7,30 +7,34 @@ 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 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: 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 + 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,7 +42,7 @@ 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 diff --git a/.github/workflows/matrix-all.yml b/.github/workflows/matrix-all.yml new file mode 100644 index 00000000..34a50677 --- /dev/null +++ b/.github/workflows/matrix-all.yml @@ -0,0 +1,33 @@ +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@v6 + + - name: Setup Python & Poetry Environment + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" + + - 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 new file mode 100644 index 00000000..0f251f90 --- /dev/null +++ b/.github/workflows/matrix-exasol.yml @@ -0,0 +1,33 @@ +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@v6 + + - name: Setup Python & Poetry Environment + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" + + - 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 index cfc0c272..8d492fe2 100644 --- a/.github/workflows/matrix-python.yml +++ b/.github/workflows/matrix-python.yml @@ -9,15 +9,18 @@ on: jobs: python_versions: - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read steps: - name: SCM Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Generate matrix run: poetry run -- nox -s matrix:python diff --git a/.github/workflows/merge-gate.yml b/.github/workflows/merge-gate.yml new file mode 100644 index 00000000..74b3d93f --- /dev/null +++ b/.github/workflows/merge-gate.yml @@ -0,0 +1,51 @@ +name: Merge-Gate + +on: + workflow_call: + +jobs: + + fast-checks: + name: Fast + uses: ./.github/workflows/checks.yml + permissions: + contents: read + + run-slow-tests: + name: Run 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). + environment: manual-approval + steps: + - name: Tests + run: echo "Slow tests approved" + + slow-checks: + name: Slow + needs: + - run-slow-tests + uses: ./.github/workflows/slow-checks.yml + secrets: inherit + permissions: + contents: read + + # This job ensures inputs have been executed successfully. + approve-merge: + name: Allow Merge + 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 + + # Each job requires a step, so we added this dummy step. + steps: + - name: Approve + run: echo "Merge Approved" diff --git a/.github/workflows/pr-merge.yml b/.github/workflows/pr-merge.yml index 0a85a6df..544c8a94 100644 --- a/.github/workflows/pr-merge.yml +++ b/.github/workflows/pr-merge.yml @@ -14,7 +14,6 @@ jobs: ci-job: name: Checks uses: ./.github/workflows/checks.yml - secrets: inherit permissions: contents: read @@ -27,7 +26,8 @@ jobs: id-token: write metrics: - needs: [ ci-job ] + needs: + - ci-job uses: ./.github/workflows/report.yml secrets: inherit permissions: diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index 1dbc3222..fc5f9a91 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -6,7 +6,7 @@ on: jobs: report: - runs-on: ubuntu-24.04 + runs-on: "ubuntu-24.04" permissions: contents: read env: @@ -14,15 +14,18 @@ jobs: steps: - name: SCM Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.6.0 + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" - name: Download Artifacts - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v7 with: path: ./artifacts @@ -41,13 +44,13 @@ jobs: run: poetry run -- nox -s project:report -- --format json | tee metrics.json - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v6 with: name: metrics.json path: metrics.json - name: Generate GitHub Summary - run: | + 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/run-tests.yml b/.github/workflows/run-tests.yml deleted file mode 100644 index 50563046..00000000 --- a/.github/workflows/run-tests.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Run Tests - -on: - workflow_call: - inputs: - slow-tests: - type: boolean - default: false - python-version: - type: string - required: true - -jobs: - - tests-job: - runs-on: ubuntu-24.04 - permissions: - contents: read - - steps: - - name: Set pytest markers - id: pytest-markers - if: ${{ ! inputs.slow-tests }} - run: | - echo slow-tests='-m "not slow"' >> "$GITHUB_OUTPUT" - echo coverage-suffix='-fast' >> "$GITHUB_OUTPUT" - - - name: SCM Checkout - uses: actions/checkout@v4 - - - name: Setup Python & Poetry Environment - uses: exasol/python-toolbox/.github/actions/python-environment@1.5.0 - with: - python-version: ${{ inputs.python-version }} - - - name: Run Tests and Calculate Coverage - 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 }} - PYTEST_ADDOPTS: '-o log_cli=true -o log_cli_level=INFO ${{ steps.pytest-markers.outputs.slow-tests }}' - PROJECT_SHORT_TAG: SAPIPY - run: poetry run -- nox -s test:coverage -- - - - name: Upload Artifacts - uses: actions/upload-artifact@v4.6.2 - with: - name: coverage-python${{ inputs.python-version }}${{ steps.pytest-markers.outputs.coverage-suffix }} - path: .coverage - include-hidden-files: true diff --git a/.github/workflows/slow-checks.yml b/.github/workflows/slow-checks.yml new file mode 100644 index 00000000..e9684bc3 --- /dev/null +++ b/.github/workflows/slow-checks.yml @@ -0,0 +1,40 @@ +name: Slow-Checks + +on: + workflow_call: + +jobs: + + tests: + name: Integration-Tests + runs-on: "ubuntu-24.04" + permissions: + contents: read + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + steps: + - name: SCM Checkout + uses: actions/checkout@v6 + + - name: Setup Python & Poetry Environment + uses: exasol/python-toolbox/.github/actions/python-environment@v5 + with: + python-version: "3.10" + poetry-version: "2.3.0" + + - name: Run Tests and Collect Coverage + run: poetry run -- nox -s test:integration -- --coverage + 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 }} + PROJECT_SHORT_TAG: SAPIPY + PYTEST_ADDOPTS: '-o log_cli=true -o log_cli_level=INFO' + + - name: Upload Artifacts + uses: actions/upload-artifact@v6 + with: + name: coverage-python3.10-slow + path: .coverage + include-hidden-files: true diff --git a/doc/changes/unreleased.md b/doc/changes/unreleased.md index a5481c81..69cc5dbc 100644 --- a/doc/changes/unreleased.md +++ b/doc/changes/unreleased.md @@ -2,8 +2,19 @@ ## Summary -This release describes naming conventions for SaaS instances in the User Guide. +This release fixes vulnerabilities by updating dependencies and updates `openapi-python-client`. +This release also describes naming conventions for SaaS instances in the User Guide. + +## Security + +* #140: Fixed vulnerabilities by updating dependencies ## Documentation * #145: Described SaaS instance naming conventions in the User Guide + +## Refactorings + +* #120: Updated openapi-python-client to version 0.26 or higher + * Re-generated the SaaS API client code +* #141: Updated PTB to version 5 and regenerated GitHub workflows diff --git a/exasol/saas/client/api_access.py b/exasol/saas/client/api_access.py index 7e57e269..2c0d8a4e 100644 --- a/exasol/saas/client/api_access.py +++ b/exasol/saas/client/api_access.py @@ -1,25 +1,27 @@ from __future__ import annotations -import datetime as dt import getpass import logging -import re import time from collections.abc import Iterable from contextlib import contextmanager from datetime import ( datetime, timedelta, - timezone, ) -from typing import Any +from typing import ( + Any, + TypeVar, + cast, +) import tenacity from tenacity import ( + RetryError, TryAgain, retry, ) -from tenacity.retry import retry_if_exception +from tenacity.retry import retry_if_exception_type from tenacity.stop import stop_after_delay from tenacity.wait import ( wait_exponential, @@ -45,13 +47,16 @@ delete_allowed_ip, list_allowed_i_ps, ) -from exasol.saas.client.openapi.errors import UnexpectedStatus -from exasol.saas.client.openapi.models.exasol_database import ExasolDatabase -from exasol.saas.client.openapi.models.status import Status +from exasol.saas.client.openapi.models import ( + ApiError, + ExasolDatabase, + Status, +) from exasol.saas.client.openapi.types import UNSET LOG = logging.getLogger(__name__) LOG.setLevel(logging.INFO) +logging.getLogger("httpx").setLevel(logging.WARNING) def interval_retry(interval: timedelta, timeout: timedelta): @@ -80,18 +85,6 @@ def timestamp_name(project_short_tag: str | None = None) -> str: return candidate[: Limits.MAX_DATABASE_NAME_LENGTH] -def indicates_retry(ex: BaseException) -> bool: - """ - When deleting a SaaS instance raises an UnexpectedStatus, then this - function decides whether we should retry to delete the database instance. - """ - return bool( - isinstance(ex, UnexpectedStatus) - and ex.status_code == 400 - and "cluster is not in a proper state" in ex.content.decode("utf-8") - ) - - class DatabaseStartupFailure(Exception): """ If a SaaS database instance during startup reports a status other than @@ -106,6 +99,41 @@ class DatabaseDeleteTimeout(Exception): """ +class DatabaseDeleteError(Exception): + """ + Failed to delete a SaaS database instance. + """ + + +class OpenApiError(Exception): + def __init__(self, message: str, error: ApiError | None): + super().__init__(f"{message}: {error.message}." if error else message) + + +T = TypeVar("T") + + +def ensure_type( + expected: type[T], + response: T | ApiError | None, + message: str, +) -> T: + """ + Ensure the passed response is of the expected type and return it with + correct type. Otherwise raise an OpenApiError. + """ + if isinstance(response, expected): + return cast(T, response) + api_error = response if isinstance(response, ApiError) else None + raise OpenApiError(message, api_error) + + +class InternalError(Exception): + """ + Internal error during delete with retry. + """ + + def create_saas_client( host: str, pat: str, @@ -199,17 +227,21 @@ def get_connection_params( cluster_id = next( filter(lambda cl: cl.main_cluster, clusters) # type: ignore ).id - connections = get_cluster_connection.sync( + resp = get_cluster_connection.sync( account_id, database_id, cluster_id, client=client ) - if connections is None: - raise RuntimeError("Failed to get the SaaS connection data.") - connection_params = { - "dsn": f"{connections.dns}:{connections.port}", - "user": connections.db_username, + connection = ensure_type( + openapi.models.ClusterConnection, + resp, + "Failed to get the connection data to" + f" host {host}, account {account_id}," + f" database with ID {database_id} named {database_name}", + ) + return { + "dsn": f"{connection.dns}:{connection.port}", + "user": connection.db_username, "password": pat, } - return connection_params class OpenApiAccess: @@ -243,7 +275,7 @@ def minutes(x: timedelta) -> int: ), ) LOG.info("Creating database %s", name) - return create_database.sync( + resp = create_database.sync( self._account_id, client=self._client, body=openapi.models.CreateDatabase( @@ -254,6 +286,11 @@ def minutes(x: timedelta) -> int: stream_type="innovation-release", ), ) + database = ensure_type( + ExasolDatabase, resp, f"Failed to create database {name}" + ) + LOG.info("Created database with ID %s", database.id) + return database @contextmanager def _ignore_failures(self, ignore: bool = False): @@ -269,14 +306,15 @@ def wait_until_deleted( interval: timedelta = timedelta(minutes=1), ): @interval_retry(interval, timeout) - def still_exists() -> bool: - result = database_id in self.list_database_ids() - if result: + def verify_not_listed() -> bool: + if database_id in self.list_database_ids(): raise TryAgain - return result + return True - if still_exists(): - raise DatabaseDeleteTimeout + try: + return verify_not_listed() + except (TryAgain, RetryError) as ex: + raise DatabaseDeleteTimeout from ex def delete_database( self, @@ -286,39 +324,51 @@ def delete_database( min_interval: timedelta = timedelta(seconds=1), max_interval: timedelta = timedelta(minutes=2), ) -> None: + def is_retry(resp: ApiError) -> bool: + return ( + resp.status == 400 + and "cluster is not in a proper state" in resp.message + ) + @retry( - reraise=True, wait=wait_exponential( multiplier=1, min=min_interval, max=max_interval, ), stop=stop_after_delay(timeout), - retry=retry_if_exception(indicates_retry), + retry=retry_if_exception_type(TryAgain), ) - def delete_with_retry(): - LOG.info("Trying to delete database with ID %s ...", database_id) - delete_database.sync_detailed( + def delete_with_retry() -> None: + LOG.info("- Trying to delete ...") + resp = delete_database.sync( self._account_id, database_id, client=self._client, ) + if not isinstance(resp, ApiError): + # success + return + if is_retry(resp): + raise TryAgain + raise InternalError(f"HTTP {resp.status}: {resp.message}.") + LOG.info("Got request to delete database with ID %s", database_id) try: delete_with_retry() - LOG.info("Deleted database with ID %s", database_id) + LOG.info("Successfully deleted database.") except Exception as ex: if ignore_failures: - LOG.error( - "Ignoring failure when deleting database with ID %s: %s", - database_id, - ex, - ) + LOG.warning("Ignoring delete failure: %s", ex) else: - raise + msg = f"Failed to delete database: {ex}" + LOG.error(msg) + raise DatabaseDeleteError(msg) from ex def list_database_ids(self) -> Iterable[str]: - dbs = list_databases.sync(self._account_id, client=self._client) or [] + resp = list_databases.sync(self._account_id, client=self._client) or [] + # actually list[ExasolDatabase] + dbs = ensure_type(list, resp, "Failed to list databases") return (db.id for db in dbs) @contextmanager @@ -340,16 +390,21 @@ def database( elif keep: LOG.info("Keeping database %s as keep = %s.", db_repr, keep) else: - LOG.info("Deleting database %s", db_repr) self.delete_database(db.id, ignore_delete_failure) - LOG.info("Successfully deleted database %s.", db_repr) + LOG.info("Context assumes database %s as deleted.", db_repr) - def get_database(self, database_id: str) -> ExasolDatabase | None: - return get_database.sync( + def get_database( + self, + database_id: str, + ) -> ExasolDatabase | None: + resp = get_database.sync( self._account_id, database_id, client=self._client, ) + return ensure_type( + ExasolDatabase, resp, f"Failed to get database {database_id}" + ) def wait_until_running( self, @@ -368,6 +423,7 @@ def poll_status() -> Status: raise TryAgain return status + LOG.info("Waiting for database with ID %s to be available:", database_id) if poll_status() not in success: raise DatabaseStartupFailure() @@ -375,10 +431,17 @@ def clusters( self, database_id: str, ) -> list[openapi.models.Cluster] | None: - return list_clusters.sync( - self._account_id, - database_id, - client=self._client, + resp = ( + list_clusters.sync( + self._account_id, + database_id, + client=self._client, + ) + or [] + ) + # actually list[openapi.models.Cluster] + return ensure_type( + list, resp, f"Failed to list clusters of database {database_id}" ) def get_connection( @@ -386,27 +449,29 @@ def get_connection( database_id: str, cluster_id: str, ) -> openapi.models.ClusterConnection | None: - return get_cluster_connection.sync( + resp = get_cluster_connection.sync( self._account_id, database_id, cluster_id, client=self._client, ) + return ensure_type( + openapi.models.ClusterConnection, + resp, + "Failed to retrieve a connection to " + f"database {database_id} cluster {cluster_id}", + ) def list_allowed_ip_ids(self) -> Iterable[str]: - ips = ( - list_allowed_i_ps.sync( - self._account_id, - client=self._client, - ) - or [] - ) + resp = list_allowed_i_ps.sync(self._account_id, client=self._client) or [] + # actually list[openapi.models.AllowedIP] + ips = ensure_type(list, resp, "Failed to retrieve the list of allowed ips") return (x.id for x in ips) def add_allowed_ip( self, cidr_ip: str = "0.0.0.0/0", - ) -> openapi.models.allowed_ip.AllowedIP | None: + ) -> openapi.models.AllowedIP | None: """ Suggested values for cidr_ip: * 185.17.207.78/32 @@ -417,15 +482,20 @@ def add_allowed_ip( name=timestamp_name(), cidr_ip=cidr_ip, ) - return add_allowed_ip.sync( + resp = add_allowed_ip.sync( self._account_id, client=self._client, body=rule, ) + return ensure_type( + openapi.models.AllowedIP, + resp, + f"Failed to add allowed IP address {cidr_ip}", + ) - def delete_allowed_ip(self, id: str, ignore_failures=False): + def delete_allowed_ip(self, id: str, ignore_failures=False) -> Any | None: with self._ignore_failures(ignore_failures) as client: - return delete_allowed_ip.sync_detailed(self._account_id, id, client=client) + return delete_allowed_ip.sync(self._account_id, id, client=client) @contextmanager def allowed_ip( diff --git a/exasol/saas/client/openapi/api/clusters/create_cluster.py b/exasol/saas/client/openapi/api/clusters/create_cluster.py index 52823f80..bec6f73f 100644 --- a/exasol/saas/client/openapi/api/clusters/create_cluster.py +++ b/exasol/saas/client/openapi/api/clusters/create_cluster.py @@ -1,24 +1,17 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.cluster import Cluster from ...models.create_cluster import CreateCluster -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -31,7 +24,10 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -43,21 +39,21 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Cluster]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | Cluster: if response.status_code == 200: response_200 = Cluster.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Cluster]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | Cluster]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -72,7 +68,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: CreateCluster, -) -> Response[Cluster]: +) -> Response[ApiError | Cluster]: """ Args: account_id (str): @@ -84,7 +80,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Cluster] + Response[ApiError | Cluster] """ kwargs = _get_kwargs( @@ -106,7 +102,7 @@ def sync( *, client: AuthenticatedClient, body: CreateCluster, -) -> Optional[Cluster]: +) -> ApiError | Cluster | None: """ Args: account_id (str): @@ -118,7 +114,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Cluster + ApiError | Cluster """ return sync_detailed( @@ -135,7 +131,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: CreateCluster, -) -> Response[Cluster]: +) -> Response[ApiError | Cluster]: """ Args: account_id (str): @@ -147,7 +143,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Cluster] + Response[ApiError | Cluster] """ kwargs = _get_kwargs( @@ -167,7 +163,7 @@ async def asyncio( *, client: AuthenticatedClient, body: CreateCluster, -) -> Optional[Cluster]: +) -> ApiError | Cluster | None: """ Args: account_id (str): @@ -179,7 +175,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Cluster + ApiError | Cluster """ return ( diff --git a/exasol/saas/client/openapi/api/clusters/delete_cluster.py b/exasol/saas/client/openapi/api/clusters/delete_cluster.py index 98997951..8d6863db 100644 --- a/exasol/saas/client/openapi/api/clusters/delete_cluster.py +++ b/exasol/saas/client/openapi/api/clusters/delete_cluster.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,26 +23,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + cluster_id=quote(str(cluster_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -61,7 +62,7 @@ def sync_detailed( cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -73,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,13 +90,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -107,7 +137,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -119,3 +149,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/clusters/get_cluster.py b/exasol/saas/client/openapi/api/clusters/get_cluster.py index fba2dd9c..4d73cf5e 100644 --- a/exasol/saas/client/openapi/api/clusters/get_cluster.py +++ b/exasol/saas/client/openapi/api/clusters/get_cluster.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.cluster import Cluster -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -28,28 +21,32 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + cluster_id=quote(str(cluster_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Cluster]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | Cluster: if response.status_code == 200: response_200 = Cluster.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Cluster]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | Cluster]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -64,7 +61,7 @@ def sync_detailed( cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Cluster]: +) -> Response[ApiError | Cluster]: """ Args: account_id (str): @@ -76,7 +73,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Cluster] + Response[ApiError | Cluster] """ kwargs = _get_kwargs( @@ -98,7 +95,7 @@ def sync( cluster_id: str, *, client: AuthenticatedClient, -) -> Optional[Cluster]: +) -> ApiError | Cluster | None: """ Args: account_id (str): @@ -110,7 +107,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Cluster + ApiError | Cluster """ return sync_detailed( @@ -127,7 +124,7 @@ async def asyncio_detailed( cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Cluster]: +) -> Response[ApiError | Cluster]: """ Args: account_id (str): @@ -139,7 +136,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Cluster] + Response[ApiError | Cluster] """ kwargs = _get_kwargs( @@ -159,7 +156,7 @@ async def asyncio( cluster_id: str, *, client: AuthenticatedClient, -) -> Optional[Cluster]: +) -> ApiError | Cluster | None: """ Args: account_id (str): @@ -171,7 +168,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Cluster + ApiError | Cluster """ return ( diff --git a/exasol/saas/client/openapi/api/clusters/get_cluster_connection.py b/exasol/saas/client/openapi/api/clusters/get_cluster_connection.py index 5259abb5..af008e83 100644 --- a/exasol/saas/client/openapi/api/clusters/get_cluster_connection.py +++ b/exasol/saas/client/openapi/api/clusters/get_cluster_connection.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.cluster_connection import ClusterConnection -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -28,28 +21,32 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/connect", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/connect".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + cluster_id=quote(str(cluster_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[ClusterConnection]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | ClusterConnection: if response.status_code == 200: response_200 = ClusterConnection.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[ClusterConnection]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | ClusterConnection]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -64,7 +61,7 @@ def sync_detailed( cluster_id: str, *, client: AuthenticatedClient, -) -> Response[ClusterConnection]: +) -> Response[ApiError | ClusterConnection]: """ Args: account_id (str): @@ -76,7 +73,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ClusterConnection] + Response[ApiError | ClusterConnection] """ kwargs = _get_kwargs( @@ -98,7 +95,7 @@ def sync( cluster_id: str, *, client: AuthenticatedClient, -) -> Optional[ClusterConnection]: +) -> ApiError | ClusterConnection | None: """ Args: account_id (str): @@ -110,7 +107,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - ClusterConnection + ApiError | ClusterConnection """ return sync_detailed( @@ -127,7 +124,7 @@ async def asyncio_detailed( cluster_id: str, *, client: AuthenticatedClient, -) -> Response[ClusterConnection]: +) -> Response[ApiError | ClusterConnection]: """ Args: account_id (str): @@ -139,7 +136,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ClusterConnection] + Response[ApiError | ClusterConnection] """ kwargs = _get_kwargs( @@ -159,7 +156,7 @@ async def asyncio( cluster_id: str, *, client: AuthenticatedClient, -) -> Optional[ClusterConnection]: +) -> ApiError | ClusterConnection | None: """ Args: account_id (str): @@ -171,7 +168,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - ClusterConnection + ApiError | ClusterConnection """ return ( diff --git a/exasol/saas/client/openapi/api/clusters/list_clusters.py b/exasol/saas/client/openapi/api/clusters/list_clusters.py index fc8afd51..cc671ee5 100644 --- a/exasol/saas/client/openapi/api/clusters/list_clusters.py +++ b/exasol/saas/client/openapi/api/clusters/list_clusters.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.cluster import Cluster -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,15 +20,18 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["Cluster"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[Cluster]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -45,15 +41,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["Cluster"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[Cluster]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -67,7 +63,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["Cluster"]]: +) -> Response[ApiError | list[Cluster]]: """ Args: account_id (str): @@ -78,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Cluster']] + Response[ApiError | list[Cluster]] """ kwargs = _get_kwargs( @@ -98,7 +94,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["Cluster"]]: +) -> ApiError | list[Cluster] | None: """ Args: account_id (str): @@ -109,7 +105,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Cluster'] + ApiError | list[Cluster] """ return sync_detailed( @@ -124,7 +120,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["Cluster"]]: +) -> Response[ApiError | list[Cluster]]: """ Args: account_id (str): @@ -135,7 +131,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Cluster']] + Response[ApiError | list[Cluster]] """ kwargs = _get_kwargs( @@ -153,7 +149,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["Cluster"]]: +) -> ApiError | list[Cluster] | None: """ Args: account_id (str): @@ -164,7 +160,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Cluster'] + ApiError | list[Cluster] """ return ( diff --git a/exasol/saas/client/openapi/api/clusters/scale_cluster.py b/exasol/saas/client/openapi/api/clusters/scale_cluster.py index 23037042..12f25ac0 100644 --- a/exasol/saas/client/openapi/api/clusters/scale_cluster.py +++ b/exasol/saas/client/openapi/api/clusters/scale_cluster.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.scale_cluster import ScaleCluster -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -31,7 +27,11 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/scale", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/scale".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + cluster_id=quote(str(cluster_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -43,19 +43,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -71,7 +72,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: ScaleCluster, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -84,7 +85,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -101,6 +102,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, + body: ScaleCluster, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + body (ScaleCluster): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, @@ -108,7 +141,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: ScaleCluster, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -121,7 +154,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -134,3 +167,37 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, + body: ScaleCluster, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + body (ScaleCluster): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/clusters/start_cluster.py b/exasol/saas/client/openapi/api/clusters/start_cluster.py index 67f0cee6..88744c4b 100644 --- a/exasol/saas/client/openapi/api/clusters/start_cluster.py +++ b/exasol/saas/client/openapi/api/clusters/start_cluster.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,26 +23,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/start", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/start".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + cluster_id=quote(str(cluster_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -61,7 +62,7 @@ def sync_detailed( cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -73,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,13 +90,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -107,7 +137,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -119,3 +149,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/clusters/stop_cluster.py b/exasol/saas/client/openapi/api/clusters/stop_cluster.py index e297520d..2fcdc37a 100644 --- a/exasol/saas/client/openapi/api/clusters/stop_cluster.py +++ b/exasol/saas/client/openapi/api/clusters/stop_cluster.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,26 +23,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/stop", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}/stop".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + cluster_id=quote(str(cluster_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -61,7 +62,7 @@ def sync_detailed( cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -73,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,13 +90,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, cluster_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -107,7 +137,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -119,3 +149,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/clusters/update_cluster.py b/exasol/saas/client/openapi/api/clusters/update_cluster.py index 05655bdd..2c4720b1 100644 --- a/exasol/saas/client/openapi/api/clusters/update_cluster.py +++ b/exasol/saas/client/openapi/api/clusters/update_cluster.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.update_cluster import UpdateCluster -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -31,7 +27,11 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/clusters/{cluster_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + cluster_id=quote(str(cluster_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -43,19 +43,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -71,7 +72,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: UpdateCluster, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -84,7 +85,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -101,6 +102,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, + body: UpdateCluster, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + body (UpdateCluster): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, @@ -108,7 +141,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: UpdateCluster, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -121,7 +154,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -134,3 +167,37 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + cluster_id: str, + *, + client: AuthenticatedClient, + body: UpdateCluster, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + cluster_id (str): + body (UpdateCluster): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + cluster_id=cluster_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/create_database.py b/exasol/saas/client/openapi/api/databases/create_database.py index d7ca6ffd..22f12a30 100644 --- a/exasol/saas/client/openapi/api/databases/create_database.py +++ b/exasol/saas/client/openapi/api/databases/create_database.py @@ -1,24 +1,17 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.create_database import CreateDatabase from ...models.exasol_database import ExasolDatabase -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,7 +23,9 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/databases", + "url": "/api/v1/accounts/{account_id}/databases".format( + account_id=quote(str(account_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -42,21 +37,21 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[ExasolDatabase]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | ExasolDatabase: if response.status_code == 200: response_200 = ExasolDatabase.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[ExasolDatabase]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | ExasolDatabase]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -70,7 +65,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: CreateDatabase, -) -> Response[ExasolDatabase]: +) -> Response[ApiError | ExasolDatabase]: """ Args: account_id (str): @@ -81,7 +76,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ExasolDatabase] + Response[ApiError | ExasolDatabase] """ kwargs = _get_kwargs( @@ -101,7 +96,7 @@ def sync( *, client: AuthenticatedClient, body: CreateDatabase, -) -> Optional[ExasolDatabase]: +) -> ApiError | ExasolDatabase | None: """ Args: account_id (str): @@ -112,7 +107,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - ExasolDatabase + ApiError | ExasolDatabase """ return sync_detailed( @@ -127,7 +122,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: CreateDatabase, -) -> Response[ExasolDatabase]: +) -> Response[ApiError | ExasolDatabase]: """ Args: account_id (str): @@ -138,7 +133,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ExasolDatabase] + Response[ApiError | ExasolDatabase] """ kwargs = _get_kwargs( @@ -156,7 +151,7 @@ async def asyncio( *, client: AuthenticatedClient, body: CreateDatabase, -) -> Optional[ExasolDatabase]: +) -> ApiError | ExasolDatabase | None: """ Args: account_id (str): @@ -167,7 +162,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - ExasolDatabase + ApiError | ExasolDatabase """ return ( diff --git a/exasol/saas/client/openapi/api/databases/create_schedule.py b/exasol/saas/client/openapi/api/databases/create_schedule.py index 65e1f66b..0deab4c8 100644 --- a/exasol/saas/client/openapi/api/databases/create_schedule.py +++ b/exasol/saas/client/openapi/api/databases/create_schedule.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.schedule import Schedule -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,7 +23,10 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/schedules", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/schedules".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -42,21 +38,21 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Schedule]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | Schedule: if response.status_code == 201: response_201 = Schedule.from_dict(response.json()) return response_201 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Schedule]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | Schedule]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -71,7 +67,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: Schedule, -) -> Response[Schedule]: +) -> Response[ApiError | Schedule]: """ Args: account_id (str): @@ -83,7 +79,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Schedule] + Response[ApiError | Schedule] """ kwargs = _get_kwargs( @@ -105,7 +101,7 @@ def sync( *, client: AuthenticatedClient, body: Schedule, -) -> Optional[Schedule]: +) -> ApiError | Schedule | None: """ Args: account_id (str): @@ -117,7 +113,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Schedule + ApiError | Schedule """ return sync_detailed( @@ -134,7 +130,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: Schedule, -) -> Response[Schedule]: +) -> Response[ApiError | Schedule]: """ Args: account_id (str): @@ -146,7 +142,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Schedule] + Response[ApiError | Schedule] """ kwargs = _get_kwargs( @@ -166,7 +162,7 @@ async def asyncio( *, client: AuthenticatedClient, body: Schedule, -) -> Optional[Schedule]: +) -> ApiError | Schedule | None: """ Args: account_id (str): @@ -178,7 +174,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Schedule + ApiError | Schedule """ return ( diff --git a/exasol/saas/client/openapi/api/databases/delete_database.py b/exasol/saas/client/openapi/api/databases/delete_database.py index 6d0e782c..41e22b2d 100644 --- a/exasol/saas/client/openapi/api/databases/delete_database.py +++ b/exasol/saas/client/openapi/api/databases/delete_database.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,26 +22,30 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -59,7 +59,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -70,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -85,12 +85,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -101,7 +127,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -112,3 +138,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/delete_schedule.py b/exasol/saas/client/openapi/api/databases/delete_schedule.py index 6cd6917a..63af683e 100644 --- a/exasol/saas/client/openapi/api/databases/delete_schedule.py +++ b/exasol/saas/client/openapi/api/databases/delete_schedule.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,26 +23,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/schedules/{action_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/schedules/{action_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + action_id=quote(str(action_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -61,7 +62,7 @@ def sync_detailed( action_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -73,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,13 +90,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + action_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + action_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + action_id=action_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, action_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -107,7 +137,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -119,3 +149,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + action_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + action_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + action_id=action_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/dlhc_activate.py b/exasol/saas/client/openapi/api/databases/dlhc_activate.py index 6feb25b1..9ea8ce90 100644 --- a/exasol/saas/client/openapi/api/databases/dlhc_activate.py +++ b/exasol/saas/client/openapi/api/databases/dlhc_activate.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,26 +22,30 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/dlhc-activate", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/dlhc-activate".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 202: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_202 = cast(Any, None) + return response_202 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -59,7 +59,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -70,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -85,12 +85,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -101,7 +127,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -112,3 +138,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/get_database.py b/exasol/saas/client/openapi/api/databases/get_database.py index 16fca77a..563ae8e0 100644 --- a/exasol/saas/client/openapi/api/databases/get_database.py +++ b/exasol/saas/client/openapi/api/databases/get_database.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.exasol_database import ExasolDatabase -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,28 +20,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[ExasolDatabase]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | ExasolDatabase: if response.status_code == 200: response_200 = ExasolDatabase.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[ExasolDatabase]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | ExasolDatabase]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -62,7 +58,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[ExasolDatabase]: +) -> Response[ApiError | ExasolDatabase]: """ Args: account_id (str): @@ -73,7 +69,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ExasolDatabase] + Response[ApiError | ExasolDatabase] """ kwargs = _get_kwargs( @@ -93,7 +89,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[ExasolDatabase]: +) -> ApiError | ExasolDatabase | None: """ Args: account_id (str): @@ -104,7 +100,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - ExasolDatabase + ApiError | ExasolDatabase """ return sync_detailed( @@ -119,7 +115,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[ExasolDatabase]: +) -> Response[ApiError | ExasolDatabase]: """ Args: account_id (str): @@ -130,7 +126,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ExasolDatabase] + Response[ApiError | ExasolDatabase] """ kwargs = _get_kwargs( @@ -148,7 +144,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[ExasolDatabase]: +) -> ApiError | ExasolDatabase | None: """ Args: account_id (str): @@ -159,7 +155,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - ExasolDatabase + ApiError | ExasolDatabase """ return ( diff --git a/exasol/saas/client/openapi/api/databases/get_database_settings.py b/exasol/saas/client/openapi/api/databases/get_database_settings.py index 6fe90535..65631339 100644 --- a/exasol/saas/client/openapi/api/databases/get_database_settings.py +++ b/exasol/saas/client/openapi/api/databases/get_database_settings.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.database_settings import DatabaseSettings -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,28 +20,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/settings", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/settings".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[DatabaseSettings]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | DatabaseSettings: if response.status_code == 200: response_200 = DatabaseSettings.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[DatabaseSettings]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | DatabaseSettings]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -62,7 +58,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[DatabaseSettings]: +) -> Response[ApiError | DatabaseSettings]: """ Args: account_id (str): @@ -73,7 +69,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DatabaseSettings] + Response[ApiError | DatabaseSettings] """ kwargs = _get_kwargs( @@ -93,7 +89,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[DatabaseSettings]: +) -> ApiError | DatabaseSettings | None: """ Args: account_id (str): @@ -104,7 +100,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DatabaseSettings + ApiError | DatabaseSettings """ return sync_detailed( @@ -119,7 +115,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[DatabaseSettings]: +) -> Response[ApiError | DatabaseSettings]: """ Args: account_id (str): @@ -130,7 +126,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DatabaseSettings] + Response[ApiError | DatabaseSettings] """ kwargs = _get_kwargs( @@ -148,7 +144,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[DatabaseSettings]: +) -> ApiError | DatabaseSettings | None: """ Args: account_id (str): @@ -159,7 +155,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DatabaseSettings + ApiError | DatabaseSettings """ return ( diff --git a/exasol/saas/client/openapi/api/databases/get_database_upgrade_info.py b/exasol/saas/client/openapi/api/databases/get_database_upgrade_info.py index 7ce75833..c81bb002 100644 --- a/exasol/saas/client/openapi/api/databases/get_database_upgrade_info.py +++ b/exasol/saas/client/openapi/api/databases/get_database_upgrade_info.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.database_upgrade_info import DatabaseUpgradeInfo -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,28 +20,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/upgrade", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/upgrade".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[DatabaseUpgradeInfo]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | DatabaseUpgradeInfo: if response.status_code == 200: response_200 = DatabaseUpgradeInfo.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[DatabaseUpgradeInfo]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | DatabaseUpgradeInfo]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -62,7 +58,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[DatabaseUpgradeInfo]: +) -> Response[ApiError | DatabaseUpgradeInfo]: """ Args: account_id (str): @@ -73,7 +69,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DatabaseUpgradeInfo] + Response[ApiError | DatabaseUpgradeInfo] """ kwargs = _get_kwargs( @@ -93,7 +89,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[DatabaseUpgradeInfo]: +) -> ApiError | DatabaseUpgradeInfo | None: """ Args: account_id (str): @@ -104,7 +100,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DatabaseUpgradeInfo + ApiError | DatabaseUpgradeInfo """ return sync_detailed( @@ -119,7 +115,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[DatabaseUpgradeInfo]: +) -> Response[ApiError | DatabaseUpgradeInfo]: """ Args: account_id (str): @@ -130,7 +126,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DatabaseUpgradeInfo] + Response[ApiError | DatabaseUpgradeInfo] """ kwargs = _get_kwargs( @@ -148,7 +144,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[DatabaseUpgradeInfo]: +) -> ApiError | DatabaseUpgradeInfo | None: """ Args: account_id (str): @@ -159,7 +155,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DatabaseUpgradeInfo + ApiError | DatabaseUpgradeInfo """ return ( diff --git a/exasol/saas/client/openapi/api/databases/get_dlhc_activate_status.py b/exasol/saas/client/openapi/api/databases/get_dlhc_activate_status.py index 4e4df47f..8a02355b 100644 --- a/exasol/saas/client/openapi/api/databases/get_dlhc_activate_status.py +++ b/exasol/saas/client/openapi/api/databases/get_dlhc_activate_status.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.dlhc_activate_status import DlhcActivateStatus -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,28 +20,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/dlhc-activate", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/dlhc-activate".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[DlhcActivateStatus]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | DlhcActivateStatus: if response.status_code == 200: response_200 = DlhcActivateStatus.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[DlhcActivateStatus]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | DlhcActivateStatus]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -62,7 +58,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[DlhcActivateStatus]: +) -> Response[ApiError | DlhcActivateStatus]: """ Args: account_id (str): @@ -73,7 +69,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DlhcActivateStatus] + Response[ApiError | DlhcActivateStatus] """ kwargs = _get_kwargs( @@ -93,7 +89,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[DlhcActivateStatus]: +) -> ApiError | DlhcActivateStatus | None: """ Args: account_id (str): @@ -104,7 +100,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DlhcActivateStatus + ApiError | DlhcActivateStatus """ return sync_detailed( @@ -119,7 +115,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[DlhcActivateStatus]: +) -> Response[ApiError | DlhcActivateStatus]: """ Args: account_id (str): @@ -130,7 +126,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DlhcActivateStatus] + Response[ApiError | DlhcActivateStatus] """ kwargs = _get_kwargs( @@ -148,7 +144,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[DlhcActivateStatus]: +) -> ApiError | DlhcActivateStatus | None: """ Args: account_id (str): @@ -159,7 +155,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DlhcActivateStatus + ApiError | DlhcActivateStatus """ return ( diff --git a/exasol/saas/client/openapi/api/databases/list_databases.py b/exasol/saas/client/openapi/api/databases/list_databases.py index e67b2a5e..056bb0c4 100644 --- a/exasol/saas/client/openapi/api/databases/list_databases.py +++ b/exasol/saas/client/openapi/api/databases/list_databases.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.exasol_database import ExasolDatabase -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -26,15 +19,17 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases", + "url": "/api/v1/accounts/{account_id}/databases".format( + account_id=quote(str(account_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["ExasolDatabase"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[ExasolDatabase]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -44,15 +39,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["ExasolDatabase"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[ExasolDatabase]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -65,7 +60,7 @@ def sync_detailed( account_id: str, *, client: AuthenticatedClient, -) -> Response[list["ExasolDatabase"]]: +) -> Response[ApiError | list[ExasolDatabase]]: """ Args: account_id (str): @@ -75,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['ExasolDatabase']] + Response[ApiError | list[ExasolDatabase]] """ kwargs = _get_kwargs( @@ -93,7 +88,7 @@ def sync( account_id: str, *, client: AuthenticatedClient, -) -> Optional[list["ExasolDatabase"]]: +) -> ApiError | list[ExasolDatabase] | None: """ Args: account_id (str): @@ -103,7 +98,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['ExasolDatabase'] + ApiError | list[ExasolDatabase] """ return sync_detailed( @@ -116,7 +111,7 @@ async def asyncio_detailed( account_id: str, *, client: AuthenticatedClient, -) -> Response[list["ExasolDatabase"]]: +) -> Response[ApiError | list[ExasolDatabase]]: """ Args: account_id (str): @@ -126,7 +121,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['ExasolDatabase']] + Response[ApiError | list[ExasolDatabase]] """ kwargs = _get_kwargs( @@ -142,7 +137,7 @@ async def asyncio( account_id: str, *, client: AuthenticatedClient, -) -> Optional[list["ExasolDatabase"]]: +) -> ApiError | list[ExasolDatabase] | None: """ Args: account_id (str): @@ -152,7 +147,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['ExasolDatabase'] + ApiError | list[ExasolDatabase] """ return ( diff --git a/exasol/saas/client/openapi/api/databases/list_schedules.py b/exasol/saas/client/openapi/api/databases/list_schedules.py index 2e78c9c4..3ff16f2e 100644 --- a/exasol/saas/client/openapi/api/databases/list_schedules.py +++ b/exasol/saas/client/openapi/api/databases/list_schedules.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.schedule import Schedule -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,15 +20,18 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/schedules", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/schedules".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["Schedule"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[Schedule]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -45,15 +41,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["Schedule"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[Schedule]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -67,7 +63,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["Schedule"]]: +) -> Response[ApiError | list[Schedule]]: """ Args: account_id (str): @@ -78,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Schedule']] + Response[ApiError | list[Schedule]] """ kwargs = _get_kwargs( @@ -98,7 +94,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["Schedule"]]: +) -> ApiError | list[Schedule] | None: """ Args: account_id (str): @@ -109,7 +105,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Schedule'] + ApiError | list[Schedule] """ return sync_detailed( @@ -124,7 +120,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["Schedule"]]: +) -> Response[ApiError | list[Schedule]]: """ Args: account_id (str): @@ -135,7 +131,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Schedule']] + Response[ApiError | list[Schedule]] """ kwargs = _get_kwargs( @@ -153,7 +149,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["Schedule"]]: +) -> ApiError | list[Schedule] | None: """ Args: account_id (str): @@ -164,7 +160,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Schedule'] + ApiError | list[Schedule] """ return ( diff --git a/exasol/saas/client/openapi/api/databases/set_auto_updates_database.py b/exasol/saas/client/openapi/api/databases/set_auto_updates_database.py index 4eee5e8a..ce78d29b 100644 --- a/exasol/saas/client/openapi/api/databases/set_auto_updates_database.py +++ b/exasol/saas/client/openapi/api/databases/set_auto_updates_database.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.set_auto_updates_database import SetAutoUpdatesDatabase -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,7 +26,10 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "patch", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/settings", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/settings".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -42,19 +41,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -69,7 +69,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: SetAutoUpdatesDatabase, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -81,7 +81,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -97,13 +97,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, + body: SetAutoUpdatesDatabase, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + body (SetAutoUpdatesDatabase): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, *, client: AuthenticatedClient, body: SetAutoUpdatesDatabase, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -115,7 +144,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -127,3 +156,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, + body: SetAutoUpdatesDatabase, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + body (SetAutoUpdatesDatabase): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/start_database.py b/exasol/saas/client/openapi/api/databases/start_database.py index a79d1b4f..9c2aae9f 100644 --- a/exasol/saas/client/openapi/api/databases/start_database.py +++ b/exasol/saas/client/openapi/api/databases/start_database.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,26 +22,30 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/start", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/start".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -59,7 +59,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -70,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -85,12 +85,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -101,7 +127,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -112,3 +138,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/stop_database.py b/exasol/saas/client/openapi/api/databases/stop_database.py index 27d9b303..3eb7b687 100644 --- a/exasol/saas/client/openapi/api/databases/stop_database.py +++ b/exasol/saas/client/openapi/api/databases/stop_database.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,26 +22,30 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/stop", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/stop".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -59,7 +59,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -70,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -85,12 +85,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -101,7 +127,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -112,3 +138,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/update_database.py b/exasol/saas/client/openapi/api/databases/update_database.py index 2dc13c8e..3359d16c 100644 --- a/exasol/saas/client/openapi/api/databases/update_database.py +++ b/exasol/saas/client/openapi/api/databases/update_database.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.update_database import UpdateDatabase -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,7 +26,10 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -42,19 +41,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -69,7 +69,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: UpdateDatabase, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -81,7 +81,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -97,13 +97,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, + body: UpdateDatabase, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + body (UpdateDatabase): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, *, client: AuthenticatedClient, body: UpdateDatabase, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -115,7 +144,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -127,3 +156,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, + body: UpdateDatabase, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + body (UpdateDatabase): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/update_schedule_cron_rule.py b/exasol/saas/client/openapi/api/databases/update_schedule_cron_rule.py index 9d1d5512..0c900437 100644 --- a/exasol/saas/client/openapi/api/databases/update_schedule_cron_rule.py +++ b/exasol/saas/client/openapi/api/databases/update_schedule_cron_rule.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.update_schedule_cron_rule import UpdateScheduleCronRule -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -31,7 +27,11 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "patch", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/schedules/{action_id}/cronRule", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/schedules/{action_id}/cronRule".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + action_id=quote(str(action_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -43,19 +43,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -71,7 +72,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: UpdateScheduleCronRule, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -84,7 +85,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -101,6 +102,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + action_id: str, + *, + client: AuthenticatedClient, + body: UpdateScheduleCronRule, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + action_id (str): + body (UpdateScheduleCronRule): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + action_id=action_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, @@ -108,7 +141,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: UpdateScheduleCronRule, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -121,7 +154,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -134,3 +167,37 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + action_id: str, + *, + client: AuthenticatedClient, + body: UpdateScheduleCronRule, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + action_id (str): + body (UpdateScheduleCronRule): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + action_id=action_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/update_schedule_state.py b/exasol/saas/client/openapi/api/databases/update_schedule_state.py index 77afa863..a18f9f36 100644 --- a/exasol/saas/client/openapi/api/databases/update_schedule_state.py +++ b/exasol/saas/client/openapi/api/databases/update_schedule_state.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.update_schedule_state import UpdateScheduleState -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -31,7 +27,11 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "patch", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/schedules/{action_id}/state", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/schedules/{action_id}/state".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + action_id=quote(str(action_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -43,19 +43,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -71,7 +72,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: UpdateScheduleState, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -84,7 +85,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -101,6 +102,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + action_id: str, + *, + client: AuthenticatedClient, + body: UpdateScheduleState, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + action_id (str): + body (UpdateScheduleState): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + action_id=action_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, @@ -108,7 +141,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: UpdateScheduleState, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -121,7 +154,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -134,3 +167,37 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + action_id: str, + *, + client: AuthenticatedClient, + body: UpdateScheduleState, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + action_id (str): + body (UpdateScheduleState): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + action_id=action_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/databases/upgrade_database.py b/exasol/saas/client/openapi/api/databases/upgrade_database.py index ba261a9e..19d07784 100644 --- a/exasol/saas/client/openapi/api/databases/upgrade_database.py +++ b/exasol/saas/client/openapi/api/databases/upgrade_database.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,26 +22,30 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/upgrade", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/upgrade".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -59,7 +59,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -70,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -85,12 +85,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -101,7 +127,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -112,3 +138,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/extensions/create_extension_instance.py b/exasol/saas/client/openapi/api/extensions/create_extension_instance.py index 7fbde518..868b2caf 100644 --- a/exasol/saas/client/openapi/api/extensions/create_extension_instance.py +++ b/exasol/saas/client/openapi/api/extensions/create_extension_instance.py @@ -1,14 +1,9 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, @@ -16,10 +11,7 @@ from ...models.api_error import ApiError from ...models.create_extension_instance import CreateExtensionInstance from ...models.extension_instance import ExtensionInstance -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -34,7 +26,12 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/instances", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/instances".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + extension_id=quote(str(extension_id), safe=""), + extension_version=quote(str(extension_version), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -46,25 +43,26 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Union[ApiError, ExtensionInstance]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | ExtensionInstance: if response.status_code == 200: response_200 = ExtensionInstance.from_dict(response.json()) return response_200 + if response.status_code == 422: response_422 = ApiError.from_dict(response.json()) return response_422 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Union[ApiError, ExtensionInstance]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | ExtensionInstance]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -81,7 +79,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: CreateExtensionInstance, -) -> Response[Union[ApiError, ExtensionInstance]]: +) -> Response[ApiError | ExtensionInstance]: """ Args: account_id (str): @@ -95,7 +93,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Union[ApiError, ExtensionInstance]] + Response[ApiError | ExtensionInstance] """ kwargs = _get_kwargs( @@ -121,7 +119,7 @@ def sync( *, client: AuthenticatedClient, body: CreateExtensionInstance, -) -> Optional[Union[ApiError, ExtensionInstance]]: +) -> ApiError | ExtensionInstance | None: """ Args: account_id (str): @@ -135,7 +133,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Union[ApiError, ExtensionInstance] + ApiError | ExtensionInstance """ return sync_detailed( @@ -156,7 +154,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: CreateExtensionInstance, -) -> Response[Union[ApiError, ExtensionInstance]]: +) -> Response[ApiError | ExtensionInstance]: """ Args: account_id (str): @@ -170,7 +168,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Union[ApiError, ExtensionInstance]] + Response[ApiError | ExtensionInstance] """ kwargs = _get_kwargs( @@ -194,7 +192,7 @@ async def asyncio( *, client: AuthenticatedClient, body: CreateExtensionInstance, -) -> Optional[Union[ApiError, ExtensionInstance]]: +) -> ApiError | ExtensionInstance | None: """ Args: account_id (str): @@ -208,7 +206,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Union[ApiError, ExtensionInstance] + ApiError | ExtensionInstance """ return ( diff --git a/exasol/saas/client/openapi/api/extensions/delete_extension_instance.py b/exasol/saas/client/openapi/api/extensions/delete_extension_instance.py index e5f41d74..c1fd2f5b 100644 --- a/exasol/saas/client/openapi/api/extensions/delete_extension_instance.py +++ b/exasol/saas/client/openapi/api/extensions/delete_extension_instance.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -29,26 +25,33 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/instances/{instance_id}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/instances/{instance_id}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + extension_id=quote(str(extension_id), safe=""), + extension_version=quote(str(extension_version), safe=""), + instance_id=quote(str(instance_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -65,7 +68,7 @@ def sync_detailed( instance_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -79,7 +82,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -97,6 +100,41 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + extension_id: str, + extension_version: str, + instance_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + extension_id (str): + extension_version (str): + instance_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + extension_id=extension_id, + extension_version=extension_version, + instance_id=instance_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, @@ -105,7 +143,7 @@ async def asyncio_detailed( instance_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -119,7 +157,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -133,3 +171,40 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + extension_id: str, + extension_version: str, + instance_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + extension_id (str): + extension_version (str): + instance_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + extension_id=extension_id, + extension_version=extension_version, + instance_id=instance_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/extensions/get_extension.py b/exasol/saas/client/openapi/api/extensions/get_extension.py index d607b0cc..25dcb5da 100644 --- a/exasol/saas/client/openapi/api/extensions/get_extension.py +++ b/exasol/saas/client/openapi/api/extensions/get_extension.py @@ -1,24 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) from ...models.api_error import ApiError from ...models.extension_detail import ExtensionDetail -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,32 +22,38 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + extension_id=quote(str(extension_id), safe=""), + extension_version=quote(str(extension_version), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Union[ApiError, ExtensionDetail]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | ExtensionDetail: if response.status_code == 200: response_200 = ExtensionDetail.from_dict(response.json()) return response_200 + if response.status_code == 422: response_422 = ApiError.from_dict(response.json()) return response_422 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Union[ApiError, ExtensionDetail]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | ExtensionDetail]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -71,7 +69,7 @@ def sync_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Union[ApiError, ExtensionDetail]]: +) -> Response[ApiError | ExtensionDetail]: """ Args: account_id (str): @@ -84,7 +82,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Union[ApiError, ExtensionDetail]] + Response[ApiError | ExtensionDetail] """ kwargs = _get_kwargs( @@ -108,7 +106,7 @@ def sync( extension_version: str, *, client: AuthenticatedClient, -) -> Optional[Union[ApiError, ExtensionDetail]]: +) -> ApiError | ExtensionDetail | None: """ Args: account_id (str): @@ -121,7 +119,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Union[ApiError, ExtensionDetail] + ApiError | ExtensionDetail """ return sync_detailed( @@ -140,7 +138,7 @@ async def asyncio_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Union[ApiError, ExtensionDetail]]: +) -> Response[ApiError | ExtensionDetail]: """ Args: account_id (str): @@ -153,7 +151,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Union[ApiError, ExtensionDetail]] + Response[ApiError | ExtensionDetail] """ kwargs = _get_kwargs( @@ -175,7 +173,7 @@ async def asyncio( extension_version: str, *, client: AuthenticatedClient, -) -> Optional[Union[ApiError, ExtensionDetail]]: +) -> ApiError | ExtensionDetail | None: """ Args: account_id (str): @@ -188,7 +186,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Union[ApiError, ExtensionDetail] + ApiError | ExtensionDetail """ return ( diff --git a/exasol/saas/client/openapi/api/extensions/install_extension.py b/exasol/saas/client/openapi/api/extensions/install_extension.py index a3f7f4f5..d2640ff8 100644 --- a/exasol/saas/client/openapi/api/extensions/install_extension.py +++ b/exasol/saas/client/openapi/api/extensions/install_extension.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -28,26 +24,32 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/install", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/install".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + extension_id=quote(str(extension_id), safe=""), + extension_version=quote(str(extension_version), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -63,7 +65,7 @@ def sync_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -76,7 +78,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -93,6 +95,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + extension_id: str, + extension_version: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + extension_id (str): + extension_version (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + extension_id=extension_id, + extension_version=extension_version, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, @@ -100,7 +134,7 @@ async def asyncio_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -113,7 +147,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -126,3 +160,37 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + extension_id: str, + extension_version: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + extension_id (str): + extension_version (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + extension_id=extension_id, + extension_version=extension_version, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/extensions/list_extension_instances.py b/exasol/saas/client/openapi/api/extensions/list_extension_instances.py index fe6d111e..f796878a 100644 --- a/exasol/saas/client/openapi/api/extensions/list_extension_instances.py +++ b/exasol/saas/client/openapi/api/extensions/list_extension_instances.py @@ -1,24 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) from ...models.api_error import ApiError from ...models.extension_instance import ExtensionInstance -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,15 +22,20 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/instances", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/instances".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + extension_id=quote(str(extension_id), safe=""), + extension_version=quote(str(extension_version), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Union[ApiError, list["ExtensionInstance"]]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[ExtensionInstance]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -48,19 +45,20 @@ def _parse_response( response_200.append(response_200_item) return response_200 + if response.status_code == 422: response_422 = ApiError.from_dict(response.json()) return response_422 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Union[ApiError, list["ExtensionInstance"]]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[ExtensionInstance]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -76,7 +74,7 @@ def sync_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Union[ApiError, list["ExtensionInstance"]]]: +) -> Response[ApiError | list[ExtensionInstance]]: """ Args: account_id (str): @@ -89,7 +87,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Union[ApiError, list['ExtensionInstance']]] + Response[ApiError | list[ExtensionInstance]] """ kwargs = _get_kwargs( @@ -113,7 +111,7 @@ def sync( extension_version: str, *, client: AuthenticatedClient, -) -> Optional[Union[ApiError, list["ExtensionInstance"]]]: +) -> ApiError | list[ExtensionInstance] | None: """ Args: account_id (str): @@ -126,7 +124,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Union[ApiError, list['ExtensionInstance']] + ApiError | list[ExtensionInstance] """ return sync_detailed( @@ -145,7 +143,7 @@ async def asyncio_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Union[ApiError, list["ExtensionInstance"]]]: +) -> Response[ApiError | list[ExtensionInstance]]: """ Args: account_id (str): @@ -158,7 +156,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Union[ApiError, list['ExtensionInstance']]] + Response[ApiError | list[ExtensionInstance]] """ kwargs = _get_kwargs( @@ -180,7 +178,7 @@ async def asyncio( extension_version: str, *, client: AuthenticatedClient, -) -> Optional[Union[ApiError, list["ExtensionInstance"]]]: +) -> ApiError | list[ExtensionInstance] | None: """ Args: account_id (str): @@ -193,7 +191,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Union[ApiError, list['ExtensionInstance']] + ApiError | list[ExtensionInstance] """ return ( diff --git a/exasol/saas/client/openapi/api/extensions/list_extensions.py b/exasol/saas/client/openapi/api/extensions/list_extensions.py index 1f33ef02..26dcce55 100644 --- a/exasol/saas/client/openapi/api/extensions/list_extensions.py +++ b/exasol/saas/client/openapi/api/extensions/list_extensions.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.extension import Extension -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,15 +20,18 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/extensions", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/extensions".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["Extension"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[Extension]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -45,15 +41,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["Extension"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[Extension]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -67,7 +63,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["Extension"]]: +) -> Response[ApiError | list[Extension]]: """ Args: account_id (str): @@ -78,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Extension']] + Response[ApiError | list[Extension]] """ kwargs = _get_kwargs( @@ -98,7 +94,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["Extension"]]: +) -> ApiError | list[Extension] | None: """ Args: account_id (str): @@ -109,7 +105,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Extension'] + ApiError | list[Extension] """ return sync_detailed( @@ -124,7 +120,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["Extension"]]: +) -> Response[ApiError | list[Extension]]: """ Args: account_id (str): @@ -135,7 +131,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Extension']] + Response[ApiError | list[Extension]] """ kwargs = _get_kwargs( @@ -153,7 +149,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["Extension"]]: +) -> ApiError | list[Extension] | None: """ Args: account_id (str): @@ -164,7 +160,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Extension'] + ApiError | list[Extension] """ return ( diff --git a/exasol/saas/client/openapi/api/extensions/uninstall_extension.py b/exasol/saas/client/openapi/api/extensions/uninstall_extension.py index 7e415e2a..8a112030 100644 --- a/exasol/saas/client/openapi/api/extensions/uninstall_extension.py +++ b/exasol/saas/client/openapi/api/extensions/uninstall_extension.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -28,26 +24,32 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/uninstall", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/extensions/{extension_id}/{extension_version}/uninstall".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + extension_id=quote(str(extension_id), safe=""), + extension_version=quote(str(extension_version), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -63,7 +65,7 @@ def sync_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -76,7 +78,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -93,6 +95,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + extension_id: str, + extension_version: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + extension_id (str): + extension_version (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + extension_id=extension_id, + extension_version=extension_version, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, @@ -100,7 +134,7 @@ async def asyncio_detailed( extension_version: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -113,7 +147,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -126,3 +160,37 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + extension_id: str, + extension_version: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + extension_id (str): + extension_version (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + extension_id=extension_id, + extension_version=extension_version, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/files/create_folder.py b/exasol/saas/client/openapi/api/files/create_folder.py index 689f0e6b..f09ffa4c 100644 --- a/exasol/saas/client/openapi/api/files/create_folder.py +++ b/exasol/saas/client/openapi/api/files/create_folder.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,26 +23,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/folder/{key}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/folder/{key}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + key=quote(str(key), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -61,7 +62,7 @@ def sync_detailed( key: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -73,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,13 +90,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + key: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + key (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + key=key, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, key: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -107,7 +137,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -119,3 +149,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + key: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + key (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + key=key, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/files/delete_file.py b/exasol/saas/client/openapi/api/files/delete_file.py index 33bdb6e6..8419e8f0 100644 --- a/exasol/saas/client/openapi/api/files/delete_file.py +++ b/exasol/saas/client/openapi/api/files/delete_file.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,26 +23,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/files/{key}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/files/{key}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + key=quote(str(key), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -61,7 +62,7 @@ def sync_detailed( key: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -73,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,13 +90,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + key: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + key (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + key=key, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, key: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -107,7 +137,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -119,3 +149,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + key: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + key (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + key=key, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/files/delete_folder.py b/exasol/saas/client/openapi/api/files/delete_folder.py index 5f9293ad..a59cae9b 100644 --- a/exasol/saas/client/openapi/api/files/delete_folder.py +++ b/exasol/saas/client/openapi/api/files/delete_folder.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,26 +23,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/folder/{key}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/folder/{key}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + key=quote(str(key), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -61,7 +62,7 @@ def sync_detailed( key: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -73,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,13 +90,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + database_id: str, + key: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + key (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + database_id=database_id, + key=key, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, database_id: str, key: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -107,7 +137,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -119,3 +149,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + database_id: str, + key: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + database_id (str): + key (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + database_id=database_id, + key=key, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/files/download_file.py b/exasol/saas/client/openapi/api/files/download_file.py index d68fc341..efb60f55 100644 --- a/exasol/saas/client/openapi/api/files/download_file.py +++ b/exasol/saas/client/openapi/api/files/download_file.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.download_file import DownloadFile -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -28,28 +21,32 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/internal/accounts/{account_id}/databases/{database_id}/files/{key}", + "url": "/api/v1/internal/accounts/{account_id}/databases/{database_id}/files/{key}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + key=quote(str(key), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[DownloadFile]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | DownloadFile: if response.status_code == 200: response_200 = DownloadFile.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[DownloadFile]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | DownloadFile]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -64,7 +61,7 @@ def sync_detailed( key: str, *, client: AuthenticatedClient, -) -> Response[DownloadFile]: +) -> Response[ApiError | DownloadFile]: """ Args: account_id (str): @@ -76,7 +73,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DownloadFile] + Response[ApiError | DownloadFile] """ kwargs = _get_kwargs( @@ -98,7 +95,7 @@ def sync( key: str, *, client: AuthenticatedClient, -) -> Optional[DownloadFile]: +) -> ApiError | DownloadFile | None: """ Args: account_id (str): @@ -110,7 +107,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DownloadFile + ApiError | DownloadFile """ return sync_detailed( @@ -127,7 +124,7 @@ async def asyncio_detailed( key: str, *, client: AuthenticatedClient, -) -> Response[DownloadFile]: +) -> Response[ApiError | DownloadFile]: """ Args: account_id (str): @@ -139,7 +136,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[DownloadFile] + Response[ApiError | DownloadFile] """ kwargs = _get_kwargs( @@ -159,7 +156,7 @@ async def asyncio( key: str, *, client: AuthenticatedClient, -) -> Optional[DownloadFile]: +) -> ApiError | DownloadFile | None: """ Args: account_id (str): @@ -171,7 +168,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - DownloadFile + ApiError | DownloadFile """ return ( diff --git a/exasol/saas/client/openapi/api/files/list_files.py b/exasol/saas/client/openapi/api/files/list_files.py index c1fd9a22..92a0e0ea 100644 --- a/exasol/saas/client/openapi/api/files/list_files.py +++ b/exasol/saas/client/openapi/api/files/list_files.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.file import File -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,15 +20,18 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/files", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/files".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["File"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[File]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -45,15 +41,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["File"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[File]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -67,7 +63,7 @@ def sync_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["File"]]: +) -> Response[ApiError | list[File]]: """ Args: account_id (str): @@ -78,7 +74,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['File']] + Response[ApiError | list[File]] """ kwargs = _get_kwargs( @@ -98,7 +94,7 @@ def sync( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["File"]]: +) -> ApiError | list[File] | None: """ Args: account_id (str): @@ -109,7 +105,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['File'] + ApiError | list[File] """ return sync_detailed( @@ -124,7 +120,7 @@ async def asyncio_detailed( database_id: str, *, client: AuthenticatedClient, -) -> Response[list["File"]]: +) -> Response[ApiError | list[File]]: """ Args: account_id (str): @@ -135,7 +131,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['File']] + Response[ApiError | list[File]] """ kwargs = _get_kwargs( @@ -153,7 +149,7 @@ async def asyncio( database_id: str, *, client: AuthenticatedClient, -) -> Optional[list["File"]]: +) -> ApiError | list[File] | None: """ Args: account_id (str): @@ -164,7 +160,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['File'] + ApiError | list[File] """ return ( diff --git a/exasol/saas/client/openapi/api/files/upload_file.py b/exasol/saas/client/openapi/api/files/upload_file.py index 191b21da..1730398e 100644 --- a/exasol/saas/client/openapi/api/files/upload_file.py +++ b/exasol/saas/client/openapi/api/files/upload_file.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.upload_file import UploadFile -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -28,28 +21,32 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/databases/{database_id}/files/{key}", + "url": "/api/v1/accounts/{account_id}/databases/{database_id}/files/{key}".format( + account_id=quote(str(account_id), safe=""), + database_id=quote(str(database_id), safe=""), + key=quote(str(key), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[UploadFile]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | UploadFile: if response.status_code == 200: response_200 = UploadFile.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[UploadFile]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | UploadFile]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -64,7 +61,7 @@ def sync_detailed( key: str, *, client: AuthenticatedClient, -) -> Response[UploadFile]: +) -> Response[ApiError | UploadFile]: """ Args: account_id (str): @@ -76,7 +73,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[UploadFile] + Response[ApiError | UploadFile] """ kwargs = _get_kwargs( @@ -98,7 +95,7 @@ def sync( key: str, *, client: AuthenticatedClient, -) -> Optional[UploadFile]: +) -> ApiError | UploadFile | None: """ Args: account_id (str): @@ -110,7 +107,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - UploadFile + ApiError | UploadFile """ return sync_detailed( @@ -127,7 +124,7 @@ async def asyncio_detailed( key: str, *, client: AuthenticatedClient, -) -> Response[UploadFile]: +) -> Response[ApiError | UploadFile]: """ Args: account_id (str): @@ -139,7 +136,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[UploadFile] + Response[ApiError | UploadFile] """ kwargs = _get_kwargs( @@ -159,7 +156,7 @@ async def asyncio( key: str, *, client: AuthenticatedClient, -) -> Optional[UploadFile]: +) -> ApiError | UploadFile | None: """ Args: account_id (str): @@ -171,7 +168,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - UploadFile + ApiError | UploadFile """ return ( diff --git a/exasol/saas/client/openapi/api/platform/list_cluster_sizes.py b/exasol/saas/client/openapi/api/platform/list_cluster_sizes.py index 8c1ab5ed..df0dc142 100644 --- a/exasol/saas/client/openapi/api/platform/list_cluster_sizes.py +++ b/exasol/saas/client/openapi/api/platform/list_cluster_sizes.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.cluster_size_1 import ClusterSize1 -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -26,15 +19,17 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/platforms/{platform}/sizes", + "url": "/api/v1/platforms/{platform}/sizes".format( + platform=quote(str(platform), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["ClusterSize1"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[ClusterSize1]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -44,15 +39,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["ClusterSize1"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[ClusterSize1]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -65,7 +60,7 @@ def sync_detailed( platform: str, *, client: AuthenticatedClient, -) -> Response[list["ClusterSize1"]]: +) -> Response[ApiError | list[ClusterSize1]]: """ Args: platform (str): @@ -75,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['ClusterSize1']] + Response[ApiError | list[ClusterSize1]] """ kwargs = _get_kwargs( @@ -93,7 +88,7 @@ def sync( platform: str, *, client: AuthenticatedClient, -) -> Optional[list["ClusterSize1"]]: +) -> ApiError | list[ClusterSize1] | None: """ Args: platform (str): @@ -103,7 +98,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['ClusterSize1'] + ApiError | list[ClusterSize1] """ return sync_detailed( @@ -116,7 +111,7 @@ async def asyncio_detailed( platform: str, *, client: AuthenticatedClient, -) -> Response[list["ClusterSize1"]]: +) -> Response[ApiError | list[ClusterSize1]]: """ Args: platform (str): @@ -126,7 +121,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['ClusterSize1']] + Response[ApiError | list[ClusterSize1]] """ kwargs = _get_kwargs( @@ -142,7 +137,7 @@ async def asyncio( platform: str, *, client: AuthenticatedClient, -) -> Optional[list["ClusterSize1"]]: +) -> ApiError | list[ClusterSize1] | None: """ Args: platform (str): @@ -152,7 +147,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['ClusterSize1'] + ApiError | list[ClusterSize1] """ return ( diff --git a/exasol/saas/client/openapi/api/platform/list_platforms.py b/exasol/saas/client/openapi/api/platform/list_platforms.py index ec98e522..7c50835e 100644 --- a/exasol/saas/client/openapi/api/platform/list_platforms.py +++ b/exasol/saas/client/openapi/api/platform/list_platforms.py @@ -1,23 +1,15 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.platform import Platform -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs() -> dict[str, Any]: @@ -31,8 +23,8 @@ def _get_kwargs() -> dict[str, Any]: def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["Platform"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[Platform]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -42,15 +34,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["Platform"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[Platform]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -62,14 +54,14 @@ def _build_response( def sync_detailed( *, client: AuthenticatedClient, -) -> Response[list["Platform"]]: +) -> Response[ApiError | list[Platform]]: """ Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Platform']] + Response[ApiError | list[Platform]] """ kwargs = _get_kwargs() @@ -84,14 +76,14 @@ def sync_detailed( def sync( *, client: AuthenticatedClient, -) -> Optional[list["Platform"]]: +) -> ApiError | list[Platform] | None: """ Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Platform'] + ApiError | list[Platform] """ return sync_detailed( @@ -102,14 +94,14 @@ def sync( async def asyncio_detailed( *, client: AuthenticatedClient, -) -> Response[list["Platform"]]: +) -> Response[ApiError | list[Platform]]: """ Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Platform']] + Response[ApiError | list[Platform]] """ kwargs = _get_kwargs() @@ -122,14 +114,14 @@ async def asyncio_detailed( async def asyncio( *, client: AuthenticatedClient, -) -> Optional[list["Platform"]]: +) -> ApiError | list[Platform] | None: """ Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Platform'] + ApiError | list[Platform] """ return ( diff --git a/exasol/saas/client/openapi/api/platform/list_regions.py b/exasol/saas/client/openapi/api/platform/list_regions.py index a09ea5a8..f1be9589 100644 --- a/exasol/saas/client/openapi/api/platform/list_regions.py +++ b/exasol/saas/client/openapi/api/platform/list_regions.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.region import Region -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -26,15 +19,17 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/platforms/{platform}/regions", + "url": "/api/v1/platforms/{platform}/regions".format( + platform=quote(str(platform), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["Region"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[Region]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -44,15 +39,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["Region"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[Region]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -65,7 +60,7 @@ def sync_detailed( platform: str, *, client: AuthenticatedClient, -) -> Response[list["Region"]]: +) -> Response[ApiError | list[Region]]: """ Args: platform (str): @@ -75,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Region']] + Response[ApiError | list[Region]] """ kwargs = _get_kwargs( @@ -93,7 +88,7 @@ def sync( platform: str, *, client: AuthenticatedClient, -) -> Optional[list["Region"]]: +) -> ApiError | list[Region] | None: """ Args: platform (str): @@ -103,7 +98,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Region'] + ApiError | list[Region] """ return sync_detailed( @@ -116,7 +111,7 @@ async def asyncio_detailed( platform: str, *, client: AuthenticatedClient, -) -> Response[list["Region"]]: +) -> Response[ApiError | list[Region]]: """ Args: platform (str): @@ -126,7 +121,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['Region']] + Response[ApiError | list[Region]] """ kwargs = _get_kwargs( @@ -142,7 +137,7 @@ async def asyncio( platform: str, *, client: AuthenticatedClient, -) -> Optional[list["Region"]]: +) -> ApiError | list[Region] | None: """ Args: platform (str): @@ -152,7 +147,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['Region'] + ApiError | list[Region] """ return ( diff --git a/exasol/saas/client/openapi/api/profile/update_profile.py b/exasol/saas/client/openapi/api/profile/update_profile.py index ef93f644..b067bfac 100644 --- a/exasol/saas/client/openapi/api/profile/update_profile.py +++ b/exasol/saas/client/openapi/api/profile/update_profile.py @@ -1,23 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.update_profile import UpdateProfile -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -40,19 +35,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -65,7 +61,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: UpdateProfile, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: body (UpdateProfile): @@ -75,7 +71,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -89,11 +85,34 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + *, + client: AuthenticatedClient, + body: UpdateProfile, +) -> Any | ApiError | None: + """ + Args: + body (UpdateProfile): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + client=client, + body=body, + ).parsed + + async def asyncio_detailed( *, client: AuthenticatedClient, body: UpdateProfile, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: body (UpdateProfile): @@ -103,7 +122,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -113,3 +132,28 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + *, + client: AuthenticatedClient, + body: UpdateProfile, +) -> Any | ApiError | None: + """ + Args: + body (UpdateProfile): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/security/add_allowed_ip.py b/exasol/saas/client/openapi/api/security/add_allowed_ip.py index b6d5b8ca..db48fa8b 100644 --- a/exasol/saas/client/openapi/api/security/add_allowed_ip.py +++ b/exasol/saas/client/openapi/api/security/add_allowed_ip.py @@ -1,24 +1,17 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) from ...models.allowed_ip import AllowedIP +from ...models.api_error import ApiError from ...models.create_allowed_ip import CreateAllowedIP -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,7 +23,9 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": f"/api/v1/accounts/{account_id}/security/allowlist_ip", + "url": "/api/v1/accounts/{account_id}/security/allowlist_ip".format( + account_id=quote(str(account_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -42,21 +37,21 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[AllowedIP]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> AllowedIP | ApiError: if response.status_code == 200: response_200 = AllowedIP.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[AllowedIP]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[AllowedIP | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -70,7 +65,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: CreateAllowedIP, -) -> Response[AllowedIP]: +) -> Response[AllowedIP | ApiError]: """ Args: account_id (str): @@ -81,7 +76,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[AllowedIP] + Response[AllowedIP | ApiError] """ kwargs = _get_kwargs( @@ -101,7 +96,7 @@ def sync( *, client: AuthenticatedClient, body: CreateAllowedIP, -) -> Optional[AllowedIP]: +) -> AllowedIP | ApiError | None: """ Args: account_id (str): @@ -112,7 +107,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - AllowedIP + AllowedIP | ApiError """ return sync_detailed( @@ -127,7 +122,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, body: CreateAllowedIP, -) -> Response[AllowedIP]: +) -> Response[AllowedIP | ApiError]: """ Args: account_id (str): @@ -138,7 +133,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[AllowedIP] + Response[AllowedIP | ApiError] """ kwargs = _get_kwargs( @@ -156,7 +151,7 @@ async def asyncio( *, client: AuthenticatedClient, body: CreateAllowedIP, -) -> Optional[AllowedIP]: +) -> AllowedIP | ApiError | None: """ Args: account_id (str): @@ -167,7 +162,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - AllowedIP + AllowedIP | ApiError """ return ( diff --git a/exasol/saas/client/openapi/api/security/delete_allowed_ip.py b/exasol/saas/client/openapi/api/security/delete_allowed_ip.py index b209d038..4b4ff65f 100644 --- a/exasol/saas/client/openapi/api/security/delete_allowed_ip.py +++ b/exasol/saas/client/openapi/api/security/delete_allowed_ip.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,26 +22,30 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/security/allowlist_ip/{allowlist_ip_id}", + "url": "/api/v1/accounts/{account_id}/security/allowlist_ip/{allowlist_ip_id}".format( + account_id=quote(str(account_id), safe=""), + allowlist_ip_id=quote(str(allowlist_ip_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -59,7 +59,7 @@ def sync_detailed( allowlist_ip_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -70,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -85,12 +85,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + allowlist_ip_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + allowlist_ip_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + allowlist_ip_id=allowlist_ip_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, allowlist_ip_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -101,7 +127,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -112,3 +138,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + allowlist_ip_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + allowlist_ip_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + allowlist_ip_id=allowlist_ip_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/security/get_allowed_ip.py b/exasol/saas/client/openapi/api/security/get_allowed_ip.py index 025b43e2..058bcbac 100644 --- a/exasol/saas/client/openapi/api/security/get_allowed_ip.py +++ b/exasol/saas/client/openapi/api/security/get_allowed_ip.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) from ...models.allowed_ip import AllowedIP -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -27,28 +20,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/security/allowlist_ip/{allowlist_ip_id}", + "url": "/api/v1/accounts/{account_id}/security/allowlist_ip/{allowlist_ip_id}".format( + account_id=quote(str(account_id), safe=""), + allowlist_ip_id=quote(str(allowlist_ip_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[AllowedIP]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> AllowedIP | ApiError: if response.status_code == 200: response_200 = AllowedIP.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[AllowedIP]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[AllowedIP | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -62,7 +58,7 @@ def sync_detailed( allowlist_ip_id: str, *, client: AuthenticatedClient, -) -> Response[AllowedIP]: +) -> Response[AllowedIP | ApiError]: """ Args: account_id (str): @@ -73,7 +69,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[AllowedIP] + Response[AllowedIP | ApiError] """ kwargs = _get_kwargs( @@ -93,7 +89,7 @@ def sync( allowlist_ip_id: str, *, client: AuthenticatedClient, -) -> Optional[AllowedIP]: +) -> AllowedIP | ApiError | None: """ Args: account_id (str): @@ -104,7 +100,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - AllowedIP + AllowedIP | ApiError """ return sync_detailed( @@ -119,7 +115,7 @@ async def asyncio_detailed( allowlist_ip_id: str, *, client: AuthenticatedClient, -) -> Response[AllowedIP]: +) -> Response[AllowedIP | ApiError]: """ Args: account_id (str): @@ -130,7 +126,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[AllowedIP] + Response[AllowedIP | ApiError] """ kwargs = _get_kwargs( @@ -148,7 +144,7 @@ async def asyncio( allowlist_ip_id: str, *, client: AuthenticatedClient, -) -> Optional[AllowedIP]: +) -> AllowedIP | ApiError | None: """ Args: account_id (str): @@ -159,7 +155,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - AllowedIP + AllowedIP | ApiError """ return ( diff --git a/exasol/saas/client/openapi/api/security/list_allowed_i_ps.py b/exasol/saas/client/openapi/api/security/list_allowed_i_ps.py index 2f476c68..ab4a4eea 100644 --- a/exasol/saas/client/openapi/api/security/list_allowed_i_ps.py +++ b/exasol/saas/client/openapi/api/security/list_allowed_i_ps.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) from ...models.allowed_ip import AllowedIP -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,15 +19,17 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/security/allowlist_ip", + "url": "/api/v1/accounts/{account_id}/security/allowlist_ip".format( + account_id=quote(str(account_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["AllowedIP"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[AllowedIP]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -44,15 +39,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["AllowedIP"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[AllowedIP]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -65,7 +60,7 @@ def sync_detailed( account_id: str, *, client: AuthenticatedClient, -) -> Response[list["AllowedIP"]]: +) -> Response[ApiError | list[AllowedIP]]: """ Args: account_id (str): @@ -75,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['AllowedIP']] + Response[ApiError | list[AllowedIP]] """ kwargs = _get_kwargs( @@ -93,7 +88,7 @@ def sync( account_id: str, *, client: AuthenticatedClient, -) -> Optional[list["AllowedIP"]]: +) -> ApiError | list[AllowedIP] | None: """ Args: account_id (str): @@ -103,7 +98,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['AllowedIP'] + ApiError | list[AllowedIP] """ return sync_detailed( @@ -116,7 +111,7 @@ async def asyncio_detailed( account_id: str, *, client: AuthenticatedClient, -) -> Response[list["AllowedIP"]]: +) -> Response[ApiError | list[AllowedIP]]: """ Args: account_id (str): @@ -126,7 +121,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['AllowedIP']] + Response[ApiError | list[AllowedIP]] """ kwargs = _get_kwargs( @@ -142,7 +137,7 @@ async def asyncio( account_id: str, *, client: AuthenticatedClient, -) -> Optional[list["AllowedIP"]]: +) -> ApiError | list[AllowedIP] | None: """ Args: account_id (str): @@ -152,7 +147,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['AllowedIP'] + ApiError | list[AllowedIP] """ return ( diff --git a/exasol/saas/client/openapi/api/security/update_allowed_ip.py b/exasol/saas/client/openapi/api/security/update_allowed_ip.py index f45738b9..4e912bc9 100644 --- a/exasol/saas/client/openapi/api/security/update_allowed_ip.py +++ b/exasol/saas/client/openapi/api/security/update_allowed_ip.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.update_allowed_ip import UpdateAllowedIP -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,7 +26,10 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "put", - "url": f"/api/v1/accounts/{account_id}/security/allowlist_ip/{allowlist_ip_id}", + "url": "/api/v1/accounts/{account_id}/security/allowlist_ip/{allowlist_ip_id}".format( + account_id=quote(str(account_id), safe=""), + allowlist_ip_id=quote(str(allowlist_ip_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -42,19 +41,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -69,7 +69,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: UpdateAllowedIP, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -81,7 +81,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -97,13 +97,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + allowlist_ip_id: str, + *, + client: AuthenticatedClient, + body: UpdateAllowedIP, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + allowlist_ip_id (str): + body (UpdateAllowedIP): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + allowlist_ip_id=allowlist_ip_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, allowlist_ip_id: str, *, client: AuthenticatedClient, body: UpdateAllowedIP, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -115,7 +144,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -127,3 +156,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + allowlist_ip_id: str, + *, + client: AuthenticatedClient, + body: UpdateAllowedIP, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + allowlist_ip_id (str): + body (UpdateAllowedIP): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + allowlist_ip_id=allowlist_ip_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/usage/get_usage.py b/exasol/saas/client/openapi/api/usage/get_usage.py index be004a81..28b21e05 100644 --- a/exasol/saas/client/openapi/api/usage/get_usage.py +++ b/exasol/saas/client/openapi/api/usage/get_usage.py @@ -1,18 +1,14 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.get_usage_type import GetUsageType from ...models.usage import Usage from ...types import ( @@ -25,15 +21,15 @@ def _get_kwargs( account_id: str, *, - year_month: Union[Unset, str] = UNSET, - type_: Union[Unset, GetUsageType] = UNSET, + year_month: str | Unset = UNSET, + type_: GetUsageType | Unset = UNSET, ) -> dict[str, Any]: params: dict[str, Any] = {} params["yearMonth"] = year_month - json_type_: Union[Unset, str] = UNSET + json_type_: str | Unset = UNSET if not isinstance(type_, Unset): json_type_ = type_.value @@ -43,7 +39,9 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/usage", + "url": "/api/v1/accounts/{account_id}/usage".format( + account_id=quote(str(account_id), safe=""), + ), "params": params, } @@ -51,21 +49,21 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Usage]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | Usage: if response.status_code == 200: response_200 = Usage.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Usage]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | Usage]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -78,21 +76,21 @@ def sync_detailed( account_id: str, *, client: AuthenticatedClient, - year_month: Union[Unset, str] = UNSET, - type_: Union[Unset, GetUsageType] = UNSET, -) -> Response[Usage]: + year_month: str | Unset = UNSET, + type_: GetUsageType | Unset = UNSET, +) -> Response[ApiError | Usage]: """ Args: account_id (str): - year_month (Union[Unset, str]): - type_ (Union[Unset, GetUsageType]): + year_month (str | Unset): + type_ (GetUsageType | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Usage] + Response[ApiError | Usage] """ kwargs = _get_kwargs( @@ -112,21 +110,21 @@ def sync( account_id: str, *, client: AuthenticatedClient, - year_month: Union[Unset, str] = UNSET, - type_: Union[Unset, GetUsageType] = UNSET, -) -> Optional[Usage]: + year_month: str | Unset = UNSET, + type_: GetUsageType | Unset = UNSET, +) -> ApiError | Usage | None: """ Args: account_id (str): - year_month (Union[Unset, str]): - type_ (Union[Unset, GetUsageType]): + year_month (str | Unset): + type_ (GetUsageType | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Usage + ApiError | Usage """ return sync_detailed( @@ -141,21 +139,21 @@ async def asyncio_detailed( account_id: str, *, client: AuthenticatedClient, - year_month: Union[Unset, str] = UNSET, - type_: Union[Unset, GetUsageType] = UNSET, -) -> Response[Usage]: + year_month: str | Unset = UNSET, + type_: GetUsageType | Unset = UNSET, +) -> Response[ApiError | Usage]: """ Args: account_id (str): - year_month (Union[Unset, str]): - type_ (Union[Unset, GetUsageType]): + year_month (str | Unset): + type_ (GetUsageType | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Usage] + Response[ApiError | Usage] """ kwargs = _get_kwargs( @@ -173,21 +171,21 @@ async def asyncio( account_id: str, *, client: AuthenticatedClient, - year_month: Union[Unset, str] = UNSET, - type_: Union[Unset, GetUsageType] = UNSET, -) -> Optional[Usage]: + year_month: str | Unset = UNSET, + type_: GetUsageType | Unset = UNSET, +) -> ApiError | Usage | None: """ Args: account_id (str): - year_month (Union[Unset, str]): - type_ (Union[Unset, GetUsageType]): + year_month (str | Unset): + type_ (GetUsageType | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Usage + ApiError | Usage """ return ( diff --git a/exasol/saas/client/openapi/api/users/delete_user.py b/exasol/saas/client/openapi/api/users/delete_user.py index 2a962190..d0851dc5 100644 --- a/exasol/saas/client/openapi/api/users/delete_user.py +++ b/exasol/saas/client/openapi/api/users/delete_user.py @@ -1,22 +1,18 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) -from ...types import ( - UNSET, - Response, -) +from ...models.api_error import ApiError +from ...types import Response def _get_kwargs( @@ -26,26 +22,30 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "delete", - "url": f"/api/v1/accounts/{account_id}/users/{user_id}", + "url": "/api/v1/accounts/{account_id}/users/{user_id}".format( + account_id=quote(str(account_id), safe=""), + user_id=quote(str(user_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -59,7 +59,7 @@ def sync_detailed( user_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -70,7 +70,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -85,12 +85,38 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + user_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + user_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + user_id=user_id, + client=client, + ).parsed + + async def asyncio_detailed( account_id: str, user_id: str, *, client: AuthenticatedClient, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -101,7 +127,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -112,3 +138,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + user_id: str, + *, + client: AuthenticatedClient, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + user_id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + user_id=user_id, + client=client, + ) + ).parsed diff --git a/exasol/saas/client/openapi/api/users/get_user.py b/exasol/saas/client/openapi/api/users/get_user.py index f08053b3..ddcfea5f 100644 --- a/exasol/saas/client/openapi/api/users/get_user.py +++ b/exasol/saas/client/openapi/api/users/get_user.py @@ -1,23 +1,16 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.user import User -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -27,28 +20,31 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/internal/accounts/{account_id}/users/{user_id}", + "url": "/api/v1/internal/accounts/{account_id}/users/{user_id}".format( + account_id=quote(str(account_id), safe=""), + user_id=quote(str(user_id), safe=""), + ), } return _kwargs def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[User]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | User: if response.status_code == 200: response_200 = User.from_dict(response.json()) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[User]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | User]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -62,7 +58,7 @@ def sync_detailed( user_id: str, *, client: AuthenticatedClient, -) -> Response[User]: +) -> Response[ApiError | User]: """ Args: account_id (str): @@ -73,7 +69,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[User] + Response[ApiError | User] """ kwargs = _get_kwargs( @@ -93,7 +89,7 @@ def sync( user_id: str, *, client: AuthenticatedClient, -) -> Optional[User]: +) -> ApiError | User | None: """ Args: account_id (str): @@ -104,7 +100,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - User + ApiError | User """ return sync_detailed( @@ -119,7 +115,7 @@ async def asyncio_detailed( user_id: str, *, client: AuthenticatedClient, -) -> Response[User]: +) -> Response[ApiError | User]: """ Args: account_id (str): @@ -130,7 +126,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[User] + Response[ApiError | User] """ kwargs = _get_kwargs( @@ -148,7 +144,7 @@ async def asyncio( user_id: str, *, client: AuthenticatedClient, -) -> Optional[User]: +) -> ApiError | User | None: """ Args: account_id (str): @@ -159,7 +155,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - User + ApiError | User """ return ( diff --git a/exasol/saas/client/openapi/api/users/list_users.py b/exasol/saas/client/openapi/api/users/list_users.py index dad14319..983ccd33 100644 --- a/exasol/saas/client/openapi/api/users/list_users.py +++ b/exasol/saas/client/openapi/api/users/list_users.py @@ -1,18 +1,14 @@ from http import HTTPStatus -from typing import ( - Any, - Optional, - Union, - cast, -) +from typing import Any +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.user import User from ...types import ( UNSET, @@ -24,9 +20,9 @@ def _get_kwargs( account_id: str, *, - filter_: Union[Unset, str] = UNSET, - next_: Union[Unset, int] = UNSET, - limit: Union[Unset, int] = UNSET, + filter_: str | Unset = UNSET, + next_: int | Unset = UNSET, + limit: int | Unset = UNSET, ) -> dict[str, Any]: params: dict[str, Any] = {} @@ -41,7 +37,9 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "get", - "url": f"/api/v1/accounts/{account_id}/users", + "url": "/api/v1/accounts/{account_id}/users".format( + account_id=quote(str(account_id), safe=""), + ), "params": params, } @@ -49,8 +47,8 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[list["User"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ApiError | list[User]: if response.status_code == 200: response_200 = [] _response_200 = response.json() @@ -60,15 +58,15 @@ def _parse_response( response_200.append(response_200_item) return response_200 - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[list["User"]]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ApiError | list[User]]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -81,23 +79,23 @@ def sync_detailed( account_id: str, *, client: AuthenticatedClient, - filter_: Union[Unset, str] = UNSET, - next_: Union[Unset, int] = UNSET, - limit: Union[Unset, int] = UNSET, -) -> Response[list["User"]]: + filter_: str | Unset = UNSET, + next_: int | Unset = UNSET, + limit: int | Unset = UNSET, +) -> Response[ApiError | list[User]]: """ Args: account_id (str): - filter_ (Union[Unset, str]): - next_ (Union[Unset, int]): - limit (Union[Unset, int]): + filter_ (str | Unset): + next_ (int | Unset): + limit (int | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['User']] + Response[ApiError | list[User]] """ kwargs = _get_kwargs( @@ -118,23 +116,23 @@ def sync( account_id: str, *, client: AuthenticatedClient, - filter_: Union[Unset, str] = UNSET, - next_: Union[Unset, int] = UNSET, - limit: Union[Unset, int] = UNSET, -) -> Optional[list["User"]]: + filter_: str | Unset = UNSET, + next_: int | Unset = UNSET, + limit: int | Unset = UNSET, +) -> ApiError | list[User] | None: """ Args: account_id (str): - filter_ (Union[Unset, str]): - next_ (Union[Unset, int]): - limit (Union[Unset, int]): + filter_ (str | Unset): + next_ (int | Unset): + limit (int | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['User'] + ApiError | list[User] """ return sync_detailed( @@ -150,23 +148,23 @@ async def asyncio_detailed( account_id: str, *, client: AuthenticatedClient, - filter_: Union[Unset, str] = UNSET, - next_: Union[Unset, int] = UNSET, - limit: Union[Unset, int] = UNSET, -) -> Response[list["User"]]: + filter_: str | Unset = UNSET, + next_: int | Unset = UNSET, + limit: int | Unset = UNSET, +) -> Response[ApiError | list[User]]: """ Args: account_id (str): - filter_ (Union[Unset, str]): - next_ (Union[Unset, int]): - limit (Union[Unset, int]): + filter_ (str | Unset): + next_ (int | Unset): + limit (int | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[list['User']] + Response[ApiError | list[User]] """ kwargs = _get_kwargs( @@ -185,23 +183,23 @@ async def asyncio( account_id: str, *, client: AuthenticatedClient, - filter_: Union[Unset, str] = UNSET, - next_: Union[Unset, int] = UNSET, - limit: Union[Unset, int] = UNSET, -) -> Optional[list["User"]]: + filter_: str | Unset = UNSET, + next_: int | Unset = UNSET, + limit: int | Unset = UNSET, +) -> ApiError | list[User] | None: """ Args: account_id (str): - filter_ (Union[Unset, str]): - next_ (Union[Unset, int]): - limit (Union[Unset, int]): + filter_ (str | Unset): + next_ (int | Unset): + limit (int | Unset): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - list['User'] + ApiError | list[User] """ return ( diff --git a/exasol/saas/client/openapi/api/users/patch_user.py b/exasol/saas/client/openapi/api/users/patch_user.py index 201fb5e1..afa9baf8 100644 --- a/exasol/saas/client/openapi/api/users/patch_user.py +++ b/exasol/saas/client/openapi/api/users/patch_user.py @@ -1,23 +1,19 @@ from http import HTTPStatus from typing import ( Any, - Optional, - Union, cast, ) +from urllib.parse import quote import httpx -from ... import errors from ...client import ( AuthenticatedClient, Client, ) +from ...models.api_error import ApiError from ...models.patch_user import PatchUser -from ...types import ( - UNSET, - Response, -) +from ...types import Response def _get_kwargs( @@ -30,7 +26,10 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "patch", - "url": f"/api/v1/accounts/{account_id}/users/{user_id}", + "url": "/api/v1/accounts/{account_id}/users/{user_id}".format( + account_id=quote(str(account_id), safe=""), + user_id=quote(str(user_id), safe=""), + ), } _kwargs["json"] = body.to_dict() @@ -42,19 +41,20 @@ def _get_kwargs( def _parse_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Optional[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | ApiError: if response.status_code == 204: - return None - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None + response_204 = cast(Any, None) + return response_204 + + response_default = ApiError.from_dict(response.json()) + + return response_default def _build_response( - *, client: Union[AuthenticatedClient, Client], response: httpx.Response -) -> Response[Any]: + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | ApiError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -69,7 +69,7 @@ def sync_detailed( *, client: AuthenticatedClient, body: PatchUser, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -81,7 +81,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -97,13 +97,42 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + account_id: str, + user_id: str, + *, + client: AuthenticatedClient, + body: PatchUser, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + user_id (str): + body (PatchUser): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return sync_detailed( + account_id=account_id, + user_id=user_id, + client=client, + body=body, + ).parsed + + async def asyncio_detailed( account_id: str, user_id: str, *, client: AuthenticatedClient, body: PatchUser, -) -> Response[Any]: +) -> Response[Any | ApiError]: """ Args: account_id (str): @@ -115,7 +144,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Any] + Response[Any | ApiError] """ kwargs = _get_kwargs( @@ -127,3 +156,34 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + account_id: str, + user_id: str, + *, + client: AuthenticatedClient, + body: PatchUser, +) -> Any | ApiError | None: + """ + Args: + account_id (str): + user_id (str): + body (PatchUser): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ApiError + """ + + return ( + await asyncio_detailed( + account_id=account_id, + user_id=user_id, + client=client, + body=body, + ) + ).parsed diff --git a/exasol/saas/client/openapi/client.py b/exasol/saas/client/openapi/client.py index 605406ad..9ee315bc 100644 --- a/exasol/saas/client/openapi/client.py +++ b/exasol/saas/client/openapi/client.py @@ -1,9 +1,5 @@ import ssl -from typing import ( - Any, - Optional, - Union, -) +from typing import Any import httpx from attrs import ( @@ -46,18 +42,16 @@ class Client: _base_url: str = field(alias="base_url") _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies") _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers") - _timeout: Optional[httpx.Timeout] = field( - default=None, kw_only=True, alias="timeout" - ) - _verify_ssl: Union[str, bool, ssl.SSLContext] = field( + _timeout: httpx.Timeout | None = field(default=None, kw_only=True, alias="timeout") + _verify_ssl: str | bool | ssl.SSLContext = field( default=True, kw_only=True, alias="verify_ssl" ) _follow_redirects: bool = field( default=False, kw_only=True, alias="follow_redirects" ) _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args") - _client: Optional[httpx.Client] = field(default=None, init=False) - _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False) + _client: httpx.Client | None = field(default=None, init=False) + _async_client: httpx.AsyncClient | None = field(default=None, init=False) def with_headers(self, headers: dict[str, str]) -> "Client": """Get a new client matching this one with additional headers""" @@ -76,7 +70,7 @@ def with_cookies(self, cookies: dict[str, str]) -> "Client": return evolve(self, cookies={**self._cookies, **cookies}) def with_timeout(self, timeout: httpx.Timeout) -> "Client": - """Get a new client matching this one with a new timeout (in seconds)""" + """Get a new client matching this one with a new timeout configuration""" if self._client is not None: self._client.timeout = timeout if self._async_client is not None: @@ -115,7 +109,7 @@ def __exit__(self, *args: Any, **kwargs: Any) -> None: self.get_httpx_client().__exit__(*args, **kwargs) def set_async_httpx_client(self, async_client: httpx.AsyncClient) -> "Client": - """Manually the underlying httpx.AsyncClient + """Manually set the underlying httpx.AsyncClient **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. """ @@ -182,18 +176,16 @@ class AuthenticatedClient: _base_url: str = field(alias="base_url") _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies") _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers") - _timeout: Optional[httpx.Timeout] = field( - default=None, kw_only=True, alias="timeout" - ) - _verify_ssl: Union[str, bool, ssl.SSLContext] = field( + _timeout: httpx.Timeout | None = field(default=None, kw_only=True, alias="timeout") + _verify_ssl: str | bool | ssl.SSLContext = field( default=True, kw_only=True, alias="verify_ssl" ) _follow_redirects: bool = field( default=False, kw_only=True, alias="follow_redirects" ) _httpx_args: dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args") - _client: Optional[httpx.Client] = field(default=None, init=False) - _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False) + _client: httpx.Client | None = field(default=None, init=False) + _async_client: httpx.AsyncClient | None = field(default=None, init=False) token: str prefix: str = "Bearer" @@ -216,7 +208,7 @@ def with_cookies(self, cookies: dict[str, str]) -> "AuthenticatedClient": return evolve(self, cookies={**self._cookies, **cookies}) def with_timeout(self, timeout: httpx.Timeout) -> "AuthenticatedClient": - """Get a new client matching this one with a new timeout (in seconds)""" + """Get a new client matching this one with a new timeout configuration""" if self._client is not None: self._client.timeout = timeout if self._async_client is not None: @@ -260,7 +252,7 @@ def __exit__(self, *args: Any, **kwargs: Any) -> None: def set_async_httpx_client( self, async_client: httpx.AsyncClient ) -> "AuthenticatedClient": - """Manually the underlying httpx.AsyncClient + """Manually set the underlying httpx.AsyncClient **NOTE**: This will override any other settings on the client, including cookies, headers, and timeout. """ diff --git a/exasol/saas/client/openapi/models/allowed_ip.py b/exasol/saas/client/openapi/models/allowed_ip.py index 4eda117c..ce24840c 100644 --- a/exasol/saas/client/openapi/models/allowed_ip.py +++ b/exasol/saas/client/openapi/models/allowed_ip.py @@ -1,21 +1,13 @@ +from __future__ import annotations + import datetime -from collections.abc import ( - Generator, - Mapping, -) +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from dateutil.parser import isoparse from ..types import ( @@ -35,8 +27,8 @@ class AllowedIP: cidr_ip (str): created_at (datetime.datetime): created_by (str): - deleted_by (Union[Unset, str]): - deleted_at (Union[Unset, datetime.datetime]): + deleted_by (str | Unset): + deleted_at (datetime.datetime | Unset): """ id: str @@ -44,8 +36,8 @@ class AllowedIP: cidr_ip: str created_at: datetime.datetime created_by: str - deleted_by: Union[Unset, str] = UNSET - deleted_at: Union[Unset, datetime.datetime] = UNSET + deleted_by: str | Unset = UNSET + deleted_at: datetime.datetime | Unset = UNSET def to_dict(self) -> dict[str, Any]: id = self.id @@ -60,7 +52,7 @@ def to_dict(self) -> dict[str, Any]: deleted_by = self.deleted_by - deleted_at: Union[Unset, str] = UNSET + deleted_at: str | Unset = UNSET if not isinstance(self.deleted_at, Unset): deleted_at = self.deleted_at.isoformat() @@ -98,7 +90,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: deleted_by = d.pop("deletedBy", UNSET) _deleted_at = d.pop("deletedAt", UNSET) - deleted_at: Union[Unset, datetime.datetime] + deleted_at: datetime.datetime | Unset if isinstance(_deleted_at, Unset): deleted_at = UNSET else: diff --git a/exasol/saas/client/openapi/models/api_error.py b/exasol/saas/client/openapi/models/api_error.py index a12c415e..9159e046 100644 --- a/exasol/saas/client/openapi/models/api_error.py +++ b/exasol/saas/client/openapi/models/api_error.py @@ -1,19 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -35,7 +28,7 @@ class ApiError: log_id (str): handler (str): timestamp (str): - causes (Union[Unset, Any]): + causes (Any | Unset): """ status: float @@ -46,7 +39,7 @@ class ApiError: log_id: str handler: str timestamp: str - causes: Union[Unset, Any] = UNSET + causes: Any | Unset = UNSET def to_dict(self) -> dict[str, Any]: status = self.status diff --git a/exasol/saas/client/openapi/models/auto_stop.py b/exasol/saas/client/openapi/models/auto_stop.py index 39ed90cb..8f3b0f86 100644 --- a/exasol/saas/client/openapi/models/auto_stop.py +++ b/exasol/saas/client/openapi/models/auto_stop.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="AutoStop") diff --git a/exasol/saas/client/openapi/models/cluster.py b/exasol/saas/client/openapi/models/cluster.py index 44af876a..f76e56ef 100644 --- a/exasol/saas/client/openapi/models/cluster.py +++ b/exasol/saas/client/openapi/models/cluster.py @@ -1,21 +1,14 @@ +from __future__ import annotations + import datetime -from collections.abc import ( - Generator, - Mapping, -) +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from dateutil.parser import isoparse from ..models.status import Status @@ -44,9 +37,9 @@ class Cluster: created_by (str): main_cluster (bool): settings (ClusterSettings): - deleted_at (Union[Unset, datetime.datetime]): - deleted_by (Union[Unset, str]): - auto_stop (Union[Unset, AutoStop]): + deleted_at (datetime.datetime | Unset): + deleted_by (str | Unset): + auto_stop (AutoStop | Unset): """ status: Status @@ -56,15 +49,12 @@ class Cluster: created_at: datetime.datetime created_by: str main_cluster: bool - settings: "ClusterSettings" - deleted_at: Union[Unset, datetime.datetime] = UNSET - deleted_by: Union[Unset, str] = UNSET - auto_stop: Union[Unset, "AutoStop"] = UNSET + settings: ClusterSettings + deleted_at: datetime.datetime | Unset = UNSET + deleted_by: str | Unset = UNSET + auto_stop: AutoStop | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.auto_stop import AutoStop - from ..models.cluster_settings import ClusterSettings - status = self.status.value id = self.id @@ -81,13 +71,13 @@ def to_dict(self) -> dict[str, Any]: settings = self.settings.to_dict() - deleted_at: Union[Unset, str] = UNSET + deleted_at: str | Unset = UNSET if not isinstance(self.deleted_at, Unset): deleted_at = self.deleted_at.isoformat() deleted_by = self.deleted_by - auto_stop: Union[Unset, dict[str, Any]] = UNSET + auto_stop: dict[str, Any] | Unset = UNSET if not isinstance(self.auto_stop, Unset): auto_stop = self.auto_stop.to_dict() @@ -137,7 +127,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: settings = ClusterSettings.from_dict(d.pop("settings")) _deleted_at = d.pop("deletedAt", UNSET) - deleted_at: Union[Unset, datetime.datetime] + deleted_at: datetime.datetime | Unset if isinstance(_deleted_at, Unset): deleted_at = UNSET else: @@ -146,7 +136,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: deleted_by = d.pop("deletedBy", UNSET) _auto_stop = d.pop("autoStop", UNSET) - auto_stop: Union[Unset, AutoStop] + auto_stop: AutoStop | Unset if isinstance(_auto_stop, Unset): auto_stop = UNSET else: diff --git a/exasol/saas/client/openapi/models/cluster_action_scale.py b/exasol/saas/client/openapi/models/cluster_action_scale.py index 240ecd6d..d6d03fd2 100644 --- a/exasol/saas/client/openapi/models/cluster_action_scale.py +++ b/exasol/saas/client/openapi/models/cluster_action_scale.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ClusterActionScale") diff --git a/exasol/saas/client/openapi/models/cluster_action_start_stop.py b/exasol/saas/client/openapi/models/cluster_action_start_stop.py index 5c0391e1..a294ad29 100644 --- a/exasol/saas/client/openapi/models/cluster_action_start_stop.py +++ b/exasol/saas/client/openapi/models/cluster_action_start_stop.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ClusterActionStartStop") diff --git a/exasol/saas/client/openapi/models/cluster_connection.py b/exasol/saas/client/openapi/models/cluster_connection.py index 8434e7c5..8faea8a7 100644 --- a/exasol/saas/client/openapi/models/cluster_connection.py +++ b/exasol/saas/client/openapi/models/cluster_connection.py @@ -1,24 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) if TYPE_CHECKING: from ..models.connection_i_ps import ConnectionIPs @@ -41,12 +30,10 @@ class ClusterConnection: dns: str port: int jdbc: str - ips: "ConnectionIPs" + ips: ConnectionIPs db_username: str def to_dict(self) -> dict[str, Any]: - from ..models.connection_i_ps import ConnectionIPs - dns = self.dns port = self.port diff --git a/exasol/saas/client/openapi/models/cluster_settings.py b/exasol/saas/client/openapi/models/cluster_settings.py index 441becea..ab08ee79 100644 --- a/exasol/saas/client/openapi/models/cluster_settings.py +++ b/exasol/saas/client/openapi/models/cluster_settings.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ClusterSettings") diff --git a/exasol/saas/client/openapi/models/cluster_settings_update.py b/exasol/saas/client/openapi/models/cluster_settings_update.py index d2d3ff2a..aaff4994 100644 --- a/exasol/saas/client/openapi/models/cluster_settings_update.py +++ b/exasol/saas/client/openapi/models/cluster_settings_update.py @@ -1,19 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -27,12 +20,12 @@ class ClusterSettingsUpdate: """ Attributes: - offload_enabled (Union[Unset, bool]): - offload_timeout_min (Union[Unset, int]): + offload_enabled (bool | Unset): + offload_timeout_min (int | Unset): """ - offload_enabled: Union[Unset, bool] = UNSET - offload_timeout_min: Union[Unset, int] = UNSET + offload_enabled: bool | Unset = UNSET + offload_timeout_min: int | Unset = UNSET def to_dict(self) -> dict[str, Any]: offload_enabled = self.offload_enabled diff --git a/exasol/saas/client/openapi/models/cluster_size_1.py b/exasol/saas/client/openapi/models/cluster_size_1.py index 8a339e2e..65023f06 100644 --- a/exasol/saas/client/openapi/models/cluster_size_1.py +++ b/exasol/saas/client/openapi/models/cluster_size_1.py @@ -1,19 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -33,7 +26,7 @@ class ClusterSize1: ram (float): is_default (bool): name (str): - family (Union[Unset, str]): + family (str | Unset): """ size: str @@ -42,7 +35,7 @@ class ClusterSize1: ram: float is_default: bool name: str - family: Union[Unset, str] = UNSET + family: str | Unset = UNSET def to_dict(self) -> dict[str, Any]: size = self.size diff --git a/exasol/saas/client/openapi/models/connection_i_ps.py b/exasol/saas/client/openapi/models/connection_i_ps.py index 3128507d..d3816b1b 100644 --- a/exasol/saas/client/openapi/models/connection_i_ps.py +++ b/exasol/saas/client/openapi/models/connection_i_ps.py @@ -1,24 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ConnectionIPs") diff --git a/exasol/saas/client/openapi/models/create_allowed_ip.py b/exasol/saas/client/openapi/models/create_allowed_ip.py index 7e6243d5..74bf2b0e 100644 --- a/exasol/saas/client/openapi/models/create_allowed_ip.py +++ b/exasol/saas/client/openapi/models/create_allowed_ip.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="CreateAllowedIP") diff --git a/exasol/saas/client/openapi/models/create_cluster.py b/exasol/saas/client/openapi/models/create_cluster.py index bf7b9ab9..70b7b7f3 100644 --- a/exasol/saas/client/openapi/models/create_cluster.py +++ b/exasol/saas/client/openapi/models/create_cluster.py @@ -1,20 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -35,32 +28,29 @@ class CreateCluster: Attributes: name (str): size (str): - family (Union[Unset, str]): - auto_stop (Union[Unset, AutoStop]): - settings (Union[Unset, ClusterSettingsUpdate]): + family (str | Unset): + auto_stop (AutoStop | Unset): + settings (ClusterSettingsUpdate | Unset): """ name: str size: str - family: Union[Unset, str] = UNSET - auto_stop: Union[Unset, "AutoStop"] = UNSET - settings: Union[Unset, "ClusterSettingsUpdate"] = UNSET + family: str | Unset = UNSET + auto_stop: AutoStop | Unset = UNSET + settings: ClusterSettingsUpdate | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.auto_stop import AutoStop - from ..models.cluster_settings_update import ClusterSettingsUpdate - name = self.name size = self.size family = self.family - auto_stop: Union[Unset, dict[str, Any]] = UNSET + auto_stop: dict[str, Any] | Unset = UNSET if not isinstance(self.auto_stop, Unset): auto_stop = self.auto_stop.to_dict() - settings: Union[Unset, dict[str, Any]] = UNSET + settings: dict[str, Any] | Unset = UNSET if not isinstance(self.settings, Unset): settings = self.settings.to_dict() @@ -94,14 +84,14 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: family = d.pop("family", UNSET) _auto_stop = d.pop("autoStop", UNSET) - auto_stop: Union[Unset, AutoStop] + auto_stop: AutoStop | Unset if isinstance(_auto_stop, Unset): auto_stop = UNSET else: auto_stop = AutoStop.from_dict(_auto_stop) _settings = d.pop("settings", UNSET) - settings: Union[Unset, ClusterSettingsUpdate] + settings: ClusterSettingsUpdate | Unset if isinstance(_settings, Unset): settings = UNSET else: diff --git a/exasol/saas/client/openapi/models/create_database.py b/exasol/saas/client/openapi/models/create_database.py index 755a754e..1986cd3e 100644 --- a/exasol/saas/client/openapi/models/create_database.py +++ b/exasol/saas/client/openapi/models/create_database.py @@ -1,16 +1,10 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define @@ -36,23 +30,19 @@ class CreateDatabase: initial_cluster (CreateDatabaseInitialCluster): provider (str): region (str): - num_nodes (Union[Unset, int]): - stream_type (Union[Unset, str]): + num_nodes (int | Unset): + stream_type (str | Unset): """ name: str - initial_cluster: "CreateDatabaseInitialCluster" + initial_cluster: CreateDatabaseInitialCluster provider: str region: str - num_nodes: Union[Unset, int] = UNSET - stream_type: Union[Unset, str] = UNSET + num_nodes: int | Unset = UNSET + stream_type: str | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: - from ..models.create_database_initial_cluster import ( - CreateDatabaseInitialCluster, - ) - name = self.name initial_cluster = self.initial_cluster.to_dict() diff --git a/exasol/saas/client/openapi/models/create_database_initial_cluster.py b/exasol/saas/client/openapi/models/create_database_initial_cluster.py index 4405a68c..adb4102b 100644 --- a/exasol/saas/client/openapi/models/create_database_initial_cluster.py +++ b/exasol/saas/client/openapi/models/create_database_initial_cluster.py @@ -1,20 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -35,32 +28,29 @@ class CreateDatabaseInitialCluster: Attributes: name (str): size (str): - family (Union[Unset, str]): - auto_stop (Union[Unset, AutoStop]): - settings (Union[Unset, ClusterSettingsUpdate]): + family (str | Unset): + auto_stop (AutoStop | Unset): + settings (ClusterSettingsUpdate | Unset): """ name: str size: str - family: Union[Unset, str] = UNSET - auto_stop: Union[Unset, "AutoStop"] = UNSET - settings: Union[Unset, "ClusterSettingsUpdate"] = UNSET + family: str | Unset = UNSET + auto_stop: AutoStop | Unset = UNSET + settings: ClusterSettingsUpdate | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.auto_stop import AutoStop - from ..models.cluster_settings_update import ClusterSettingsUpdate - name = self.name size = self.size family = self.family - auto_stop: Union[Unset, dict[str, Any]] = UNSET + auto_stop: dict[str, Any] | Unset = UNSET if not isinstance(self.auto_stop, Unset): auto_stop = self.auto_stop.to_dict() - settings: Union[Unset, dict[str, Any]] = UNSET + settings: dict[str, Any] | Unset = UNSET if not isinstance(self.settings, Unset): settings = self.settings.to_dict() @@ -94,14 +84,14 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: family = d.pop("family", UNSET) _auto_stop = d.pop("autoStop", UNSET) - auto_stop: Union[Unset, AutoStop] + auto_stop: AutoStop | Unset if isinstance(_auto_stop, Unset): auto_stop = UNSET else: auto_stop = AutoStop.from_dict(_auto_stop) _settings = d.pop("settings", UNSET) - settings: Union[Unset, ClusterSettingsUpdate] + settings: ClusterSettingsUpdate | Unset if isinstance(_settings, Unset): settings = UNSET else: diff --git a/exasol/saas/client/openapi/models/create_extension_instance.py b/exasol/saas/client/openapi/models/create_extension_instance.py index d23dd334..2f14e67c 100644 --- a/exasol/saas/client/openapi/models/create_extension_instance.py +++ b/exasol/saas/client/openapi/models/create_extension_instance.py @@ -1,24 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) if TYPE_CHECKING: from ..models.extension_parameter_value import ExtensionParameterValue @@ -31,14 +20,12 @@ class CreateExtensionInstance: """ Attributes: - parameter_values (list['ExtensionParameterValue']): + parameter_values (list[ExtensionParameterValue]): """ - parameter_values: list["ExtensionParameterValue"] + parameter_values: list[ExtensionParameterValue] def to_dict(self) -> dict[str, Any]: - from ..models.extension_parameter_value import ExtensionParameterValue - parameter_values = [] for parameter_values_item_data in self.parameter_values: parameter_values_item = parameter_values_item_data.to_dict() diff --git a/exasol/saas/client/openapi/models/database_settings.py b/exasol/saas/client/openapi/models/database_settings.py index 15f7e866..e3800745 100644 --- a/exasol/saas/client/openapi/models/database_settings.py +++ b/exasol/saas/client/openapi/models/database_settings.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="DatabaseSettings") diff --git a/exasol/saas/client/openapi/models/database_upgrade_info.py b/exasol/saas/client/openapi/models/database_upgrade_info.py index e9cb29d0..2d5908b7 100644 --- a/exasol/saas/client/openapi/models/database_upgrade_info.py +++ b/exasol/saas/client/openapi/models/database_upgrade_info.py @@ -1,24 +1,14 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define from attrs import field as _attrs_field -from ..types import ( - UNSET, - Unset, -) - T = TypeVar("T", bound="DatabaseUpgradeInfo") diff --git a/exasol/saas/client/openapi/models/dlhc_activate_status.py b/exasol/saas/client/openapi/models/dlhc_activate_status.py index e8ad86d5..4c8a210a 100644 --- a/exasol/saas/client/openapi/models/dlhc_activate_status.py +++ b/exasol/saas/client/openapi/models/dlhc_activate_status.py @@ -1,24 +1,14 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define from attrs import field as _attrs_field -from ..types import ( - UNSET, - Unset, -) - T = TypeVar("T", bound="DlhcActivateStatus") diff --git a/exasol/saas/client/openapi/models/download_file.py b/exasol/saas/client/openapi/models/download_file.py index 5dd5beaa..bd8e5922 100644 --- a/exasol/saas/client/openapi/models/download_file.py +++ b/exasol/saas/client/openapi/models/download_file.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="DownloadFile") diff --git a/exasol/saas/client/openapi/models/exasol_database.py b/exasol/saas/client/openapi/models/exasol_database.py index 53cdb648..cfbe2e6b 100644 --- a/exasol/saas/client/openapi/models/exasol_database.py +++ b/exasol/saas/client/openapi/models/exasol_database.py @@ -1,17 +1,11 @@ +from __future__ import annotations + import datetime -from collections.abc import ( - Generator, - Mapping, -) +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define @@ -46,30 +40,25 @@ class ExasolDatabase: region (str): created_at (datetime.datetime): created_by (str): - integrations (Union[Unset, list['ExasolDatabaseIntegrationsItem']]): - deleted_by (Union[Unset, str]): - deleted_at (Union[Unset, datetime.datetime]): + integrations (list[ExasolDatabaseIntegrationsItem] | Unset): + deleted_by (str | Unset): + deleted_at (datetime.datetime | Unset): """ status: Status id: str name: str - clusters: "ExasolDatabaseClusters" + clusters: ExasolDatabaseClusters provider: str region: str created_at: datetime.datetime created_by: str - integrations: Union[Unset, list["ExasolDatabaseIntegrationsItem"]] = UNSET - deleted_by: Union[Unset, str] = UNSET - deleted_at: Union[Unset, datetime.datetime] = UNSET + integrations: list[ExasolDatabaseIntegrationsItem] | Unset = UNSET + deleted_by: str | Unset = UNSET + deleted_at: datetime.datetime | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: - from ..models.exasol_database_clusters import ExasolDatabaseClusters - from ..models.exasol_database_integrations_item import ( - ExasolDatabaseIntegrationsItem, - ) - status = self.status.value id = self.id @@ -86,7 +75,7 @@ def to_dict(self) -> dict[str, Any]: created_by = self.created_by - integrations: Union[Unset, list[dict[str, Any]]] = UNSET + integrations: list[dict[str, Any]] | Unset = UNSET if not isinstance(self.integrations, Unset): integrations = [] for integrations_item_data in self.integrations: @@ -95,7 +84,7 @@ def to_dict(self) -> dict[str, Any]: deleted_by = self.deleted_by - deleted_at: Union[Unset, str] = UNSET + deleted_at: str | Unset = UNSET if not isinstance(self.deleted_at, Unset): deleted_at = self.deleted_at.isoformat() @@ -146,19 +135,21 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: created_by = d.pop("createdBy") - integrations = [] _integrations = d.pop("integrations", UNSET) - for integrations_item_data in _integrations or []: - integrations_item = ExasolDatabaseIntegrationsItem.from_dict( - integrations_item_data - ) + integrations: list[ExasolDatabaseIntegrationsItem] | Unset = UNSET + if _integrations is not UNSET: + integrations = [] + for integrations_item_data in _integrations: + integrations_item = ExasolDatabaseIntegrationsItem.from_dict( + integrations_item_data + ) - integrations.append(integrations_item) + integrations.append(integrations_item) deleted_by = d.pop("deletedBy", UNSET) _deleted_at = d.pop("deletedAt", UNSET) - deleted_at: Union[Unset, datetime.datetime] + deleted_at: datetime.datetime | Unset if isinstance(_deleted_at, Unset): deleted_at = UNSET else: diff --git a/exasol/saas/client/openapi/models/exasol_database_clusters.py b/exasol/saas/client/openapi/models/exasol_database_clusters.py index 6e2d09e1..387607c2 100644 --- a/exasol/saas/client/openapi/models/exasol_database_clusters.py +++ b/exasol/saas/client/openapi/models/exasol_database_clusters.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ExasolDatabaseClusters") diff --git a/exasol/saas/client/openapi/models/exasol_database_integrations_item.py b/exasol/saas/client/openapi/models/exasol_database_integrations_item.py index a1ba1933..41bddfd9 100644 --- a/exasol/saas/client/openapi/models/exasol_database_integrations_item.py +++ b/exasol/saas/client/openapi/models/exasol_database_integrations_item.py @@ -1,15 +1,9 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, ) from attrs import define as _attrs_define @@ -29,12 +23,12 @@ class ExasolDatabaseIntegrationsItem: Attributes: id (str): name (str): - url (Union[Unset, str]): + url (str | Unset): """ id: str name: str - url: Union[Unset, str] = UNSET + url: str | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: diff --git a/exasol/saas/client/openapi/models/extension.py b/exasol/saas/client/openapi/models/extension.py index 1e0d7426..ab47e546 100644 --- a/exasol/saas/client/openapi/models/extension.py +++ b/exasol/saas/client/openapi/models/extension.py @@ -1,24 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) if TYPE_CHECKING: from ..models.extension_version import ExtensionVersion @@ -35,18 +24,16 @@ class Extension: name (str): description (str): category_id (str): - installable_versions (list['ExtensionVersion']): + installable_versions (list[ExtensionVersion]): """ id: str name: str description: str category_id: str - installable_versions: list["ExtensionVersion"] + installable_versions: list[ExtensionVersion] def to_dict(self) -> dict[str, Any]: - from ..models.extension_version import ExtensionVersion - id = self.id name = self.name diff --git a/exasol/saas/client/openapi/models/extension_detail.py b/exasol/saas/client/openapi/models/extension_detail.py index ba22653a..ecce152f 100644 --- a/exasol/saas/client/openapi/models/extension_detail.py +++ b/exasol/saas/client/openapi/models/extension_detail.py @@ -1,24 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) if TYPE_CHECKING: from ..models.extension_parameter_definitions import ExtensionParameterDefinitions @@ -33,18 +22,14 @@ class ExtensionDetail: Attributes: id (str): version (str): - parameter_definitions (list['ExtensionParameterDefinitions']): + parameter_definitions (list[ExtensionParameterDefinitions]): """ id: str version: str - parameter_definitions: list["ExtensionParameterDefinitions"] + parameter_definitions: list[ExtensionParameterDefinitions] def to_dict(self) -> dict[str, Any]: - from ..models.extension_parameter_definitions import ( - ExtensionParameterDefinitions, - ) - id = self.id version = self.version diff --git a/exasol/saas/client/openapi/models/extension_instance.py b/exasol/saas/client/openapi/models/extension_instance.py index 6c0ca6da..5214bfd7 100644 --- a/exasol/saas/client/openapi/models/extension_instance.py +++ b/exasol/saas/client/openapi/models/extension_instance.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ExtensionInstance") diff --git a/exasol/saas/client/openapi/models/extension_parameter_definitions.py b/exasol/saas/client/openapi/models/extension_parameter_definitions.py index 46a34ee1..54acbd79 100644 --- a/exasol/saas/client/openapi/models/extension_parameter_definitions.py +++ b/exasol/saas/client/openapi/models/extension_parameter_definitions.py @@ -1,19 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -29,12 +22,12 @@ class ExtensionParameterDefinitions: Attributes: id (str): name (str): - raw_definition (Union[Unset, Any]): + raw_definition (Any | Unset): """ id: str name: str - raw_definition: Union[Unset, Any] = UNSET + raw_definition: Any | Unset = UNSET def to_dict(self) -> dict[str, Any]: id = self.id diff --git a/exasol/saas/client/openapi/models/extension_parameter_value.py b/exasol/saas/client/openapi/models/extension_parameter_value.py index 459dcdc6..673b9935 100644 --- a/exasol/saas/client/openapi/models/extension_parameter_value.py +++ b/exasol/saas/client/openapi/models/extension_parameter_value.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ExtensionParameterValue") diff --git a/exasol/saas/client/openapi/models/extension_version.py b/exasol/saas/client/openapi/models/extension_version.py index 35c9669a..4a03a551 100644 --- a/exasol/saas/client/openapi/models/extension_version.py +++ b/exasol/saas/client/openapi/models/extension_version.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="ExtensionVersion") diff --git a/exasol/saas/client/openapi/models/file.py b/exasol/saas/client/openapi/models/file.py index 570ab177..74d4e00a 100644 --- a/exasol/saas/client/openapi/models/file.py +++ b/exasol/saas/client/openapi/models/file.py @@ -1,21 +1,13 @@ +from __future__ import annotations + import datetime -from collections.abc import ( - Generator, - Mapping, -) +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from dateutil.parser import isoparse from ..types import ( @@ -34,16 +26,16 @@ class File: type_ (str): path (str): last_modified (datetime.datetime): - size (Union[Unset, int]): - children (Union[Unset, list['File']]): + size (int | Unset): + children (list[File] | Unset): """ name: str type_: str path: str last_modified: datetime.datetime - size: Union[Unset, int] = UNSET - children: Union[Unset, list["File"]] = UNSET + size: int | Unset = UNSET + children: list[File] | Unset = UNSET def to_dict(self) -> dict[str, Any]: name = self.name @@ -56,7 +48,7 @@ def to_dict(self) -> dict[str, Any]: size = self.size - children: Union[Unset, list[dict[str, Any]]] = UNSET + children: list[dict[str, Any]] | Unset = UNSET if not isinstance(self.children, Unset): children = [] for children_item_data in self.children: @@ -93,12 +85,14 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: size = d.pop("size", UNSET) - children = [] _children = d.pop("children", UNSET) - for children_item_data in _children or []: - children_item = File.from_dict(children_item_data) + children: list[File] | Unset = UNSET + if _children is not UNSET: + children = [] + for children_item_data in _children: + children_item = File.from_dict(children_item_data) - children.append(children_item) + children.append(children_item) file = cls( name=name, diff --git a/exasol/saas/client/openapi/models/patch_user.py b/exasol/saas/client/openapi/models/patch_user.py index 718463ae..ee2088ba 100644 --- a/exasol/saas/client/openapi/models/patch_user.py +++ b/exasol/saas/client/openapi/models/patch_user.py @@ -1,20 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -32,21 +25,19 @@ class PatchUser: """ Attributes: - role_id (Union[Unset, str]): - databases (Union[Unset, PatchUserDatabases]): - db_username (Union[Unset, str]): + role_id (str | Unset): + databases (PatchUserDatabases | Unset): + db_username (str | Unset): """ - role_id: Union[Unset, str] = UNSET - databases: Union[Unset, "PatchUserDatabases"] = UNSET - db_username: Union[Unset, str] = UNSET + role_id: str | Unset = UNSET + databases: PatchUserDatabases | Unset = UNSET + db_username: str | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.patch_user_databases import PatchUserDatabases - role_id = self.role_id - databases: Union[Unset, dict[str, Any]] = UNSET + databases: dict[str, Any] | Unset = UNSET if not isinstance(self.databases, Unset): databases = self.databases.to_dict() @@ -72,7 +63,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: role_id = d.pop("roleID", UNSET) _databases = d.pop("databases", UNSET) - databases: Union[Unset, PatchUserDatabases] + databases: PatchUserDatabases | Unset if isinstance(_databases, Unset): databases = UNSET else: diff --git a/exasol/saas/client/openapi/models/patch_user_databases.py b/exasol/saas/client/openapi/models/patch_user_databases.py index ca1e5f4b..da82263b 100644 --- a/exasol/saas/client/openapi/models/patch_user_databases.py +++ b/exasol/saas/client/openapi/models/patch_user_databases.py @@ -1,24 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="PatchUserDatabases") diff --git a/exasol/saas/client/openapi/models/platform.py b/exasol/saas/client/openapi/models/platform.py index 872d85d1..71b93a94 100644 --- a/exasol/saas/client/openapi/models/platform.py +++ b/exasol/saas/client/openapi/models/platform.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="Platform") diff --git a/exasol/saas/client/openapi/models/region.py b/exasol/saas/client/openapi/models/region.py index 72258642..5ac2d887 100644 --- a/exasol/saas/client/openapi/models/region.py +++ b/exasol/saas/client/openapi/models/region.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="Region") diff --git a/exasol/saas/client/openapi/models/scale_cluster.py b/exasol/saas/client/openapi/models/scale_cluster.py index 85ee8265..3b48e914 100644 --- a/exasol/saas/client/openapi/models/scale_cluster.py +++ b/exasol/saas/client/openapi/models/scale_cluster.py @@ -1,19 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -28,11 +21,11 @@ class ScaleCluster: """ Attributes: size (str): - family (Union[Unset, str]): + family (str | Unset): """ size: str - family: Union[Unset, str] = UNSET + family: str | Unset = UNSET def to_dict(self) -> dict[str, Any]: size = self.size diff --git a/exasol/saas/client/openapi/models/schedule.py b/exasol/saas/client/openapi/models/schedule.py index 0da2d6ff..189ce3cc 100644 --- a/exasol/saas/client/openapi/models/schedule.py +++ b/exasol/saas/client/openapi/models/schedule.py @@ -1,20 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..models.schedule_action_type_0 import ScheduleActionType0 from ..models.schedule_state import ScheduleState @@ -37,28 +30,27 @@ class Schedule: Attributes: action (ScheduleActionType0): cron_rule (str): cron rule in format: - id (Union[Unset, str]): - createdby_id (Union[Unset, str]): - createdby_first_name (Union[Unset, str]): - createdby_last_name (Union[Unset, str]): - cluster_name (Union[Unset, str]): - payload (Union['ClusterActionScale', 'ClusterActionStartStop', Unset]): - state (Union[Unset, ScheduleState]): + id (str | Unset): + createdby_id (str | Unset): + createdby_first_name (str | Unset): + createdby_last_name (str | Unset): + cluster_name (str | Unset): + payload (ClusterActionScale | ClusterActionStartStop | Unset): + state (ScheduleState | Unset): """ action: ScheduleActionType0 cron_rule: str - id: Union[Unset, str] = UNSET - createdby_id: Union[Unset, str] = UNSET - createdby_first_name: Union[Unset, str] = UNSET - createdby_last_name: Union[Unset, str] = UNSET - cluster_name: Union[Unset, str] = UNSET - payload: Union["ClusterActionScale", "ClusterActionStartStop", Unset] = UNSET - state: Union[Unset, ScheduleState] = UNSET + id: str | Unset = UNSET + createdby_id: str | Unset = UNSET + createdby_first_name: str | Unset = UNSET + createdby_last_name: str | Unset = UNSET + cluster_name: str | Unset = UNSET + payload: ClusterActionScale | ClusterActionStartStop | Unset = UNSET + state: ScheduleState | Unset = UNSET def to_dict(self) -> dict[str, Any]: from ..models.cluster_action_scale import ClusterActionScale - from ..models.cluster_action_start_stop import ClusterActionStartStop action: str if isinstance(self.action, ScheduleActionType0): @@ -76,7 +68,7 @@ def to_dict(self) -> dict[str, Any]: cluster_name = self.cluster_name - payload: Union[Unset, dict[str, Any]] + payload: dict[str, Any] | Unset if isinstance(self.payload, Unset): payload = UNSET elif isinstance(self.payload, ClusterActionScale): @@ -84,7 +76,7 @@ def to_dict(self) -> dict[str, Any]: else: payload = self.payload.to_dict() - state: Union[Unset, str] = UNSET + state: str | Unset = UNSET if not isinstance(self.state, Unset): state = self.state.value @@ -143,7 +135,7 @@ def _parse_action(data: object) -> ScheduleActionType0: def _parse_payload( data: object, - ) -> Union["ClusterActionScale", "ClusterActionStartStop", Unset]: + ) -> ClusterActionScale | ClusterActionStartStop | Unset: if isinstance(data, Unset): return data try: @@ -152,7 +144,7 @@ def _parse_payload( payload_type_0 = ClusterActionScale.from_dict(data) return payload_type_0 - except: # noqa: E722 + except (TypeError, ValueError, AttributeError, KeyError): pass if not isinstance(data, dict): raise TypeError() @@ -163,7 +155,7 @@ def _parse_payload( payload = _parse_payload(d.pop("payload", UNSET)) _state = d.pop("state", UNSET) - state: Union[Unset, ScheduleState] + state: ScheduleState | Unset if isinstance(_state, Unset): state = UNSET else: diff --git a/exasol/saas/client/openapi/models/set_auto_updates_database.py b/exasol/saas/client/openapi/models/set_auto_updates_database.py index 1000a6c9..87946a5c 100644 --- a/exasol/saas/client/openapi/models/set_auto_updates_database.py +++ b/exasol/saas/client/openapi/models/set_auto_updates_database.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="SetAutoUpdatesDatabase") diff --git a/exasol/saas/client/openapi/models/update_allowed_ip.py b/exasol/saas/client/openapi/models/update_allowed_ip.py index 27d05c16..3344fd75 100644 --- a/exasol/saas/client/openapi/models/update_allowed_ip.py +++ b/exasol/saas/client/openapi/models/update_allowed_ip.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="UpdateAllowedIP") diff --git a/exasol/saas/client/openapi/models/update_cluster.py b/exasol/saas/client/openapi/models/update_cluster.py index b8e99a88..9fa9aef7 100644 --- a/exasol/saas/client/openapi/models/update_cluster.py +++ b/exasol/saas/client/openapi/models/update_cluster.py @@ -1,20 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -33,26 +26,23 @@ class UpdateCluster: """ Attributes: - name (Union[Unset, str]): - auto_stop (Union[Unset, AutoStop]): - settings (Union[Unset, ClusterSettingsUpdate]): + name (str | Unset): + auto_stop (AutoStop | Unset): + settings (ClusterSettingsUpdate | Unset): """ - name: Union[Unset, str] = UNSET - auto_stop: Union[Unset, "AutoStop"] = UNSET - settings: Union[Unset, "ClusterSettingsUpdate"] = UNSET + name: str | Unset = UNSET + auto_stop: AutoStop | Unset = UNSET + settings: ClusterSettingsUpdate | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.auto_stop import AutoStop - from ..models.cluster_settings_update import ClusterSettingsUpdate - name = self.name - auto_stop: Union[Unset, dict[str, Any]] = UNSET + auto_stop: dict[str, Any] | Unset = UNSET if not isinstance(self.auto_stop, Unset): auto_stop = self.auto_stop.to_dict() - settings: Union[Unset, dict[str, Any]] = UNSET + settings: dict[str, Any] | Unset = UNSET if not isinstance(self.settings, Unset): settings = self.settings.to_dict() @@ -77,14 +67,14 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: name = d.pop("name", UNSET) _auto_stop = d.pop("autoStop", UNSET) - auto_stop: Union[Unset, AutoStop] + auto_stop: AutoStop | Unset if isinstance(_auto_stop, Unset): auto_stop = UNSET else: auto_stop = AutoStop.from_dict(_auto_stop) _settings = d.pop("settings", UNSET) - settings: Union[Unset, ClusterSettingsUpdate] + settings: ClusterSettingsUpdate | Unset if isinstance(_settings, Unset): settings = UNSET else: diff --git a/exasol/saas/client/openapi/models/update_database.py b/exasol/saas/client/openapi/models/update_database.py index 033a248f..4b814993 100644 --- a/exasol/saas/client/openapi/models/update_database.py +++ b/exasol/saas/client/openapi/models/update_database.py @@ -1,24 +1,14 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define from attrs import field as _attrs_field -from ..types import ( - UNSET, - Unset, -) - T = TypeVar("T", bound="UpdateDatabase") diff --git a/exasol/saas/client/openapi/models/update_profile.py b/exasol/saas/client/openapi/models/update_profile.py index d1c10272..c5589a1e 100644 --- a/exasol/saas/client/openapi/models/update_profile.py +++ b/exasol/saas/client/openapi/models/update_profile.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="UpdateProfile") diff --git a/exasol/saas/client/openapi/models/update_schedule_cron_rule.py b/exasol/saas/client/openapi/models/update_schedule_cron_rule.py index 4cef1ebf..39c359fc 100644 --- a/exasol/saas/client/openapi/models/update_schedule_cron_rule.py +++ b/exasol/saas/client/openapi/models/update_schedule_cron_rule.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="UpdateScheduleCronRule") diff --git a/exasol/saas/client/openapi/models/update_schedule_state.py b/exasol/saas/client/openapi/models/update_schedule_state.py index 3da1b1cb..a17272fa 100644 --- a/exasol/saas/client/openapi/models/update_schedule_state.py +++ b/exasol/saas/client/openapi/models/update_schedule_state.py @@ -1,24 +1,14 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..models.schedule_state import ScheduleState -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="UpdateScheduleState") diff --git a/exasol/saas/client/openapi/models/upload_file.py b/exasol/saas/client/openapi/models/upload_file.py index 292e67ec..f051bc5f 100644 --- a/exasol/saas/client/openapi/models/upload_file.py +++ b/exasol/saas/client/openapi/models/upload_file.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="UploadFile") diff --git a/exasol/saas/client/openapi/models/usage.py b/exasol/saas/client/openapi/models/usage.py index d6b7952b..b277aba9 100644 --- a/exasol/saas/client/openapi/models/usage.py +++ b/exasol/saas/client/openapi/models/usage.py @@ -1,25 +1,15 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - cast, ) from attrs import define as _attrs_define from attrs import field as _attrs_field -from ..types import ( - UNSET, - Unset, -) - if TYPE_CHECKING: from ..models.usage_additional_property_item import UsageAdditionalPropertyItem @@ -31,12 +21,11 @@ class Usage: """ """ - additional_properties: dict[str, list["UsageAdditionalPropertyItem"]] = ( - _attrs_field(init=False, factory=dict) + additional_properties: dict[str, list[UsageAdditionalPropertyItem]] = _attrs_field( + init=False, factory=dict ) def to_dict(self) -> dict[str, Any]: - from ..models.usage_additional_property_item import UsageAdditionalPropertyItem field_dict: dict[str, Any] = {} for prop_name, prop in self.additional_properties.items(): @@ -74,10 +63,10 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: def additional_keys(self) -> list[str]: return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> list["UsageAdditionalPropertyItem"]: + def __getitem__(self, key: str) -> list[UsageAdditionalPropertyItem]: return self.additional_properties[key] - def __setitem__(self, key: str, value: list["UsageAdditionalPropertyItem"]) -> None: + def __setitem__(self, key: str, value: list[UsageAdditionalPropertyItem]) -> None: self.additional_properties[key] = value def __delitem__(self, key: str) -> None: diff --git a/exasol/saas/client/openapi/models/usage_additional_property_item.py b/exasol/saas/client/openapi/models/usage_additional_property_item.py index b779e227..17d88ee6 100644 --- a/exasol/saas/client/openapi/models/usage_additional_property_item.py +++ b/exasol/saas/client/openapi/models/usage_additional_property_item.py @@ -1,20 +1,13 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -34,18 +27,16 @@ class UsageAdditionalPropertyItem: Attributes: id (str): name (str): - clusters (list['UsageCluster']): - used_storage (Union[Unset, float]): + clusters (list[UsageCluster]): + used_storage (float | Unset): """ id: str name: str - clusters: list["UsageCluster"] - used_storage: Union[Unset, float] = UNSET + clusters: list[UsageCluster] + used_storage: float | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.usage_cluster import UsageCluster - id = self.id name = self.name diff --git a/exasol/saas/client/openapi/models/usage_cluster.py b/exasol/saas/client/openapi/models/usage_cluster.py index a26529ab..c6eecb1a 100644 --- a/exasol/saas/client/openapi/models/usage_cluster.py +++ b/exasol/saas/client/openapi/models/usage_cluster.py @@ -1,19 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from ..types import ( UNSET, @@ -30,19 +23,19 @@ class UsageCluster: id (str): size (str): name (str): - compute (Union[Unset, float]): - out_same_region (Union[Unset, float]): - out_different_region (Union[Unset, float]): - out_internet (Union[Unset, float]): + compute (float | Unset): + out_same_region (float | Unset): + out_different_region (float | Unset): + out_internet (float | Unset): """ id: str size: str name: str - compute: Union[Unset, float] = UNSET - out_same_region: Union[Unset, float] = UNSET - out_different_region: Union[Unset, float] = UNSET - out_internet: Union[Unset, float] = UNSET + compute: float | Unset = UNSET + out_same_region: float | Unset = UNSET + out_different_region: float | Unset = UNSET + out_internet: float | Unset = UNSET def to_dict(self) -> dict[str, Any]: id = self.id diff --git a/exasol/saas/client/openapi/models/user.py b/exasol/saas/client/openapi/models/user.py index df24eceb..6adbeaec 100644 --- a/exasol/saas/client/openapi/models/user.py +++ b/exasol/saas/client/openapi/models/user.py @@ -1,21 +1,14 @@ +from __future__ import annotations + import datetime -from collections.abc import ( - Generator, - Mapping, -) +from collections.abc import Mapping from typing import ( TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, - Union, - cast, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field from dateutil.parser import isoparse from ..models.user_status import UserStatus @@ -41,12 +34,12 @@ class User: created_at (datetime.datetime): created_by (str): status (UserStatus): - roles (list['UserRole']): + roles (list[UserRole]): is_deletable (bool): - first_name (Union[Unset, str]): - last_name (Union[Unset, str]): - databases (Union[Unset, list['UserDatabase']]): - db_username (Union[Unset, str]): + first_name (str | Unset): + last_name (str | Unset): + databases (list[UserDatabase] | Unset): + db_username (str | Unset): """ email: str @@ -54,17 +47,14 @@ class User: created_at: datetime.datetime created_by: str status: UserStatus - roles: list["UserRole"] + roles: list[UserRole] is_deletable: bool - first_name: Union[Unset, str] = UNSET - last_name: Union[Unset, str] = UNSET - databases: Union[Unset, list["UserDatabase"]] = UNSET - db_username: Union[Unset, str] = UNSET + first_name: str | Unset = UNSET + last_name: str | Unset = UNSET + databases: list[UserDatabase] | Unset = UNSET + db_username: str | Unset = UNSET def to_dict(self) -> dict[str, Any]: - from ..models.user_database import UserDatabase - from ..models.user_role import UserRole - email = self.email id = self.id @@ -86,7 +76,7 @@ def to_dict(self) -> dict[str, Any]: last_name = self.last_name - databases: Union[Unset, list[dict[str, Any]]] = UNSET + databases: list[dict[str, Any]] | Unset = UNSET if not isinstance(self.databases, Unset): databases = [] for databases_item_data in self.databases: @@ -148,12 +138,14 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: last_name = d.pop("lastName", UNSET) - databases = [] _databases = d.pop("databases", UNSET) - for databases_item_data in _databases or []: - databases_item = UserDatabase.from_dict(databases_item_data) + databases: list[UserDatabase] | Unset = UNSET + if _databases is not UNSET: + databases = [] + for databases_item_data in _databases: + databases_item = UserDatabase.from_dict(databases_item_data) - databases.append(databases_item) + databases.append(databases_item) db_username = d.pop("dbUsername", UNSET) diff --git a/exasol/saas/client/openapi/models/user_database.py b/exasol/saas/client/openapi/models/user_database.py index 9368189d..847d8224 100644 --- a/exasol/saas/client/openapi/models/user_database.py +++ b/exasol/saas/client/openapi/models/user_database.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="UserDatabase") diff --git a/exasol/saas/client/openapi/models/user_role.py b/exasol/saas/client/openapi/models/user_role.py index a192579c..d385252b 100644 --- a/exasol/saas/client/openapi/models/user_role.py +++ b/exasol/saas/client/openapi/models/user_role.py @@ -1,23 +1,12 @@ -from collections.abc import ( - Generator, - Mapping, -) +from __future__ import annotations + +from collections.abc import Mapping from typing import ( - TYPE_CHECKING, Any, - BinaryIO, - Optional, - TextIO, TypeVar, ) from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import ( - UNSET, - Unset, -) T = TypeVar("T", bound="UserRole") diff --git a/exasol/saas/client/openapi/types.py b/exasol/saas/client/openapi/types.py index dc61a306..c9f792b5 100644 --- a/exasol/saas/client/openapi/types.py +++ b/exasol/saas/client/openapi/types.py @@ -10,9 +10,7 @@ BinaryIO, Generic, Literal, - Optional, TypeVar, - Union, ) from attrs import define @@ -26,13 +24,13 @@ def __bool__(self) -> Literal[False]: UNSET: Unset = Unset() # The types that `httpx.Client(files=)` can accept, copied from that library. -FileContent = Union[IO[bytes], bytes, str] -FileTypes = Union[ +FileContent = IO[bytes] | bytes | str +FileTypes = ( # (filename, file (or bytes), content_type) - tuple[Optional[str], FileContent, Optional[str]], + tuple[str | None, FileContent, str | None] # (filename, file (or bytes), content_type, headers) - tuple[Optional[str], FileContent, Optional[str], Mapping[str, str]], -] + | tuple[str | None, FileContent, str | None, Mapping[str, str]] +) RequestFiles = list[tuple[str, FileTypes]] @@ -41,8 +39,8 @@ class File: """Contains information for file uploads""" payload: BinaryIO - file_name: Optional[str] = None - mime_type: Optional[str] = None + file_name: str | None = None + mime_type: str | None = None def to_tuple(self) -> FileTypes: """Return a tuple representation that httpx will accept for multipart/form-data""" @@ -59,7 +57,7 @@ class Response(Generic[T]): status_code: HTTPStatus content: bytes headers: MutableMapping[str, str] - parsed: Optional[T] + parsed: T | None __all__ = ["UNSET", "File", "FileTypes", "RequestFiles", "Response", "Unset"] diff --git a/version.py b/exasol/saas/version.py similarity index 88% rename from version.py rename to exasol/saas/version.py index 53e712c5..eb018ba7 100644 --- a/version.py +++ b/exasol/saas/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 diff --git a/noxconfig.py b/noxconfig.py index 6d2ae370..ee60f5d2 100644 --- a/noxconfig.py +++ b/noxconfig.py @@ -1,19 +1,12 @@ -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" - source: Path = Path("exasol/saas") - version_file: Path = ROOT_DIR / "version.py" - path_filters: Iterable[str] = ("dist", ".eggs", "venv") - - python_versions = ["3.10"] - - -PROJECT_CONFIG = Config() +PROJECT_CONFIG = BaseConfig( + root_path=Path(__file__).parent, + project_name="saas", + python_versions=("3.10", "3.11", "3.12", "3.13"), + # Actually SAPIPY itests don't use any (on-prem) database version, see + # https://github.com/exasol/python-toolbox/issues/682. + exasol_versions=("7.1.30",), +) diff --git a/noxfile.py b/noxfile.py index 96cb6164..1cd1f82c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -8,7 +8,6 @@ timezone, ) from pathlib import Path -from typing import List import nox import requests @@ -19,10 +18,9 @@ from nox import Session from exasol.saas.client import SAAS_HOST -from noxconfig import PROJECT_CONFIG # default actions to be run if nothing is explicitly specified with the -s option -nox.options.sessions = ["project:fix"] +nox.options.sessions = ["format:fix"] # destination folder for the generated open api client code DEST_DIR = "exasol/saas/client/openapi" @@ -115,7 +113,7 @@ def generate_api(session: Session): if local_build: session.run("poetry", "add", *dependencies("tmp/pyproject.toml")) shutil.rmtree("tmp") - fix(session) + fix_format(session) @nox.session(name="api:check-outdated", python=False) diff --git a/openapi.json b/openapi.json index bfe61096..064d8bd4 100644 --- a/openapi.json +++ b/openapi.json @@ -6,7 +6,7 @@ "version": "1.0", "download": { "source": "https://cloud.exasol.com/openapi.json", - "timestamp": "2026-02-11T08:12:54.599117+00:00" + "timestamp": "2026-02-16T07:33:57.444753+00:00" } }, "servers": [ diff --git a/poetry.lock b/poetry.lock index 21b54a8f..40baa0f4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.3 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" @@ -31,6 +31,18 @@ files = [ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] +[[package]] +name = "annotated-doc" +version = "0.0.4" +description = "Document parameters, class attributes, return types, and variables inline, with Annotated." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320"}, + {file = "annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"}, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -45,24 +57,23 @@ files = [ [[package]] name = "anyio" -version = "4.11.0" +version = "4.12.1" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, - {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" -sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -trio = ["trio (>=0.31.0)"] +trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] [[package]] name = "apeye" @@ -119,14 +130,14 @@ test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] [[package]] name = "astroid" -version = "4.0.2" +version = "4.0.4" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.10.0" groups = ["dev"] files = [ - {file = "astroid-4.0.2-py3-none-any.whl", hash = "sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b"}, - {file = "astroid-4.0.2.tar.gz", hash = "sha256:ac8fb7ca1c08eb9afec91ccc23edbd8ac73bb22cbdd7da1d488d9fb8d6579070"}, + {file = "astroid-4.0.4-py3-none-any.whl", hash = "sha256:52f39653876c7dec3e3afd4c2696920e05c83832b9737afc21928f2d2eb7a753"}, + {file = "astroid-4.0.4.tar.gz", hash = "sha256:986fed8bcf79fb82c78b18a53352a0b287a73817d6dbcfba3162da36667c49a0"}, ] [package.dependencies] @@ -161,14 +172,14 @@ Sphinx = ">=4.0,<9.0" [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, - {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, + {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, + {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, ] [package.extras] @@ -193,14 +204,14 @@ testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-ch [[package]] name = "bandit" -version = "1.9.2" +version = "1.9.3" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "bandit-1.9.2-py3-none-any.whl", hash = "sha256:bda8d68610fc33a6e10b7a8f1d61d92c8f6c004051d5e946406be1fb1b16a868"}, - {file = "bandit-1.9.2.tar.gz", hash = "sha256:32410415cd93bf9c8b91972159d5cf1e7f063a9146d70345641cd3877de348ce"}, + {file = "bandit-1.9.3-py3-none-any.whl", hash = "sha256:4745917c88d2246def79748bde5e08b9d5e9b92f877863d43fab70cd8814ce6a"}, + {file = "bandit-1.9.3.tar.gz", hash = "sha256:ade4b9b7786f89ef6fc7344a52b34558caec5da74cb90373aed01de88472f774"}, ] [package.dependencies] @@ -219,18 +230,18 @@ yaml = ["PyYAML"] [[package]] name = "beautifulsoup4" -version = "4.14.2" +version = "4.14.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" groups = ["dev"] files = [ - {file = "beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515"}, - {file = "beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e"}, + {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, + {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, ] [package.dependencies] -soupsieve = ">1.2" +soupsieve = ">=1.6.1" typing-extensions = ">=4.0.0" [package.extras] @@ -242,38 +253,39 @@ lxml = ["lxml"] [[package]] name = "black" -version = "25.11.0" +version = "25.12.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e"}, - {file = "black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0"}, - {file = "black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37"}, - {file = "black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03"}, - {file = "black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a"}, - {file = "black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170"}, - {file = "black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc"}, - {file = "black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e"}, - {file = "black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac"}, - {file = "black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96"}, - {file = "black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd"}, - {file = "black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409"}, - {file = "black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b"}, - {file = "black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd"}, - {file = "black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993"}, - {file = "black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c"}, - {file = "black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170"}, - {file = "black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545"}, - {file = "black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda"}, - {file = "black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664"}, - {file = "black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06"}, - {file = "black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2"}, - {file = "black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc"}, - {file = "black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc"}, - {file = "black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b"}, - {file = "black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08"}, + {file = "black-25.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f85ba1ad15d446756b4ab5f3044731bf68b777f8f9ac9cdabd2425b97cd9c4e8"}, + {file = "black-25.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:546eecfe9a3a6b46f9d69d8a642585a6eaf348bcbbc4d87a19635570e02d9f4a"}, + {file = "black-25.12.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17dcc893da8d73d8f74a596f64b7c98ef5239c2cd2b053c0f25912c4494bf9ea"}, + {file = "black-25.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:09524b0e6af8ba7a3ffabdfc7a9922fb9adef60fed008c7cd2fc01f3048e6e6f"}, + {file = "black-25.12.0-cp310-cp310-win_arm64.whl", hash = "sha256:b162653ed89eb942758efeb29d5e333ca5bb90e5130216f8369857db5955a7da"}, + {file = "black-25.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0cfa263e85caea2cff57d8f917f9f51adae8e20b610e2b23de35b5b11ce691a"}, + {file = "black-25.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a2f578ae20c19c50a382286ba78bfbeafdf788579b053d8e4980afb079ab9be"}, + {file = "black-25.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e1b65634b0e471d07ff86ec338819e2ef860689859ef4501ab7ac290431f9b"}, + {file = "black-25.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a3fa71e3b8dd9f7c6ac4d818345237dfb4175ed3bf37cd5a581dbc4c034f1ec5"}, + {file = "black-25.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:51e267458f7e650afed8445dc7edb3187143003d52a1b710c7321aef22aa9655"}, + {file = "black-25.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:31f96b7c98c1ddaeb07dc0f56c652e25bdedaac76d5b68a059d998b57c55594a"}, + {file = "black-25.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05dd459a19e218078a1f98178c13f861fe6a9a5f88fc969ca4d9b49eb1809783"}, + {file = "black-25.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1f68c5eff61f226934be6b5b80296cf6939e5d2f0c2f7d543ea08b204bfaf59"}, + {file = "black-25.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:274f940c147ddab4442d316b27f9e332ca586d39c85ecf59ebdea82cc9ee8892"}, + {file = "black-25.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:169506ba91ef21e2e0591563deda7f00030cb466e747c4b09cb0a9dae5db2f43"}, + {file = "black-25.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a05ddeb656534c3e27a05a29196c962877c83fa5503db89e68857d1161ad08a5"}, + {file = "black-25.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ec77439ef3e34896995503865a85732c94396edcc739f302c5673a2315e1e7f"}, + {file = "black-25.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e509c858adf63aa61d908061b52e580c40eae0dfa72415fa47ac01b12e29baf"}, + {file = "black-25.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:252678f07f5bac4ff0d0e9b261fbb029fa530cfa206d0a636a34ab445ef8ca9d"}, + {file = "black-25.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc5b1c09fe3c931ddd20ee548511c64ebf964ada7e6f0763d443947fd1c603ce"}, + {file = "black-25.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0a0953b134f9335c2434864a643c842c44fba562155c738a2a37a4d61f00cad5"}, + {file = "black-25.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2355bbb6c3b76062870942d8cc450d4f8ac71f9c93c40122762c8784df49543f"}, + {file = "black-25.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9678bd991cc793e81d19aeeae57966ee02909877cb65838ccffef24c3ebac08f"}, + {file = "black-25.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:97596189949a8aad13ad12fcbb4ae89330039b96ad6742e6f6b45e75ad5cfd83"}, + {file = "black-25.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:778285d9ea197f34704e3791ea9404cd6d07595745907dd2ce3da7a13627b29b"}, + {file = "black-25.12.0-py3-none-any.whl", hash = "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828"}, + {file = "black-25.12.0.tar.gz", hash = "sha256:8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7"}, ] [package.dependencies] @@ -334,14 +346,14 @@ redis = ["redis (>=2.10.5)"] [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.1.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main", "dev"] files = [ - {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, - {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, ] [[package]] @@ -625,104 +637,118 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "coverage" -version = "7.12.0" +version = "7.13.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "coverage-7.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b"}, - {file = "coverage-7.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c"}, - {file = "coverage-7.12.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832"}, - {file = "coverage-7.12.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa"}, - {file = "coverage-7.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73"}, - {file = "coverage-7.12.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb"}, - {file = "coverage-7.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e"}, - {file = "coverage-7.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777"}, - {file = "coverage-7.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553"}, - {file = "coverage-7.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d"}, - {file = "coverage-7.12.0-cp310-cp310-win32.whl", hash = "sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef"}, - {file = "coverage-7.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022"}, - {file = "coverage-7.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f"}, - {file = "coverage-7.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3"}, - {file = "coverage-7.12.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e"}, - {file = "coverage-7.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7"}, - {file = "coverage-7.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245"}, - {file = "coverage-7.12.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b"}, - {file = "coverage-7.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64"}, - {file = "coverage-7.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742"}, - {file = "coverage-7.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c"}, - {file = "coverage-7.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984"}, - {file = "coverage-7.12.0-cp311-cp311-win32.whl", hash = "sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6"}, - {file = "coverage-7.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4"}, - {file = "coverage-7.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc"}, - {file = "coverage-7.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647"}, - {file = "coverage-7.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736"}, - {file = "coverage-7.12.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60"}, - {file = "coverage-7.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8"}, - {file = "coverage-7.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f"}, - {file = "coverage-7.12.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70"}, - {file = "coverage-7.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0"}, - {file = "coverage-7.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068"}, - {file = "coverage-7.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b"}, - {file = "coverage-7.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937"}, - {file = "coverage-7.12.0-cp312-cp312-win32.whl", hash = "sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa"}, - {file = "coverage-7.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a"}, - {file = "coverage-7.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c"}, - {file = "coverage-7.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941"}, - {file = "coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a"}, - {file = "coverage-7.12.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b365adc70a6936c6b0582dc38746b33b2454148c02349345412c6e743efb646d"}, - {file = "coverage-7.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211"}, - {file = "coverage-7.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:099d11698385d572ceafb3288a5b80fe1fc58bf665b3f9d362389de488361d3d"}, - {file = "coverage-7.12.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:473dc45d69694069adb7680c405fb1e81f60b2aff42c81e2f2c3feaf544d878c"}, - {file = "coverage-7.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:583f9adbefd278e9de33c33d6846aa8f5d164fa49b47144180a0e037f0688bb9"}, - {file = "coverage-7.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2089cc445f2dc0af6f801f0d1355c025b76c24481935303cf1af28f636688f0"}, - {file = "coverage-7.12.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:950411f1eb5d579999c5f66c62a40961f126fc71e5e14419f004471957b51508"}, - {file = "coverage-7.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1aab7302a87bafebfe76b12af681b56ff446dc6f32ed178ff9c092ca776e6bc"}, - {file = "coverage-7.12.0-cp313-cp313-win32.whl", hash = "sha256:d7e0d0303c13b54db495eb636bc2465b2fb8475d4c8bcec8fe4b5ca454dfbae8"}, - {file = "coverage-7.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07"}, - {file = "coverage-7.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bcec6f47e4cb8a4c2dc91ce507f6eefc6a1b10f58df32cdc61dff65455031dfc"}, - {file = "coverage-7.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:459443346509476170d553035e4a3eed7b860f4fe5242f02de1010501956ce87"}, - {file = "coverage-7.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04a79245ab2b7a61688958f7a855275997134bc84f4a03bc240cf64ff132abf6"}, - {file = "coverage-7.12.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:09a86acaaa8455f13d6a99221d9654df249b33937b4e212b4e5a822065f12aa7"}, - {file = "coverage-7.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:907e0df1b71ba77463687a74149c6122c3f6aac56c2510a5d906b2f368208560"}, - {file = "coverage-7.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b57e2d0ddd5f0582bae5437c04ee71c46cd908e7bc5d4d0391f9a41e812dd12"}, - {file = "coverage-7.12.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:58c1c6aa677f3a1411fe6fb28ec3a942e4f665df036a3608816e0847fad23296"}, - {file = "coverage-7.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4c589361263ab2953e3c4cd2a94db94c4ad4a8e572776ecfbad2389c626e4507"}, - {file = "coverage-7.12.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:91b810a163ccad2e43b1faa11d70d3cf4b6f3d83f9fd5f2df82a32d47b648e0d"}, - {file = "coverage-7.12.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:40c867af715f22592e0d0fb533a33a71ec9e0f73a6945f722a0c85c8c1cbe3a2"}, - {file = "coverage-7.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:68b0d0a2d84f333de875666259dadf28cc67858bc8fd8b3f1eae84d3c2bec455"}, - {file = "coverage-7.12.0-cp313-cp313t-win32.whl", hash = "sha256:73f9e7fbd51a221818fd11b7090eaa835a353ddd59c236c57b2199486b116c6d"}, - {file = "coverage-7.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:24cff9d1f5743f67db7ba46ff284018a6e9aeb649b67aa1e70c396aa1b7cb23c"}, - {file = "coverage-7.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c87395744f5c77c866d0f5a43d97cc39e17c7f1cb0115e54a2fe67ca75c5d14d"}, - {file = "coverage-7.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a1c59b7dc169809a88b21a936eccf71c3895a78f5592051b1af8f4d59c2b4f92"}, - {file = "coverage-7.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8787b0f982e020adb732b9f051f3e49dd5054cebbc3f3432061278512a2b1360"}, - {file = "coverage-7.12.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ea5a9f7dc8877455b13dd1effd3202e0bca72f6f3ab09f9036b1bcf728f69ac"}, - {file = "coverage-7.12.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdba9f15849534594f60b47c9a30bc70409b54947319a7c4fd0e8e3d8d2f355d"}, - {file = "coverage-7.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a00594770eb715854fb1c57e0dea08cce6720cfbc531accdb9850d7c7770396c"}, - {file = "coverage-7.12.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5560c7e0d82b42eb1951e4f68f071f8017c824ebfd5a6ebe42c60ac16c6c2434"}, - {file = "coverage-7.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2e26b481c9159c2773a37947a9718cfdc58893029cdfb177531793e375cfc"}, - {file = "coverage-7.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6e1a8c066dabcde56d5d9fed6a66bc19a2883a3fe051f0c397a41fc42aedd4cc"}, - {file = "coverage-7.12.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f7ba9da4726e446d8dd8aae5a6cd872511184a5d861de80a86ef970b5dacce3e"}, - {file = "coverage-7.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e0f483ab4f749039894abaf80c2f9e7ed77bbf3c737517fb88c8e8e305896a17"}, - {file = "coverage-7.12.0-cp314-cp314-win32.whl", hash = "sha256:76336c19a9ef4a94b2f8dc79f8ac2da3f193f625bb5d6f51a328cd19bfc19933"}, - {file = "coverage-7.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c1059b600aec6ef090721f8f633f60ed70afaffe8ecab85b59df748f24b31fe"}, - {file = "coverage-7.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:172cf3a34bfef42611963e2b661302a8931f44df31629e5b1050567d6b90287d"}, - {file = "coverage-7.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:aa7d48520a32cb21c7a9b31f81799e8eaec7239db36c3b670be0fa2403828d1d"}, - {file = "coverage-7.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:90d58ac63bc85e0fb919f14d09d6caa63f35a5512a2205284b7816cafd21bb03"}, - {file = "coverage-7.12.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ca8ecfa283764fdda3eae1bdb6afe58bf78c2c3ec2b2edcb05a671f0bba7b3f9"}, - {file = "coverage-7.12.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:874fe69a0785d96bd066059cd4368022cebbec1a8958f224f0016979183916e6"}, - {file = "coverage-7.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b3c889c0b8b283a24d721a9eabc8ccafcfc3aebf167e4cd0d0e23bf8ec4e339"}, - {file = "coverage-7.12.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bb5b894b3ec09dcd6d3743229dc7f2c42ef7787dc40596ae04c0edda487371e"}, - {file = "coverage-7.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:79a44421cd5fba96aa57b5e3b5a4d3274c449d4c622e8f76882d76635501fd13"}, - {file = "coverage-7.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:33baadc0efd5c7294f436a632566ccc1f72c867f82833eb59820ee37dc811c6f"}, - {file = "coverage-7.12.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c406a71f544800ef7e9e0000af706b88465f3573ae8b8de37e5f96c59f689ad1"}, - {file = "coverage-7.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e71bba6a40883b00c6d571599b4627f50c360b3d0d02bfc658168936be74027b"}, - {file = "coverage-7.12.0-cp314-cp314t-win32.whl", hash = "sha256:9157a5e233c40ce6613dead4c131a006adfda70e557b6856b97aceed01b0e27a"}, - {file = "coverage-7.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e84da3a0fd233aeec797b981c51af1cabac74f9bd67be42458365b30d11b5291"}, - {file = "coverage-7.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:01d24af36fedda51c2b1aca56e4330a3710f83b02a5ff3743a6b015ffa7c9384"}, - {file = "coverage-7.12.0-py3-none-any.whl", hash = "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a"}, - {file = "coverage-7.12.0.tar.gz", hash = "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c"}, + {file = "coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415"}, + {file = "coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def"}, + {file = "coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58"}, + {file = "coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9"}, + {file = "coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf"}, + {file = "coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95"}, + {file = "coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053"}, + {file = "coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef"}, + {file = "coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6"}, + {file = "coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9"}, + {file = "coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9"}, + {file = "coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f"}, + {file = "coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f"}, + {file = "coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459"}, + {file = "coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3"}, + {file = "coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985"}, + {file = "coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0"}, + {file = "coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246"}, + {file = "coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126"}, + {file = "coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d"}, + {file = "coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9"}, + {file = "coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242"}, + {file = "coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea"}, + {file = "coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a"}, + {file = "coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d"}, + {file = "coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd"}, + {file = "coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af"}, + {file = "coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d"}, + {file = "coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9"}, + {file = "coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0"}, + {file = "coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b"}, + {file = "coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9"}, + {file = "coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd"}, + {file = "coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997"}, + {file = "coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601"}, + {file = "coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a"}, + {file = "coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5"}, + {file = "coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0"}, + {file = "coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb"}, + {file = "coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505"}, + {file = "coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2"}, + {file = "coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056"}, + {file = "coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72"}, + {file = "coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39"}, + {file = "coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0"}, + {file = "coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea"}, + {file = "coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932"}, + {file = "coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b"}, + {file = "coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0"}, + {file = "coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91"}, ] [package.extras] @@ -730,66 +756,61 @@ toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.8" groups = ["dev"] files = [ - {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926"}, - {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71"}, - {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac"}, - {file = "cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018"}, - {file = "cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb"}, - {file = "cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c"}, - {file = "cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3"}, - {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20"}, - {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de"}, - {file = "cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914"}, - {file = "cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db"}, - {file = "cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21"}, - {file = "cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506"}, - {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963"}, - {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4"}, - {file = "cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df"}, - {file = "cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f"}, - {file = "cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372"}, - {file = "cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32"}, - {file = "cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, - {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, + {file = "cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0"}, + {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731"}, + {file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82"}, + {file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1"}, + {file = "cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48"}, + {file = "cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4"}, + {file = "cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0"}, + {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663"}, + {file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826"}, + {file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d"}, + {file = "cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a"}, + {file = "cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4"}, + {file = "cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d"}, + {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c"}, + {file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4"}, + {file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9"}, + {file = "cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72"}, + {file = "cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257"}, + {file = "cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7"}, + {file = "cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d"}, ] [package.dependencies] @@ -803,7 +824,7 @@ nox = ["nox[uv] (>=2024.4.15)"] pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==46.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==46.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -827,26 +848,27 @@ test = ["cssselect", "importlib-resources ; python_version < \"3.9\"", "jaraco.t [[package]] name = "cyclonedx-python-lib" -version = "9.1.0" +version = "11.6.0" description = "Python library for CycloneDX" optional = false -python-versions = "<4.0,>=3.8" +python-versions = "<4.0,>=3.9" groups = ["dev"] files = [ - {file = "cyclonedx_python_lib-9.1.0-py3-none-any.whl", hash = "sha256:55693fca8edaecc3363b24af14e82cc6e659eb1e8353e58b587c42652ce0fb52"}, - {file = "cyclonedx_python_lib-9.1.0.tar.gz", hash = "sha256:86935f2c88a7b47a529b93c724dbd3e903bc573f6f8bd977628a7ca1b5dadea1"}, + {file = "cyclonedx_python_lib-11.6.0-py3-none-any.whl", hash = "sha256:94f4aae97db42a452134dafdddcfab9745324198201c4777ed131e64c8380759"}, + {file = "cyclonedx_python_lib-11.6.0.tar.gz", hash = "sha256:7fb85a4371fa3a203e5be577ac22b7e9a7157f8b0058b7448731474d6dea7bf0"}, ] [package.dependencies] license-expression = ">=30,<31" packageurl-python = ">=0.11,<2" -py-serializable = ">=2.0.0,<3.0.0" +py-serializable = ">=2.1.0,<3.0.0" sortedcontainers = ">=2.4.0,<3.0.0" +typing_extensions = {version = ">=4.6,<5.0", markers = "python_version < \"3.13\""} [package.extras] -json-validation = ["jsonschema[format] (>=4.18,<5.0)"] -validation = ["jsonschema[format] (>=4.18,<5.0)", "lxml (>=4,<6)"] -xml-validation = ["lxml (>=4,<6)"] +json-validation = ["jsonschema[format-nongpl] (>=4.25,<5.0)", "referencing (>=0.28.4)"] +validation = ["jsonschema[format-nongpl] (>=4.25,<5.0)", "lxml (>=4,<7)", "referencing (>=0.28.4)"] +xml-validation = ["lxml (>=4,<7)"] [[package]] name = "defusedxml" @@ -897,14 +919,14 @@ domdf-python-tools = ">=2.2.0" [[package]] name = "dill" -version = "0.4.0" +version = "0.4.1" description = "serialize all of Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, - {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, + {file = "dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d"}, + {file = "dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa"}, ] [package.extras] @@ -957,44 +979,47 @@ dates = ["pytz (>=2019.1)"] [[package]] name = "exasol-toolbox" -version = "1.13.0" +version = "5.1.1" 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-5.1.1-py3-none-any.whl", hash = "sha256:0640240b32679163a0eea5f32fafb98f149e9a7e37944b9f7b24865a842a8cee"}, + {file = "exasol_toolbox-5.1.1.tar.gz", hash = "sha256:bbef30c7c8a26c6621761edccce31146153e1e78dc2a883dbda5527a4637aab8"}, ] [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" +twine = ">=6.1.0,<7" typer = {version = ">=0.7.0", extras = ["all"]} [[package]] @@ -1016,156 +1041,174 @@ typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "fastapi" +version = "0.129.0" +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"}, +] + +[package.dependencies] +annotated-doc = ">=0.0.2" +pydantic = ">=2.7.0" +starlette = ">=0.40.0,<1.0.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)"] +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.20.0" +version = "3.24.0" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2"}, - {file = "filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4"}, + {file = "filelock-3.24.0-py3-none-any.whl", hash = "sha256:eebebb403d78363ef7be8e236b63cc6760b0004c7464dceaba3fd0afbd637ced"}, + {file = "filelock-3.24.0.tar.gz", hash = "sha256:aeeab479339ddf463a1cdd1f15a6e6894db976071e5883efc94d22ed5139044b"}, ] [[package]] name = "furo" -version = "2025.9.25" +version = "2025.12.19" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "furo-2025.9.25-py3-none-any.whl", hash = "sha256:2937f68e823b8e37b410c972c371bc2b1d88026709534927158e0cb3fac95afe"}, - {file = "furo-2025.9.25.tar.gz", hash = "sha256:3eac05582768fdbbc2bdfa1cdbcdd5d33cfc8b4bd2051729ff4e026a1d7e0a98"}, + {file = "furo-2025.12.19-py3-none-any.whl", hash = "sha256:bb0ead5309f9500130665a26bee87693c41ce4dbdff864dbfb6b0dae4673d24f"}, + {file = "furo-2025.12.19.tar.gz", hash = "sha256:188d1f942037d8b37cd3985b955839fea62baa1730087dc29d157677c857e2a7"}, ] [package.dependencies] accessible-pygments = ">=0.0.5" beautifulsoup4 = "*" pygments = ">=2.7" -sphinx = ">=6.0,<9.0" -sphinx-basic-ng = ">=1.0.0.beta2" +sphinx = ">=7.0,<10.0" +sphinx-basic-ng = ">=1.0.0b2" [[package]] name = "grimp" -version = "3.13" +version = "3.14" description = "Builds a queryable graph of the imports within one or more Python packages." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "grimp-3.13-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:0ad0b51c8216cdffd60c68b54f6f3c803a0729dbe476fe9cd81642f6f0a3008e"}, - {file = "grimp-3.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c4b5382964055e2fbae38a9e67c1d805bd4368c87341eff09a2ef29a095f39e"}, - {file = "grimp-3.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87673986e66c0cfe5280744a5c28613453def1ddb849338c76a425f2eeab4460"}, - {file = "grimp-3.13-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbc8d42013036ce3cba4c919d8f2a10309f33e80dbbbc5b280814c7bb159a459"}, - {file = "grimp-3.13-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b9a1ba890854b457a3df82f9c341c1f131e9617ee7ed8058e8016c57b963f8"}, - {file = "grimp-3.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50c6025df388d004dd34cbb3c4a914c8e933b0bdfeb44a5598b9126f27fc164e"}, - {file = "grimp-3.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c9b89b62b6381dc8de1ca524c0764df00bd7f1d823892c8ac1e9c10a8e87ab4"}, - {file = "grimp-3.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dc76e193ff53cd9722148bde0fc327781ae4b58080316e900b6b29be2b62bd"}, - {file = "grimp-3.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b5884d0f94fd24b4ab6a51a81a830f4f0752e4c73f44dc579ac2ef5de186b599"}, - {file = "grimp-3.13-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4523c7d4eaff96a37104cd9d2bedc0c805421144d81dac38ec975720eca5eded"}, - {file = "grimp-3.13-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e5be25e3bd5c2029ae8016a8baefcc4842baa7e49a613b91b45881673f1f7a6e"}, - {file = "grimp-3.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:876f6e5cfc8e92eef6b626cf9df1779be10cf84003363a9170322114688b24e5"}, - {file = "grimp-3.13-cp310-cp310-win32.whl", hash = "sha256:fcb36fcf0a4756d9ce8fbcc3cf2bf6a7cfda83bf5a6c26e7e727b0cd9766a0a2"}, - {file = "grimp-3.13-cp310-cp310-win_amd64.whl", hash = "sha256:cc8dc66768e903ca40b70691a8a9335045e622747ee94f11c8a413a7dbe52a46"}, - {file = "grimp-3.13-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:57745996698932768274a2ed9ba3e5c424f60996c53ecaf1c82b75be9e819ee9"}, - {file = "grimp-3.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ca29f09710342b94fa6441f4d1102a0e49f0b463b1d91e43223baa949c5e9337"}, - {file = "grimp-3.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adda25aa158e11d96dd27166300b955c8ec0c76ce2fd1a13597e9af012aada06"}, - {file = "grimp-3.13-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03e17029d75500a5282b40cb15cdae030bf14df9dfaa6a2b983f08898dfe74b6"}, - {file = "grimp-3.13-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cbfc9d2d0ebc0631fb4012a002f3d8f4e3acb8325be34db525c0392674433b8"}, - {file = "grimp-3.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:161449751a085484608c5b9f863e41e8fb2a98e93f7312ead5d831e487a94518"}, - {file = "grimp-3.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:119628fbe7f941d1e784edac98e8ced7e78a0b966a4ff2c449e436ee860bd507"}, - {file = "grimp-3.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ca1ac776baf1fa105342b23c72f2e7fdd6771d4cce8d2903d28f92fd34a9e8f"}, - {file = "grimp-3.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:941ff414cc66458f56e6af93c618266091ea70bfdabe7a84039be31d937051ee"}, - {file = "grimp-3.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:87ad9bcd1caaa2f77c369d61a04b9f2f1b87f4c3b23ae6891b2c943193c4ec62"}, - {file = "grimp-3.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:751fe37104a4f023d5c6556558b723d843d44361245c20f51a5d196de00e4774"}, - {file = "grimp-3.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9b561f79ec0b3a4156937709737191ad57520f2d58fa1fc43cd79f67839a3cd7"}, - {file = "grimp-3.13-cp311-cp311-win32.whl", hash = "sha256:52405ea8c8f20cf5d2d1866c80ee3f0243a38af82bd49d1464c5e254bf2e1f8f"}, - {file = "grimp-3.13-cp311-cp311-win_amd64.whl", hash = "sha256:6a45d1d3beeefad69717b3718e53680fb3579fe67696b86349d6f39b75e850bf"}, - {file = "grimp-3.13-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3e715c56ffdd055e5c84d27b4c02d83369b733e6a24579d42bbbc284bd0664a9"}, - {file = "grimp-3.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f794dea35a4728b948ab8fec970ffbdf2589b34209f3ab902cf8a9148cf1eaad"}, - {file = "grimp-3.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69571270f2c27e8a64b968195aa7ecc126797112a9bf1e804ff39ba9f42d6f6d"}, - {file = "grimp-3.13-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f7b226398ae476762ef0afb5ef8f838d39c8e0e2f6d1a4378ce47059b221a4a"}, - {file = "grimp-3.13-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5498aeac4df0131a1787fcbe9bb460b52fc9b781ec6bba607fd6a7d6d3ea6fce"}, - {file = "grimp-3.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4be702bb2b5c001a6baf709c452358470881e15e3e074cfc5308903603485dcb"}, - {file = "grimp-3.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fcf988f3e3d272a88f7be68f0c1d3719fee8624d902e9c0346b9015a0ea6a65"}, - {file = "grimp-3.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ede36d104ff88c208140f978de3345f439345f35b8ef2b4390c59ef6984deba"}, - {file = "grimp-3.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b35e44bb8dc80e0bd909a64387f722395453593a1884caca9dc0748efea33764"}, - {file = "grimp-3.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:becb88e9405fc40896acd6e2b9bbf6f242a5ae2fd43a1ec0a32319ab6c10a227"}, - {file = "grimp-3.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a66585b4af46c3fbadbef495483514bee037e8c3075ed179ba4f13e494eb7899"}, - {file = "grimp-3.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:29f68c6e2ff70d782ca0e989ec4ec44df73ba847937bcbb6191499224a2f84e2"}, - {file = "grimp-3.13-cp312-cp312-win32.whl", hash = "sha256:cc996dcd1a44ae52d257b9a3e98838f8ecfdc42f7c62c8c82c2fcd3828155c98"}, - {file = "grimp-3.13-cp312-cp312-win_amd64.whl", hash = "sha256:e2966435947e45b11568f04a65863dcf836343c11ae44aeefdaa7f07eb1a0576"}, - {file = "grimp-3.13-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1dd9be203e856b8c725b9af4100c6619c82672e6e0c5101e1154b3c8bffde2df"}, - {file = "grimp-3.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:921222b6ba969fb292f5014f8ab3da9068427ebc3d6ff7f79bf46a07958529fe"}, - {file = "grimp-3.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56f1128efd6e222990d3fbc0cf911096272bd333a086f3b485950bc022e767d9"}, - {file = "grimp-3.13-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7742743183f3a2676774a341f460f34c80c3c80f6cbf9e9e421769dc69c170a0"}, - {file = "grimp-3.13-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88bbaa0305f4ed3d7ee3e12eced83ede249eb2690cf9b623bde75c6650f39c13"}, - {file = "grimp-3.13-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0c0ffbc579a42281ac54af446b4c2e35e5be9a7f64171de8b806c8c3e624919"}, - {file = "grimp-3.13-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e07fb97ac153c01ecd5790b27c47b8cc4a5a70ab2f6618ec8f9b69ade31d5f81"}, - {file = "grimp-3.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c3d8f5fd5a962793c4cd9e4089a8ae8edcaf1ebabc28b151d4015a5736ca79"}, - {file = "grimp-3.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a5b323710e586b5db37d962d2b948eca47ceb70713c7aacb5cff01e7e7fc1b30"}, - {file = "grimp-3.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:fc9933269b4b390d5d256fbee065eeea549e837ad43daf8f9cce832bd692cd5f"}, - {file = "grimp-3.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c683645a4f61e62f8c99f3f643500b8660136666e44151b7491989e41407c86b"}, - {file = "grimp-3.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd07ab467fd6ed44db8cef047269ebc18e2b1811d30e25c54fc5818c573c3542"}, - {file = "grimp-3.13-cp313-cp313-win32.whl", hash = "sha256:ab88dfb6a2df6e362b75be19e803c71b02f5cb22ee5fb0459dce5b180cef0b7f"}, - {file = "grimp-3.13-cp313-cp313-win_amd64.whl", hash = "sha256:79a48b88b9b13de4ebe93a7d32e47e1155e85d4f67baef4b92bb34a65ea2bdb3"}, - {file = "grimp-3.13-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70094984cef4de1d59dad1a073a2e3e3e9cfd9874bd4c53146b3c66144800d39"}, - {file = "grimp-3.13-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a62b8f2073277a051d59a5973695b7e571a8225c433278777d9500070150a138"}, - {file = "grimp-3.13-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13d1c158bae4cc0d24107389bf526ee02088df6f0a3caa413dd4e35c83d76f63"}, - {file = "grimp-3.13-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a77d900c13d32c4aed91f6aab7ceb485f7bd0e3d2f88ca6c190ec5dc9143703b"}, - {file = "grimp-3.13-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21aeef8f1b7fc5f74e5513358f7774bd5bbb3159bd83eab7fe908c058fec3836"}, - {file = "grimp-3.13-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:0eef1697f5b608e8b615a72957474e76231105cdd79a8a546390045ba904a654"}, - {file = "grimp-3.13-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3f733a57be87b772cc21f63b062566cde4c90db6f3f338774a1567b11f7cb569"}, - {file = "grimp-3.13-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d00b611249f0370f811433c1d81173be27a34ecb588364a371e00f182e4fe88b"}, - {file = "grimp-3.13-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:db63d787ac9665374a09a6cc00f7adb3f63c3f462c68ea87d5efe186db9c9ad7"}, - {file = "grimp-3.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba6f46658b5cf48b902f054a29e09b3af62893cf24df2951e300a0cf13cb2e71"}, - {file = "grimp-3.13-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:472aa20a42b8486a5bf46720fdb21c58f81a86646057f727afab39c0d6f5e6aa"}, - {file = "grimp-3.13-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f54bafaebc94db0a6e38a6c9a58fa9a8339d88acca99095d326104ee2747335"}, - {file = "grimp-3.13-cp314-cp314-win32.whl", hash = "sha256:b8b7450e1ad2494540ac39bc97b9f8f0a38ff1b0588b7722d93468e6ac1c9473"}, - {file = "grimp-3.13-cp314-cp314-win_amd64.whl", hash = "sha256:b70ca87be9e2df7212b7e3ebf65310051def6d2bb037a9b6a799397f56ac68df"}, - {file = "grimp-3.13-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82eeb220124f22fc145685b34430a98143f994844d0f0899ec1e8ff82e5c48cf"}, - {file = "grimp-3.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1bf47f43b9cd35d50c4777e56ccf7a0a9703dfca262da5c25b7fcc1a0007545d"}, - {file = "grimp-3.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64dab41b6da5bbd2ca3c5ece4dcb0470981925664f3e1a310f1e57e78b777318"}, - {file = "grimp-3.13-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de1cdf18d35f6d1c3f63f480c7a9d1d0abef61cc35f4dd5fe22731a38ee35fa4"}, - {file = "grimp-3.13-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb1d58b57c99a020b961dc07391b567b20ffd13e5a6aec44e4ed22ad260964c6"}, - {file = "grimp-3.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:88d70179ddd4e2e9acaebf04239f45468189c9cbe14893e1958b48409eea572f"}, - {file = "grimp-3.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e8272214e3af42316d85f7938cb5ffbdb653041490c7f6db3cd99285eb150d3"}, - {file = "grimp-3.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e75333974b1a7318251314b650ffa8c5a250e8dc2ae45f94bd51418d0c3764d"}, - {file = "grimp-3.13-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a4d8308e404517a68429b34749f8d44bc0f46ef04dad16998105c60033f90951"}, - {file = "grimp-3.13-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4d20e54075f337637d4ddc4e4f174db1530bc257a0cc3991ff8b38b39372f1b8"}, - {file = "grimp-3.13-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:02b329cdb6beb4159db4c74bf7e89ab0a0964524f56e463a2a3564a9e9ce25f5"}, - {file = "grimp-3.13-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c3a5e13f4b3619375b203a617ad377c2d099abb05a42f2792f2634bc24bfae1d"}, - {file = "grimp-3.13-cp39-cp39-win32.whl", hash = "sha256:cdb6e793bb83c901db8664ec3f6741786fb884a8dcac1d064592f083ab12f643"}, - {file = "grimp-3.13-cp39-cp39-win_amd64.whl", hash = "sha256:f27219649bb2610ce4a1db0761ce4a0651373d38b138b9fea4cfae77872f52e8"}, - {file = "grimp-3.13-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cbf5bdf82dd076c08583d689b1f40a042430401caa1e234b76198fe7333b91"}, - {file = "grimp-3.13-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c98f23be5c5c9a0d882bb5c58f190c7ac787fda00082618181b2b3b35181064"}, - {file = "grimp-3.13-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5738fad8fd82800564daab85d484b3dfc59bb38e5bc2879b96c906592d05aa97"}, - {file = "grimp-3.13-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e997676334afc838a2403efb633f271e52a76b1e50f970e7cfe367a1a9394550"}, - {file = "grimp-3.13-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b2f5ed0b657b41b99dd47dcafcb2af2d135aaacbb030be541aff7bd8df4ea61d"}, - {file = "grimp-3.13-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:99c8dd4c93a55554f66d388553e928f302d68f04f2d1dff6375a27d9c01e2b18"}, - {file = "grimp-3.13-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:2af34b44c1a8b6ead1a74e63cfb3b3ee299d31e71780031d43ae807bec145f18"}, - {file = "grimp-3.13-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ca96c2b2fac81ec2c518ae45986f122a388167ea93e89f71e851a508d3c92575"}, - {file = "grimp-3.13-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6a3c76525b018c85c0e3a632d94d72be02225f8ada56670f3f213cf0762be4"}, - {file = "grimp-3.13-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239e9b347af4da4cf69465bfa7b2901127f6057bc73416ba8187fb1eabafc6ea"}, - {file = "grimp-3.13-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6db85ce2dc2f804a2edd1c1e9eaa46d282e1f0051752a83ca08ca8b87f87376"}, - {file = "grimp-3.13-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e000f3590bcc6ff7c781ebbc1ac4eb919f97180f13cc4002c868822167bd9aed"}, - {file = "grimp-3.13-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2374c217c862c1af933a430192d6a7c6723ed1d90303f1abbc26f709bbb9263"}, - {file = "grimp-3.13-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ed0ff17d559ff2e7fa1be8ae086bc4fedcace5d7b12017f60164db8d9a8d806"}, - {file = "grimp-3.13-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:43960234aabce018c8d796ec8b77c484a1c9cbb6a3bc036a0d307c8dade9874c"}, - {file = "grimp-3.13-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:44420b638b3e303f32314bd4d309f15de1666629035acd1cdd3720c15917ac85"}, - {file = "grimp-3.13-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:f6127fdb982cf135612504d34aa16b841f421e54751fcd54f80b9531decb2b3f"}, - {file = "grimp-3.13-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:69893a9ef1edea25226ed17e8e8981e32900c59703972e0780c0e927ce624f75"}, - {file = "grimp-3.13-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c522d4ee6e921c040b7f932343d983b5a9521aab07685eedc49a6fc9001bd8c1"}, - {file = "grimp-3.13-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32f4d60aa056640b0a3547521363329b6a5292df4ce4bc67a355d841303587dd"}, - {file = "grimp-3.13-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e1b558ac78f82fa44a1c3b6b4fa1ad04ab41b4445353b6aebaff8cca4a9245c"}, - {file = "grimp-3.13-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27644460a503aea1df0f2e39d683395d45def73ebd5d61efc43e4dc8ad0cd4e0"}, - {file = "grimp-3.13-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:20b56bbf2ff00ea97701bf2ef48e79aed61790f01a0465a065787ca300057d74"}, - {file = "grimp-3.13-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:fce5f24e792f8bb3dbe32e3329df53b54c0facd8181fa219ce0874ae4af7febd"}, - {file = "grimp-3.13-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:71e100238833264cbd1408e1e8636c16574ede09b9840fabed58ac2f4754d4e3"}, - {file = "grimp-3.13-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:7cbfde149e00986270b3c3552c67fefa101282f4ec9c5bfd08e7fd1878596629"}, - {file = "grimp-3.13.tar.gz", hash = "sha256:759bf6e05186e6473ee71af4119ec181855b2b324f4fcdd78dee9e5b59d87874"}, + {file = "grimp-3.14-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:17364365c27c111514fd9d17844f275ed074ec9feca0d6cf9bd5bf9218db2412"}, + {file = "grimp-3.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:25273ea53ac1492e7343bd9d9d9b60445f707bc0d162eca85288c7325579ee47"}, + {file = "grimp-3.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53b8f69bdf070fddbbc13f60a5cdb42efb102516770b34f076456ec4ce960627"}, + {file = "grimp-3.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1aa397596bb6d616200be1fd6570e87ddc225c192845c649d4f6015175b77bc6"}, + {file = "grimp-3.14-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2892ca934fc19c6d51d6c0a609d4db7e97c4721cc9a609f2bab8fe8e1ec1821"}, + {file = "grimp-3.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e9367b9fa9c97cb8d1974a164d5981852b498977a097ad7335fc012ab96498b"}, + {file = "grimp-3.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87f398915c716c13736460a54f8dc5d70494d7d616039f547c0093f252307109"}, + {file = "grimp-3.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5551a825b14e52642428ef7c4a5790819bfaee0fdae94f89ce248cff3d7109bb"}, + {file = "grimp-3.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6ee7a2fab52ce0c6ae81fa1f2319bad5bd361110994567477f26be018043d63d"}, + {file = "grimp-3.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6d1434172a02cd97425126260dec80a8fd0491d9467b822d871498199c296c91"}, + {file = "grimp-3.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9a85bf0a8c4b58db12184fe53a469a7189b4c63397a2eaca0d9efe410f6f68e7"}, + {file = "grimp-3.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:53d9ed23fb7da4c886affeb6b8bce7c19d8b09f2e1631a482c9446a20d504bdf"}, + {file = "grimp-3.14-cp310-cp310-win32.whl", hash = "sha256:d05110b9afda361ff8d90740a8344ccfd2d59a5a1977d517b9bce178738ed34f"}, + {file = "grimp-3.14-cp310-cp310-win_amd64.whl", hash = "sha256:fad2a819756b5c0441b8841c2e6f541960b13edd09b672e6e199232dcf9bcb7a"}, + {file = "grimp-3.14-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f1c91e3fa48c2196bf62e3c71492140d227b2bfcd6d15e735cbc0b3e2d5308e0"}, + {file = "grimp-3.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6291c8f1690a9fe21b70923c60b075f4a89676541999e3d33084cbc69ac06a1"}, + {file = "grimp-3.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ec312383935c2d09e4085c8435780ada2e13ebef14e105609c2988a02a5b2ce"}, + {file = "grimp-3.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f43cbf640e73ee703ad91639591046828d20103a1c363a02516e77a66a4ac07"}, + {file = "grimp-3.14-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a93c9fddccb9ff16f5c6b5fca44227f5f86cba7cffc145d2176119603d2d7c7"}, + {file = "grimp-3.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5653a2769fdc062cb7598d12200352069c9c6559b6643af6ada3639edb98fcc3"}, + {file = "grimp-3.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:071c7ddf5e5bb7b2fdf79aefdf6e1c237cd81c095d6d0a19620e777e85bf103c"}, + {file = "grimp-3.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e01b7a4419f535b667dfdcb556d3815b52981474f791fb40d72607228389a31"}, + {file = "grimp-3.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c29682f336151d1d018d0c3aa9eeaa35734b970e4593fa396b901edca7ef5c79"}, + {file = "grimp-3.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a5c4fd71f363ea39e8aab0630010ced77a8de9789f27c0acdd0d7e6269d4a8ef"}, + {file = "grimp-3.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:766911e3ba0b13d833fdd03ad1f217523a8a2b2527b5507335f71dca1153183d"}, + {file = "grimp-3.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:154e84a2053e9f858ae48743de23a5ad4eb994007518c29371276f59b8419036"}, + {file = "grimp-3.14-cp311-cp311-win32.whl", hash = "sha256:3189c86c3e73016a1907ee3ba9f7a6ca037e3601ad09e60ce9bf12b88877f812"}, + {file = "grimp-3.14-cp311-cp311-win_amd64.whl", hash = "sha256:201f46a6a4e5ee9dfba4a2f7d043f7deab080d1d84233f4a1aee812678c25307"}, + {file = "grimp-3.14-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ffabc6940301214753bad89ec0bfe275892fa1f64b999e9a101f6cebfc777133"}, + {file = "grimp-3.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:075d9a1c78d607792d0ed8d4d3d7754a621ef04c8a95eaebf634930dc9232bb2"}, + {file = "grimp-3.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06ff52addeb20955a4d6aa097bee910573ffc9ef0d3c8a860844f267ad958156"}, + {file = "grimp-3.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d10e0663e961fcbe8d0f54608854af31f911f164c96a44112d5173050132701f"}, + {file = "grimp-3.14-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ab874d7ddddc7a1291259cf7c31a4e7b5c612e9da2e24c67c0eb1a44a624e67"}, + {file = "grimp-3.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54fec672ec83355636a852177f5a470c964bede0f6730f9ba3c7b5c8419c9eab"}, + {file = "grimp-3.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9e221b5e8070a916c780e88c877fee2a61c95a76a76a2a076396e459511b0bb"}, + {file = "grimp-3.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eea6b495f9b4a8d82f5ce544921e76d0d12017f5d1ac3a3bd2f5ac88ab055b1c"}, + {file = "grimp-3.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:655e8d3f79cd99bb859e09c9dd633515150e9d850879ca71417d5ac31809b745"}, + {file = "grimp-3.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a14f10b1b71c6c37647a76e6a49c226509648107abc0f48c1e3ecd158ba05531"}, + {file = "grimp-3.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:81685111ee24d3e25f8ed9e77ed00b92b58b2414e1a1c2937236026900972744"}, + {file = "grimp-3.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce8352a8ea0e27b143136ea086582fc6653419aa8a7c15e28ed08c898c42b185"}, + {file = "grimp-3.14-cp312-cp312-win32.whl", hash = "sha256:3fc0f98b3c60d88e9ffa08faff3200f36604930972f8b29155f323b76ea25a06"}, + {file = "grimp-3.14-cp312-cp312-win_amd64.whl", hash = "sha256:6bca77d1d50c8dc402c96af21f4e28e2f1e9938eeabd7417592a22bd83cde3c3"}, + {file = "grimp-3.14-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af8a625554beea84530b98cc471902155b5fc042b42dc47ec846fa3e32b0c615"}, + {file = "grimp-3.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0dd1942ffb419ad342f76b0c3d3d2d7f312b264ddc578179d13ce8d5acec1167"}, + {file = "grimp-3.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:537f784ce9b4acf8657f0b9714ab69a6c72ffa752eccc38a5a85506103b1a194"}, + {file = "grimp-3.14-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78ab18c08770aa005bef67b873bc3946d33f65727e9f3e508155093db5fa57d6"}, + {file = "grimp-3.14-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28ca58728c27e7292c99f964e6ece9295c2f9cfdefc37c18dea0679c783ffb6f"}, + {file = "grimp-3.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b5577de29c6c5ae6e08d4ca0ac361b45dba323aa145796e6b320a6ea35414b7"}, + {file = "grimp-3.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d7d1f9f42306f455abcec34db877e4887ff15f2777a43491f7ccbd6936c449b"}, + {file = "grimp-3.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39bd5c9b7cef59ee30a05535e9cb4cbf45a3c503f22edce34d0aa79362a311a9"}, + {file = "grimp-3.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7fec3116b4f780a1bc54176b19e6b9f2e36e2ef3164b8fc840660566af35df88"}, + {file = "grimp-3.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0233a35a5bbb23688d63e1736b54415fa9994ace8dfeb7de8514ed9dee212968"}, + {file = "grimp-3.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e46b2fef0f1da7e7e2f8129eb93c7e79db716ff7810140a22ce5504e10ed86df"}, + {file = "grimp-3.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3e6d9b50623ee1c3d2a1927ec3f5d408995ea1f92f3e91ed996c908bb40e856f"}, + {file = "grimp-3.14-cp313-cp313-win32.whl", hash = "sha256:fd57c56f5833c99320ec77e8ba5508d56f6fb48ec8032a942f7931cc6ebb80ce"}, + {file = "grimp-3.14-cp313-cp313-win_amd64.whl", hash = "sha256:173307cf881a126fe5120b7bbec7d54384002e3c83dcd8c4df6ce7f0fee07c53"}, + {file = "grimp-3.14-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebe29f8f13fbd7c314908ed535183a36e6db71839355b04869b27f23c58fa082"}, + {file = "grimp-3.14-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:073d285b00100153fd86064c7726bb1b6d610df1356d33bb42d3fd8809cb6e72"}, + {file = "grimp-3.14-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6d6efc37e1728bbfcd881b89467be5f7b046292597b3ebe5f8e44e89ea8b6cb"}, + {file = "grimp-3.14-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5337d65d81960b712574c41e85b480d4480bbb5c6f547c94e634f6c60d730889"}, + {file = "grimp-3.14-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:84a7fea63e352b325daa89b0b7297db411b7f0036f8d710c32f8e5090e1fc3ca"}, + {file = "grimp-3.14-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d0b19a3726377165fe1f7184a8af317734d80d32b371b6c5578747867ab53c0b"}, + {file = "grimp-3.14-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9caa4991f530750f88474a3f5ecf6ef9f0d064034889d92db00cfb4ecb78aa24"}, + {file = "grimp-3.14-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1876efc119b99332a5cc2b08a6bdaada2f0ad94b596f0372a497e2aa8bda4d94"}, + {file = "grimp-3.14-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3ccf03e65864d6bc7bf1c003c319f5330a7627b3677f31143f11691a088464c2"}, + {file = "grimp-3.14-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9ecd58fa58a270e7523f8bec9e6452f4fdb9c21e4cd370640829f1e43fa87a69"}, + {file = "grimp-3.14-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d75d1f8f7944978b39b08d870315174f1ffcd5123be6ccff8ce90467ace648a"}, + {file = "grimp-3.14-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6f70bbb1dd6055d08d29e39a78a11c4118c1778b39d17cd8271e18e213524ca7"}, + {file = "grimp-3.14-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f21b7c003626c902669dc26ede83a91220cf0a81b51b27128370998c2f247b4"}, + {file = "grimp-3.14-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80d9f056415c936b45561310296374c4319b5df0003da802c84d2830a103792a"}, + {file = "grimp-3.14-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0332963cd63a45863775d4237e59dedf95455e0a1ea50c356be23100c5fc1d7c"}, + {file = "grimp-3.14-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4144350d074f2058fe7c89230a26b34296b161f085b0471a692cb2fe27036f"}, + {file = "grimp-3.14-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e148e67975e92f90a8435b1b4c02180b9a3f3d725b7a188ba63793f1b1e445a0"}, + {file = "grimp-3.14-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1093f7770cb5f3ca6f99fb152f9c949381cc0b078dfdfe598c8ab99abaccda3b"}, + {file = "grimp-3.14-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a213f45ec69e9c2b28ffd3ba5ab12cc9859da17083ba4dc39317f2083b618111"}, + {file = "grimp-3.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f003ac3f226d2437a49af0b6036f26edba57f8a32d329275dbde1b2b2a00a56"}, + {file = "grimp-3.14-cp314-cp314-win32.whl", hash = "sha256:eec81be65a18f4b2af014b1e97296cc9ee20d1115529bf70dd7e06f457eac30b"}, + {file = "grimp-3.14-cp314-cp314-win_amd64.whl", hash = "sha256:cd3bab6164f1d5e313678f0ab4bf45955afe7f5bdb0f2f481014aa9cca7e81ba"}, + {file = "grimp-3.14-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b1df33de479be4d620f69633d1876858a8e64a79c07907d47cf3aaf896af057"}, + {file = "grimp-3.14-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07096d4402e9d5a2c59c402ea3d601f4b7f99025f5e32f077468846fc8d3821b"}, + {file = "grimp-3.14-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:712bc28f46b354316af50c469c77953ba3d6cb4166a62b8fb086436a8b05d301"}, + {file = "grimp-3.14-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abe2bbef1cf8e27df636c02f60184319f138dee4f3a949405c21a4b491980397"}, + {file = "grimp-3.14-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2f9ae3fabb7a7a8468ddc96acc84ecabd84f168e7ca508ee94d8f32ea9bd5de2"}, + {file = "grimp-3.14-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:efaf11ea73f7f12d847c54a5d6edcbe919e0369dce2d1aabae6c50792e16f816"}, + {file = "grimp-3.14-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e089c9ab8aa755ff5af88c55891727783b4eb6b228e7bdf278e17209d954aa1e"}, + {file = "grimp-3.14-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a424ad14d5deb56721ac24ab939747f72ab3d378d42e7d1f038317d33b052b77"}, + {file = "grimp-3.14-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1d4f96c0159b33647295ad36683fe7be55fa620de6e54e970c913cb88d0a5a6"}, + {file = "grimp-3.14-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e715f78fda0019b493459f97efc48462912b4c5b5d261215d94c05115511d311"}, + {file = "grimp-3.14-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d0a885b04edbe908cd6f2f8cb0999dd2a348091d241bd9842f9ea593fabdce5"}, + {file = "grimp-3.14-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6995b20574313ba66b73d288f431af24b9d23d60c861e8f5cbf0d0e26ad9c49"}, + {file = "grimp-3.14-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d2a170deb9f4790221dcde8c47e60be7fcd52999062241ac944ce556efa1d24d"}, + {file = "grimp-3.14-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:1d4a28e2545a83c853a6357ccf4a5105e3f74419a75312b5ebaf0435085cd938"}, + {file = "grimp-3.14-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9aa74d848c083725add12e0e6d42a01ddfd8ee84e9504ad7254204985e3c5c92"}, + {file = "grimp-3.14-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:acf0acedaf105c8d3747abf073c6a2dd1379bafcb5807926fd6d5fe4b0980698"}, + {file = "grimp-3.14-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c8a8aab9b4310a7e69d7d845cac21cf14563aa0520ea322b948eadeae56d303"}, + {file = "grimp-3.14-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d781943b27e5875a41c8f9cfc80f8f0a349f864379192b8c3faa0e6a22593313"}, + {file = "grimp-3.14-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9630d4633607aff94d0ac84b9c64fef1382cdb05b00d9acbde47f8745e264871"}, + {file = "grimp-3.14-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cb00e1bcca583668554a8e9e1e4229a1d11b0620969310aae40148829ff6a32"}, + {file = "grimp-3.14-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3389da4ceaaa7f7de24a668c0afc307a9f95997bd90f81ec359a828a9bd1d270"}, + {file = "grimp-3.14-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd7a32970ef97e42d4e7369397c7795287d84a736d788ccb90b6c14f0561d975"}, + {file = "grimp-3.14-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:fd1278623fa09f62abc0fd8a6500f31b421a1fd479980f44c2926020a0becf02"}, + {file = "grimp-3.14-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:9cfa52c89333d3d8fe9dc782529e888270d060231c3783e036d424044671dde0"}, + {file = "grimp-3.14-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:48a5be4a12fca6587e6885b4fc13b9e242ab8bf874519292f0f13814aecf52cc"}, + {file = "grimp-3.14-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3fcc332466783a12a42cd317fd344c30fe734ba4fa2362efff132dc3f8d36da7"}, + {file = "grimp-3.14.tar.gz", hash = "sha256:645fbd835983901042dae4e1b24fde3a89bf7ac152f9272dd17a97e55cb4f871"}, ] [package.dependencies] @@ -1254,14 +1297,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "humanize" -version = "4.14.0" +version = "4.15.0" description = "Python humanize utilities" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "humanize-4.14.0-py3-none-any.whl", hash = "sha256:d57701248d040ad456092820e6fde56c930f17749956ac47f4f655c0c547bfff"}, - {file = "humanize-4.14.0.tar.gz", hash = "sha256:2fa092705ea640d605c435b1ca82b2866a1b601cdf96f076d70b79a855eba90d"}, + {file = "humanize-4.15.0-py3-none-any.whl", hash = "sha256:b1186eb9f5a9749cd9cb8565aee77919dd7c8d076161cf44d70e59e3301e1769"}, + {file = "humanize-4.15.0.tar.gz", hash = "sha256:1dd098483eb1c7ee8e32eb2e99ad1910baefa4b75c3aff3a82f4d78688993b10"}, ] [package.extras] @@ -1269,34 +1312,34 @@ tests = ["freezegun", "pytest", "pytest-cov"] [[package]] name = "id" -version = "1.5.0" +version = "1.6.1" description = "A tool for generating OIDC identities" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"}, - {file = "id-1.5.0.tar.gz", hash = "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d"}, + {file = "id-1.6.1-py3-none-any.whl", hash = "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca"}, + {file = "id-1.6.1.tar.gz", hash = "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069"}, ] [package.dependencies] -requests = "*" +urllib3 = ">=2,<3" [package.extras] dev = ["build", "bump (>=1.3.2)", "id[lint,test]"] -lint = ["bandit", "interrogate", "mypy", "ruff (<0.8.2)", "types-requests"] +lint = ["bandit", "interrogate", "mypy", "ruff (<0.14.15)"] test = ["coverage[toml]", "pretend", "pytest", "pytest-cov"] [[package]] name = "identify" -version = "2.6.15" +version = "2.6.16" description = "File identification library for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757"}, - {file = "identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf"}, + {file = "identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0"}, + {file = "identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980"}, ] [package.extras] @@ -1343,34 +1386,36 @@ files = [ [[package]] name = "import-linter" -version = "2.7" -description = "Enforces rules for the imports within and between Python packages." +version = "2.10" +description = "Lint your Python architecture" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "import_linter-2.7-py3-none-any.whl", hash = "sha256:be03bbd467b3f0b4535fb3ee12e07995d9837864b307df2e78888364e0ba012d"}, - {file = "import_linter-2.7.tar.gz", hash = "sha256:7bea754fac9cde54182c81eeb48f649eea20b865219c39f7ac2abd23775d07d2"}, + {file = "import_linter-2.10-py3-none-any.whl", hash = "sha256:cc2ddd7ec0145cbf83f3b25391d2a5dbbf138382aaf80708612497fa6ebc8f60"}, + {file = "import_linter-2.10.tar.gz", hash = "sha256:c6a5057d2dbd32e1854c4d6b60e90dfad459b7ab5356230486d8521f25872963"}, ] [package.dependencies] click = ">=6" -grimp = "3.13" +fastapi = "*" +grimp = ">=3.14" rich = ">=14.2.0" tomli = {version = ">=1.2.1", markers = "python_version < \"3.11\""} typing-extensions = ">=3.10.0.0" +uvicorn = "*" [[package]] name = "importlib-metadata" -version = "8.7.0" +version = "8.7.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version <= \"3.11\"" files = [ - {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, - {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, + {file = "importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151"}, + {file = "importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb"}, ] [package.dependencies] @@ -1380,10 +1425,10 @@ zipp = ">=3.20" check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] +enabler = ["pytest-enabler (>=3.4)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] +test = ["flufl.flake8", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "importlib-resources" @@ -1419,14 +1464,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] @@ -1455,35 +1500,39 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena [[package]] name = "jaraco-context" -version = "6.0.1" +version = "6.1.0" description = "Useful decorators and context managers" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ - {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, - {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, + {file = "jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda"}, + {file = "jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f"}, ] [package.dependencies] "backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +enabler = ["pytest-enabler (>=3.4)"] +test = ["jaraco.test (>=5.6.0)", "portend", "pytest (>=6,!=8.1.*)"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "jaraco-functools" -version = "4.3.0" +version = "4.4.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ - {file = "jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8"}, - {file = "jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294"}, + {file = "jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176"}, + {file = "jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb"}, ] [package.dependencies] @@ -1493,9 +1542,9 @@ more_itertools = "*" check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] +enabler = ["pytest-enabler (>=3.4)"] test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] -type = ["pytest-mypy"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "jeepney" @@ -1578,6 +1627,107 @@ enabler = ["pytest-enabler (>=3.4)"] test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] type = ["pygobject-stubs", "pytest-mypy (>=1.0.1)", "shtab", "types-pywin32"] +[[package]] +name = "librt" +version = "0.8.0" +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"}, +] + [[package]] name = "license-expression" version = "30.4.4" @@ -1850,53 +2000,54 @@ files = [ [[package]] name = "mypy" -version = "1.18.2" +version = "1.19.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c"}, - {file = "mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e"}, - {file = "mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b"}, - {file = "mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66"}, - {file = "mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428"}, - {file = "mypy-1.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed"}, - {file = "mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f"}, - {file = "mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341"}, - {file = "mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d"}, - {file = "mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86"}, - {file = "mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37"}, - {file = "mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8"}, - {file = "mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34"}, - {file = "mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764"}, - {file = "mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893"}, - {file = "mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914"}, - {file = "mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8"}, - {file = "mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074"}, - {file = "mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc"}, - {file = "mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e"}, - {file = "mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986"}, - {file = "mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d"}, - {file = "mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba"}, - {file = "mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544"}, - {file = "mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce"}, - {file = "mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d"}, - {file = "mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c"}, - {file = "mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb"}, - {file = "mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075"}, - {file = "mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf"}, - {file = "mypy-1.18.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25a9c8fb67b00599f839cf472713f54249a62efd53a54b565eb61956a7e3296b"}, - {file = "mypy-1.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2b9c7e284ee20e7598d6f42e13ca40b4928e6957ed6813d1ab6348aa3f47133"}, - {file = "mypy-1.18.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6985ed057513e344e43a26cc1cd815c7a94602fb6a3130a34798625bc2f07b6"}, - {file = "mypy-1.18.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f27105f1525ec024b5c630c0b9f36d5c1cc4d447d61fe51ff4bd60633f47ac"}, - {file = "mypy-1.18.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:030c52d0ea8144e721e49b1f68391e39553d7451f0c3f8a7565b59e19fcb608b"}, - {file = "mypy-1.18.2-cp39-cp39-win_amd64.whl", hash = "sha256:aa5e07ac1a60a253445797e42b8b2963c9675563a94f11291ab40718b016a7a0"}, - {file = "mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e"}, - {file = "mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b"}, -] - -[package.dependencies] + {file = "mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec"}, + {file = "mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b"}, + {file = "mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6"}, + {file = "mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74"}, + {file = "mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1"}, + {file = "mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac"}, + {file = "mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288"}, + {file = "mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab"}, + {file = "mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6"}, + {file = "mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331"}, + {file = "mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925"}, + {file = "mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042"}, + {file = "mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1"}, + {file = "mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e"}, + {file = "mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2"}, + {file = "mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8"}, + {file = "mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a"}, + {file = "mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13"}, + {file = "mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250"}, + {file = "mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b"}, + {file = "mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e"}, + {file = "mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef"}, + {file = "mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75"}, + {file = "mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd"}, + {file = "mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1"}, + {file = "mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718"}, + {file = "mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b"}, + {file = "mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045"}, + {file = "mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957"}, + {file = "mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f"}, + {file = "mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3"}, + {file = "mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a"}, + {file = "mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67"}, + {file = "mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e"}, + {file = "mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376"}, + {file = "mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24"}, + {file = "mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247"}, + {file = "mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba"}, +] + +[package.dependencies] +librt = {version = ">=0.6.2", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" pathspec = ">=0.9.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -1966,62 +2117,63 @@ icu = ["PyICU (>=1.0.0)"] [[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]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["dev"] files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, + {file = "nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827"}, + {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, ] [[package]] name = "nox" -version = "2025.11.12" +version = "2026.2.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "nox-2025.11.12-py3-none-any.whl", hash = "sha256:707171f9f63bc685da9d00edd8c2ceec8405b8e38b5fb4e46114a860070ef0ff"}, - {file = "nox-2025.11.12.tar.gz", hash = "sha256:3d317f9e61f49d6bde39cf2f59695bb4e1722960457eee3ae19dacfe03c07259"}, + {file = "nox-2026.2.9-py3-none-any.whl", hash = "sha256:1b7143bc8ecdf25f2353201326152c5303ae4ae56ca097b1fb6179ad75164c47"}, + {file = "nox-2026.2.9.tar.gz", hash = "sha256:1bc8a202ee8cd69be7aaada63b2a7019126899a06fc930a7aee75585bf8ee41b"}, ] [package.dependencies] @@ -2030,7 +2182,7 @@ attrs = ">=24.1" colorlog = ">=2.6.1,<7" dependency-groups = ">=1.1" humanize = ">=4" -packaging = {version = ">=21", markers = "python_version >= \"3.10\""} +packaging = ">=22" tomli = {version = ">=1.1", markers = "python_version < \"3.11\""} virtualenv = {version = ">=20.15", markers = "python_version >= \"3.10\""} @@ -2041,14 +2193,14 @@ uv = ["uv (>=0.1.6)"] [[package]] name = "openapi-python-client" -version = "0.25.3" +version = "0.28.2" description = "Generate modern Python clients from OpenAPI" optional = false -python-versions = "<4.0,>=3.9" +python-versions = "<4.0,>=3.10" groups = ["dev"] files = [ - {file = "openapi_python_client-0.25.3-py3-none-any.whl", hash = "sha256:008e4c5f3079f312c135b55b142eb9616eafbd739ad6d5f8e95add726d1a02f2"}, - {file = "openapi_python_client-0.25.3.tar.gz", hash = "sha256:cafc6b5aebd0c55fe7be4d400b24d3b107f7ec64923b8117ef8aa7ceb2a918a4"}, + {file = "openapi_python_client-0.28.2-py3-none-any.whl", hash = "sha256:0b6b84114af49ca672a57ae4421db9b2b09f55304a525731b91cf9d80e9313e5"}, + {file = "openapi_python_client-0.28.2.tar.gz", hash = "sha256:3699a7138fae3d89ce7f27922a985562e88fe790171db5626bfc7b4ae4cd4c31"}, ] [package.dependencies] @@ -2058,11 +2210,10 @@ httpx = ">=0.23.0,<0.29.0" jinja2 = ">=3.0.0,<4.0.0" pydantic = ">=2.10,<3.0.0" python-dateutil = ">=2.8.1,<3.0.0" -ruamel-yaml = ">=0.18.6,<0.19.0" -ruff = ">=0.2,<0.13" +ruamel-yaml = ">=0.18.6,<0.20.0" +ruff = ">=0.2" shellingham = ">=1.3.2,<2.0.0" -typer = ">0.6,<0.17" -typing-extensions = ">=4.8.0,<5.0.0" +typer = ">0.16,<0.24" [[package]] name = "packageurl-python" @@ -2096,26 +2247,32 @@ files = [ [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.4" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, + {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, ] +[package.extras] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + [[package]] name = "pip" -version = "25.3" +version = "26.0.1" description = "The PyPA recommended tool for installing Python packages." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pip-25.3-py3-none-any.whl", hash = "sha256:9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd"}, - {file = "pip-25.3.tar.gz", hash = "sha256:8d0538dbbd7babbd207f261ed969c65de439f6bc9e5dbd3b3b9a77f25d95f343"}, + {file = "pip-26.0.1-py3-none-any.whl", hash = "sha256:bdb1b08f4274833d62c1aa29e20907365a2ceb950410df15fc9521bad440122b"}, + {file = "pip-26.0.1.tar.gz", hash = "sha256:c4037d8a277c89b320abe636d59f91e6d0922d08a05b60e85e53b296613346d8"}, ] [[package]] @@ -2135,43 +2292,45 @@ pip = "*" [[package]] name = "pip-audit" -version = "2.9.0" +version = "2.10.0" description = "A tool for scanning Python environments for known vulnerabilities" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pip_audit-2.9.0-py3-none-any.whl", hash = "sha256:348b16e60895749a0839875d7cc27ebd692e1584ebe5d5cb145941c8e25a80bd"}, - {file = "pip_audit-2.9.0.tar.gz", hash = "sha256:0b998410b58339d7a231e5aa004326a294e4c7c6295289cdc9d5e1ef07b1f44d"}, + {file = "pip_audit-2.10.0-py3-none-any.whl", hash = "sha256:16e02093872fac97580303f0848fa3ad64f7ecf600736ea7835a2b24de49613f"}, + {file = "pip_audit-2.10.0.tar.gz", hash = "sha256:427ea5bf61d1d06b98b1ae29b7feacc00288a2eced52c9c58ceed5253ef6c2a4"}, ] [package.dependencies] CacheControl = {version = ">=0.13.0", extras = ["filecache"]} -cyclonedx-python-lib = ">=5,<10" +cyclonedx-python-lib = ">=5,<12" packaging = ">=23.0.0" pip-api = ">=0.0.28" pip-requirements-parser = ">=32.0.0" platformdirs = ">=4.2.0" requests = ">=2.31.0" rich = ">=12.4" -toml = ">=0.10" +tomli = ">=2.2.1" +tomli-w = ">=1.2.0" [package.extras] +cov = ["coverage[toml] (>=7.0,!=7.3.3,<8.0)"] dev = ["build", "pip-audit[doc,lint,test]"] doc = ["pdoc"] -lint = ["interrogate (>=1.6,<2.0)", "mypy", "ruff (>=0.9,<1.0)", "types-requests", "types-toml"] -test = ["coverage[toml] (>=7.0,!=7.3.3,<8.0)", "pretend", "pytest", "pytest-cov"] +lint = ["interrogate (>=1.6,<2.0)", "mypy", "ruff (>=0.11)", "types-requests", "types-toml"] +test = ["pip-audit[cov]", "pretend", "pytest"] [[package]] name = "pip-licenses" -version = "5.5.0" +version = "5.5.1" description = "Dump the software license list of Python packages installed with pip." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pip_licenses-5.5.0-py3-none-any.whl", hash = "sha256:ae1869436d13ee487088d29e71fc5821950062ad25ec28b6a1a443e0add6d8e8"}, - {file = "pip_licenses-5.5.0.tar.gz", hash = "sha256:2473e7afd02a0c21460758f70fd2bb3b3c080c5150713dd33baa9493dc1563a5"}, + {file = "pip_licenses-5.5.1-py3-none-any.whl", hash = "sha256:ed5e229a93760e529cfa7edaec6630b5a2cd3874c1bddb8019e5f18a723fdead"}, + {file = "pip_licenses-5.5.1.tar.gz", hash = "sha256:7df370e6e5024a3f7449abf8e4321ef868ba9a795698ad24ab6851f3e7fc65a7"}, ] [package.dependencies] @@ -2203,21 +2362,16 @@ testing = ["aboutcode-toolkit (>=6.0.0)", "black", "pytest (>=6,!=7.0.0)", "pyte [[package]] name = "platformdirs" -version = "4.5.0" +version = "4.9.1" 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.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"}, - {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"}, + {file = "platformdirs-4.9.1-py3-none-any.whl", hash = "sha256:61d8b967d34791c162d30d60737369cbbd77debad5b981c4bfda1842e71e0d66"}, + {file = "platformdirs-4.9.1.tar.gz", hash = "sha256:f310f16e89c4e29117805d8328f7c10876eeff36c94eac879532812110f7d39f"}, ] -[package.extras] -docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] -type = ["mypy (>=1.18.2)"] - [[package]] name = "pluggy" version = "1.6.0" @@ -2236,14 +2390,14 @@ testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "4.5.0" +version = "4.5.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pre_commit-4.5.0-py2.py3-none-any.whl", hash = "sha256:25e2ce09595174d9c97860a95609f9f852c0614ba602de3561e267547f2335e1"}, - {file = "pre_commit-4.5.0.tar.gz", hash = "sha256:dc5a065e932b19fc1d4c653c6939068fe54325af8e741e74e88db4d28a4dd66b"}, + {file = "pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77"}, + {file = "pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61"}, ] [package.dependencies] @@ -2286,29 +2440,17 @@ files = [ [package.dependencies] defusedxml = ">=0.7.1,<0.8.0" -[[package]] -name = "pyasn1" -version = "0.6.1" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, - {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, -] - [[package]] name = "pycparser" -version = "2.23" +version = "3.0" description = "C parser in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ - {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, - {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, + {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, + {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] [[package]] @@ -2469,31 +2611,30 @@ typing-extensions = ">=4.14.1" [[package]] name = "pyexasol" -version = "1.3.0" +version = "2.0.0" description = "Exasol python driver with extra features" optional = false -python-versions = "<4,>=3.9.2" +python-versions = "<3.15,>=3.10" groups = ["dev"] files = [ - {file = "pyexasol-1.3.0-py3-none-any.whl", hash = "sha256:0bb076346dcb33b36031a2633d6e7b9982f8411b95e770ad8017801ee438a689"}, - {file = "pyexasol-1.3.0.tar.gz", hash = "sha256:44e5be7245b92343634b0b66a81b62be2fb4b1ca485d4e0f86c0583d5a2cf6b5"}, + {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 = "*" -rsa = "*" +packaging = ">=24.1.0,<26.0.0" websocket-client = ">=1.0.1,<1.9.0" [package.extras] -all = ["orjson (>=3.6)", "pandas (>=2,<3)", "polars (>=1.10,<2.0)", "pproxy", "pyarrow (>=21.0.0,<22.0.0)", "python-rapidjson", "ujson"] +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)"] -pandas = ["pandas (>=2,<3)"] -polars = ["polars (>=1.10,<2.0)"] -pyarrow = ["pyarrow (>=21.0.0,<22.0.0)"] -rapidjson = ["python-rapidjson"] -ujson = ["ujson"] +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" @@ -2539,14 +2680,14 @@ pygments = "*" [[package]] name = "pylint" -version = "4.0.3" +version = "4.0.4" description = "python code static checker" optional = false python-versions = ">=3.10.0" groups = ["dev"] files = [ - {file = "pylint-4.0.3-py3-none-any.whl", hash = "sha256:896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a"}, - {file = "pylint-4.0.3.tar.gz", hash = "sha256:a427fe76e0e5355e9fb9b604fd106c419cafb395886ba7f3cebebb03f30e081d"}, + {file = "pylint-4.0.4-py3-none-any.whl", hash = "sha256:63e06a37d5922555ee2c20963eb42559918c20bd2b21244e4ef426e7c43b92e0"}, + {file = "pylint-4.0.4.tar.gz", hash = "sha256:d9b71674e19b1c36d79265b5887bf8e55278cbe236c9e95d22dc82cf044fdbd2"}, ] [package.dependencies] @@ -2569,14 +2710,14 @@ testutils = ["gitpython (>3)"] [[package]] name = "pyparsing" -version = "3.2.5" +version = "3.3.2" description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e"}, - {file = "pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6"}, + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, ] [package.extras] @@ -2584,14 +2725,14 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pysonar" -version = "1.2.1.3951" +version = "1.3.0.4086" description = "Sonar Scanner for the Python Ecosystem" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pysonar-1.2.1.3951-py3-none-any.whl", hash = "sha256:d157f53faa3d589de176e98413568a69062c20f135adb8475af29566fbc334d9"}, - {file = "pysonar-1.2.1.3951.tar.gz", hash = "sha256:13dde0358f3a8db00e0bfca1955314f2f8c8a532567bf8bd38d91d4d27afb5e4"}, + {file = "pysonar-1.3.0.4086-py3-none-any.whl", hash = "sha256:64428c7d534c48066fcf6a13f9076a2477e717a930325fb18ad7375e10b0adee"}, + {file = "pysonar-1.3.0.4086.tar.gz", hash = "sha256:b05f887503de37d13bfec799a3b1d52fea084a4fd2ff06fdd2d2c8f9b73a4634"}, ] [package.dependencies] @@ -2659,14 +2800,54 @@ six = ">=1.5" [[package]] name = "pytokens" -version = "0.3.0" +version = "0.4.1" description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3"}, - {file = "pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a"}, + {file = "pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c"}, + {file = "pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7"}, + {file = "pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2"}, + {file = "pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d"}, + {file = "pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16"}, + {file = "pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6"}, + {file = "pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1"}, + {file = "pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9"}, + {file = "pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68"}, + {file = "pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1"}, + {file = "pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4"}, + {file = "pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78"}, + {file = "pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d"}, + {file = "pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324"}, + {file = "pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9"}, + {file = "pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975"}, + {file = "pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a"}, + {file = "pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918"}, + {file = "pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1"}, + {file = "pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6"}, + {file = "pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037"}, + {file = "pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db"}, + {file = "pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1"}, + {file = "pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a"}, + {file = "pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de"}, + {file = "pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a"}, ] [package.extras] @@ -2877,14 +3058,14 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "14.2.0" +version = "14.3.2" 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.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, - {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, + {file = "rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69"}, + {file = "rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8"}, ] [package.dependencies] @@ -2895,20 +3076,17 @@ pygments = ">=2.13.0,<3.0.0" jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] -name = "rsa" -version = "4.9.1" -description = "Pure-Python RSA implementation" +name = "roman" +version = "5.2" +description = "Integer to Roman numerals converter" optional = false -python-versions = "<4,>=3.6" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, - {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, + {file = "roman-5.2-py3-none-any.whl", hash = "sha256:89d3b47400388806d06ff77ea77c79ab080bc127820dea6bf34e1f1c1b8e676e"}, + {file = "roman-5.2.tar.gz", hash = "sha256:275fe9f46290f7d0ffaea1c33251b92b8e463ace23660508ceef522e7587cb6f"}, ] -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "ruamel-yaml" version = "0.18.16" @@ -3002,31 +3180,31 @@ files = [ [[package]] name = "ruff" -version = "0.12.12" +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.12.12-py3-none-linux_armv6l.whl", hash = "sha256:de1c4b916d98ab289818e55ce481e2cacfaad7710b01d1f990c497edf217dafc"}, - {file = "ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7acd6045e87fac75a0b0cdedacf9ab3e1ad9d929d149785903cff9bb69ad9727"}, - {file = "ruff-0.12.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:abf4073688d7d6da16611f2f126be86523a8ec4343d15d276c614bda8ec44edb"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:968e77094b1d7a576992ac078557d1439df678a34c6fe02fd979f973af167577"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42a67d16e5b1ffc6d21c5f67851e0e769517fb57a8ebad1d0781b30888aa704e"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b216ec0a0674e4b1214dcc998a5088e54eaf39417327b19ffefba1c4a1e4971e"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:59f909c0fdd8f1dcdbfed0b9569b8bf428cf144bec87d9de298dcd4723f5bee8"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ac93d87047e765336f0c18eacad51dad0c1c33c9df7484c40f98e1d773876f5"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01543c137fd3650d322922e8b14cc133b8ea734617c4891c5a9fccf4bfc9aa92"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afc2fa864197634e549d87fb1e7b6feb01df0a80fd510d6489e1ce8c0b1cc45"}, - {file = "ruff-0.12.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0c0945246f5ad776cb8925e36af2438e66188d2b57d9cf2eed2c382c58b371e5"}, - {file = "ruff-0.12.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a0fbafe8c58e37aae28b84a80ba1817f2ea552e9450156018a478bf1fa80f4e4"}, - {file = "ruff-0.12.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b9c456fb2fc8e1282affa932c9e40f5ec31ec9cbb66751a316bd131273b57c23"}, - {file = "ruff-0.12.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f12856123b0ad0147d90b3961f5c90e7427f9acd4b40050705499c98983f489"}, - {file = "ruff-0.12.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:26a1b5a2bf7dd2c47e3b46d077cd9c0fc3b93e6c6cc9ed750bd312ae9dc302ee"}, - {file = "ruff-0.12.12-py3-none-win32.whl", hash = "sha256:173be2bfc142af07a01e3a759aba6f7791aa47acf3604f610b1c36db888df7b1"}, - {file = "ruff-0.12.12-py3-none-win_amd64.whl", hash = "sha256:e99620bf01884e5f38611934c09dd194eb665b0109104acae3ba6102b600fd0d"}, - {file = "ruff-0.12.12-py3-none-win_arm64.whl", hash = "sha256:2a8199cab4ce4d72d158319b63370abf60991495fb733db96cd923a34c52d093"}, - {file = "ruff-0.12.12.tar.gz", hash = "sha256:b86cd3415dbe31b3b46a71c598f4c4b2f550346d1ccf6326b347cc0c8fd063d6"}, + {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]] @@ -3060,14 +3238,14 @@ files = [ [[package]] name = "shibuya" -version = "2025.11.10" +version = "2026.1.9" description = "A clean, responsive, and customizable Sphinx documentation theme with light/dark mode." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "shibuya-2025.11.10-py3-none-any.whl", hash = "sha256:7d9116bcd14977e689c6048232bb42d739832c0dd861dc7be34dfb183edb511e"}, - {file = "shibuya-2025.11.10.tar.gz", hash = "sha256:7a8a2b4ac6c3fb8d2f75a15098458e376f5af33cfff45b21e5816e41dfcc5dd3"}, + {file = "shibuya-2026.1.9-py3-none-any.whl", hash = "sha256:b58a3cc6e5619c71d00fcf0be4a3060c87040c2a62a1b3f1a93a6a41ca8eaf45"}, + {file = "shibuya-2026.1.9.tar.gz", hash = "sha256:b389f10fd9c07b048e940f32d1e1ac096a2d49736389173ac771b37a10b51fdf"}, ] [package.dependencies] @@ -3086,18 +3264,6 @@ files = [ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -groups = ["main", "dev"] -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - [[package]] name = "snowballstemmer" version = "3.0.1" @@ -3124,14 +3290,14 @@ files = [ [[package]] name = "soupsieve" -version = "2.8" +version = "2.8.3" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c"}, - {file = "soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f"}, + {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, + {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, ] [[package]] @@ -3234,6 +3400,7 @@ description = "A sphinx extension for designing beautiful, view size responsive optional = false python-versions = ">=3.9" groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c"}, {file = "sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632"}, @@ -3253,6 +3420,33 @@ theme-pydata = ["pydata-sphinx-theme (>=0.15.2,<0.16.0)"] theme-rtd = ["sphinx-rtd-theme (>=2.0,<3.0)"] theme-sbt = ["sphinx-book-theme (>=1.1,<2.0)"] +[[package]] +name = "sphinx-design" +version = "0.7.0" +description = "A sphinx extension for designing beautiful, view size responsive web components." +optional = false +python-versions = ">=3.11" +groups = ["dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "sphinx_design-0.7.0-py3-none-any.whl", hash = "sha256:f82bf179951d58f55dca78ab3706aeafa496b741a91b1911d371441127d64282"}, + {file = "sphinx_design-0.7.0.tar.gz", hash = "sha256:d2a3f5b19c24b916adb52f97c5f00efab4009ca337812001109084a740ec9b7a"}, +] + +[package.dependencies] +sphinx = ">=7,<10" + +[package.extras] +code-style = ["pre-commit (>=3,<4)"] +rtd = ["myst-parser (>=4,<6)"] +testing = ["defusedxml", "myst-parser (>=4,<6)", "pytest (>=8.3,<9.0)", "pytest-cov", "pytest-regressions"] +testing-no-myst = ["defusedxml", "pytest (>=8.3,<9.0)", "pytest-cov", "pytest-regressions"] +theme-furo = ["furo (>=2024.7.18,<2024.8.0)"] +theme-im = ["sphinx-immaterial (>=0.12.2,<0.13.0)"] +theme-pydata = ["pydata-sphinx-theme (>=0.15.2,<0.16.0)"] +theme-rtd = ["sphinx-rtd-theme (>=2.0,<3.0)"] +theme-sbt = ["sphinx-book-theme (>=1.1,<2.0)"] + [[package]] name = "sphinx-inline-tabs" version = "2023.4.21" @@ -3296,6 +3490,7 @@ description = "Sphinx directive to add unselectable prompt" optional = false python-versions = ">=3.9,<4.0" groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "sphinx_prompt-1.8.0-py3-none-any.whl", hash = "sha256:369ecc633f0711886f9b3a078c83264245be1adf46abeeb9b88b5519e4b51007"}, {file = "sphinx_prompt-1.8.0.tar.gz", hash = "sha256:47482f86fcec29662fdfd23e7c04ef03582714195d01f5d565403320084372ed"}, @@ -3306,6 +3501,29 @@ docutils = "*" pygments = "*" Sphinx = ">=7.0.0,<8.0.0" +[[package]] +name = "sphinx-prompt" +version = "1.10.2" +description = "Sphinx directive to add unselectable prompt" +optional = false +python-versions = ">=3.11" +groups = ["dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "sphinx_prompt-1.10.2-py3-none-any.whl", hash = "sha256:6594337962c4b1498602e6984634bed4a0dc7955852e3cfc255eb0af766ed859"}, + {file = "sphinx_prompt-1.10.2.tar.gz", hash = "sha256:47b592ba75caebd044b0eddf7a5a1b6e0aef6df587b034377cd101a999b686ba"}, +] + +[package.dependencies] +certifi = "*" +docutils = "*" +idna = "*" +jinja2 = "*" +pygments = "*" +requests = ">=2.32.4" +Sphinx = "*" +urllib3 = "*" + [[package]] name = "sphinx-tabs" version = "3.4.5" @@ -3329,14 +3547,14 @@ testing = ["bs4", "coverage", "pygments", "pytest (>=7.1,<8)", "pytest-cov", "py [[package]] name = "sphinx-toolbox" -version = "4.0.0" +version = "4.1.2" description = "Box of handy tools for Sphinx 🧰 📔" optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "sphinx_toolbox-4.0.0-py3-none-any.whl", hash = "sha256:c700937baee505e440d44d46bc47ccd036ec282ae61b04e40342944128721117"}, - {file = "sphinx_toolbox-4.0.0.tar.gz", hash = "sha256:48c31451db2e2d8c71c03939e72a19ef7bc92ca7850a62db63fc7bb8395b6785"}, + {file = "sphinx_toolbox-4.1.2-py3-none-any.whl", hash = "sha256:0438f8342ba1c6c0d6e47207f4eac167adba61742e8c2b1dc9624ff955b7bc89"}, + {file = "sphinx_toolbox-4.1.2.tar.gz", hash = "sha256:c30a4f86c4c29e97adb0eb9337d35f5093cb96a44f49caffcf7d5bc58a88b781"}, ] [package.dependencies] @@ -3349,7 +3567,8 @@ docutils = ">=0.16" domdf-python-tools = ">=2.9.0" filelock = ">=3.8.0" html5lib = ">=1.1" -"ruamel.yaml" = ">=0.16.12" +roman = ">4.0" +"ruamel.yaml" = ">=0.16.12,<=0.18.16" sphinx = ">=3.2.0" sphinx-autodoc-typehints = ">=1.11.1" sphinx-jinja2-compat = ">=0.1.0" @@ -3428,6 +3647,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" @@ -3475,6 +3714,25 @@ files = [ {file = "standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52"}, ] +[[package]] +name = "starlette" +version = "0.52.1" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74"}, + {file = "starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933"}, +] + +[package.dependencies] +anyio = ">=3.6.2,<5" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + [[package]] name = "stevedore" version = "5.6.0" @@ -3584,16 +3842,28 @@ files = [ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] +[[package]] +name = "tomli-w" +version = "1.2.0" +description = "A lil' TOML writer" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90"}, + {file = "tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021"}, +] + [[package]] name = "tomlkit" -version = "0.13.3" +version = "0.14.0" description = "Style preserving TOML library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, - {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, + {file = "tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680"}, + {file = "tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064"}, ] [[package]] @@ -3624,44 +3894,44 @@ keyring = ["keyring (>=21.2.0)"] [[package]] name = "typer" -version = "0.16.1" +version = "0.23.1" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "typer-0.16.1-py3-none-any.whl", hash = "sha256:90ee01cb02d9b8395ae21ee3368421faf21fa138cb2a541ed369c08cec5237c9"}, - {file = "typer-0.16.1.tar.gz", hash = "sha256:d358c65a464a7a90f338e3bb7ff0c74ac081449e53884b12ba658cbd72990614"}, + {file = "typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e"}, + {file = "typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134"}, ] [package.dependencies] +annotated-doc = ">=0.0.2" click = ">=8.0.0" rich = ">=10.11.0" shellingham = ">=1.3.0" -typing-extensions = ">=3.7.4.3" [[package]] name = "types-python-dateutil" -version = "2.9.0.20251115" +version = "2.9.0.20260124" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "types_python_dateutil-2.9.0.20251115-py3-none-any.whl", hash = "sha256:9cf9c1c582019753b8639a081deefd7e044b9fa36bd8217f565c6c4e36ee0624"}, - {file = "types_python_dateutil-2.9.0.20251115.tar.gz", hash = "sha256:8a47f2c3920f52a994056b8786309b43143faa5a64d4cbb2722d6addabdf1a58"}, + {file = "types_python_dateutil-2.9.0.20260124-py3-none-any.whl", hash = "sha256:f802977ae08bf2260142e7ca1ab9d4403772a254409f7bbdf652229997124951"}, + {file = "types_python_dateutil-2.9.0.20260124.tar.gz", hash = "sha256:7d2db9f860820c30e5b8152bfe78dbdf795f7d1c6176057424e8b3fdd1f581af"}, ] [[package]] name = "types-requests" -version = "2.32.4.20250913" +version = "2.32.4.20260107" description = "Typing stubs for requests" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1"}, - {file = "types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d"}, + {file = "types_requests-2.32.4.20260107-py3-none-any.whl", hash = "sha256:b703fe72f8ce5b31ef031264fe9395cac8f46a04661a79f7ed31a80fb308730d"}, + {file = "types_requests-2.32.4.20260107.tar.gz", hash = "sha256:018a11ac158f801bfa84857ddec1650750e393df8a004a8a9ae2a9bec6fcb24f"}, ] [package.dependencies] @@ -3697,37 +3967,57 @@ typing-extensions = ">=4.12.0" [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] + +[[package]] +name = "uvicorn" +version = "0.40.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"}, +] + +[package.dependencies] +click = ">=7.0" +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)"] [[package]] name = "virtualenv" -version = "20.35.4" +version = "20.36.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b"}, - {file = "virtualenv-20.35.4.tar.gz", hash = "sha256:643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c"}, + {file = "virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f"}, + {file = "virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba"}, ] [package.dependencies] distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" +filelock = {version = ">=3.20.1,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} @@ -3737,14 +4027,14 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.6.0" description = "Measures the displayed width of unicode strings in a terminal" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1"}, - {file = "wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605"}, + {file = "wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"}, + {file = "wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"}, ] [[package]] @@ -3799,5 +4089,5 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" -python-versions = ">=3.10.0,<4.0" -content-hash = "506edf6a7095e27187fa713d8f58dbfe5a7d0e931ba47559bb408c339f5275f3" +python-versions = ">=3.10.0,<3.15" +content-hash = "481b7e6125466c0f91e7c93b9d6e6662576213af3f7b63b1223c32b9ce5f81b7" diff --git a/pyproject.toml b/pyproject.toml index ea13d8d4..f6c6d271 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "exasol-saas-api" version = "2.8.0" -requires-python = ">=3.10.0,<4.0" +requires-python = ">=3.10.0,<3.15" description = "API enabling Python applications connecting to Exasol database SaaS instances and using their SaaS services" authors = [ {name="Christoph Kuhnke", email="christoph.kuhnke@exasol.com"}, @@ -47,11 +47,9 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.group.dev.dependencies] pytest = "^7.1.1" pytest-mock = "^3.7.0" -exasol-toolbox = "^1.6.0" -# See https://github.com/exasol/saas-api-python/issues/120 -# for using openapi-python-client version >= 0.26 -openapi-python-client = ">=0.21.5, <0.26" -pyexasol = ">=1.0.0, <2" +exasol-toolbox = "^5.1.1" +openapi-python-client = ">=0.26" +pyexasol = ">=2, <3" toml = "^0.10.2" types-python-dateutil = "^2.9.0.20250516" @@ -63,10 +61,6 @@ testpaths = [ "test" ] -markers = [ - "slow: marks tests as slow (deselect with '-m \"not slow\"')", -] - [tool.coverage.run] relative_files = true source = [ @@ -103,8 +97,7 @@ ignore-paths = [ [[tool.mypy.overrides]] module = [ - "test.conftest.*", - "test.*", + "test.*.conftest.*", ] ignore_errors = true ignore_missing_imports = true @@ -114,11 +107,18 @@ ignore_missing_imports = true max-line-length = 88 max-module-lines = 800 -[tool.poetry.scripts] -tbx = 'exasol.toolbox.tools.tbx:CLI' +[tool.ruff.lint] +extend-ignore = [ + "E", # Syntax errors + "F", # Pyflakes rules (excluding F401) + "UP", # pyupgrade rules + "D", # Docstring rules +] +extend-select = ["F401"] +unfixable = [] [tool.sonar] projectKey = "com.exasol:saas-api-python" hostUrl = "https://sonarcloud.io" organization = "exasol" -exclusions = "exasol/saas/client/openapi/**" \ No newline at end of file +exclusions = "exasol/saas/client/openapi/**" diff --git a/test/integration/conftest.py b/test/integration/conftest.py index 2fc825ef..272ba1bc 100644 --- a/test/integration/conftest.py +++ b/test/integration/conftest.py @@ -1,5 +1,4 @@ import os -from pathlib import Path import pytest diff --git a/test/integration/allowed_ip_test.py b/test/integration/test_allowed_ip.py similarity index 91% rename from test/integration/allowed_ip_test.py rename to test/integration/test_allowed_ip.py index 8b92637b..1aa54720 100644 --- a/test/integration/allowed_ip_test.py +++ b/test/integration/test_allowed_ip.py @@ -1,7 +1,3 @@ -import pytest - - -@pytest.mark.slow def test_lifecycle(api_access): testee = api_access with testee.allowed_ip(ignore_delete_failure=True) as ip: diff --git a/test/integration/connection_test.py b/test/integration/test_connection.py similarity index 97% rename from test/integration/connection_test.py rename to test/integration/test_connection.py index e55cf842..fdb52a46 100644 --- a/test/integration/connection_test.py +++ b/test/integration/test_connection.py @@ -32,7 +32,6 @@ def connect(**kwargs): return connect -@pytest.mark.slow def test_get_connection_params_with_id( pyexasol_connection, operational_saas_database_id, @@ -46,7 +45,6 @@ def test_get_connection_params_with_id( assert result == [(1,)] -@pytest.mark.slow def test_get_connection_params_with_name(pyexasol_connection, database_name): """ This integration test checks that opening a pyexasol connection to a SaaS DB with diff --git a/test/integration/databases_test.py b/test/integration/test_databases.py similarity index 93% rename from test/integration/databases_test.py rename to test/integration/test_databases.py index ec1383f6..65d19381 100644 --- a/test/integration/databases_test.py +++ b/test/integration/test_databases.py @@ -1,3 +1,4 @@ +import logging from datetime import ( datetime, timedelta, @@ -8,11 +9,16 @@ from exasol.saas.client import PROMISING_STATES from exasol.saas.client.api_access import ( - get_connection_params, timestamp_name, ) from exasol.saas.client.openapi.models.exasol_database import ExasolDatabase +LOG = logging.getLogger(__name__) +logging.basicConfig( + level=logging.INFO, + format="[%(levelname)s] %(message)s", +) + @pytest.fixture def local_name(project_short_tag: str | None) -> str: @@ -23,7 +29,6 @@ def local_name(project_short_tag: str | None) -> str: return timestamp_name(project_short_tag) -@pytest.mark.slow def test_lifecycle(api_access, local_name): """ This integration test uses the database created and provided by pytest diff --git a/test/integration/test_placeholder.py b/test/integration/test_placeholder.py deleted file mode 100644 index 1d09f30c..00000000 --- a/test/integration/test_placeholder.py +++ /dev/null @@ -1,4 +0,0 @@ -def test_placeholder(): - """ - Prevent failure when call pytest "-m not slow" test/integration. - """ diff --git a/test/unit/test_api_access.py b/test/unit/test_api_access.py index b4a02167..b39b1c6b 100644 --- a/test/unit/test_api_access.py +++ b/test/unit/test_api_access.py @@ -5,51 +5,38 @@ import pytest from exasol.saas.client.api_access import ( + DatabaseDeleteError, OpenApiAccess, - indicates_retry, timestamp_name, ) -from exasol.saas.client.openapi.errors import UnexpectedStatus +from exasol.saas.client.openapi.models.api_error import ApiError -RETRY_EXCEPTION = UnexpectedStatus( - 400, b"Operation is not allowed:The cluster is not in a proper state!" -) +def response(status_code: int, message: str, spec=None): + return Mock(spec, status=status_code, message=message) -@pytest.mark.parametrize( - "exception, expected", - [ - pytest.param(RuntimeError("bla"), False, id="other_exception"), - pytest.param(UnexpectedStatus(404, b"bla"), False, id="other_status_code"), - pytest.param(UnexpectedStatus(400, b"bla"), False, id="other_message"), - pytest.param(RETRY_EXCEPTION, True, id="indicates_retry"), - ], -) -def test_indicates_retry(exception, expected): - """ - Call function api_access.indicates_retry() with different exceptions - in order to verify if it correctly rates the current exception as - indicating to retry deleting a SaaS database instance. - """ - assert indicates_retry(exception) == expected +def api_error(status_code: int, message: str): + return response(status_code, message, spec=ApiError) -class ApiRunner: - def __init__(self, mocker): - self.api = OpenApiAccess(Mock(), account_id="A1") - self._mocker = mocker - self.mock = None - def mock_delete(self, side_effect): - self.mock = Mock(side_effect=side_effect) - self._mocker.patch( - "exasol.saas.client.api_access." "delete_database.sync_detailed", self.mock - ) +RETRY = api_error( + 400, + "Operation is not allowed:The cluster is not in a proper state!", +) @pytest.fixture -def api_runner(mocker) -> ApiRunner: - return ApiRunner(mocker) +def api_mock(): + return OpenApiAccess(Mock(), account_id="A1") + + +def delete_mock(monkeypatch, side_effect) -> Mock: + from exasol.saas.client.api_access import delete_database as api + + mock = Mock(side_effect=side_effect) + monkeypatch.setattr(api, "sync", mock) + return mock @pytest.fixture @@ -68,39 +55,39 @@ def retry_timings() -> dict[str, timedelta]: @pytest.mark.parametrize( "side_effect", [ - pytest.param([UnexpectedStatus(400, b"bla")], id="immediate_failure"), pytest.param( - [RETRY_EXCEPTION, RETRY_EXCEPTION, UnexpectedStatus(400, b"bla")], + [api_error(400, "bla")], + id="immediate_failure", + ), + pytest.param( + [RETRY, RETRY, api_error(400, "bla")], id="failure_after_retry", ), pytest.param( - [RETRY_EXCEPTION for _ in range(4)], + [RETRY for _ in range(4)], id="timeout_after_too_many_retries", ), ], ) -def test_delete_fail(side_effect, api_runner, retry_timings) -> None: - api_runner.mock_delete(side_effect) - with pytest.raises(UnexpectedStatus): - api_runner.api.delete_database("123", **retry_timings) +def test_delete_fail(api_mock, monkeypatch, side_effect, retry_timings) -> None: + delete_mock(monkeypatch, side_effect) + with pytest.raises(DatabaseDeleteError): + api_mock.delete_database("123", **retry_timings) @pytest.mark.parametrize( "side_effect, ignore_failures, expected_log_message", [ pytest.param( - [RETRY_EXCEPTION, None], + [RETRY, response(200, "")], False, "", id="success_after_retry", ), pytest.param( - [UnexpectedStatus(400, b"bla")], + [api_error(400, "bla")], True, - ( - "Ignoring failure when deleting database with" - " ID 123: Unexpected status code: 400" - ), + "Ignoring delete failure: HTTP 400:", id="success_by_ignoring_failures", ), ], @@ -109,18 +96,21 @@ def test_delete_success( side_effect, ignore_failures, expected_log_message, - api_runner, + api_mock, + monkeypatch, retry_timings, caplog, ) -> None: - api_runner.mock_delete(side_effect) + delete = delete_mock(monkeypatch, side_effect) with not_raises(Exception): - api_runner.api.delete_database( + api_mock.delete_database( database_id="123", **retry_timings, ignore_failures=ignore_failures, ) - assert api_runner.mock.called + assert delete.called + # if expected_log_message not in caplog.text: + # print(f"\nactual: {caplog.text}\n expected: {expected_log_message}") assert expected_log_message in caplog.text diff --git a/test/unit/test_ensure_type.py b/test/unit/test_ensure_type.py new file mode 100644 index 00000000..959c12f3 --- /dev/null +++ b/test/unit/test_ensure_type.py @@ -0,0 +1,41 @@ +from test.util import not_raises +from unittest.mock import Mock + +import pytest + +from exasol.saas.client.api_access import ( + OpenApiError, + ensure_type, +) +from exasol.saas.client.openapi.models.api_error import ApiError + + +class MyClass: + pass + + +def test_ensure_type_success(): + response = MyClass() + with not_raises(Exception): + actual = ensure_type(MyClass, response, "error message") + assert isinstance(actual, MyClass) + + +@pytest.mark.parametrize( + "object, suffix", + [ + pytest.param( + Mock(ApiError, message="inner error"), + ": inner error.", + id="api_error", + ), + pytest.param(Mock(), "", id="other_class"), + pytest.param(None, "", id="none"), + ], +) +def test_ensure_type_raises_exception(object, suffix): + prefix = "some error message" + expected_error = prefix + suffix + with pytest.raises(OpenApiError, match=expected_error) as ex: + ensure_type(MyClass, object, prefix) + assert str(ex.value) == expected_error