From 67dcc973953c24cab56ae24f80466c9384b274b6 Mon Sep 17 00:00:00 2001 From: Thomas Zajac Date: Wed, 29 May 2024 17:36:43 +0200 Subject: [PATCH] Docker Workflow and Python 3.12 (#6) Co-authored-by: Byron Himes Co-authored-by: TheByronHimes --- .devcontainer/Dockerfile | 2 +- .github/workflows/check_config_docs.yaml | 10 +- .github/workflows/check_openapi_specs.yaml | 10 +- .github/workflows/check_pyproject.yaml | 6 + .github/workflows/check_readmes.yaml | 16 +- .github/workflows/ci_docker.yaml | 117 +++ .github/workflows/get_affected_services.yaml | 35 +- .../{tests_on_push.yaml => run_tests.yaml} | 22 +- .github/workflows/static_code_analysis.yaml | 4 +- .github/workflows/tests_on_pr.yaml | 41 - .pre-commit-config.yaml | 4 +- Dockerfile | 12 +- lock/requirements-dev-template.in | 2 +- lock/requirements-dev.txt | 988 +++++++++++------- lock/requirements.txt | 915 ++++++++++------ scripts/check_license.py | 3 +- scripts/service_name.py | 33 + .../src/ifrs/adapters/inbound/event_sub.py | 1 + services/ifrs/src/ifrs/main.py | 2 +- services/ifrs/tests_ifrs/conftest.py | 58 + services/ifrs/tests_ifrs/fixtures/config.py | 2 +- services/ifrs/tests_ifrs/fixtures/joint.py | 71 +- .../fixtures/module_scope_fixtures.py | 42 - .../ifrs/tests_ifrs/test_ifrs_edge_cases.py | 276 +++-- .../tests_ifrs/test_ifrs_typical_journey.py | 223 ++-- .../irs/src/irs/adapters/inbound/event_sub.py | 2 +- services/irs/src/irs/main.py | 4 +- services/irs/tests_irs/conftest.py | 58 + services/irs/tests_irs/fixtures/joint.py | 64 +- services/irs/tests_irs/test_cli.py | 16 +- services/irs/tests_irs/test_event_handling.py | 534 +++++----- services/pcs/scripts/app_openapi.py | 2 +- services/pcs/src/pcs/main.py | 2 +- services/pcs/tests_pcs/fixtures/config.py | 2 +- services/pcs/tests_pcs/fixtures/joint.py | 21 +- .../pcs/tests_pcs/test_typical_journey.py | 3 +- 36 files changed, 2113 insertions(+), 1490 deletions(-) create mode 100644 .github/workflows/ci_docker.yaml rename .github/workflows/{tests_on_push.yaml => run_tests.yaml} (69%) delete mode 100644 .github/workflows/tests_on_pr.yaml create mode 100644 scripts/service_name.py create mode 100644 services/ifrs/tests_ifrs/conftest.py delete mode 100644 services/ifrs/tests_ifrs/fixtures/module_scope_fixtures.py create mode 100644 services/irs/tests_irs/conftest.py diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 335a8d6c..4d4e4e5e 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/vscode/devcontainers/python:3.9-bullseye +FROM mcr.microsoft.com/devcontainers/python:1-3.12-bookworm ENV PYTHONUNBUFFERED 1 diff --git a/.github/workflows/check_config_docs.yaml b/.github/workflows/check_config_docs.yaml index 128b12aa..c8a75e8f 100644 --- a/.github/workflows/check_config_docs.yaml +++ b/.github/workflows/check_config_docs.yaml @@ -9,12 +9,12 @@ jobs: check-config: name: Check config schema and example needs: get-changed-services - if: ${{ needs.get-changed-services.outputs.since-last-commit != '' }} + if: ${{ needs.get-changed-services.outputs.services != '' }} runs-on: ubuntu-latest strategy: matrix: - service: ${{ fromJson(needs.get-changed-services.outputs.since-last-commit) }} + service: ${{ fromJson(needs.get-changed-services.outputs.services) }} fail-fast: false env: @@ -27,6 +27,12 @@ jobs: id: checkout uses: actions/checkout@v4 + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Update pip and pyopenssl id: pip-update run: python -m pip install --upgrade pip && pip install --upgrade pyopenssl diff --git a/.github/workflows/check_openapi_specs.yaml b/.github/workflows/check_openapi_specs.yaml index 7f310091..37a82473 100644 --- a/.github/workflows/check_openapi_specs.yaml +++ b/.github/workflows/check_openapi_specs.yaml @@ -10,12 +10,12 @@ jobs: check-openapi-specs: name: Check config schema and example needs: get-changed-services - if: ${{ needs.get-changed-services.outputs.since-last-commit != '' }} + if: ${{ needs.get-changed-services.outputs.services != '' }} runs-on: ubuntu-latest strategy: matrix: - service: ${{ fromJson(needs.get-changed-services.outputs.since-last-commit) }} + service: ${{ fromJson(needs.get-changed-services.outputs.services) }} fail-fast: false env: @@ -28,6 +28,12 @@ jobs: id: checkout uses: actions/checkout@v4 + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Update pip and install dependencies id: install-dependencies run: python -m pip install --upgrade pip && pip install --no-deps -r ./lock/requirements-dev.txt && pip install --no-deps ./services/${{matrix.service}} diff --git a/.github/workflows/check_pyproject.yaml b/.github/workflows/check_pyproject.yaml index e3cb121e..3a44eb35 100644 --- a/.github/workflows/check_pyproject.yaml +++ b/.github/workflows/check_pyproject.yaml @@ -13,6 +13,12 @@ jobs: id: checkout uses: actions/checkout@v4 + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Update pip and install dependencies id: install-dependencies run: python -m pip install --upgrade pip && pip install --no-deps -r ./lock/requirements-dev.txt diff --git a/.github/workflows/check_readmes.yaml b/.github/workflows/check_readmes.yaml index 32936fdb..f799548d 100644 --- a/.github/workflows/check_readmes.yaml +++ b/.github/workflows/check_readmes.yaml @@ -15,6 +15,12 @@ jobs: id: checkout uses: actions/checkout@v4 + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Update pip and install dependencies id: install-dependencies run: python -m pip install --upgrade pip && pip install --no-deps -r ./lock/requirements-dev.txt @@ -27,11 +33,11 @@ jobs: check-service-readme: name: Check README file for ${{matrix.service}} needs: get-changed-services - if: ${{ needs.get-changed-services.outputs.all-changes != '' }} + if: ${{ needs.get-changed-services.outputs.services != '' }} runs-on: ubuntu-latest strategy: matrix: - service: ${{ fromJson(needs.get-changed-services.outputs.since-last-commit) }} + service: ${{ fromJson(needs.get-changed-services.outputs.services) }} fail-fast: false env: IFRS_CONFIG_YAML: ./services/ifrs/dev_config.yaml @@ -43,6 +49,12 @@ jobs: id: checkout uses: actions/checkout@v4 + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Update pip and install dependencies id: install-dependencies run: python -m pip install --upgrade pip && pip install --no-deps -r ./lock/requirements-dev.txt diff --git a/.github/workflows/ci_docker.yaml b/.github/workflows/ci_docker.yaml new file mode 100644 index 00000000..8a977187 --- /dev/null +++ b/.github/workflows/ci_docker.yaml @@ -0,0 +1,117 @@ +# Copyright 2022-2023 Universität Tübingen, DKFZ and EMBL +# for the German Human Genome-Phenome Archive (GHGA) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: "Push to docker on new commit to main" + +on: + push: + branches: + - main + +env: + DOCKERHUB_NAMESPACE: ghga + DOCKERHUB_PLATFORMS: "linux/amd64,linux/arm64" + TRIVY_SEVERITY: "CRITICAL,HIGH" + IFRS_CONFIG_YAML: ./services/ifrs/dev_config.yaml + IRS_CONFIG_YAML: ./services/irs/dev_config.yaml + PCS_CONFIG_YAML: ./services/pcs/dev_config.yaml + +jobs: + get-changed-services: + uses: ./.github/workflows/get_affected_services.yaml + + push-to-docker: + runs-on: ubuntu-latest + if: ${{ needs.get-changed-services.outputs.services != '' }} + needs: get-changed-services + strategy: + matrix: + service: ${{ fromJson(needs.get-changed-services.outputs.services) }} + fail-fast: false + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + + - name: Install stringcase and typer + id: setup-stringcase + run: pip install stringcase typer + + - name: Extract service name for ${{ matrix.service }} + id: extract-service-name + shell: bash + run: | + echo name=$(python3 scripts/service_name.py ${{ matrix.service }}) >> $GITHUB_OUTPUT + + - name: Extract service version for ${{ matrix.service }} + id: extract-service-version + shell: bash + run: | + echo version=$(python3.12 -c "import tomllib; print(tomllib.load(open('services/${{ matrix.service }}/pyproject.toml', 'rb'))['project']['version'])") >> $GITHUB_OUTPUT + + - name: Ensure that tag complies with semantic versioning. + uses: matt-usurp/validate-semver@v2 + with: + version: ${{ steps.extract-service-version.outputs.version }} + + - name: Symlink requirement files + id: symlink-requirements + run: ln -sf lock services/${{ matrix.service }}/lock + + - name: Prepare Dockerfile + id: prepare-dockerfile + run: cp Dockerfile services/${{ matrix.service }}/ && sed -i "s/\(ENTRYPOINT \)\[\]/\1[\"${{ matrix.service }}\"]/" services/${{ matrix.service }}/Dockerfile + + - uses: docker/setup-qemu-action@v3 + name: Set up QEMU + + - uses: docker/setup-buildx-action@v3 + name: Set up Docker Buildx + + - uses: docker/login-action@v3 + name: Login to DockerHub + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - uses: docker/build-push-action@v5 + name: Build and push + id: docker_build + with: + platforms: "${{ env.DOCKERHUB_PLATFORMS }}" + tags: "${{ env.DOCKERHUB_NAMESPACE }}/${{ steps.extract-service-name.outputs.name }}:${{ steps.extract-service-version.outputs.version }}" + context: "services/${{ matrix.service }}" + + - name: Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@master + with: + image-ref: "docker.io/${{ env.DOCKERHUB_NAMESPACE }}/${{ steps.extract-service-name.outputs.name }}:${{ steps.extract-service-version.outputs.version }}" + format: "table" + exit-code: "1" + ignore-unfixed: true + vuln-type: "os,library" + severity: ${{ env.TRIVY_SEVERITY }} + + - name: Image digest + shell: bash + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/get_affected_services.yaml b/.github/workflows/get_affected_services.yaml index aeca418f..0fbf3d4e 100644 --- a/.github/workflows/get_affected_services.yaml +++ b/.github/workflows/get_affected_services.yaml @@ -3,15 +3,12 @@ name: Get services affected by changes on: workflow_call: outputs: - all-changes: - description: "Services affected by changes for all commits on branch" - value: ${{ jobs.get_changed_services_pr.outputs.services }} - since-last-commit: + services: description: "Services affected by changes since last commit" - value: ${{ jobs.get_changed_services_commit.outputs.services }} + value: ${{ jobs.get-changed-services.outputs.services }} jobs: - get_changed_services_commit: + get-changed-services: runs-on: ubuntu-latest outputs: services: ${{ steps.services-changed.outputs.affected }} @@ -22,29 +19,11 @@ jobs: with: fetch-depth: 2 - - name: Changed Files - id: changed-files - uses: tj-actions/changed-files@v44 - - - name: Install Typer to check changed services - id: install-typer - run: pip install typer>=0.9.0 - - - name: Generate list of changed services - id: services-changed - run: | - echo "affected=$(python3 ./scripts/get_affected_services.py ${{ steps.changed-files.outputs.all_changed_files }} )" >> $GITHUB_OUTPUT - - get_changed_services_pr: - runs-on: ubuntu-latest - outputs: - services: ${{ steps.services-changed.outputs.affected }} - - steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 with: - fetch-depth: 1 + python-version: 3.12 - name: Changed Files id: changed-files diff --git a/.github/workflows/tests_on_push.yaml b/.github/workflows/run_tests.yaml similarity index 69% rename from .github/workflows/tests_on_push.yaml rename to .github/workflows/run_tests.yaml index 3ca78c15..768cbd70 100644 --- a/.github/workflows/tests_on_push.yaml +++ b/.github/workflows/run_tests.yaml @@ -1,34 +1,40 @@ -name: Monorepo Push Tests +name: Run tests on non main branch on: push: branches-ignore: - main +env: + IFRS_CONFIG_YAML: ./services/ifrs/dev_config.yaml + IRS_CONFIG_YAML: ./services/irs/dev_config.yaml + PCS_CONFIG_YAML: ./services/pcs/dev_config.yaml + jobs: get-changed-services: uses: ./.github/workflows/get_affected_services.yaml test: needs: get-changed-services - if: ${{ needs.get-changed-services.outputs.since-last-commit != '' }} + if: ${{ needs.get-changed-services.outputs.services != '' }} runs-on: ubuntu-latest strategy: matrix: - service: ${{ fromJson(needs.get-changed-services.outputs.since-last-commit) }} + service: ${{ fromJson(needs.get-changed-services.outputs.services) }} fail-fast: false - env: - IFRS_CONFIG_YAML: ./services/ifrs/dev_config.yaml - IRS_CONFIG_YAML: ./services/irs/dev_config.yaml - PCS_CONFIG_YAML: ./services/pcs/dev_config.yaml - steps: - name: Checkout ${{matrix.service}} uses: actions/checkout@v4 with: fetch-depth: 1 + - name: Set up Python 3.12 + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Update pip and pyopenssl id: pip-update run: python -m pip install --upgrade pip && pip install --upgrade pyopenssl diff --git a/.github/workflows/static_code_analysis.yaml b/.github/workflows/static_code_analysis.yaml index b593fc9c..46abce87 100644 --- a/.github/workflows/static_code_analysis.yaml +++ b/.github/workflows/static_code_analysis.yaml @@ -13,11 +13,11 @@ jobs: id: checkout uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 id: setup-python uses: actions/setup-python@v5 with: - python-version: 3.9 + python-version: 3.12 - name: Run pre-commit uses: pre-commit/action@v3.0.1 diff --git a/.github/workflows/tests_on_pr.yaml b/.github/workflows/tests_on_pr.yaml deleted file mode 100644 index 4af3a4ed..00000000 --- a/.github/workflows/tests_on_pr.yaml +++ /dev/null @@ -1,41 +0,0 @@ -name: Monorepo PR Tests - -on: - pull_request: - types: [opened, reopened] - -jobs: - get-changed-services: - uses: ./.github/workflows/get_affected_services.yaml - - test: - needs: get-changed-services - if: ${{ needs.get-changed-services.outputs.all-changes != '' }} - runs-on: ubuntu-latest - strategy: - matrix: - service: ${{ fromJson(needs.get-changed-services.outputs.all-changes) }} - fail-fast: false - - env: - IFRS_CONFIG_YAML: ./services/ifrs/dev_config.yaml - IRS_CONFIG_YAML: ./services/irs/dev_config.yaml - PCS_CONFIG_YAML: ./services/pcs/dev_config.yaml - - steps: - - name: Checkout ${{matrix.service}} - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Update pip and pyopenssl - id: pip-update - run: python -m pip install --upgrade pip && pip install --upgrade pyopenssl - - - name: Install global and local dependencies for ${{matrix.service}} - id: install-dependencies - run: pip install --no-deps -r ./lock/requirements-dev.txt && pip install --no-deps ./services/${{matrix.service}} - - - name: Run tests for ${{matrix.service}} - id: run-tests - run: pytest ./services/${{matrix.service}} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f538d12a..fb8fc69e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ # See https://pre-commit.com/hooks.html for more hooks default_language_version: - python: python3.9 + python: python3.12 minimum_pre_commit_version: 3.6.0 @@ -49,7 +49,7 @@ repos: - id: no-commit-to-branch args: [--branch, dev, --branch, int, --branch, main] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.2 + rev: v0.4.4 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] diff --git a/Dockerfile b/Dockerfile index 01bb2930..42f6bdd8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. ## creating building container -FROM python:3.10.9-slim-bullseye AS builder +FROM python:3.12-slim-bookworm AS builder # update and install dependencies RUN apt update RUN apt upgrade -y @@ -22,11 +22,11 @@ RUN pip install build # copy code COPY . /service WORKDIR /service -# build wheels -RUN for svc in ./services/*; do python -m build $svc --outdir ./dist; done +# build wheel +RUN python -m build # creating running container -FROM python:3.10.9-slim-bullseye +FROM python:3.12-slim-bookworm # update and install dependencies RUN apt update RUN apt upgrade -y @@ -43,4 +43,6 @@ RUN useradd --create-home appuser WORKDIR /home/appuser USER appuser # set environment -ENV PYTHONUNBUFFERED=1 +ENV PYTHONUNBUFFERED=1s + +ENTRYPOINT [] diff --git a/lock/requirements-dev-template.in b/lock/requirements-dev-template.in index e58affc6..bc068954 100644 --- a/lock/requirements-dev-template.in +++ b/lock/requirements-dev-template.in @@ -20,7 +20,7 @@ httpx>=0.27 pytest-httpx>=0.30 urllib3>=1.26.18 -requests>=2.31 +requests>=2.31,<2.32 stringcase>=1.2 jsonschema2md>=1.1 diff --git a/lock/requirements-dev.txt b/lock/requirements-dev.txt index ebc36a24..61186aa1 100644 --- a/lock/requirements-dev.txt +++ b/lock/requirements-dev.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile --refresh --generate-hashes --output-file lock/requirements-dev.txt /tmp/tmpb93jgb01/pyproject.toml lock/requirements-dev.in +# uv pip compile --refresh --generate-hashes --output-file lock/requirements-dev.txt /tmp/tmpa2jwqs7x/pyproject.toml lock/requirements-dev.in aiokafka==0.10.0 \ --hash=sha256:007f1c51f440cc07155d2491f4deea6536492324153296aa73736a74cd833d3e \ --hash=sha256:05c4a7ced5d6f3dbc289767574d6a5d9b31e1c243e992dcecd34dbc40fcbbf9b \ @@ -33,9 +33,9 @@ aiokafka==0.10.0 \ --hash=sha256:fafc95bdaed9e1810fcd80b02ac117e51c72681ffe50353e5d61e2170609e1fc \ --hash=sha256:ffc30e4c6bfcb00356a002f623c93a51d8336ca67687ea069dd11822da07379c # via hexkit -annotated-types==0.6.0 \ - --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ - --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ + --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 # via pydantic anyio==4.3.0 \ --hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \ @@ -54,42 +54,42 @@ attrs==23.2.0 \ # via # jsonschema # referencing -bcrypt==4.1.2 \ - --hash=sha256:02d9ef8915f72dd6daaef40e0baeef8a017ce624369f09754baf32bb32dba25f \ - --hash=sha256:1c28973decf4e0e69cee78c68e30a523be441972c826703bb93099868a8ff5b5 \ - --hash=sha256:2a298db2a8ab20056120b45e86c00a0a5eb50ec4075b6142db35f593b97cb3fb \ - --hash=sha256:33313a1200a3ae90b75587ceac502b048b840fc69e7f7a0905b5f87fac7a1258 \ - --hash=sha256:3566a88234e8de2ccae31968127b0ecccbb4cddb629da744165db72b58d88ca4 \ - --hash=sha256:387e7e1af9a4dd636b9505a465032f2f5cb8e61ba1120e79a0e1cd0b512f3dfc \ - --hash=sha256:44290ccc827d3a24604f2c8bcd00d0da349e336e6503656cb8192133e27335e2 \ - --hash=sha256:57fa9442758da926ed33a91644649d3e340a71e2d0a5a8de064fb621fd5a3326 \ - --hash=sha256:68e3c6642077b0c8092580c819c1684161262b2e30c4f45deb000c38947bf483 \ - --hash=sha256:69057b9fc5093ea1ab00dd24ede891f3e5e65bee040395fb1e66ee196f9c9b4a \ - --hash=sha256:6cad43d8c63f34b26aef462b6f5e44fdcf9860b723d2453b5d391258c4c8e966 \ - --hash=sha256:71b8be82bc46cedd61a9f4ccb6c1a493211d031415a34adde3669ee1b0afbb63 \ - --hash=sha256:732b3920a08eacf12f93e6b04ea276c489f1c8fb49344f564cca2adb663b3e4c \ - --hash=sha256:9800ae5bd5077b13725e2e3934aa3c9c37e49d3ea3d06318010aa40f54c63551 \ - --hash=sha256:a97e07e83e3262599434816f631cc4c7ca2aa8e9c072c1b1a7fec2ae809a1d2d \ - --hash=sha256:ac621c093edb28200728a9cca214d7e838529e557027ef0581685909acd28b5e \ - --hash=sha256:b8df79979c5bae07f1db22dcc49cc5bccf08a0380ca5c6f391cbb5790355c0b0 \ - --hash=sha256:b90e216dc36864ae7132cb151ffe95155a37a14e0de3a8f64b49655dd959ff9c \ - --hash=sha256:ba4e4cc26610581a6329b3937e02d319f5ad4b85b074846bf4fef8a8cf51e7bb \ - --hash=sha256:ba55e40de38a24e2d78d34c2d36d6e864f93e0d79d0b6ce915e4335aa81d01b1 \ - --hash=sha256:be3ab1071662f6065899fe08428e45c16aa36e28bc42921c4901a191fda6ee42 \ - --hash=sha256:d75fc8cd0ba23f97bae88a6ec04e9e5351ff3c6ad06f38fe32ba50cbd0d11946 \ - --hash=sha256:e51c42750b7585cee7892c2614be0d14107fad9581d1738d954a262556dd1aab \ - --hash=sha256:ea505c97a5c465ab8c3ba75c0805a102ce526695cd6818c6de3b1a38f6f60da1 \ - --hash=sha256:eb3bd3321517916696233b5e0c67fd7d6281f0ef48e66812db35fc963a422a1c \ - --hash=sha256:f70d9c61f9c4ca7d57f3bfe88a5ccf62546ffbadf3681bb1e268d9d2e41c91a7 \ - --hash=sha256:fbe188b878313d01b7718390f31528be4010fed1faa798c5a1d0469c9c48c369 +bcrypt==4.1.3 \ + --hash=sha256:01746eb2c4299dd0ae1670234bf77704f581dd72cc180f444bfe74eb80495b64 \ + --hash=sha256:037c5bf7c196a63dcce75545c8874610c600809d5d82c305dd327cd4969995bf \ + --hash=sha256:094fd31e08c2b102a14880ee5b3d09913ecf334cd604af27e1013c76831f7b05 \ + --hash=sha256:0d4cf6ef1525f79255ef048b3489602868c47aea61f375377f0d00514fe4a78c \ + --hash=sha256:193bb49eeeb9c1e2db9ba65d09dc6384edd5608d9d672b4125e9320af9153a15 \ + --hash=sha256:2505b54afb074627111b5a8dc9b6ae69d0f01fea65c2fcaea403448c503d3991 \ + --hash=sha256:2ee15dd749f5952fe3f0430d0ff6b74082e159c50332a1413d51b5689cf06623 \ + --hash=sha256:31adb9cbb8737a581a843e13df22ffb7c84638342de3708a98d5c986770f2834 \ + --hash=sha256:3a5be252fef513363fe281bafc596c31b552cf81d04c5085bc5dac29670faa08 \ + --hash=sha256:3d3b317050a9a711a5c7214bf04e28333cf528e0ed0ec9a4e55ba628d0f07c1a \ + --hash=sha256:48429c83292b57bf4af6ab75809f8f4daf52aa5d480632e53707805cc1ce9b74 \ + --hash=sha256:4a8bea4c152b91fd8319fef4c6a790da5c07840421c2b785084989bf8bbb7455 \ + --hash=sha256:4fb253d65da30d9269e0a6f4b0de32bd657a0208a6f4e43d3e645774fb5457f3 \ + --hash=sha256:551b320396e1d05e49cc18dd77d970accd52b322441628aca04801bbd1d52a73 \ + --hash=sha256:5f7cd3399fbc4ec290378b541b0cf3d4398e4737a65d0f938c7c0f9d5e686611 \ + --hash=sha256:6004f5229b50f8493c49232b8e75726b568535fd300e5039e255d919fc3a07f2 \ + --hash=sha256:6717543d2c110a155e6821ce5670c1f512f602eabb77dba95717ca76af79867d \ + --hash=sha256:6cac78a8d42f9d120b3987f82252bdbeb7e6e900a5e1ba37f6be6fe4e3848286 \ + --hash=sha256:8a893d192dfb7c8e883c4576813bf18bb9d59e2cfd88b68b725990f033f1b978 \ + --hash=sha256:8cbb119267068c2581ae38790e0d1fbae65d0725247a930fc9900c285d95725d \ + --hash=sha256:9f8ea645eb94fb6e7bea0cf4ba121c07a3a182ac52876493870033141aa687bc \ + --hash=sha256:c4c8d9b3e97209dd7111bf726e79f638ad9224b4691d1c7cfefa571a09b1b2d6 \ + --hash=sha256:cb9c707c10bddaf9e5ba7cdb769f3e889e60b7d4fea22834b261f51ca2b89fed \ + --hash=sha256:d84702adb8f2798d813b17d8187d27076cca3cd52fe3686bb07a9083930ce650 \ + --hash=sha256:ec3c2e1ca3e5c4b9edb94290b356d082b721f3f50758bce7cce11d8a7c89ce84 \ + --hash=sha256:f44a97780677e7ac0ca393bd7982b19dbbd8d7228c1afe10b128fd9550eef5f1 \ + --hash=sha256:f5698ce5292a4e4b9e5861f7e53b1d89242ad39d54c3da451a93cac17b61921a # via crypt4gh -boto3==1.34.96 \ - --hash=sha256:42ea7d46688e7cb27259780b9da2cddcfaf2763ff5d327f4d54eac12edba8e72 \ - --hash=sha256:fe3d039631074a96374a354764641b6623036b6ea15381b8a04ac0a193b8c1e0 +boto3==1.34.109 \ + --hash=sha256:50a0f24dd737529ae489a3586f260b9220c6aede1ae7851fa4f33878c8805ef8 \ + --hash=sha256:98d389562e03a46fd79fea5f988e9e6032674a0c3e9e42c06941ec588b7e1070 # via hexkit -botocore==1.34.96 \ - --hash=sha256:00e917cd8152d902a4771b9e1e4d0cf1ee096c90027ee35f2a76b6d394e2ada5 \ - --hash=sha256:4c307f5772286f1ab58a91220ea8e180416a2ea0cc7e76983a6984e4ef8c212d +botocore==1.34.109 \ + --hash=sha256:647059a81acbfab85c694b9b57b0ef200dde071449fb8837f10aef9c6472730d \ + --hash=sha256:804821252597821f7223cb3bfca2a2a513ae0bb9a71e8e22605aff6866e13e71 # via # boto3 # hexkit @@ -257,98 +257,100 @@ click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de # via + # -r lock/requirements-dev-template.in # typer # uvicorn -coverage==7.5.0 \ - --hash=sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0 \ - --hash=sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7 \ - --hash=sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631 \ - --hash=sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b \ - --hash=sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25 \ - --hash=sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7 \ - --hash=sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067 \ - --hash=sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b \ - --hash=sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46 \ - --hash=sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5 \ - --hash=sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a \ - --hash=sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3 \ - --hash=sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4 \ - --hash=sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1 \ - --hash=sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475 \ - --hash=sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c \ - --hash=sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1 \ - --hash=sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be \ - --hash=sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58 \ - --hash=sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de \ - --hash=sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a \ - --hash=sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb \ - --hash=sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95 \ - --hash=sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb \ - --hash=sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517 \ - --hash=sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656 \ - --hash=sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e \ - --hash=sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880 \ - --hash=sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9 \ - --hash=sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f \ - --hash=sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2 \ - --hash=sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af \ - --hash=sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2 \ - --hash=sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932 \ - --hash=sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc \ - --hash=sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d \ - --hash=sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d \ - --hash=sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493 \ - --hash=sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64 \ - --hash=sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4 \ - --hash=sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff \ - --hash=sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8 \ - --hash=sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1 \ - --hash=sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4 \ - --hash=sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e \ - --hash=sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375 \ - --hash=sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88 \ - --hash=sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a \ - --hash=sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb \ - --hash=sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4 \ - --hash=sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743 \ - --hash=sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9 +coverage==7.5.1 \ + --hash=sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de \ + --hash=sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661 \ + --hash=sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26 \ + --hash=sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41 \ + --hash=sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d \ + --hash=sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981 \ + --hash=sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2 \ + --hash=sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34 \ + --hash=sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f \ + --hash=sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a \ + --hash=sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35 \ + --hash=sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223 \ + --hash=sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1 \ + --hash=sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746 \ + --hash=sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90 \ + --hash=sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c \ + --hash=sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca \ + --hash=sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8 \ + --hash=sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596 \ + --hash=sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e \ + --hash=sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd \ + --hash=sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e \ + --hash=sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3 \ + --hash=sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e \ + --hash=sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312 \ + --hash=sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7 \ + --hash=sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572 \ + --hash=sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428 \ + --hash=sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f \ + --hash=sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07 \ + --hash=sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e \ + --hash=sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4 \ + --hash=sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136 \ + --hash=sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5 \ + --hash=sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8 \ + --hash=sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d \ + --hash=sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228 \ + --hash=sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206 \ + --hash=sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa \ + --hash=sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e \ + --hash=sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be \ + --hash=sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5 \ + --hash=sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668 \ + --hash=sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601 \ + --hash=sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057 \ + --hash=sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146 \ + --hash=sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f \ + --hash=sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8 \ + --hash=sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7 \ + --hash=sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987 \ + --hash=sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19 \ + --hash=sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece # via pytest-cov crypt4gh==1.6 \ --hash=sha256:134015d4d1ea469389f6ee2c7036dec58caf91b3fb87cc6e131876080942306a \ --hash=sha256:c44d999e5da84ca0bff00d0381eacfa27855ccbbd2eb0c95ec7b80f31e82860d -cryptography==42.0.5 \ - --hash=sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee \ - --hash=sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576 \ - --hash=sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d \ - --hash=sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30 \ - --hash=sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413 \ - --hash=sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb \ - --hash=sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da \ - --hash=sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4 \ - --hash=sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd \ - --hash=sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc \ - --hash=sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8 \ - --hash=sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1 \ - --hash=sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc \ - --hash=sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e \ - --hash=sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8 \ - --hash=sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940 \ - --hash=sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400 \ - --hash=sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7 \ - --hash=sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16 \ - --hash=sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278 \ - --hash=sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74 \ - --hash=sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec \ - --hash=sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1 \ - --hash=sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2 \ - --hash=sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c \ - --hash=sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922 \ - --hash=sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a \ - --hash=sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6 \ - --hash=sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1 \ - --hash=sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e \ - --hash=sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac \ - --hash=sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7 + # via fsb (pyproject.toml) +cryptography==42.0.7 \ + --hash=sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55 \ + --hash=sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785 \ + --hash=sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b \ + --hash=sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886 \ + --hash=sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82 \ + --hash=sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1 \ + --hash=sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda \ + --hash=sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f \ + --hash=sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68 \ + --hash=sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60 \ + --hash=sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7 \ + --hash=sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd \ + --hash=sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582 \ + --hash=sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc \ + --hash=sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858 \ + --hash=sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b \ + --hash=sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2 \ + --hash=sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678 \ + --hash=sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13 \ + --hash=sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4 \ + --hash=sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8 \ + --hash=sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604 \ + --hash=sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477 \ + --hash=sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e \ + --hash=sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a \ + --hash=sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9 \ + --hash=sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14 \ + --hash=sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda \ + --hash=sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da \ + --hash=sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562 \ + --hash=sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2 \ + --hash=sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9 # via crypt4gh distlib==0.3.8 \ --hash=sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 \ @@ -370,37 +372,41 @@ docopt==0.6.2 \ email-validator==2.1.1 \ --hash=sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84 \ --hash=sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05 - # via pydantic -exceptiongroup==1.2.1 \ - --hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \ - --hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16 # via - # anyio - # pytest -fastapi==0.110.3 \ - --hash=sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626 \ - --hash=sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32 + # fastapi + # pydantic +fastapi==0.111.0 \ + --hash=sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0 \ + --hash=sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7 # via ghga-service-commons +fastapi-cli==0.0.4 \ + --hash=sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809 \ + --hash=sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32 + # via fastapi filelock==3.14.0 \ --hash=sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f \ --hash=sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a # via virtualenv -ghga-event-schemas==3.1.0 \ - --hash=sha256:87706784895376314124d30a0ba77dd7cfebdbfbcbb98e88d2a836486f11c385 \ - --hash=sha256:fa0048eda36002e7a79bc9084d2acdcc9eb9d38bcf263d6f68ad6fc453cae130 -ghga-service-commons==3.1.3 \ - --hash=sha256:4f7c2b56ae24594dd60cb28719f040351056c06d59b2d8f74f46eb9005b770f2 \ - --hash=sha256:8b2e255506ac11cfafba3a18f58c0471a0b1b0c89893f6489a8a2f9af4dd6c0b +ghga-event-schemas==3.3.0 \ + --hash=sha256:852a04ebadf311e1e04d9b95a6286716a2e80f1e6c135795c3f207fc58011290 \ + --hash=sha256:d98b82d3fb92698a7ee0505740ed2469d62c4577c651b5f98d561720a27db8cf + # via fsb (pyproject.toml) +ghga-service-commons==3.1.4 \ + --hash=sha256:63450bed2f0ca7431f064b640d35e15a29f93b7f4c67b5fd3b812afc8ced5151 \ + --hash=sha256:eb78042aeb17bb70e17f7c7185fbcf87a54968a410de99f968a7e944cd0f6f78 + # via fsb (pyproject.toml) h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 # via # httpcore # uvicorn -hexkit==3.0.2 \ - --hash=sha256:172c55b756ea0a5ff5e83ba97860947408a132bb37800404e6e7b1cabab9d3e7 \ - --hash=sha256:d8cb77d64c6021725f6e40e87d62792e22a8928810de983f96a6ecfe9245f1f8 - # via ghga-service-commons +hexkit==3.1.0 \ + --hash=sha256:3f96ede959b4d81a6b78637ebf47019787e5d3321bd01f9abe82cb8118bada66 \ + --hash=sha256:b922c048091f622798ccf25a767fe3d64ff8ee000d1c3cf18967b6b6de8f2592 + # via + # fsb (pyproject.toml) + # ghga-service-commons httpcore==1.0.5 \ --hash=sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61 \ --hash=sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5 @@ -446,7 +452,10 @@ httptools==0.6.1 \ httpx==0.27.0 \ --hash=sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5 \ --hash=sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5 - # via pytest-httpx + # via + # -r lock/requirements-dev-template.in + # fastapi + # pytest-httpx identify==2.5.36 \ --hash=sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa \ --hash=sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d @@ -463,6 +472,10 @@ iniconfig==2.0.0 \ --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 # via pytest +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + # via fastapi jmespath==1.0.1 \ --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe @@ -482,13 +495,77 @@ jsonschema-specifications==2023.12.1 \ jsonschema2md==1.1.0 \ --hash=sha256:2386fc4d119330686db3989ea497ab96a4defb6388386fc0ceff756b5c1a66a7 \ --hash=sha256:e89edf2de1bc7fc3e842915c7c29b7b70888555a87002eccc06350c0412a1458 + # via -r lock/requirements-dev-template.in logot==1.3.0 \ --hash=sha256:bb2e8cf8ca949015e1e096e45023095ebd5df06ea4627f5df47d53dcdf62b74e \ --hash=sha256:de392d182308828a0a9a442120e25e4ad2258fef52c4ed275e012aaffb0514a5 + # via -r lock/requirements-dev-template.in markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb # via rich +markupsafe==2.1.5 \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 + # via jinja2 mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba @@ -525,14 +602,65 @@ mypy==1.10.0 \ --hash=sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727 \ --hash=sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976 \ --hash=sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4 + # via -r lock/requirements-dev-template.in mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 - # via mypy + # via + # -r lock/requirements-dev-template.in + # mypy nodeenv==1.8.0 \ --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \ --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec # via pre-commit +orjson==3.10.3 \ + --hash=sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2 \ + --hash=sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b \ + --hash=sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5 \ + --hash=sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b \ + --hash=sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0 \ + --hash=sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0 \ + --hash=sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7 \ + --hash=sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42 \ + --hash=sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5 \ + --hash=sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa \ + --hash=sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818 \ + --hash=sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25 \ + --hash=sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08 \ + --hash=sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7 \ + --hash=sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b \ + --hash=sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754 \ + --hash=sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0 \ + --hash=sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912 \ + --hash=sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b \ + --hash=sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3 \ + --hash=sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700 \ + --hash=sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78 \ + --hash=sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290 \ + --hash=sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134 \ + --hash=sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294 \ + --hash=sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0 \ + --hash=sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5 \ + --hash=sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d \ + --hash=sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d \ + --hash=sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16 \ + --hash=sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195 \ + --hash=sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da \ + --hash=sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8 \ + --hash=sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098 \ + --hash=sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8 \ + --hash=sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063 \ + --hash=sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534 \ + --hash=sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d \ + --hash=sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109 \ + --hash=sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d \ + --hash=sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3 \ + --hash=sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2 \ + --hash=sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf \ + --hash=sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069 \ + --hash=sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7 \ + --hash=sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176 + # via fastapi packaging==24.0 \ --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 @@ -540,17 +668,18 @@ packaging==24.0 \ # aiokafka # docker # pytest -platformdirs==4.2.1 \ - --hash=sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf \ - --hash=sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1 +platformdirs==4.2.2 \ + --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ + --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 # via virtualenv pluggy==1.5.0 \ --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # via pytest -pre-commit==3.7.0 \ - --hash=sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab \ - --hash=sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060 +pre-commit==3.7.1 \ + --hash=sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a \ + --hash=sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5 + # via -r lock/requirements-dev-template.in pycparser==2.22 \ --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc @@ -649,71 +778,71 @@ pydantic-settings==2.2.1 \ --hash=sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed \ --hash=sha256:0235391d26db4d2190cb9b31051c4b46882d28a51533f97440867f012d4da091 # via hexkit -pygments==2.17.2 \ - --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ - --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 +pygments==2.18.0 \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a # via rich -pymongo==4.7.1 \ - --hash=sha256:11f74dafde63ad2dc30c01f40b4c69d9af157f8ba5224b0c9d4de7158537266f \ - --hash=sha256:13fc201e073644acd77860d9e91ccfc27addf510563e07381cadc9a55ac3a894 \ - --hash=sha256:1bd1eef70c1eda838b26397ef75c9580d7a97fd94b6324971d7f3d2ad3552e9a \ - --hash=sha256:24c8f1dd545360ec1b79007a3ba6573af565df6fde49f6dfc53813f3f475a751 \ - --hash=sha256:253ed8fd6e7f4b2a1caa89e6b287b9e04f42613319ee1e1240c2db2afe1637e7 \ - --hash=sha256:263c169302df636f9086b584994a51d0adfc8738fe27d7b8e2aacf46fd68b6cb \ - --hash=sha256:297cdc87c4b4168782b571c8643540e9b0ad1d09266b43d2f5954f8632280835 \ - --hash=sha256:2ccc8dd4fe9aac18dde27c33a53271c6c90159b74c43fbdab1d33d5efc36c2f5 \ - --hash=sha256:30a9d891631d7e847b24f551b1d89ff2033539e7cd8e9af29714b4d0db7abb06 \ - --hash=sha256:31ed8ba3da0366346264604b3a443f5a4232cab5ed45f520bead6184cf0851a1 \ - --hash=sha256:337d99f88d32a5f8056d6d2bc365ccf09d09583f3942882c50cf11b459e8fbc0 \ - --hash=sha256:3ef32a7cfe748c0c72fdad9e51459de5e0c6b16c5288b39f863abfff23503847 \ - --hash=sha256:455f9d603ed0990a787773d5718e871300bddf585ce543baf129c9f5ca3adb02 \ - --hash=sha256:45ac46f0d6bdc2baac34ced60aae27b2083170d77397330eff0ac5689ea29d38 \ - --hash=sha256:4c7e05454cdc5aa4702e03cad0df4205daccd6fd631bbbf0a85bbe598129a6cc \ - --hash=sha256:4d227555be35078b53f506f6b58bd0b0e8fd4513e89e6f29e83a97efab439250 \ - --hash=sha256:4dd998e9f0f7694032c1648c7f57fccaa78903df6329b8f8ae20cfa7c4ceca34 \ - --hash=sha256:5119c66af8c4197c8757b4b7d98c443e5b127c224ac92fb657dbe2b512ae2713 \ - --hash=sha256:57b5b485ef89270ed2e603814f43f0fdd9b8ba5d4039124d90878cdc2327000c \ - --hash=sha256:58989bcb94233233a71645236b972835d4f87a6bb1b7e818d38a7e6e6d4630de \ - --hash=sha256:5a58b6cd7c423ba49db10d8445756062c931ad2246ba0da1e705bf22962fd9e9 \ - --hash=sha256:5ae1aeeb405c29885266666dc7115792d647ed68cfdb6ed02e2e211d12f2e1c8 \ - --hash=sha256:5bc87db2e9563295c4e45602ab978a2fcbaba3ab89e745503b24f895cddeb755 \ - --hash=sha256:5ff6d56ca1f0cd3687a13ce90a32a8efb3cc3a53728e5ac160c4c30d10385a72 \ - --hash=sha256:615c7573d7a9c4837332a673fdc5a5f214b474dd52d846bcf4cc3d011550bee1 \ - --hash=sha256:64b69b9cd8a6d23881a80490d575e92918f9afca43096a7d6c1013d6b3e5c75c \ - --hash=sha256:65c45682d5ed8c6618bde22cd6716b47a197f4ef800a025213b28d13a59e5fca \ - --hash=sha256:67cbee427c263a4483e3249fef480788ccc16edb1a4fc330c4c6cb0cb9db94a8 \ - --hash=sha256:7247c1dc7d8eed4e24eb1dd92c4c58ebf1e5159500015652552acfdebdeed256 \ - --hash=sha256:73bf96ece4999b0bbab7169cb2b9c60918b434487009e48be4bd47eeb2aa7b14 \ - --hash=sha256:7b10603ba64af08f5af7eb9a69d6b24e3c69d91fdd48c54b95e284686c1c582d \ - --hash=sha256:811a07bba9d35f1e34159ede632ac71dbc429b372a20004e32d6578af872db1a \ - --hash=sha256:811c41c6227b7548afcb53e1b996c25262d837b5e5f519e2ddc2c7e59d8728a5 \ - --hash=sha256:85b8dd3756b73993b1e3ab6b1cba826b9e4987a094a5d5b6d37313776458cd94 \ - --hash=sha256:887d043ecc0c7d5591925bbc7abb67caf21c94d6e6e5d442cb49eb5d9d8ee76b \ - --hash=sha256:8cee62188127a126f59ea45d3981868a5e35343be4ef4ad8712eaf42be37a00b \ - --hash=sha256:9e0a30a022ac8a9164ee5a4b761e13dbb3d10a21845f7258011e3415151fb645 \ - --hash=sha256:9e99dac3c7c2cb498937cc1767361851099da38861e921113318c87d71e3d127 \ - --hash=sha256:a46c08ef0b273c415b1e8933f6739596be264ae700a4927f84e0b84e70fdf0eb \ - --hash=sha256:a848249d5b4763497add62f7dd7bd0ce1538129bf42f4cb132a76d24c61bf98d \ - --hash=sha256:aa354933a158e57494c98b592f46d5d24d1b109e6ba05a05179cde719d9f7fd3 \ - --hash=sha256:ad360630c221aee7c0841a51851496a3ca6fdea87007098a982c1aa26e34083a \ - --hash=sha256:b897b60b2d55c26f3efea0effc11b655db68125c3731274bc3953375e9ccab73 \ - --hash=sha256:b8b95e2163b73d03a913efa89b0f7c5012be82efd4e9dbce8aa62010a75a277c \ - --hash=sha256:bfd5c7e5bb87171a5296fa32205adb50b27704a612036ec4395c3cd316fc0e91 \ - --hash=sha256:c808098f2cdb87d4035144e536ba5fa7709d0420c17b68e6ace5da18c38ded5f \ - --hash=sha256:d1829a7db720ff586aaf59c806e89e0a388548063aa844d21a570a231ad8ca87 \ - --hash=sha256:d50969de00d3522b2c394f7e59b843871e2be4b525af92066da7f3bd02799fdc \ - --hash=sha256:d63f38454a2e23c117d3ceab3b661568f2418536825787256ad24e5baaedfd27 \ - --hash=sha256:d804eaf19a65211cc2c8c5db75be685c3f31c64cdab639794f66f13f8e258ba6 \ - --hash=sha256:daf35ab13b86aba7cc8c4b019882f1fa8d287a26f586ef5eaf60a5233d3eaa52 \ - --hash=sha256:dbc32217c81d87750401fa1c2bc9450e854b23e6e30243c82d3514b8e58f39e3 \ - --hash=sha256:e175d74c52b6c8414a4b4504a2dd42b0202d101b2eb9508a34c137357683864e \ - --hash=sha256:e4a63ba6813a2168ebd35ea5369f6c33f7787525986cd77668b7956acc3d2a38 \ - --hash=sha256:e935712b17e7a42831022353bac91a346a792658a54e12bec907ec11695cc899 \ - --hash=sha256:ec94d29103317aa920dae59ed385de9604cb0ef840b5b7137b5eaa7a2042580a \ - --hash=sha256:ed6b3a0740efe98bb03ccf054578e9788ebcd06d021d548b8217ab2c82e45975 \ - --hash=sha256:f2a720e787c9b9b912db5bb4c3e7123ccff1352d6c3ac0cb2c7ee392cdc95c00 \ - --hash=sha256:f8822614975038e0cece47d12e7634a79c2ee590a0ae78ae64c37b9c6610a14c \ - --hash=sha256:fb1a884b1c6aeac5ffeb8ccb696fbc242a7ae1bba36f2328c01f76fab7221b94 +pymongo==4.7.2 \ + --hash=sha256:02efd1bb3397e24ef2af45923888b41a378ce00cb3a4259c5f4fc3c70497a22f \ + --hash=sha256:0d833651f1ba938bb7501f13e326b96cfbb7d98867b2d545ca6d69c7664903e0 \ + --hash=sha256:12c466e02133b7f8f4ff1045c6b5916215c5f7923bc83fd6e28e290cba18f9f6 \ + --hash=sha256:12d1fef77d25640cb78893d07ff7d2fac4c4461d8eec45bd3b9ad491a1115d6e \ + --hash=sha256:194065c9d445017b3c82fb85f89aa2055464a080bde604010dc8eb932a6b3c95 \ + --hash=sha256:1c78f156edc59b905c80c9003e022e1a764c54fd40ac4fea05b0764f829790e2 \ + --hash=sha256:1e37faf298a37ffb3e0809e77fbbb0a32b6a2d18a83c59cfc2a7b794ea1136b0 \ + --hash=sha256:25eeb2c18ede63891cbd617943dd9e6b9cbccc54f276e0b2e693a0cc40f243c5 \ + --hash=sha256:268d8578c0500012140c5460755ea405cbfe541ef47c81efa9d6744f0f99aeca \ + --hash=sha256:2cb77d09bd012cb4b30636e7e38d00b5f9be5eb521c364bde66490c45ee6c4b4 \ + --hash=sha256:347c49cf7f0ba49ea87c1a5a1984187ecc5516b7c753f31938bf7b37462824fd \ + --hash=sha256:35b3f0c7d49724859d4df5f0445818d525824a6cd55074c42573d9b50764df67 \ + --hash=sha256:37e9ea81fa59ee9274457ed7d59b6c27f6f2a5fe8e26f184ecf58ea52a019cb8 \ + --hash=sha256:47a1a4832ef2f4346dcd1a10a36ade7367ad6905929ddb476459abb4fd1b98cb \ + --hash=sha256:4bdb5ffe1cd3728c9479671a067ef44dacafc3743741d4dc700c377c4231356f \ + --hash=sha256:4ffd1519edbe311df73c74ec338de7d294af535b2748191c866ea3a7c484cd15 \ + --hash=sha256:5239776633f7578b81207e5646245415a5a95f6ae5ef5dff8e7c2357e6264bfc \ + --hash=sha256:5239ef7e749f1326ea7564428bf861d5250aa39d7f26d612741b1b1273227062 \ + --hash=sha256:56bf8b706946952acdea0fe478f8e44f1ed101c4b87f046859e6c3abe6c0a9f4 \ + --hash=sha256:65b4c00dedbd333698b83cd2095a639a6f0d7c4e2a617988f6c65fb46711f028 \ + --hash=sha256:6a87eef394039765679f75c6a47455a4030870341cb76eafc349c5944408c882 \ + --hash=sha256:727ad07952c155cd20045f2ce91143c7dc4fb01a5b4e8012905a89a7da554b0c \ + --hash=sha256:730778b6f0964b164c187289f906bbc84cb0524df285b7a85aa355bbec43eb21 \ + --hash=sha256:743552033c63f0afdb56b9189ab04b5c1dbffd7310cf7156ab98eebcecf24621 \ + --hash=sha256:7e9d9d2c0aae73aa4369bd373ac2ac59f02c46d4e56c4b6d6e250cfe85f76802 \ + --hash=sha256:82102e353be13f1a6769660dd88115b1da382447672ba1c2662a0fbe3df1d861 \ + --hash=sha256:827611beb6c483260d520cfa6a49662d980dfa5368a04296f65fa39e78fccea7 \ + --hash=sha256:84bc00200c3cbb6c98a2bb964c9e8284b641e4a33cf10c802390552575ee21de \ + --hash=sha256:87032f818bf5052ab742812c715eff896621385c43f8f97cdd37d15b5d394e95 \ + --hash=sha256:87832d6076c2c82f42870157414fd876facbb6554d2faf271ffe7f8f30ce7bed \ + --hash=sha256:87bb453ac3eb44db95cb6d5a616fbc906c1c00661eec7f55696253a6245beb8a \ + --hash=sha256:9024e1661c6e40acf468177bf90ce924d1bc681d2b244adda3ed7b2f4c4d17d7 \ + --hash=sha256:9349f0bb17a31371d4cacb64b306e4ca90413a3ad1fffe73ac7cd495570d94b5 \ + --hash=sha256:9385654f01a90f73827af4db90c290a1519f7d9102ba43286e187b373e9a78e9 \ + --hash=sha256:9a8bd37f5dabc86efceb8d8cbff5969256523d42d08088f098753dba15f3b37a \ + --hash=sha256:9d892fb91e81cccb83f507cdb2ea0aa026ec3ced7f12a1d60f6a5bf0f20f9c1f \ + --hash=sha256:a754e366c404d19ff3f077ddeed64be31e0bb515e04f502bf11987f1baa55a16 \ + --hash=sha256:b48a5650ee5320d59f6d570bd99a8d5c58ac6f297a4e9090535f6561469ac32e \ + --hash=sha256:bcf337d1b252405779d9c79978d6ca15eab3cdaa2f44c100a79221bddad97c8a \ + --hash=sha256:c44efab10d9a3db920530f7bcb26af8f408b7273d2f0214081d3891979726328 \ + --hash=sha256:c72d16fede22efe7cdd1f422e8da15760e9498024040429362886f946c10fe95 \ + --hash=sha256:cb6e00a79dff22c9a72212ad82021b54bdb3b85f38a85f4fc466bde581d7d17a \ + --hash=sha256:ce1a374ea0e49808e0380ffc64284c0ce0f12bd21042b4bef1af3eb7bdf49054 \ + --hash=sha256:cecd2df037249d1c74f0af86fb5b766104a5012becac6ff63d85d1de53ba8b98 \ + --hash=sha256:cf17ea9cea14d59b0527403dd7106362917ced7c4ec936c4ba22bd36c912c8e0 \ + --hash=sha256:cf28430ec1924af1bffed37b69a812339084697fd3f3e781074a0148e6475803 \ + --hash=sha256:d1bcd58669e56c08f1e72c5758868b5df169fe267501c949ee83c418e9df9155 \ + --hash=sha256:d275596f840018858757561840767b39272ac96436fcb54f5cac6d245393fd97 \ + --hash=sha256:d2dcf608d35644e8d276d61bf40a93339d8d66a0e5f3e3f75b2c155a421a1b71 \ + --hash=sha256:d4d59776f435564159196d971aa89422ead878174aff8fe18e06d9a0bc6d648c \ + --hash=sha256:d9b6cbc037108ff1a0a867e7670d8513c37f9bcd9ee3d2464411bfabf70ca002 \ + --hash=sha256:db4380d1e69fdad1044a4b8f3bb105200542c49a0dde93452d938ff9db1d6d29 \ + --hash=sha256:e004527ea42a6b99a8b8d5b42b42762c3bdf80f88fbdb5c3a9d47f3808495b86 \ + --hash=sha256:e6eab12c6385526d386543d6823b07187fefba028f0da216506e00f0e1855119 \ + --hash=sha256:eb0642e5f0dd7e86bb358749cc278e70b911e617f519989d346f742dc9520dfb \ + --hash=sha256:f91073049c43d14e66696970dd708d319b86ee57ef9af359294eee072abaac79 \ + --hash=sha256:fadc6e8db7707c861ebe25b13ad6aca19ea4d2c56bf04a26691f46c23dadf6e4 \ + --hash=sha256:fc5af24fcf5fc6f7f40d65446400d45dd12bea933d0299dc9e90c5b22197f1e9 \ + --hash=sha256:fcaf8c911cb29316a02356f89dbc0e0dfcc6a712ace217b6b543805690d2aefd \ + --hash=sha256:ffd4d7cb2e6c6e100e2b39606d38a9ffc934e18593dc9bb326196afc7d93ce3d # via motor pynacl==1.5.0 \ --hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \ @@ -727,22 +856,26 @@ pynacl==1.5.0 \ --hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \ --hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543 # via crypt4gh -pytest==8.2.0 \ - --hash=sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233 \ - --hash=sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f +pytest==8.2.1 \ + --hash=sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd \ + --hash=sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1 # via + # -r lock/requirements-dev-template.in # pytest-asyncio # pytest-cov # pytest-httpx -pytest-asyncio==0.23.6 \ - --hash=sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a \ - --hash=sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f +pytest-asyncio==0.23.7 \ + --hash=sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b \ + --hash=sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268 + # via -r lock/requirements-dev-template.in pytest-cov==5.0.0 \ --hash=sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 \ --hash=sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857 + # via -r lock/requirements-dev-template.in pytest-httpx==0.30.0 \ --hash=sha256:6d47849691faf11d2532565d0c8e0e02b9f4ee730da31687feae315581d7520c \ --hash=sha256:755b8edca87c974dd4f3605c374fda11db84631de3d163b99c0df5807023a19a + # via -r lock/requirements-dev-template.in python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 @@ -753,6 +886,10 @@ python-dotenv==1.0.1 \ # via # pydantic-settings # uvicorn +python-multipart==0.0.9 \ + --hash=sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026 \ + --hash=sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215 + # via fastapi pyyaml==6.0.1 \ --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ @@ -820,140 +957,145 @@ referencing==0.35.1 \ requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 - # via docker + # via + # -r lock/requirements-dev-template.in + # docker rich==13.7.1 \ --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 # via typer -rpds-py==0.18.0 \ - --hash=sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f \ - --hash=sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c \ - --hash=sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76 \ - --hash=sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e \ - --hash=sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157 \ - --hash=sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f \ - --hash=sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5 \ - --hash=sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05 \ - --hash=sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24 \ - --hash=sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1 \ - --hash=sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8 \ - --hash=sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b \ - --hash=sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb \ - --hash=sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07 \ - --hash=sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1 \ - --hash=sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6 \ - --hash=sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e \ - --hash=sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e \ - --hash=sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1 \ - --hash=sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab \ - --hash=sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4 \ - --hash=sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17 \ - --hash=sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594 \ - --hash=sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d \ - --hash=sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d \ - --hash=sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3 \ - --hash=sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c \ - --hash=sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66 \ - --hash=sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f \ - --hash=sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80 \ - --hash=sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33 \ - --hash=sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f \ - --hash=sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c \ - --hash=sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022 \ - --hash=sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e \ - --hash=sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f \ - --hash=sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da \ - --hash=sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1 \ - --hash=sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688 \ - --hash=sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795 \ - --hash=sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c \ - --hash=sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98 \ - --hash=sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1 \ - --hash=sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20 \ - --hash=sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307 \ - --hash=sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4 \ - --hash=sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18 \ - --hash=sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294 \ - --hash=sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66 \ - --hash=sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467 \ - --hash=sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948 \ - --hash=sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e \ - --hash=sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1 \ - --hash=sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0 \ - --hash=sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7 \ - --hash=sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd \ - --hash=sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641 \ - --hash=sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d \ - --hash=sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9 \ - --hash=sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1 \ - --hash=sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da \ - --hash=sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3 \ - --hash=sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa \ - --hash=sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7 \ - --hash=sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40 \ - --hash=sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496 \ - --hash=sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124 \ - --hash=sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836 \ - --hash=sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434 \ - --hash=sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984 \ - --hash=sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f \ - --hash=sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6 \ - --hash=sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e \ - --hash=sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461 \ - --hash=sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c \ - --hash=sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432 \ - --hash=sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73 \ - --hash=sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58 \ - --hash=sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88 \ - --hash=sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337 \ - --hash=sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7 \ - --hash=sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863 \ - --hash=sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475 \ - --hash=sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3 \ - --hash=sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51 \ - --hash=sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf \ - --hash=sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024 \ - --hash=sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40 \ - --hash=sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9 \ - --hash=sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec \ - --hash=sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb \ - --hash=sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7 \ - --hash=sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861 \ - --hash=sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880 \ - --hash=sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f \ - --hash=sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd \ - --hash=sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca \ - --hash=sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58 \ - --hash=sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e +rpds-py==0.18.1 \ + --hash=sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee \ + --hash=sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc \ + --hash=sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc \ + --hash=sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944 \ + --hash=sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20 \ + --hash=sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7 \ + --hash=sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4 \ + --hash=sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6 \ + --hash=sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6 \ + --hash=sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93 \ + --hash=sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633 \ + --hash=sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0 \ + --hash=sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360 \ + --hash=sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8 \ + --hash=sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139 \ + --hash=sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7 \ + --hash=sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a \ + --hash=sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9 \ + --hash=sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26 \ + --hash=sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724 \ + --hash=sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72 \ + --hash=sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b \ + --hash=sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09 \ + --hash=sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100 \ + --hash=sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3 \ + --hash=sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261 \ + --hash=sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3 \ + --hash=sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9 \ + --hash=sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b \ + --hash=sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3 \ + --hash=sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de \ + --hash=sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d \ + --hash=sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e \ + --hash=sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8 \ + --hash=sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff \ + --hash=sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5 \ + --hash=sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c \ + --hash=sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e \ + --hash=sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e \ + --hash=sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4 \ + --hash=sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8 \ + --hash=sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922 \ + --hash=sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338 \ + --hash=sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d \ + --hash=sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8 \ + --hash=sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2 \ + --hash=sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72 \ + --hash=sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80 \ + --hash=sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644 \ + --hash=sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae \ + --hash=sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163 \ + --hash=sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104 \ + --hash=sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d \ + --hash=sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60 \ + --hash=sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a \ + --hash=sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d \ + --hash=sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07 \ + --hash=sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49 \ + --hash=sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10 \ + --hash=sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f \ + --hash=sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2 \ + --hash=sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8 \ + --hash=sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7 \ + --hash=sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88 \ + --hash=sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65 \ + --hash=sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0 \ + --hash=sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909 \ + --hash=sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8 \ + --hash=sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c \ + --hash=sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184 \ + --hash=sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397 \ + --hash=sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a \ + --hash=sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346 \ + --hash=sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590 \ + --hash=sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333 \ + --hash=sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb \ + --hash=sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74 \ + --hash=sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e \ + --hash=sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d \ + --hash=sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa \ + --hash=sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f \ + --hash=sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53 \ + --hash=sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1 \ + --hash=sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac \ + --hash=sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0 \ + --hash=sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd \ + --hash=sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611 \ + --hash=sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f \ + --hash=sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c \ + --hash=sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5 \ + --hash=sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab \ + --hash=sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc \ + --hash=sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43 \ + --hash=sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da \ + --hash=sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac \ + --hash=sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843 \ + --hash=sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e \ + --hash=sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89 \ + --hash=sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64 # via # jsonschema # referencing -ruff==0.4.2 \ - --hash=sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b \ - --hash=sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68 \ - --hash=sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac \ - --hash=sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483 \ - --hash=sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc \ - --hash=sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5 \ - --hash=sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798 \ - --hash=sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd \ - --hash=sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22 \ - --hash=sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376 \ - --hash=sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe \ - --hash=sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480 \ - --hash=sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e \ - --hash=sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa \ - --hash=sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5 \ - --hash=sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf \ - --hash=sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069 +ruff==0.4.4 \ + --hash=sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768 \ + --hash=sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6 \ + --hash=sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6 \ + --hash=sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae \ + --hash=sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15 \ + --hash=sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab \ + --hash=sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef \ + --hash=sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95 \ + --hash=sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e \ + --hash=sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595 \ + --hash=sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36 \ + --hash=sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85 \ + --hash=sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd \ + --hash=sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891 \ + --hash=sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9 \ + --hash=sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876 \ + --hash=sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af + # via -r lock/requirements-dev-template.in s3transfer==0.10.1 \ --hash=sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19 \ --hash=sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d # via boto3 -setuptools==69.5.1 \ - --hash=sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987 \ - --hash=sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32 - # via nodeenv +setuptools==70.0.0 \ + --hash=sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4 \ + --hash=sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0 + # via + # -r lock/requirements-dev-template.in + # nodeenv shellingham==1.5.4 \ --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 \ --hash=sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de @@ -965,6 +1107,7 @@ six==1.16.0 \ snakeviz==2.2.0 \ --hash=sha256:569e2d71c47f80a886aa6e70d6405cb6d30aa3520969ad956b06f824c5f02b8e \ --hash=sha256:7bfd00be7ae147eb4a170a471578e1cd3f41f803238958b6b8efcf2c698a6aa9 + # via -r lock/requirements-dev-template.in sniffio==1.3.1 \ --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc @@ -977,19 +1120,19 @@ starlette==0.37.2 \ # via fastapi stringcase==1.2.0 \ --hash=sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008 -testcontainers==4.4.0 \ - --hash=sha256:455e0e28bbf9dcf2d66a342e3103b0d8889db3295a490c009a98848e08791837 \ - --hash=sha256:f4e87c3831991f9b4d5b6544d0f438fbfd140a74c834b13efb15a2f7c89833c4 + # via -r lock/requirements-dev-template.in +testcontainers==4.4.1 \ + --hash=sha256:0ab41538d363576c30dcb9064bf50736d310da4ff99a8ab4f58bee9ac9e44cc6 \ + --hash=sha256:fdc9e6cfb6f4b2d4ecf1f7ff286c76283cd5fe0f91f71baf9817f505fa14575d + # via -r lock/requirements-dev.in tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f - # via - # coverage - # mypy - # pytest + # via -r lock/requirements-dev-template.in tomli-w==1.0.0 \ --hash=sha256:9f2a07e8be30a0729e533ec968016807069991ae2fd921a78d42f429ae5f4463 \ --hash=sha256:f463434305e0336248cac9c2dc8076b707d8a12d019dd349f5c1e382dd1ae1b9 + # via -r lock/requirements-dev-template.in tornado==6.4 \ --hash=sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0 \ --hash=sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63 \ @@ -1006,50 +1149,135 @@ tornado==6.4 \ typer==0.12.3 \ --hash=sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914 \ --hash=sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482 + # via + # -r lock/requirements-dev-template.in + # fsb (pyproject.toml) + # fastapi-cli typing-extensions==4.11.0 \ --hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \ --hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a # via - # anyio # fastapi - # logot # mypy # pydantic # pydantic-core - # starlette # testcontainers # typer - # uvicorn -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 +ujson==5.10.0 \ + --hash=sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e \ + --hash=sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b \ + --hash=sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6 \ + --hash=sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7 \ + --hash=sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9 \ + --hash=sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd \ + --hash=sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569 \ + --hash=sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f \ + --hash=sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51 \ + --hash=sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20 \ + --hash=sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1 \ + --hash=sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf \ + --hash=sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc \ + --hash=sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e \ + --hash=sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a \ + --hash=sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539 \ + --hash=sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27 \ + --hash=sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165 \ + --hash=sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126 \ + --hash=sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1 \ + --hash=sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816 \ + --hash=sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64 \ + --hash=sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8 \ + --hash=sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e \ + --hash=sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287 \ + --hash=sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3 \ + --hash=sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb \ + --hash=sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0 \ + --hash=sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043 \ + --hash=sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557 \ + --hash=sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e \ + --hash=sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21 \ + --hash=sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d \ + --hash=sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd \ + --hash=sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0 \ + --hash=sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337 \ + --hash=sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753 \ + --hash=sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804 \ + --hash=sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f \ + --hash=sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f \ + --hash=sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5 \ + --hash=sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5 \ + --hash=sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1 \ + --hash=sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00 \ + --hash=sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2 \ + --hash=sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050 \ + --hash=sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e \ + --hash=sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4 \ + --hash=sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8 \ + --hash=sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996 \ + --hash=sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6 \ + --hash=sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1 \ + --hash=sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f \ + --hash=sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1 \ + --hash=sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4 \ + --hash=sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b \ + --hash=sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88 \ + --hash=sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518 \ + --hash=sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5 \ + --hash=sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770 \ + --hash=sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4 \ + --hash=sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a \ + --hash=sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76 \ + --hash=sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe \ + --hash=sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988 \ + --hash=sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1 \ + --hash=sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5 \ + --hash=sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b \ + --hash=sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7 \ + --hash=sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8 \ + --hash=sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc \ + --hash=sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a \ + --hash=sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720 \ + --hash=sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3 \ + --hash=sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b \ + --hash=sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9 \ + --hash=sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1 \ + --hash=sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746 + # via fastapi +urllib3==2.2.1 \ + --hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \ + --hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19 # via + # -r lock/requirements-dev-template.in # botocore # docker # requests # testcontainers -uv==0.1.39 \ - --hash=sha256:2333dd52e6734e0da6722bdd7b7257d0f8beeac89623c5cfc3888b4c56bc812e \ - --hash=sha256:2ae930189742536f8178617c4ec05cb10271cb3886f6039abd36ee6ab511b160 \ - --hash=sha256:2bda6686a9bb1370d7f53436d34f8ede0fa1b9877b5e152aedd9b22fc3cb33a9 \ - --hash=sha256:3330bd7ab8a6160d815fdc36f48479edf6db8b58d39d20959555095ea7eb63c5 \ - --hash=sha256:3365e0631a738a482d2379e565a230b135f7c5665394313829ccabf7c76c1362 \ - --hash=sha256:388018659e5d73fdeb8ce13c1d812391ec981bf446ab86fb9c0e3d227f727da2 \ - --hash=sha256:4c6ee1148f23aa5d6edf1a1106cc33c4aa57bdbfe8d4c5068c672105415d3b99 \ - --hash=sha256:6b2acc907f7a1735dd9ffeb20d8c7aeeb86b1e5ba0a999e09433ad7f2789dc78 \ - --hash=sha256:7848d703201e6867ae2c70d611e6ffd53d5e5adfc2c9abe89b6d021975e43e81 \ - --hash=sha256:7ee426e0c5fa048cc44f3ac78e476121ef4365bb8bc9199d3cbffc372a80e55d \ - --hash=sha256:88f5601ee957f9be2efc7a24d186f9d2641053806e107e0e42c5e522882c89e0 \ - --hash=sha256:93217578e68a431df235173e390ad7df090499367cd7f5c811520fd4ea3d5047 \ - --hash=sha256:c131dba5fe5079d9c5f06846649e35662901a9afd9b31de17714c63e042d91d2 \ - --hash=sha256:c20b9023dac12ee518de79c91df313be7abb052440cb78f8ffb20dea81d3289e \ - --hash=sha256:cd6d9629ab0e22ab2336b8d6363573ea5a7060ef82ff5d3e6da4b1b30522ef13 \ - --hash=sha256:ce911087f56edc97a5792c17f682ed7611fedead0ea117f56bb6f3942eb3e7b3 \ - --hash=sha256:fba96b3049aea5c1394cd360e5900e4af39829df48ed6fc55eba115c00c8195a +uv==0.1.45 \ + --hash=sha256:088af576fb0e0462cd5f718d03fb1a9f16ce5ae61fdb2a9d3ea938fc826cecc1 \ + --hash=sha256:0f6cfe885f109bacc055edd5df2c837616ae2238b9324a9d37835a96b204ab2f \ + --hash=sha256:110e0f45ddb2fe832ce50b0308be90e5439e0c02d3ffe042feeb3f759811f31f \ + --hash=sha256:2ca2d5a5e06c5f71c7b213e14fa59129e63b77de3ffbcf84ecc98d647d73a821 \ + --hash=sha256:346aa2d0a4ad3c0c3f7852c1edf5e5a8e5d2ef34c7474e9089877291c2da979c \ + --hash=sha256:40fab956bc7af50dfa4bda14e5871528f57603eb9bf8595eb3144aace0ed8c47 \ + --hash=sha256:4e5d55f0f8b6ae416c72d78106e224c8e8338356da21ddebecc7b1723de80924 \ + --hash=sha256:68718add6ee2cef2816f9bf8a1dbf2d8cf63d98ddf45840f340029f65a49fd89 \ + --hash=sha256:7fdb235aaf420fa8ac9009999b1654a23540f03e25c35094543c2f48d7c41aef \ + --hash=sha256:87e77d25e8f358c0d5de1983497ee4cf4cea8fc73373d1ef1063533352db2f89 \ + --hash=sha256:8e2eeea4eec0e09f7d67378152428b5308dba8b33990d045d7a31d19bf18ca1f \ + --hash=sha256:90b68c80dddebeca69b26a2af1e2e683804bcf2b5f22d107af03d9156d6218c6 \ + --hash=sha256:a39141e179fea043151a165c9155031e7976b0e4b076c0c33a45b58a420134e0 \ + --hash=sha256:a601eed14d484d36d421e4208911a56aaf758ea6c385ef8edf8ad9f8ead57ce1 \ + --hash=sha256:b94180009264f3f7ee74250f8e4f99c8cb0cb3633e3a9c9c66cdef3eb69be575 \ + --hash=sha256:cd7f2f64fdded940342dc37234c11ae3508222c3c9b6b0eac5879dcd586010fa \ + --hash=sha256:ddb93620c9e01fa83573c2648df4bee3fa548ca940de51c8a2c3566a23a0c776 \ + --hash=sha256:de81501c0b03160d0944906d1a713f108258360e20c58385974acb7253b56166 + # via -r lock/requirements-dev-template.in uvicorn==0.29.0 \ --hash=sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de \ --hash=sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0 - # via ghga-service-commons + # via + # fastapi + # ghga-service-commons uvloop==0.19.0 \ --hash=sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd \ --hash=sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec \ @@ -1083,9 +1311,9 @@ uvloop==0.19.0 \ --hash=sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7 \ --hash=sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256 # via uvicorn -virtualenv==20.26.1 \ - --hash=sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b \ - --hash=sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75 +virtualenv==20.26.2 \ + --hash=sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c \ + --hash=sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b # via pre-commit watchfiles==0.21.0 \ --hash=sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc \ diff --git a/lock/requirements.txt b/lock/requirements.txt index acb67700..db89a822 100644 --- a/lock/requirements.txt +++ b/lock/requirements.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile --refresh --generate-hashes --output-file lock/requirements.txt /tmp/tmpb93jgb01/pyproject.toml -c lock/requirements-dev.txt +# uv pip compile --refresh --generate-hashes --output-file lock/requirements.txt /tmp/tmpa2jwqs7x/pyproject.toml -c lock/requirements-dev.txt aiokafka==0.10.0 \ --hash=sha256:007f1c51f440cc07155d2491f4deea6536492324153296aa73736a74cd833d3e \ --hash=sha256:05c4a7ced5d6f3dbc289767574d6a5d9b31e1c243e992dcecd34dbc40fcbbf9b \ @@ -32,67 +32,88 @@ aiokafka==0.10.0 \ --hash=sha256:f4b22a31f40493cea50dddb4dfc92750dfb273635ccb094a16fde9678eb38958 \ --hash=sha256:fafc95bdaed9e1810fcd80b02ac117e51c72681ffe50353e5d61e2170609e1fc \ --hash=sha256:ffc30e4c6bfcb00356a002f623c93a51d8336ca67687ea069dd11822da07379c - # via hexkit -annotated-types==0.6.0 \ - --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ - --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d - # via pydantic + # via + # -c lock/requirements-dev.txt + # hexkit +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ + --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 + # via + # -c lock/requirements-dev.txt + # pydantic anyio==4.3.0 \ --hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \ --hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6 # via + # -c lock/requirements-dev.txt + # httpx # starlette # watchfiles async-timeout==4.0.3 \ --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 - # via aiokafka + # via + # -c lock/requirements-dev.txt + # aiokafka attrs==23.2.0 \ --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via + # -c lock/requirements-dev.txt # jsonschema # referencing -bcrypt==4.1.2 \ - --hash=sha256:02d9ef8915f72dd6daaef40e0baeef8a017ce624369f09754baf32bb32dba25f \ - --hash=sha256:1c28973decf4e0e69cee78c68e30a523be441972c826703bb93099868a8ff5b5 \ - --hash=sha256:2a298db2a8ab20056120b45e86c00a0a5eb50ec4075b6142db35f593b97cb3fb \ - --hash=sha256:33313a1200a3ae90b75587ceac502b048b840fc69e7f7a0905b5f87fac7a1258 \ - --hash=sha256:3566a88234e8de2ccae31968127b0ecccbb4cddb629da744165db72b58d88ca4 \ - --hash=sha256:387e7e1af9a4dd636b9505a465032f2f5cb8e61ba1120e79a0e1cd0b512f3dfc \ - --hash=sha256:44290ccc827d3a24604f2c8bcd00d0da349e336e6503656cb8192133e27335e2 \ - --hash=sha256:57fa9442758da926ed33a91644649d3e340a71e2d0a5a8de064fb621fd5a3326 \ - --hash=sha256:68e3c6642077b0c8092580c819c1684161262b2e30c4f45deb000c38947bf483 \ - --hash=sha256:69057b9fc5093ea1ab00dd24ede891f3e5e65bee040395fb1e66ee196f9c9b4a \ - --hash=sha256:6cad43d8c63f34b26aef462b6f5e44fdcf9860b723d2453b5d391258c4c8e966 \ - --hash=sha256:71b8be82bc46cedd61a9f4ccb6c1a493211d031415a34adde3669ee1b0afbb63 \ - --hash=sha256:732b3920a08eacf12f93e6b04ea276c489f1c8fb49344f564cca2adb663b3e4c \ - --hash=sha256:9800ae5bd5077b13725e2e3934aa3c9c37e49d3ea3d06318010aa40f54c63551 \ - --hash=sha256:a97e07e83e3262599434816f631cc4c7ca2aa8e9c072c1b1a7fec2ae809a1d2d \ - --hash=sha256:ac621c093edb28200728a9cca214d7e838529e557027ef0581685909acd28b5e \ - --hash=sha256:b8df79979c5bae07f1db22dcc49cc5bccf08a0380ca5c6f391cbb5790355c0b0 \ - --hash=sha256:b90e216dc36864ae7132cb151ffe95155a37a14e0de3a8f64b49655dd959ff9c \ - --hash=sha256:ba4e4cc26610581a6329b3937e02d319f5ad4b85b074846bf4fef8a8cf51e7bb \ - --hash=sha256:ba55e40de38a24e2d78d34c2d36d6e864f93e0d79d0b6ce915e4335aa81d01b1 \ - --hash=sha256:be3ab1071662f6065899fe08428e45c16aa36e28bc42921c4901a191fda6ee42 \ - --hash=sha256:d75fc8cd0ba23f97bae88a6ec04e9e5351ff3c6ad06f38fe32ba50cbd0d11946 \ - --hash=sha256:e51c42750b7585cee7892c2614be0d14107fad9581d1738d954a262556dd1aab \ - --hash=sha256:ea505c97a5c465ab8c3ba75c0805a102ce526695cd6818c6de3b1a38f6f60da1 \ - --hash=sha256:eb3bd3321517916696233b5e0c67fd7d6281f0ef48e66812db35fc963a422a1c \ - --hash=sha256:f70d9c61f9c4ca7d57f3bfe88a5ccf62546ffbadf3681bb1e268d9d2e41c91a7 \ - --hash=sha256:fbe188b878313d01b7718390f31528be4010fed1faa798c5a1d0469c9c48c369 - # via crypt4gh -boto3==1.34.96 \ - --hash=sha256:42ea7d46688e7cb27259780b9da2cddcfaf2763ff5d327f4d54eac12edba8e72 \ - --hash=sha256:fe3d039631074a96374a354764641b6623036b6ea15381b8a04ac0a193b8c1e0 - # via hexkit -botocore==1.34.96 \ - --hash=sha256:00e917cd8152d902a4771b9e1e4d0cf1ee096c90027ee35f2a76b6d394e2ada5 \ - --hash=sha256:4c307f5772286f1ab58a91220ea8e180416a2ea0cc7e76983a6984e4ef8c212d +bcrypt==4.1.3 \ + --hash=sha256:01746eb2c4299dd0ae1670234bf77704f581dd72cc180f444bfe74eb80495b64 \ + --hash=sha256:037c5bf7c196a63dcce75545c8874610c600809d5d82c305dd327cd4969995bf \ + --hash=sha256:094fd31e08c2b102a14880ee5b3d09913ecf334cd604af27e1013c76831f7b05 \ + --hash=sha256:0d4cf6ef1525f79255ef048b3489602868c47aea61f375377f0d00514fe4a78c \ + --hash=sha256:193bb49eeeb9c1e2db9ba65d09dc6384edd5608d9d672b4125e9320af9153a15 \ + --hash=sha256:2505b54afb074627111b5a8dc9b6ae69d0f01fea65c2fcaea403448c503d3991 \ + --hash=sha256:2ee15dd749f5952fe3f0430d0ff6b74082e159c50332a1413d51b5689cf06623 \ + --hash=sha256:31adb9cbb8737a581a843e13df22ffb7c84638342de3708a98d5c986770f2834 \ + --hash=sha256:3a5be252fef513363fe281bafc596c31b552cf81d04c5085bc5dac29670faa08 \ + --hash=sha256:3d3b317050a9a711a5c7214bf04e28333cf528e0ed0ec9a4e55ba628d0f07c1a \ + --hash=sha256:48429c83292b57bf4af6ab75809f8f4daf52aa5d480632e53707805cc1ce9b74 \ + --hash=sha256:4a8bea4c152b91fd8319fef4c6a790da5c07840421c2b785084989bf8bbb7455 \ + --hash=sha256:4fb253d65da30d9269e0a6f4b0de32bd657a0208a6f4e43d3e645774fb5457f3 \ + --hash=sha256:551b320396e1d05e49cc18dd77d970accd52b322441628aca04801bbd1d52a73 \ + --hash=sha256:5f7cd3399fbc4ec290378b541b0cf3d4398e4737a65d0f938c7c0f9d5e686611 \ + --hash=sha256:6004f5229b50f8493c49232b8e75726b568535fd300e5039e255d919fc3a07f2 \ + --hash=sha256:6717543d2c110a155e6821ce5670c1f512f602eabb77dba95717ca76af79867d \ + --hash=sha256:6cac78a8d42f9d120b3987f82252bdbeb7e6e900a5e1ba37f6be6fe4e3848286 \ + --hash=sha256:8a893d192dfb7c8e883c4576813bf18bb9d59e2cfd88b68b725990f033f1b978 \ + --hash=sha256:8cbb119267068c2581ae38790e0d1fbae65d0725247a930fc9900c285d95725d \ + --hash=sha256:9f8ea645eb94fb6e7bea0cf4ba121c07a3a182ac52876493870033141aa687bc \ + --hash=sha256:c4c8d9b3e97209dd7111bf726e79f638ad9224b4691d1c7cfefa571a09b1b2d6 \ + --hash=sha256:cb9c707c10bddaf9e5ba7cdb769f3e889e60b7d4fea22834b261f51ca2b89fed \ + --hash=sha256:d84702adb8f2798d813b17d8187d27076cca3cd52fe3686bb07a9083930ce650 \ + --hash=sha256:ec3c2e1ca3e5c4b9edb94290b356d082b721f3f50758bce7cce11d8a7c89ce84 \ + --hash=sha256:f44a97780677e7ac0ca393bd7982b19dbbd8d7228c1afe10b128fd9550eef5f1 \ + --hash=sha256:f5698ce5292a4e4b9e5861f7e53b1d89242ad39d54c3da451a93cac17b61921a # via + # -c lock/requirements-dev.txt + # crypt4gh +boto3==1.34.109 \ + --hash=sha256:50a0f24dd737529ae489a3586f260b9220c6aede1ae7851fa4f33878c8805ef8 \ + --hash=sha256:98d389562e03a46fd79fea5f988e9e6032674a0c3e9e42c06941ec588b7e1070 + # via + # -c lock/requirements-dev.txt + # hexkit +botocore==1.34.109 \ + --hash=sha256:647059a81acbfab85c694b9b57b0ef200dde071449fb8837f10aef9c6472730d \ + --hash=sha256:804821252597821f7223cb3bfca2a2a513ae0bb9a71e8e22605aff6866e13e71 + # via + # -c lock/requirements-dev.txt # boto3 # hexkit # s3transfer +certifi==2024.2.2 \ + --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \ + --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 + # via + # -c lock/requirements-dev.txt + # httpcore + # httpx cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ @@ -147,86 +168,121 @@ cffi==1.16.0 \ --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 # via + # -c lock/requirements-dev.txt # cryptography # pynacl click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de # via + # -c lock/requirements-dev.txt # typer # uvicorn crypt4gh==1.6 \ --hash=sha256:134015d4d1ea469389f6ee2c7036dec58caf91b3fb87cc6e131876080942306a \ --hash=sha256:c44d999e5da84ca0bff00d0381eacfa27855ccbbd2eb0c95ec7b80f31e82860d -cryptography==42.0.5 \ - --hash=sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee \ - --hash=sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576 \ - --hash=sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d \ - --hash=sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30 \ - --hash=sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413 \ - --hash=sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb \ - --hash=sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da \ - --hash=sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4 \ - --hash=sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd \ - --hash=sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc \ - --hash=sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8 \ - --hash=sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1 \ - --hash=sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc \ - --hash=sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e \ - --hash=sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8 \ - --hash=sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940 \ - --hash=sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400 \ - --hash=sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7 \ - --hash=sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16 \ - --hash=sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278 \ - --hash=sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74 \ - --hash=sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec \ - --hash=sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1 \ - --hash=sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2 \ - --hash=sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c \ - --hash=sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922 \ - --hash=sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a \ - --hash=sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6 \ - --hash=sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1 \ - --hash=sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e \ - --hash=sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac \ - --hash=sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7 - # via crypt4gh + # via + # -c lock/requirements-dev.txt + # fsb (pyproject.toml) +cryptography==42.0.7 \ + --hash=sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55 \ + --hash=sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785 \ + --hash=sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b \ + --hash=sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886 \ + --hash=sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82 \ + --hash=sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1 \ + --hash=sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda \ + --hash=sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f \ + --hash=sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68 \ + --hash=sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60 \ + --hash=sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7 \ + --hash=sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd \ + --hash=sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582 \ + --hash=sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc \ + --hash=sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858 \ + --hash=sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b \ + --hash=sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2 \ + --hash=sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678 \ + --hash=sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13 \ + --hash=sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4 \ + --hash=sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8 \ + --hash=sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604 \ + --hash=sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477 \ + --hash=sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e \ + --hash=sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a \ + --hash=sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9 \ + --hash=sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14 \ + --hash=sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda \ + --hash=sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da \ + --hash=sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562 \ + --hash=sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2 \ + --hash=sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9 + # via + # -c lock/requirements-dev.txt + # crypt4gh dnspython==2.6.1 \ --hash=sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50 \ --hash=sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc # via + # -c lock/requirements-dev.txt # email-validator # pymongo docopt==0.6.2 \ --hash=sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491 - # via crypt4gh + # via + # -c lock/requirements-dev.txt + # crypt4gh email-validator==2.1.1 \ --hash=sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84 \ --hash=sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05 - # via pydantic -exceptiongroup==1.2.1 \ - --hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \ - --hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16 - # via anyio -fastapi==0.110.3 \ - --hash=sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626 \ - --hash=sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32 - # via ghga-service-commons -ghga-event-schemas==3.1.0 \ - --hash=sha256:87706784895376314124d30a0ba77dd7cfebdbfbcbb98e88d2a836486f11c385 \ - --hash=sha256:fa0048eda36002e7a79bc9084d2acdcc9eb9d38bcf263d6f68ad6fc453cae130 -ghga-service-commons==3.1.3 \ - --hash=sha256:4f7c2b56ae24594dd60cb28719f040351056c06d59b2d8f74f46eb9005b770f2 \ - --hash=sha256:8b2e255506ac11cfafba3a18f58c0471a0b1b0c89893f6489a8a2f9af4dd6c0b + # via + # -c lock/requirements-dev.txt + # fastapi + # pydantic +fastapi==0.111.0 \ + --hash=sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0 \ + --hash=sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7 + # via + # -c lock/requirements-dev.txt + # ghga-service-commons +fastapi-cli==0.0.4 \ + --hash=sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809 \ + --hash=sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32 + # via + # -c lock/requirements-dev.txt + # fastapi +ghga-event-schemas==3.3.0 \ + --hash=sha256:852a04ebadf311e1e04d9b95a6286716a2e80f1e6c135795c3f207fc58011290 \ + --hash=sha256:d98b82d3fb92698a7ee0505740ed2469d62c4577c651b5f98d561720a27db8cf + # via + # -c lock/requirements-dev.txt + # fsb (pyproject.toml) +ghga-service-commons==3.1.4 \ + --hash=sha256:63450bed2f0ca7431f064b640d35e15a29f93b7f4c67b5fd3b812afc8ced5151 \ + --hash=sha256:eb78042aeb17bb70e17f7c7185fbcf87a54968a410de99f968a7e944cd0f6f78 + # via + # -c lock/requirements-dev.txt + # fsb (pyproject.toml) h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 - # via uvicorn -hexkit==3.0.2 \ - --hash=sha256:172c55b756ea0a5ff5e83ba97860947408a132bb37800404e6e7b1cabab9d3e7 \ - --hash=sha256:d8cb77d64c6021725f6e40e87d62792e22a8928810de983f96a6ecfe9245f1f8 - # via ghga-service-commons + # via + # -c lock/requirements-dev.txt + # httpcore + # uvicorn +hexkit==3.1.0 \ + --hash=sha256:3f96ede959b4d81a6b78637ebf47019787e5d3321bd01f9abe82cb8118bada66 \ + --hash=sha256:b922c048091f622798ccf25a767fe3d64ff8ee000d1c3cf18967b6b6de8f2592 + # via + # -c lock/requirements-dev.txt + # fsb (pyproject.toml) + # ghga-service-commons +httpcore==1.0.5 \ + --hash=sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61 \ + --hash=sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5 + # via + # -c lock/requirements-dev.txt + # httpx httptools==0.6.1 \ --hash=sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563 \ --hash=sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142 \ @@ -264,53 +320,198 @@ httptools==0.6.1 \ --hash=sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81 \ --hash=sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185 \ --hash=sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3 - # via uvicorn + # via + # -c lock/requirements-dev.txt + # uvicorn +httpx==0.27.0 \ + --hash=sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5 \ + --hash=sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5 + # via + # -c lock/requirements-dev.txt + # fastapi idna==3.7 \ --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via + # -c lock/requirements-dev.txt # anyio # email-validator + # httpx +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + # via + # -c lock/requirements-dev.txt + # fastapi jmespath==1.0.1 \ --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe # via + # -c lock/requirements-dev.txt # boto3 # botocore jsonschema==4.22.0 \ --hash=sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7 \ --hash=sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802 # via + # -c lock/requirements-dev.txt # ghga-event-schemas # hexkit jsonschema-specifications==2023.12.1 \ --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c - # via jsonschema + # via + # -c lock/requirements-dev.txt + # jsonschema markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb - # via rich + # via + # -c lock/requirements-dev.txt + # rich +markupsafe==2.1.5 \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 + # via + # -c lock/requirements-dev.txt + # jinja2 mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba - # via markdown-it-py + # via + # -c lock/requirements-dev.txt + # markdown-it-py motor==3.4.0 \ --hash=sha256:4b1e1a0cc5116ff73be2c080a72da078f2bb719b53bc7a6bb9e9a2f7dcd421ed \ --hash=sha256:c89b4e4eb2e711345e91c7c9b122cb68cce0e5e869ed0387dd0acb10775e3131 - # via hexkit + # via + # -c lock/requirements-dev.txt + # hexkit +orjson==3.10.3 \ + --hash=sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2 \ + --hash=sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b \ + --hash=sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5 \ + --hash=sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b \ + --hash=sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0 \ + --hash=sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0 \ + --hash=sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7 \ + --hash=sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42 \ + --hash=sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5 \ + --hash=sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa \ + --hash=sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818 \ + --hash=sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25 \ + --hash=sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08 \ + --hash=sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7 \ + --hash=sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b \ + --hash=sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754 \ + --hash=sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0 \ + --hash=sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912 \ + --hash=sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b \ + --hash=sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3 \ + --hash=sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700 \ + --hash=sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78 \ + --hash=sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290 \ + --hash=sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134 \ + --hash=sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294 \ + --hash=sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0 \ + --hash=sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5 \ + --hash=sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d \ + --hash=sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d \ + --hash=sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16 \ + --hash=sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195 \ + --hash=sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da \ + --hash=sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8 \ + --hash=sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098 \ + --hash=sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8 \ + --hash=sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063 \ + --hash=sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534 \ + --hash=sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d \ + --hash=sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109 \ + --hash=sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d \ + --hash=sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3 \ + --hash=sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2 \ + --hash=sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf \ + --hash=sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069 \ + --hash=sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7 \ + --hash=sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176 + # via + # -c lock/requirements-dev.txt + # fastapi packaging==24.0 \ --hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \ --hash=sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9 - # via aiokafka + # via + # -c lock/requirements-dev.txt + # aiokafka pycparser==2.22 \ --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc - # via cffi + # via + # -c lock/requirements-dev.txt + # cffi pydantic==2.7.1 \ --hash=sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5 \ --hash=sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc # via + # -c lock/requirements-dev.txt # fastapi # ghga-event-schemas # ghga-service-commons @@ -396,77 +597,85 @@ pydantic-core==2.18.2 \ --hash=sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0 \ --hash=sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4 \ --hash=sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242 - # via pydantic + # via + # -c lock/requirements-dev.txt + # pydantic pydantic-settings==2.2.1 \ --hash=sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed \ --hash=sha256:0235391d26db4d2190cb9b31051c4b46882d28a51533f97440867f012d4da091 - # via hexkit -pygments==2.17.2 \ - --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ - --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 - # via rich -pymongo==4.7.1 \ - --hash=sha256:11f74dafde63ad2dc30c01f40b4c69d9af157f8ba5224b0c9d4de7158537266f \ - --hash=sha256:13fc201e073644acd77860d9e91ccfc27addf510563e07381cadc9a55ac3a894 \ - --hash=sha256:1bd1eef70c1eda838b26397ef75c9580d7a97fd94b6324971d7f3d2ad3552e9a \ - --hash=sha256:24c8f1dd545360ec1b79007a3ba6573af565df6fde49f6dfc53813f3f475a751 \ - --hash=sha256:253ed8fd6e7f4b2a1caa89e6b287b9e04f42613319ee1e1240c2db2afe1637e7 \ - --hash=sha256:263c169302df636f9086b584994a51d0adfc8738fe27d7b8e2aacf46fd68b6cb \ - --hash=sha256:297cdc87c4b4168782b571c8643540e9b0ad1d09266b43d2f5954f8632280835 \ - --hash=sha256:2ccc8dd4fe9aac18dde27c33a53271c6c90159b74c43fbdab1d33d5efc36c2f5 \ - --hash=sha256:30a9d891631d7e847b24f551b1d89ff2033539e7cd8e9af29714b4d0db7abb06 \ - --hash=sha256:31ed8ba3da0366346264604b3a443f5a4232cab5ed45f520bead6184cf0851a1 \ - --hash=sha256:337d99f88d32a5f8056d6d2bc365ccf09d09583f3942882c50cf11b459e8fbc0 \ - --hash=sha256:3ef32a7cfe748c0c72fdad9e51459de5e0c6b16c5288b39f863abfff23503847 \ - --hash=sha256:455f9d603ed0990a787773d5718e871300bddf585ce543baf129c9f5ca3adb02 \ - --hash=sha256:45ac46f0d6bdc2baac34ced60aae27b2083170d77397330eff0ac5689ea29d38 \ - --hash=sha256:4c7e05454cdc5aa4702e03cad0df4205daccd6fd631bbbf0a85bbe598129a6cc \ - --hash=sha256:4d227555be35078b53f506f6b58bd0b0e8fd4513e89e6f29e83a97efab439250 \ - --hash=sha256:4dd998e9f0f7694032c1648c7f57fccaa78903df6329b8f8ae20cfa7c4ceca34 \ - --hash=sha256:5119c66af8c4197c8757b4b7d98c443e5b127c224ac92fb657dbe2b512ae2713 \ - --hash=sha256:57b5b485ef89270ed2e603814f43f0fdd9b8ba5d4039124d90878cdc2327000c \ - --hash=sha256:58989bcb94233233a71645236b972835d4f87a6bb1b7e818d38a7e6e6d4630de \ - --hash=sha256:5a58b6cd7c423ba49db10d8445756062c931ad2246ba0da1e705bf22962fd9e9 \ - --hash=sha256:5ae1aeeb405c29885266666dc7115792d647ed68cfdb6ed02e2e211d12f2e1c8 \ - --hash=sha256:5bc87db2e9563295c4e45602ab978a2fcbaba3ab89e745503b24f895cddeb755 \ - --hash=sha256:5ff6d56ca1f0cd3687a13ce90a32a8efb3cc3a53728e5ac160c4c30d10385a72 \ - --hash=sha256:615c7573d7a9c4837332a673fdc5a5f214b474dd52d846bcf4cc3d011550bee1 \ - --hash=sha256:64b69b9cd8a6d23881a80490d575e92918f9afca43096a7d6c1013d6b3e5c75c \ - --hash=sha256:65c45682d5ed8c6618bde22cd6716b47a197f4ef800a025213b28d13a59e5fca \ - --hash=sha256:67cbee427c263a4483e3249fef480788ccc16edb1a4fc330c4c6cb0cb9db94a8 \ - --hash=sha256:7247c1dc7d8eed4e24eb1dd92c4c58ebf1e5159500015652552acfdebdeed256 \ - --hash=sha256:73bf96ece4999b0bbab7169cb2b9c60918b434487009e48be4bd47eeb2aa7b14 \ - --hash=sha256:7b10603ba64af08f5af7eb9a69d6b24e3c69d91fdd48c54b95e284686c1c582d \ - --hash=sha256:811a07bba9d35f1e34159ede632ac71dbc429b372a20004e32d6578af872db1a \ - --hash=sha256:811c41c6227b7548afcb53e1b996c25262d837b5e5f519e2ddc2c7e59d8728a5 \ - --hash=sha256:85b8dd3756b73993b1e3ab6b1cba826b9e4987a094a5d5b6d37313776458cd94 \ - --hash=sha256:887d043ecc0c7d5591925bbc7abb67caf21c94d6e6e5d442cb49eb5d9d8ee76b \ - --hash=sha256:8cee62188127a126f59ea45d3981868a5e35343be4ef4ad8712eaf42be37a00b \ - --hash=sha256:9e0a30a022ac8a9164ee5a4b761e13dbb3d10a21845f7258011e3415151fb645 \ - --hash=sha256:9e99dac3c7c2cb498937cc1767361851099da38861e921113318c87d71e3d127 \ - --hash=sha256:a46c08ef0b273c415b1e8933f6739596be264ae700a4927f84e0b84e70fdf0eb \ - --hash=sha256:a848249d5b4763497add62f7dd7bd0ce1538129bf42f4cb132a76d24c61bf98d \ - --hash=sha256:aa354933a158e57494c98b592f46d5d24d1b109e6ba05a05179cde719d9f7fd3 \ - --hash=sha256:ad360630c221aee7c0841a51851496a3ca6fdea87007098a982c1aa26e34083a \ - --hash=sha256:b897b60b2d55c26f3efea0effc11b655db68125c3731274bc3953375e9ccab73 \ - --hash=sha256:b8b95e2163b73d03a913efa89b0f7c5012be82efd4e9dbce8aa62010a75a277c \ - --hash=sha256:bfd5c7e5bb87171a5296fa32205adb50b27704a612036ec4395c3cd316fc0e91 \ - --hash=sha256:c808098f2cdb87d4035144e536ba5fa7709d0420c17b68e6ace5da18c38ded5f \ - --hash=sha256:d1829a7db720ff586aaf59c806e89e0a388548063aa844d21a570a231ad8ca87 \ - --hash=sha256:d50969de00d3522b2c394f7e59b843871e2be4b525af92066da7f3bd02799fdc \ - --hash=sha256:d63f38454a2e23c117d3ceab3b661568f2418536825787256ad24e5baaedfd27 \ - --hash=sha256:d804eaf19a65211cc2c8c5db75be685c3f31c64cdab639794f66f13f8e258ba6 \ - --hash=sha256:daf35ab13b86aba7cc8c4b019882f1fa8d287a26f586ef5eaf60a5233d3eaa52 \ - --hash=sha256:dbc32217c81d87750401fa1c2bc9450e854b23e6e30243c82d3514b8e58f39e3 \ - --hash=sha256:e175d74c52b6c8414a4b4504a2dd42b0202d101b2eb9508a34c137357683864e \ - --hash=sha256:e4a63ba6813a2168ebd35ea5369f6c33f7787525986cd77668b7956acc3d2a38 \ - --hash=sha256:e935712b17e7a42831022353bac91a346a792658a54e12bec907ec11695cc899 \ - --hash=sha256:ec94d29103317aa920dae59ed385de9604cb0ef840b5b7137b5eaa7a2042580a \ - --hash=sha256:ed6b3a0740efe98bb03ccf054578e9788ebcd06d021d548b8217ab2c82e45975 \ - --hash=sha256:f2a720e787c9b9b912db5bb4c3e7123ccff1352d6c3ac0cb2c7ee392cdc95c00 \ - --hash=sha256:f8822614975038e0cece47d12e7634a79c2ee590a0ae78ae64c37b9c6610a14c \ - --hash=sha256:fb1a884b1c6aeac5ffeb8ccb696fbc242a7ae1bba36f2328c01f76fab7221b94 - # via motor + # via + # -c lock/requirements-dev.txt + # hexkit +pygments==2.18.0 \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a + # via + # -c lock/requirements-dev.txt + # rich +pymongo==4.7.2 \ + --hash=sha256:02efd1bb3397e24ef2af45923888b41a378ce00cb3a4259c5f4fc3c70497a22f \ + --hash=sha256:0d833651f1ba938bb7501f13e326b96cfbb7d98867b2d545ca6d69c7664903e0 \ + --hash=sha256:12c466e02133b7f8f4ff1045c6b5916215c5f7923bc83fd6e28e290cba18f9f6 \ + --hash=sha256:12d1fef77d25640cb78893d07ff7d2fac4c4461d8eec45bd3b9ad491a1115d6e \ + --hash=sha256:194065c9d445017b3c82fb85f89aa2055464a080bde604010dc8eb932a6b3c95 \ + --hash=sha256:1c78f156edc59b905c80c9003e022e1a764c54fd40ac4fea05b0764f829790e2 \ + --hash=sha256:1e37faf298a37ffb3e0809e77fbbb0a32b6a2d18a83c59cfc2a7b794ea1136b0 \ + --hash=sha256:25eeb2c18ede63891cbd617943dd9e6b9cbccc54f276e0b2e693a0cc40f243c5 \ + --hash=sha256:268d8578c0500012140c5460755ea405cbfe541ef47c81efa9d6744f0f99aeca \ + --hash=sha256:2cb77d09bd012cb4b30636e7e38d00b5f9be5eb521c364bde66490c45ee6c4b4 \ + --hash=sha256:347c49cf7f0ba49ea87c1a5a1984187ecc5516b7c753f31938bf7b37462824fd \ + --hash=sha256:35b3f0c7d49724859d4df5f0445818d525824a6cd55074c42573d9b50764df67 \ + --hash=sha256:37e9ea81fa59ee9274457ed7d59b6c27f6f2a5fe8e26f184ecf58ea52a019cb8 \ + --hash=sha256:47a1a4832ef2f4346dcd1a10a36ade7367ad6905929ddb476459abb4fd1b98cb \ + --hash=sha256:4bdb5ffe1cd3728c9479671a067ef44dacafc3743741d4dc700c377c4231356f \ + --hash=sha256:4ffd1519edbe311df73c74ec338de7d294af535b2748191c866ea3a7c484cd15 \ + --hash=sha256:5239776633f7578b81207e5646245415a5a95f6ae5ef5dff8e7c2357e6264bfc \ + --hash=sha256:5239ef7e749f1326ea7564428bf861d5250aa39d7f26d612741b1b1273227062 \ + --hash=sha256:56bf8b706946952acdea0fe478f8e44f1ed101c4b87f046859e6c3abe6c0a9f4 \ + --hash=sha256:65b4c00dedbd333698b83cd2095a639a6f0d7c4e2a617988f6c65fb46711f028 \ + --hash=sha256:6a87eef394039765679f75c6a47455a4030870341cb76eafc349c5944408c882 \ + --hash=sha256:727ad07952c155cd20045f2ce91143c7dc4fb01a5b4e8012905a89a7da554b0c \ + --hash=sha256:730778b6f0964b164c187289f906bbc84cb0524df285b7a85aa355bbec43eb21 \ + --hash=sha256:743552033c63f0afdb56b9189ab04b5c1dbffd7310cf7156ab98eebcecf24621 \ + --hash=sha256:7e9d9d2c0aae73aa4369bd373ac2ac59f02c46d4e56c4b6d6e250cfe85f76802 \ + --hash=sha256:82102e353be13f1a6769660dd88115b1da382447672ba1c2662a0fbe3df1d861 \ + --hash=sha256:827611beb6c483260d520cfa6a49662d980dfa5368a04296f65fa39e78fccea7 \ + --hash=sha256:84bc00200c3cbb6c98a2bb964c9e8284b641e4a33cf10c802390552575ee21de \ + --hash=sha256:87032f818bf5052ab742812c715eff896621385c43f8f97cdd37d15b5d394e95 \ + --hash=sha256:87832d6076c2c82f42870157414fd876facbb6554d2faf271ffe7f8f30ce7bed \ + --hash=sha256:87bb453ac3eb44db95cb6d5a616fbc906c1c00661eec7f55696253a6245beb8a \ + --hash=sha256:9024e1661c6e40acf468177bf90ce924d1bc681d2b244adda3ed7b2f4c4d17d7 \ + --hash=sha256:9349f0bb17a31371d4cacb64b306e4ca90413a3ad1fffe73ac7cd495570d94b5 \ + --hash=sha256:9385654f01a90f73827af4db90c290a1519f7d9102ba43286e187b373e9a78e9 \ + --hash=sha256:9a8bd37f5dabc86efceb8d8cbff5969256523d42d08088f098753dba15f3b37a \ + --hash=sha256:9d892fb91e81cccb83f507cdb2ea0aa026ec3ced7f12a1d60f6a5bf0f20f9c1f \ + --hash=sha256:a754e366c404d19ff3f077ddeed64be31e0bb515e04f502bf11987f1baa55a16 \ + --hash=sha256:b48a5650ee5320d59f6d570bd99a8d5c58ac6f297a4e9090535f6561469ac32e \ + --hash=sha256:bcf337d1b252405779d9c79978d6ca15eab3cdaa2f44c100a79221bddad97c8a \ + --hash=sha256:c44efab10d9a3db920530f7bcb26af8f408b7273d2f0214081d3891979726328 \ + --hash=sha256:c72d16fede22efe7cdd1f422e8da15760e9498024040429362886f946c10fe95 \ + --hash=sha256:cb6e00a79dff22c9a72212ad82021b54bdb3b85f38a85f4fc466bde581d7d17a \ + --hash=sha256:ce1a374ea0e49808e0380ffc64284c0ce0f12bd21042b4bef1af3eb7bdf49054 \ + --hash=sha256:cecd2df037249d1c74f0af86fb5b766104a5012becac6ff63d85d1de53ba8b98 \ + --hash=sha256:cf17ea9cea14d59b0527403dd7106362917ced7c4ec936c4ba22bd36c912c8e0 \ + --hash=sha256:cf28430ec1924af1bffed37b69a812339084697fd3f3e781074a0148e6475803 \ + --hash=sha256:d1bcd58669e56c08f1e72c5758868b5df169fe267501c949ee83c418e9df9155 \ + --hash=sha256:d275596f840018858757561840767b39272ac96436fcb54f5cac6d245393fd97 \ + --hash=sha256:d2dcf608d35644e8d276d61bf40a93339d8d66a0e5f3e3f75b2c155a421a1b71 \ + --hash=sha256:d4d59776f435564159196d971aa89422ead878174aff8fe18e06d9a0bc6d648c \ + --hash=sha256:d9b6cbc037108ff1a0a867e7670d8513c37f9bcd9ee3d2464411bfabf70ca002 \ + --hash=sha256:db4380d1e69fdad1044a4b8f3bb105200542c49a0dde93452d938ff9db1d6d29 \ + --hash=sha256:e004527ea42a6b99a8b8d5b42b42762c3bdf80f88fbdb5c3a9d47f3808495b86 \ + --hash=sha256:e6eab12c6385526d386543d6823b07187fefba028f0da216506e00f0e1855119 \ + --hash=sha256:eb0642e5f0dd7e86bb358749cc278e70b911e617f519989d346f742dc9520dfb \ + --hash=sha256:f91073049c43d14e66696970dd708d319b86ee57ef9af359294eee072abaac79 \ + --hash=sha256:fadc6e8db7707c861ebe25b13ad6aca19ea4d2c56bf04a26691f46c23dadf6e4 \ + --hash=sha256:fc5af24fcf5fc6f7f40d65446400d45dd12bea933d0299dc9e90c5b22197f1e9 \ + --hash=sha256:fcaf8c911cb29316a02356f89dbc0e0dfcc6a712ace217b6b543805690d2aefd \ + --hash=sha256:ffd4d7cb2e6c6e100e2b39606d38a9ffc934e18593dc9bb326196afc7d93ce3d + # via + # -c lock/requirements-dev.txt + # motor pynacl==1.5.0 \ --hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \ --hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \ @@ -478,17 +687,28 @@ pynacl==1.5.0 \ --hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \ --hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \ --hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543 - # via crypt4gh + # via + # -c lock/requirements-dev.txt + # crypt4gh python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 - # via botocore + # via + # -c lock/requirements-dev.txt + # botocore python-dotenv==1.0.1 \ --hash=sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca \ --hash=sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a # via + # -c lock/requirements-dev.txt # pydantic-settings # uvicorn +python-multipart==0.0.9 \ + --hash=sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026 \ + --hash=sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215 + # via + # -c lock/requirements-dev.txt + # fastapi pyyaml==6.0.1 \ --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ @@ -542,6 +762,7 @@ pyyaml==6.0.1 \ --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f # via + # -c lock/requirements-dev.txt # crypt4gh # hexkit # uvicorn @@ -549,157 +770,261 @@ referencing==0.35.1 \ --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \ --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de # via + # -c lock/requirements-dev.txt # jsonschema # jsonschema-specifications rich==13.7.1 \ --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 - # via typer -rpds-py==0.18.0 \ - --hash=sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f \ - --hash=sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c \ - --hash=sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76 \ - --hash=sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e \ - --hash=sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157 \ - --hash=sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f \ - --hash=sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5 \ - --hash=sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05 \ - --hash=sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24 \ - --hash=sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1 \ - --hash=sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8 \ - --hash=sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b \ - --hash=sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb \ - --hash=sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07 \ - --hash=sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1 \ - --hash=sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6 \ - --hash=sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e \ - --hash=sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e \ - --hash=sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1 \ - --hash=sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab \ - --hash=sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4 \ - --hash=sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17 \ - --hash=sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594 \ - --hash=sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d \ - --hash=sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d \ - --hash=sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3 \ - --hash=sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c \ - --hash=sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66 \ - --hash=sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f \ - --hash=sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80 \ - --hash=sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33 \ - --hash=sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f \ - --hash=sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c \ - --hash=sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022 \ - --hash=sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e \ - --hash=sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f \ - --hash=sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da \ - --hash=sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1 \ - --hash=sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688 \ - --hash=sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795 \ - --hash=sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c \ - --hash=sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98 \ - --hash=sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1 \ - --hash=sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20 \ - --hash=sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307 \ - --hash=sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4 \ - --hash=sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18 \ - --hash=sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294 \ - --hash=sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66 \ - --hash=sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467 \ - --hash=sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948 \ - --hash=sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e \ - --hash=sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1 \ - --hash=sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0 \ - --hash=sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7 \ - --hash=sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd \ - --hash=sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641 \ - --hash=sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d \ - --hash=sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9 \ - --hash=sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1 \ - --hash=sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da \ - --hash=sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3 \ - --hash=sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa \ - --hash=sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7 \ - --hash=sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40 \ - --hash=sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496 \ - --hash=sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124 \ - --hash=sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836 \ - --hash=sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434 \ - --hash=sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984 \ - --hash=sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f \ - --hash=sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6 \ - --hash=sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e \ - --hash=sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461 \ - --hash=sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c \ - --hash=sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432 \ - --hash=sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73 \ - --hash=sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58 \ - --hash=sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88 \ - --hash=sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337 \ - --hash=sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7 \ - --hash=sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863 \ - --hash=sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475 \ - --hash=sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3 \ - --hash=sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51 \ - --hash=sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf \ - --hash=sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024 \ - --hash=sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40 \ - --hash=sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9 \ - --hash=sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec \ - --hash=sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb \ - --hash=sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7 \ - --hash=sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861 \ - --hash=sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880 \ - --hash=sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f \ - --hash=sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd \ - --hash=sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca \ - --hash=sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58 \ - --hash=sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e # via + # -c lock/requirements-dev.txt + # typer +rpds-py==0.18.1 \ + --hash=sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee \ + --hash=sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc \ + --hash=sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc \ + --hash=sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944 \ + --hash=sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20 \ + --hash=sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7 \ + --hash=sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4 \ + --hash=sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6 \ + --hash=sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6 \ + --hash=sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93 \ + --hash=sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633 \ + --hash=sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0 \ + --hash=sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360 \ + --hash=sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8 \ + --hash=sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139 \ + --hash=sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7 \ + --hash=sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a \ + --hash=sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9 \ + --hash=sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26 \ + --hash=sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724 \ + --hash=sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72 \ + --hash=sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b \ + --hash=sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09 \ + --hash=sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100 \ + --hash=sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3 \ + --hash=sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261 \ + --hash=sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3 \ + --hash=sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9 \ + --hash=sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b \ + --hash=sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3 \ + --hash=sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de \ + --hash=sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d \ + --hash=sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e \ + --hash=sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8 \ + --hash=sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff \ + --hash=sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5 \ + --hash=sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c \ + --hash=sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e \ + --hash=sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e \ + --hash=sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4 \ + --hash=sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8 \ + --hash=sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922 \ + --hash=sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338 \ + --hash=sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d \ + --hash=sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8 \ + --hash=sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2 \ + --hash=sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72 \ + --hash=sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80 \ + --hash=sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644 \ + --hash=sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae \ + --hash=sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163 \ + --hash=sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104 \ + --hash=sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d \ + --hash=sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60 \ + --hash=sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a \ + --hash=sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d \ + --hash=sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07 \ + --hash=sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49 \ + --hash=sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10 \ + --hash=sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f \ + --hash=sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2 \ + --hash=sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8 \ + --hash=sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7 \ + --hash=sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88 \ + --hash=sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65 \ + --hash=sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0 \ + --hash=sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909 \ + --hash=sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8 \ + --hash=sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c \ + --hash=sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184 \ + --hash=sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397 \ + --hash=sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a \ + --hash=sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346 \ + --hash=sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590 \ + --hash=sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333 \ + --hash=sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb \ + --hash=sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74 \ + --hash=sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e \ + --hash=sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d \ + --hash=sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa \ + --hash=sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f \ + --hash=sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53 \ + --hash=sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1 \ + --hash=sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac \ + --hash=sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0 \ + --hash=sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd \ + --hash=sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611 \ + --hash=sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f \ + --hash=sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c \ + --hash=sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5 \ + --hash=sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab \ + --hash=sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc \ + --hash=sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43 \ + --hash=sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da \ + --hash=sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac \ + --hash=sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843 \ + --hash=sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e \ + --hash=sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89 \ + --hash=sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64 + # via + # -c lock/requirements-dev.txt # jsonschema # referencing s3transfer==0.10.1 \ --hash=sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19 \ --hash=sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d - # via boto3 + # via + # -c lock/requirements-dev.txt + # boto3 shellingham==1.5.4 \ --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 \ --hash=sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de - # via typer + # via + # -c lock/requirements-dev.txt + # typer six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via python-dateutil + # via + # -c lock/requirements-dev.txt + # python-dateutil sniffio==1.3.1 \ --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc - # via anyio + # via + # -c lock/requirements-dev.txt + # anyio + # httpx starlette==0.37.2 \ --hash=sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee \ --hash=sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823 - # via fastapi + # via + # -c lock/requirements-dev.txt + # fastapi typer==0.12.3 \ --hash=sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914 \ --hash=sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482 + # via + # -c lock/requirements-dev.txt + # fsb (pyproject.toml) + # fastapi-cli typing-extensions==4.11.0 \ --hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \ --hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a # via - # anyio + # -c lock/requirements-dev.txt # fastapi # pydantic # pydantic-core - # starlette # typer - # uvicorn -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 - # via botocore +ujson==5.10.0 \ + --hash=sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e \ + --hash=sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b \ + --hash=sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6 \ + --hash=sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7 \ + --hash=sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9 \ + --hash=sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd \ + --hash=sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569 \ + --hash=sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f \ + --hash=sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51 \ + --hash=sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20 \ + --hash=sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1 \ + --hash=sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf \ + --hash=sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc \ + --hash=sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e \ + --hash=sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a \ + --hash=sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539 \ + --hash=sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27 \ + --hash=sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165 \ + --hash=sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126 \ + --hash=sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1 \ + --hash=sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816 \ + --hash=sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64 \ + --hash=sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8 \ + --hash=sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e \ + --hash=sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287 \ + --hash=sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3 \ + --hash=sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb \ + --hash=sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0 \ + --hash=sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043 \ + --hash=sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557 \ + --hash=sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e \ + --hash=sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21 \ + --hash=sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d \ + --hash=sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd \ + --hash=sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0 \ + --hash=sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337 \ + --hash=sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753 \ + --hash=sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804 \ + --hash=sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f \ + --hash=sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f \ + --hash=sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5 \ + --hash=sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5 \ + --hash=sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1 \ + --hash=sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00 \ + --hash=sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2 \ + --hash=sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050 \ + --hash=sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e \ + --hash=sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4 \ + --hash=sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8 \ + --hash=sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996 \ + --hash=sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6 \ + --hash=sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1 \ + --hash=sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f \ + --hash=sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1 \ + --hash=sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4 \ + --hash=sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b \ + --hash=sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88 \ + --hash=sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518 \ + --hash=sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5 \ + --hash=sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770 \ + --hash=sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4 \ + --hash=sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a \ + --hash=sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76 \ + --hash=sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe \ + --hash=sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988 \ + --hash=sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1 \ + --hash=sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5 \ + --hash=sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b \ + --hash=sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7 \ + --hash=sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8 \ + --hash=sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc \ + --hash=sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a \ + --hash=sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720 \ + --hash=sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3 \ + --hash=sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b \ + --hash=sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9 \ + --hash=sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1 \ + --hash=sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746 + # via + # -c lock/requirements-dev.txt + # fastapi +urllib3==2.2.1 \ + --hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \ + --hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19 + # via + # -c lock/requirements-dev.txt + # botocore uvicorn==0.29.0 \ --hash=sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de \ --hash=sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0 - # via ghga-service-commons + # via + # -c lock/requirements-dev.txt + # fastapi + # ghga-service-commons uvloop==0.19.0 \ --hash=sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd \ --hash=sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec \ @@ -732,7 +1057,9 @@ uvloop==0.19.0 \ --hash=sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e \ --hash=sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7 \ --hash=sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256 - # via uvicorn + # via + # -c lock/requirements-dev.txt + # uvicorn watchfiles==0.21.0 \ --hash=sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc \ --hash=sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365 \ @@ -809,7 +1136,9 @@ watchfiles==0.21.0 \ --hash=sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165 \ --hash=sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303 \ --hash=sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d - # via uvicorn + # via + # -c lock/requirements-dev.txt + # uvicorn websockets==12.0 \ --hash=sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b \ --hash=sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6 \ @@ -883,4 +1212,6 @@ websockets==12.0 \ --hash=sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5 \ --hash=sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8 \ --hash=sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7 - # via uvicorn + # via + # -c lock/requirements-dev.txt + # uvicorn diff --git a/scripts/check_license.py b/scripts/check_license.py index b6a718df..df6c1664 100755 --- a/scripts/check_license.py +++ b/scripts/check_license.py @@ -64,6 +64,7 @@ ".mypy.ini", ".pytest_cache", ".editorconfig", + "monorepo.code-workspace", ".template/.static_files.txt", ".template/.static_files_ignore.txt", ".template/.mandatory_files.txt", @@ -292,7 +293,7 @@ def validate_year_string(year_string: str, min_year: int = MIN_YEAR) -> bool: return int(year_string) == current_year # Otherwise, a range (e.g. 2021 - 2023) is expected: - match = re.match("(\d+) - (\d+)", year_string) + match = re.match(r"(\d+) - (\d+)", year_string) if not match: return False diff --git a/scripts/service_name.py b/scripts/service_name.py new file mode 100644 index 00000000..cf67d57c --- /dev/null +++ b/scripts/service_name.py @@ -0,0 +1,33 @@ +# Copyright 2021 - 2023 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln +# for the German Human Genome-Phenome Archive (GHGA) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Retrieve the full name of the service, as opposed to the abbreviation.""" + +import tomllib +from stringcase import spinalcase + +from script_utils.cli import run + + +def main(*, service: str): + with open(f"services/{service}/pyproject.toml", "rb") as pyproject: + description: str = tomllib.load(pyproject)["project"]["description"] + if "-" in description: + description = description.split("-")[0] + description = description.title().replace(" ", "") + print(spinalcase(description)) + + +if __name__ == "__main__": + run(main) diff --git a/services/ifrs/src/ifrs/adapters/inbound/event_sub.py b/services/ifrs/src/ifrs/adapters/inbound/event_sub.py index 3b71494e..53514e72 100644 --- a/services/ifrs/src/ifrs/adapters/inbound/event_sub.py +++ b/services/ifrs/src/ifrs/adapters/inbound/event_sub.py @@ -139,6 +139,7 @@ async def _consume_validated( payload: JsonObject, type_: Ascii, topic: Ascii, # pylint: disable=unused-argument + key: str, ) -> None: """Consume events from the topics of interest.""" if type_ == self._config.files_to_register_type: diff --git a/services/ifrs/src/ifrs/main.py b/services/ifrs/src/ifrs/main.py index c2778a9b..43c66828 100644 --- a/services/ifrs/src/ifrs/main.py +++ b/services/ifrs/src/ifrs/main.py @@ -23,7 +23,7 @@ async def consume_events(run_forever: bool = True): """Run an event consumer listening to the specified topic.""" - config = Config() # type: ignore + config = Config() configure_logging(config=config) async with prepare_event_subscriber(config=config) as event_subscriber: diff --git a/services/ifrs/tests_ifrs/conftest.py b/services/ifrs/tests_ifrs/conftest.py new file mode 100644 index 00000000..a41cee78 --- /dev/null +++ b/services/ifrs/tests_ifrs/conftest.py @@ -0,0 +1,58 @@ +# Copyright 2021 - 2023 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln +# for the German Human Genome-Phenome Archive (GHGA) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Set up session-scope fixtures for tests.""" + +import pytest_asyncio +from hexkit.providers.akafka.testutils import ( + kafka_container_fixture, # noqa: F401 + kafka_fixture, # noqa: F401 +) +from hexkit.providers.mongodb.testutils import ( + mongodb_container_fixture, # noqa: F401 + mongodb_fixture, # noqa: F401 +) +from hexkit.providers.s3.testutils import ( # noqa: F401 + S3Fixture, + s3_container_fixture, + s3_fixture, +) + +from tests_ifrs.fixtures.joint import ( # noqa: F401 + OUTBOX_BUCKET, + PERMANENT_BUCKET, + STAGING_BUCKET, + JointFixture, + joint_fixture, +) + + +async def _populate_s3_buckets(s3: S3Fixture): + await s3.populate_buckets( + buckets=[ + OUTBOX_BUCKET, + STAGING_BUCKET, + PERMANENT_BUCKET, + ] + ) + + +def get_populate_s3_buckets_fixture(name: str = "populate_s3_buckets"): + """Populate the S3 instance buckets""" + return pytest_asyncio.fixture( + _populate_s3_buckets, scope="function", name=name, autouse=True + ) + + +populate_s3_buckets = get_populate_s3_buckets_fixture() diff --git a/services/ifrs/tests_ifrs/fixtures/config.py b/services/ifrs/tests_ifrs/fixtures/config.py index cc9ac05d..ae5ad6f0 100644 --- a/services/ifrs/tests_ifrs/fixtures/config.py +++ b/services/ifrs/tests_ifrs/fixtures/config.py @@ -39,7 +39,7 @@ def get_config( for source in sources: sources_dict.update(**source.model_dump()) - return Config(config_yaml=default_config_yaml, **sources_dict) # type: ignore + return Config(config_yaml=default_config_yaml, **sources_dict) DEFAULT_CONFIG = get_config() diff --git a/services/ifrs/tests_ifrs/fixtures/joint.py b/services/ifrs/tests_ifrs/fixtures/joint.py index 237c6e20..6c2363d9 100644 --- a/services/ifrs/tests_ifrs/fixtures/joint.py +++ b/services/ifrs/tests_ifrs/fixtures/joint.py @@ -17,10 +17,11 @@ __all__ = [ "JointFixture", - "get_joint_fixture", + "OUTBOX_BUCKET", + "PERMANENT_BUCKET", + "STAGING_BUCKET", ] -import socket from collections.abc import AsyncGenerator from dataclasses import dataclass @@ -38,7 +39,6 @@ from ifrs.inject import prepare_core from ifrs.ports.inbound.file_registry import FileRegistryPort from ifrs.ports.outbound.dao import FileMetadataDaoPort -from pytest_asyncio.plugin import _ScopeName from tests_ifrs.fixtures.config import get_config @@ -56,13 +56,6 @@ class EndpointAliases: fake: str = f"{STORAGE_ALIASES[0]}_fake" -def get_free_port() -> int: - """Finds and returns a free port on localhost.""" - sock = socket.socket() - sock.bind(("", 0)) - return int(sock.getsockname()[1]) - - @dataclass class JointFixture: """Returned by the `joint_fixture`.""" @@ -70,7 +63,6 @@ class JointFixture: config: Config mongodb: MongoDbFixture s3: S3Fixture - second_s3: S3Fixture file_metadata_dao: FileMetadataDaoPort file_registry: FileRegistryPort kafka: KafkaFixture @@ -78,28 +70,18 @@ class JointFixture: staging_bucket: str endpoint_aliases: EndpointAliases - async def reset_state(self): - """Completely reset fixture states""" - await self.s3.empty_buckets() - await self.second_s3.empty_buckets() - self.mongodb.empty_collections() - self.kafka.clear_topics() - -async def joint_fixture_function( - mongodb_fixture: MongoDbFixture, - s3_fixture: S3Fixture, - second_s3_fixture: S3Fixture, - kafka_fixture: KafkaFixture, +@pytest_asyncio.fixture(scope="function") +async def joint_fixture( + mongodb: MongoDbFixture, + s3: S3Fixture, + kafka: KafkaFixture, ) -> AsyncGenerator[JointFixture, None]: """A fixture that embeds all other fixtures for API-level integration testing""" # merge configs from different sources with the default one: node_config = S3ObjectStorageNodeConfig( - bucket=PERMANENT_BUCKET, credentials=s3_fixture.config - ) - second_node_config = S3ObjectStorageNodeConfig( - bucket=PERMANENT_BUCKET, credentials=second_s3_fixture.config + bucket=PERMANENT_BUCKET, credentials=s3.config ) endpoint_aliases = EndpointAliases() @@ -107,49 +89,24 @@ async def joint_fixture_function( object_storage_config = S3ObjectStoragesConfig( object_storages={ endpoint_aliases.node1: node_config, - endpoint_aliases.node2: second_node_config, } ) - config = get_config( - sources=[mongodb_fixture.config, object_storage_config, kafka_fixture.config] - ) + config = get_config(sources=[mongodb.config, object_storage_config, kafka.config]) dao_factory = MongoDbDaoFactory(config=config) file_metadata_dao = await FileMetadataDaoConstructor.construct( dao_factory=dao_factory ) - # create a DI container instance:translators + # Prepare the file registry (core) async with prepare_core(config=config) as file_registry: - # create storage entities: - await s3_fixture.populate_buckets( - buckets=[ - OUTBOX_BUCKET, - STAGING_BUCKET, - PERMANENT_BUCKET, - ] - ) - await second_s3_fixture.populate_buckets( - buckets=[ - OUTBOX_BUCKET, - STAGING_BUCKET, - PERMANENT_BUCKET, - ] - ) - yield JointFixture( config=config, - mongodb=mongodb_fixture, - s3=s3_fixture, - second_s3=second_s3_fixture, + mongodb=mongodb, + s3=s3, file_metadata_dao=file_metadata_dao, file_registry=file_registry, - kafka=kafka_fixture, + kafka=kafka, outbox_bucket=OUTBOX_BUCKET, staging_bucket=STAGING_BUCKET, endpoint_aliases=endpoint_aliases, ) - - -def get_joint_fixture(scope: _ScopeName = "function"): - """Produce a joint fixture with desired scope""" - return pytest_asyncio.fixture(joint_fixture_function, scope=scope) diff --git a/services/ifrs/tests_ifrs/fixtures/module_scope_fixtures.py b/services/ifrs/tests_ifrs/fixtures/module_scope_fixtures.py deleted file mode 100644 index fc9f94aa..00000000 --- a/services/ifrs/tests_ifrs/fixtures/module_scope_fixtures.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2021 - 2023 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln -# for the German Human Genome-Phenome Archive (GHGA) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Contains module-scoped fixtures""" - -import asyncio - -import pytest -from hexkit.providers.akafka.testutils import get_kafka_fixture -from hexkit.providers.mongodb.testutils import get_mongodb_fixture -from hexkit.providers.s3.testutils import get_s3_fixture - -from tests_ifrs.fixtures.joint import JointFixture, get_joint_fixture - - -@pytest.fixture(autouse=True, scope="function") -def reset_state(joint_fixture: JointFixture): - """Clear joint_fixture state before and after tests that use this fixture. - - This is a function-level fixture because it needs to run in each test. - """ - loop = asyncio.get_event_loop() - loop.run_until_complete(joint_fixture.reset_state()) - - -mongodb_fixture = get_mongodb_fixture("session") -kafka_fixture = get_kafka_fixture("session") -s3_fixture = get_s3_fixture("session") -second_s3_fixture = get_s3_fixture("session") -joint_fixture = get_joint_fixture("session") diff --git a/services/ifrs/tests_ifrs/test_ifrs_edge_cases.py b/services/ifrs/tests_ifrs/test_ifrs_edge_cases.py index 2ea0f402..9dba2d13 100644 --- a/services/ifrs/tests_ifrs/test_ifrs_edge_cases.py +++ b/services/ifrs/tests_ifrs/test_ifrs_edge_cases.py @@ -18,24 +18,21 @@ import logging import pytest -from hexkit.providers.s3.testutils import FileObject, file_fixture # noqa: F401 +from hexkit.providers.s3.testutils import ( # noqa: F401, + FileObject, + S3Fixture, + file_fixture, +) from ifrs.ports.inbound.file_registry import FileRegistryPort from tests_ifrs.fixtures.example_data import EXAMPLE_METADATA, EXAMPLE_METADATA_BASE -from tests_ifrs.fixtures.module_scope_fixtures import ( # noqa: F401 - JointFixture, - joint_fixture, - kafka_fixture, - mongodb_fixture, - reset_state, - s3_fixture, - second_s3_fixture, -) +from tests_ifrs.fixtures.joint import JointFixture +pytestmark = pytest.mark.asyncio() -@pytest.mark.asyncio(scope="session") -async def test_register_with_empty_staging(joint_fixture: JointFixture): # noqa: F811 - """Test registration of a file when the file content is missing from the staging.""" + +async def test_register_with_empty_staging(joint_fixture: JointFixture): + """Test registration of a file when the file content is missing from staging.""" with pytest.raises(FileRegistryPort.FileContentNotInStagingError): await joint_fixture.file_registry.register_file( file_without_object_id=EXAMPLE_METADATA_BASE, @@ -44,127 +41,114 @@ async def test_register_with_empty_staging(joint_fixture: JointFixture): # noqa ) -@pytest.mark.asyncio(scope="session") -async def test_reregistration( - joint_fixture: JointFixture, # noqa: F811 - file_fixture: FileObject, # noqa: F811 -): +async def test_reregistration(joint_fixture: JointFixture, tmp_file: FileObject): """Test the re-registration of a file with identical metadata (should not result in an exception). Test PR/Push workflow message """ - for s3, storage_alias in ( - (joint_fixture.s3, joint_fixture.endpoint_aliases.node1), - (joint_fixture.second_s3, joint_fixture.endpoint_aliases.node2), - ): - # place example content in the staging: - file_object = file_fixture.model_copy( - update={ - "bucket_id": joint_fixture.staging_bucket, - "object_id": EXAMPLE_METADATA.object_id, - } + storage = joint_fixture.s3 + storage_alias = joint_fixture.endpoint_aliases.node1 + + # place example content in the staging bucket: + file_object = tmp_file.model_copy( + update={ + "bucket_id": joint_fixture.staging_bucket, + "object_id": EXAMPLE_METADATA.object_id, + } + ) + await storage.populate_file_objects(file_objects=[file_object]) + + # register new file from the staging bucket: + # (And check if an event informing about the new registration has been published.) + file_metadata_base = EXAMPLE_METADATA_BASE.model_copy( + update={"storage_alias": storage_alias} + ) + + async with joint_fixture.kafka.record_events( + in_topic=joint_fixture.config.file_registered_event_topic + ) as recorder: + await joint_fixture.file_registry.register_file( + file_without_object_id=file_metadata_base, + staging_object_id=EXAMPLE_METADATA.object_id, + staging_bucket_id=joint_fixture.staging_bucket, ) - await s3.populate_file_objects(file_objects=[file_object]) - # register new file from the staging: - # (And check if an event informing about the new registration has been published.) - file_metadata_base = EXAMPLE_METADATA_BASE.model_copy( - update={"storage_alias": storage_alias} + assert len(recorder.recorded_events) == 1 + event = recorder.recorded_events[0] + assert event.payload["object_id"] != "" + assert event.type_ == joint_fixture.config.file_registered_event_type + + # re-register the same file from the staging bucket: + # (A second event is not expected.) + async with joint_fixture.kafka.expect_events( + events=[], + in_topic=joint_fixture.config.file_registered_event_topic, + ): + await joint_fixture.file_registry.register_file( + file_without_object_id=file_metadata_base, + staging_object_id=EXAMPLE_METADATA.object_id, + staging_bucket_id=joint_fixture.staging_bucket, ) - async with joint_fixture.kafka.record_events( - in_topic=joint_fixture.config.file_registered_event_topic - ) as recorder: - await joint_fixture.file_registry.register_file( - file_without_object_id=file_metadata_base, - staging_object_id=EXAMPLE_METADATA.object_id, - staging_bucket_id=joint_fixture.staging_bucket, - ) - - assert len(recorder.recorded_events) == 1 - event = recorder.recorded_events[0] - assert event.payload["object_id"] != "" - assert event.type_ == joint_fixture.config.file_registered_event_type - - # re-register the same file from the staging: - # (A second event is not expected.) - async with joint_fixture.kafka.expect_events( - events=[], - in_topic=joint_fixture.config.file_registered_event_topic, - ): - await joint_fixture.file_registry.register_file( - file_without_object_id=file_metadata_base, - staging_object_id=EXAMPLE_METADATA.object_id, - staging_bucket_id=joint_fixture.staging_bucket, - ) - - await joint_fixture.reset_state() - - -@pytest.mark.asyncio(scope="session") + async def test_reregistration_with_updated_metadata( caplog, - joint_fixture: JointFixture, # noqa: F811 - file_fixture: FileObject, # noqa: F811 + joint_fixture: JointFixture, + tmp_file: FileObject, ): """Check that a re-registration of a file with updated metadata fails with the expected exception. """ - for s3, storage_alias in ( - (joint_fixture.s3, joint_fixture.endpoint_aliases.node1), - (joint_fixture.second_s3, joint_fixture.endpoint_aliases.node2), - ): - # place example content in the staging: - file_object = file_fixture.model_copy( - update={ - "bucket_id": joint_fixture.staging_bucket, - "object_id": EXAMPLE_METADATA.object_id, - } + storage = joint_fixture.s3 + storage_alias = joint_fixture.endpoint_aliases.node1 + # place example content in the staging bucket: + file_object = tmp_file.model_copy( + update={ + "bucket_id": joint_fixture.staging_bucket, + "object_id": EXAMPLE_METADATA.object_id, + } + ) + await storage.populate_file_objects(file_objects=[file_object]) + + # register new file from the staging bucket: + # (And check if an event informing about the new registration has been published.) + file_metadata_base = EXAMPLE_METADATA_BASE.model_copy( + update={"storage_alias": storage_alias} + ) + + async with joint_fixture.kafka.record_events( + in_topic=joint_fixture.config.file_registered_event_topic, + ) as recorder: + await joint_fixture.file_registry.register_file( + file_without_object_id=file_metadata_base, + staging_object_id=EXAMPLE_METADATA.object_id, + staging_bucket_id=joint_fixture.staging_bucket, ) - await s3.populate_file_objects(file_objects=[file_object]) - # register new file from the staging: - # (And check if an event informing about the new registration has been published.) - file_metadata_base = EXAMPLE_METADATA_BASE.model_copy( - update={"storage_alias": storage_alias} + assert len(recorder.recorded_events) == 1 + event = recorder.recorded_events[0] + assert event.payload["object_id"] != "" + assert event.type_ == joint_fixture.config.file_registered_event_type + + # try to re-register the same file with updated metadata: + # Check for correct logging + file_update = file_metadata_base.model_copy(update={"decrypted_size": 4321}) + + caplog.clear() + + with caplog.at_level(level=logging.ERROR, logger="ifrs.core.file_registry"): + expected_message = str( + FileRegistryPort.FileUpdateError(file_id=file_metadata_base.file_id) + ) + await joint_fixture.file_registry.register_file( + file_without_object_id=file_update, + staging_object_id=EXAMPLE_METADATA.object_id, + staging_bucket_id=joint_fixture.staging_bucket, ) + assert len(caplog.messages) == 1 + assert expected_message in caplog.messages - async with joint_fixture.kafka.record_events( - in_topic=joint_fixture.config.file_registered_event_topic, - ) as recorder: - await joint_fixture.file_registry.register_file( - file_without_object_id=file_metadata_base, - staging_object_id=EXAMPLE_METADATA.object_id, - staging_bucket_id=joint_fixture.staging_bucket, - ) - - assert len(recorder.recorded_events) == 1 - event = recorder.recorded_events[0] - assert event.payload["object_id"] != "" - assert event.type_ == joint_fixture.config.file_registered_event_type - - # try to re-register the same file with updated metadata: - # Check for correct logging - file_update = file_metadata_base.model_copy(update={"decrypted_size": 4321}) - - caplog.clear() - - with caplog.at_level(level=logging.ERROR, logger="ifrs.core.file_registry"): - expected_message = str( - FileRegistryPort.FileUpdateError(file_id=file_metadata_base.file_id) - ) - await joint_fixture.file_registry.register_file( - file_without_object_id=file_update, - staging_object_id=EXAMPLE_METADATA.object_id, - staging_bucket_id=joint_fixture.staging_bucket, - ) - assert len(caplog.messages) == 1 - assert expected_message in caplog.messages - - await joint_fixture.reset_state() - - -@pytest.mark.asyncio(scope="session") -async def test_stage_non_existing_file(joint_fixture: JointFixture): # noqa: F811 + +async def test_stage_non_existing_file(joint_fixture: JointFixture): """Check that requesting to stage a non-registered file fails with the expected exception. """ @@ -177,10 +161,8 @@ async def test_stage_non_existing_file(joint_fixture: JointFixture): # noqa: F8 ) -@pytest.mark.asyncio(scope="session") async def test_stage_checksum_mismatch( - joint_fixture: JointFixture, # noqa: F811 - file_fixture: FileObject, # noqa: F811 + joint_fixture: JointFixture, tmp_file: FileObject ): """Check that requesting to stage a registered file to the outbox by specifying the wrong checksum fails with the expected exception. @@ -188,36 +170,32 @@ async def test_stage_checksum_mismatch( # populate the database with a corresponding file metadata entry: await joint_fixture.file_metadata_dao.insert(EXAMPLE_METADATA) - for s3, storage_alias in ( - (joint_fixture.s3, joint_fixture.endpoint_aliases.node1), - (joint_fixture.second_s3, joint_fixture.endpoint_aliases.node2), - ): - bucket_id = joint_fixture.config.object_storages[storage_alias].bucket - # place the content for an example file in the permanent storage: - file_object = file_fixture.model_copy( - update={ - "bucket_id": bucket_id, - "object_id": EXAMPLE_METADATA.object_id, - } + storage = joint_fixture.s3 + storage_alias = joint_fixture.endpoint_aliases.node1 + + bucket_id = joint_fixture.config.object_storages[storage_alias].bucket + # place the content for an example file in the permanent storage: + file_object = tmp_file.model_copy( + update={ + "bucket_id": bucket_id, + "object_id": EXAMPLE_METADATA.object_id, + } + ) + await storage.populate_file_objects(file_objects=[file_object]) + + # request a stage for the registered file to the outbox by specifying a wrong checksum: + with pytest.raises(FileRegistryPort.ChecksumMismatchError): + await joint_fixture.file_registry.stage_registered_file( + file_id=EXAMPLE_METADATA_BASE.file_id, + decrypted_sha256=( + "e6da6d6d05cc057964877aad8a3e9ad712c8abeae279dfa2f89b07eba7ef8abe" + ), + outbox_object_id=EXAMPLE_METADATA.object_id, + outbox_bucket_id=joint_fixture.outbox_bucket, ) - await s3.populate_file_objects(file_objects=[file_object]) - - # request a stage for the registered file to the outbox by specifying a wrong checksum: - with pytest.raises(FileRegistryPort.ChecksumMismatchError): - await joint_fixture.file_registry.stage_registered_file( - file_id=EXAMPLE_METADATA_BASE.file_id, - decrypted_sha256=( - "e6da6d6d05cc057964877aad8a3e9ad712c8abeae279dfa2f89b07eba7ef8abe" - ), - outbox_object_id=EXAMPLE_METADATA.object_id, - outbox_bucket_id=joint_fixture.outbox_bucket, - ) - - -@pytest.mark.asyncio(scope="session") -async def test_storage_db_inconsistency( - joint_fixture: JointFixture, # noqa: F811 -): + + +async def test_storage_db_inconsistency(joint_fixture: JointFixture): """Check that an inconsistency between the database and the storage, whereby the database contains a file metadata registration but the storage is missing the corresponding content, results in the expected exception. diff --git a/services/ifrs/tests_ifrs/test_ifrs_typical_journey.py b/services/ifrs/tests_ifrs/test_ifrs_typical_journey.py index 3a7fbf7f..9fd57a9e 100644 --- a/services/ifrs/tests_ifrs/test_ifrs_typical_journey.py +++ b/services/ifrs/tests_ifrs/test_ifrs_typical_journey.py @@ -26,132 +26,119 @@ ) from tests_ifrs.fixtures.example_data import EXAMPLE_METADATA, EXAMPLE_METADATA_BASE -from tests_ifrs.fixtures.module_scope_fixtures import ( # noqa: F401 - JointFixture, - joint_fixture, - kafka_fixture, - mongodb_fixture, - reset_state, - s3_fixture, - second_s3_fixture, -) - - -@pytest.mark.asyncio(scope="session") -async def test_happy_journey( - joint_fixture: JointFixture, # noqa: F811 - file_fixture: FileObject, # noqa: F811 -): - """Simulates a typical, successful journey for upload, download, and deletion""" - for s3, strorage_alias in ( - (joint_fixture.s3, joint_fixture.endpoint_aliases.node1), - (joint_fixture.second_s3, joint_fixture.endpoint_aliases.node2), - ): - bucket_id = joint_fixture.config.object_storages[strorage_alias].bucket - # place example content in the staging: - file_object = file_fixture.model_copy( - update={ - "bucket_id": joint_fixture.staging_bucket, - "object_id": EXAMPLE_METADATA.object_id, - } - ) - await s3.populate_file_objects(file_objects=[file_object]) - - # register new file from the staging: - # (And check if an event informing about the new registration has been published.) - file_metadata_base = EXAMPLE_METADATA_BASE.model_copy( - update={"storage_alias": strorage_alias}, deep=True - ) - - async with joint_fixture.kafka.record_events( - in_topic=joint_fixture.config.file_registered_event_topic, - ) as recorder: - await joint_fixture.file_registry.register_file( - file_without_object_id=file_metadata_base, - staging_object_id=EXAMPLE_METADATA.object_id, - staging_bucket_id=joint_fixture.staging_bucket, - ) +from tests_ifrs.fixtures.joint import JointFixture - assert len(recorder.recorded_events) == 1 - event = recorder.recorded_events[0] - assert event.payload["object_id"] != "" - assert event.type_ == joint_fixture.config.file_registered_event_type +pytestmark = pytest.mark.asyncio() - object_id = cast(str, event.payload["object_id"]) - # check that the file content is now in both the staging and the permanent storage: - assert await s3.storage.does_object_exist( - bucket_id=joint_fixture.staging_bucket, - object_id=EXAMPLE_METADATA.object_id, - ) - assert await s3.storage.does_object_exist( - bucket_id=bucket_id, - object_id=object_id, +async def test_happy_journey(joint_fixture: JointFixture, tmp_file: FileObject): + """Simulates a typical, successful journey for upload, download, and deletion""" + storage = joint_fixture.s3 + storage_alias = joint_fixture.endpoint_aliases.node1 + + bucket_id = joint_fixture.config.object_storages[storage_alias].bucket + # place example content in the staging: + file_object = tmp_file.model_copy( + update={ + "bucket_id": joint_fixture.staging_bucket, + "object_id": EXAMPLE_METADATA.object_id, + } + ) + await storage.populate_file_objects(file_objects=[file_object]) + + # register new file from the staging: + # (And check if an event informing about the new registration has been published.) + file_metadata_base = EXAMPLE_METADATA_BASE.model_copy( + update={"storage_alias": storage_alias}, deep=True + ) + + async with joint_fixture.kafka.record_events( + in_topic=joint_fixture.config.file_registered_event_topic, + ) as recorder: + await joint_fixture.file_registry.register_file( + file_without_object_id=file_metadata_base, + staging_object_id=EXAMPLE_METADATA.object_id, + staging_bucket_id=joint_fixture.staging_bucket, ) - # request a stage to the outbox: - async with joint_fixture.kafka.expect_events( - events=[ - ExpectedEvent( - payload={ - "file_id": file_metadata_base.file_id, - "decrypted_sha256": file_metadata_base.decrypted_sha256, - "target_object_id": EXAMPLE_METADATA.object_id, - "target_bucket_id": joint_fixture.outbox_bucket, - "s3_endpoint_alias": strorage_alias, - }, - type_=joint_fixture.config.file_staged_event_type, - key=file_metadata_base.file_id, - ) - ], - in_topic=joint_fixture.config.file_staged_event_topic, - ): - await joint_fixture.file_registry.stage_registered_file( - file_id=file_metadata_base.file_id, - decrypted_sha256=file_metadata_base.decrypted_sha256, - outbox_object_id=EXAMPLE_METADATA.object_id, - outbox_bucket_id=joint_fixture.outbox_bucket, + assert len(recorder.recorded_events) == 1 + event = recorder.recorded_events[0] + assert event.payload["object_id"] != "" + assert event.type_ == joint_fixture.config.file_registered_event_type + + object_id = cast(str, event.payload["object_id"]) + + # check that the file content is now in both the staging and the permanent storage: + assert await storage.storage.does_object_exist( + bucket_id=joint_fixture.staging_bucket, + object_id=EXAMPLE_METADATA.object_id, + ) + assert await storage.storage.does_object_exist( + bucket_id=bucket_id, + object_id=object_id, + ) + + # request a stage to the outbox: + async with joint_fixture.kafka.expect_events( + events=[ + ExpectedEvent( + payload={ + "file_id": file_metadata_base.file_id, + "decrypted_sha256": file_metadata_base.decrypted_sha256, + "target_object_id": EXAMPLE_METADATA.object_id, + "target_bucket_id": joint_fixture.outbox_bucket, + "s3_endpoint_alias": storage_alias, + }, + type_=joint_fixture.config.file_staged_event_type, + key=file_metadata_base.file_id, ) - - # check that the file content is now in all three storage entities: - assert await s3.storage.does_object_exist( - bucket_id=joint_fixture.staging_bucket, - object_id=EXAMPLE_METADATA.object_id, - ) - assert await s3.storage.does_object_exist( - bucket_id=bucket_id, - object_id=object_id, - ) - assert await s3.storage.does_object_exist( - bucket_id=joint_fixture.outbox_bucket, object_id=EXAMPLE_METADATA.object_id + ], + in_topic=joint_fixture.config.file_staged_event_topic, + ): + await joint_fixture.file_registry.stage_registered_file( + file_id=file_metadata_base.file_id, + decrypted_sha256=file_metadata_base.decrypted_sha256, + outbox_object_id=EXAMPLE_METADATA.object_id, + outbox_bucket_id=joint_fixture.outbox_bucket, ) - # check that the file content in the outbox is identical to the content in the - # staging: - download_url = await s3.storage.get_object_download_url( - bucket_id=joint_fixture.outbox_bucket, object_id=EXAMPLE_METADATA.object_id - ) - response = requests.get(download_url, timeout=60) - response.raise_for_status() - assert response.content == file_object.content - - # Request file deletion: - async with joint_fixture.kafka.expect_events( - events=[ - ExpectedEvent( - payload={"file_id": file_metadata_base.file_id}, - type_=joint_fixture.config.file_deleted_event_type, - ) - ], - in_topic=joint_fixture.config.file_deleted_event_topic, - ): - await joint_fixture.file_registry.delete_file( - file_id=file_metadata_base.file_id, + # check that the file content is now in all three storage entities: + assert await storage.storage.does_object_exist( + bucket_id=joint_fixture.staging_bucket, + object_id=EXAMPLE_METADATA.object_id, + ) + assert await storage.storage.does_object_exist( + bucket_id=bucket_id, + object_id=object_id, + ) + assert await storage.storage.does_object_exist( + bucket_id=joint_fixture.outbox_bucket, object_id=EXAMPLE_METADATA.object_id + ) + + # check that the file content in the outbox is identical to the content in the + # staging: + download_url = await storage.storage.get_object_download_url( + bucket_id=joint_fixture.outbox_bucket, object_id=EXAMPLE_METADATA.object_id + ) + response = requests.get(download_url, timeout=60) + response.raise_for_status() + assert response.content == file_object.content + + # Request file deletion: + async with joint_fixture.kafka.expect_events( + events=[ + ExpectedEvent( + payload={"file_id": file_metadata_base.file_id}, + type_=joint_fixture.config.file_deleted_event_type, ) - - assert not await s3.storage.does_object_exist( - bucket_id=bucket_id, - object_id=object_id, + ], + in_topic=joint_fixture.config.file_deleted_event_topic, + ): + await joint_fixture.file_registry.delete_file( + file_id=file_metadata_base.file_id, ) - await joint_fixture.reset_state() + assert not await storage.storage.does_object_exist( + bucket_id=bucket_id, + object_id=object_id, + ) diff --git a/services/irs/src/irs/adapters/inbound/event_sub.py b/services/irs/src/irs/adapters/inbound/event_sub.py index bff19a35..16720965 100644 --- a/services/irs/src/irs/adapters/inbound/event_sub.py +++ b/services/irs/src/irs/adapters/inbound/event_sub.py @@ -76,7 +76,7 @@ def __init__( ] async def _consume_validated( - self, *, payload: JsonObject, type_: Ascii, topic: Ascii + self, *, payload: JsonObject, type_: Ascii, topic: Ascii, key: str ) -> None: """ Receive and process an event with already validated topic and type. diff --git a/services/irs/src/irs/main.py b/services/irs/src/irs/main.py index eff4a154..3fac94ed 100644 --- a/services/irs/src/irs/main.py +++ b/services/irs/src/irs/main.py @@ -23,7 +23,7 @@ async def consume_events(run_forever: bool = True): """Run the event consumer""" - config = Config() # type: ignore [call-arg] + config = Config() configure_logging(config=config) async with prepare_event_subscriber(config=config) as event_subscriber: @@ -36,7 +36,7 @@ async def check_staging_buckets(): For now this only logs objects that should no longer remain in their respective bucket, but have not been removed by the mechanisms in place. """ - config = Config() # type: ignore [call-arg] + config = Config() configure_logging(config=config) async with prepare_storage_inspector(config=config) as staging_inspector: diff --git a/services/irs/tests_irs/conftest.py b/services/irs/tests_irs/conftest.py new file mode 100644 index 00000000..23d98ec6 --- /dev/null +++ b/services/irs/tests_irs/conftest.py @@ -0,0 +1,58 @@ +# Copyright 2021 - 2023 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln +# for the German Human Genome-Phenome Archive (GHGA) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Set up session-scope fixtures for tests.""" + +import pytest +import pytest_asyncio +from hexkit.providers.akafka.testutils import ( # noqa: F401 + kafka_container_fixture, + kafka_fixture, +) +from hexkit.providers.mongodb.testutils import ( # noqa: F401 + mongodb_container_fixture, + mongodb_fixture, +) +from hexkit.providers.s3.testutils import ( # noqa: F401 + S3Fixture, + s3_container_fixture, + s3_fixture, +) + +from tests_irs.fixtures.joint import ( # noqa: F401 + INBOX_BUCKET_ID, + STAGING_BUCKET_ID, + JointFixture, + joint_fixture, +) + + +async def _populate_s3_buckets(s3: S3Fixture): + await s3.populate_buckets([INBOX_BUCKET_ID, STAGING_BUCKET_ID]) + + +def get_populate_s3_buckets_fixture(name: str = "populate_s3_buckets"): + """Populate the S3 instance buckets""" + return pytest_asyncio.fixture( + _populate_s3_buckets, scope="function", name=name, autouse=True + ) + + +populate_s3_buckets = get_populate_s3_buckets_fixture() + + +@pytest.fixture(scope="function", autouse=True) +def regenerate_keypair(joint_fixture: JointFixture): # noqa: F811 + """Regenerate the keypair for each test.""" + joint_fixture.keypair.regenerate() diff --git a/services/irs/tests_irs/fixtures/joint.py b/services/irs/tests_irs/fixtures/joint.py index 9f1517dc..d839377d 100644 --- a/services/irs/tests_irs/fixtures/joint.py +++ b/services/irs/tests_irs/fixtures/joint.py @@ -16,20 +16,18 @@ """Provides multiple fixtures in one spot""" -import asyncio from collections.abc import AsyncGenerator from dataclasses import dataclass -import pytest import pytest_asyncio from ghga_service_commons.utils.multinode_storage import ( S3ObjectStorageNodeConfig, S3ObjectStoragesConfig, ) from hexkit.providers.akafka import KafkaEventSubscriber -from hexkit.providers.akafka.testutils import KafkaFixture, get_kafka_fixture -from hexkit.providers.mongodb.testutils import MongoDbFixture, get_mongodb_fixture -from hexkit.providers.s3.testutils import S3Fixture, get_s3_fixture +from hexkit.providers.akafka.testutils import KafkaFixture +from hexkit.providers.mongodb.testutils import MongoDbFixture +from hexkit.providers.s3.testutils import S3Fixture from irs.config import Config from irs.inject import prepare_core, prepare_event_subscriber from irs.ports.inbound.interrogator import InterrogatorPort @@ -45,12 +43,6 @@ STAGING_BUCKET_ID = "test-staging" -kafka_fixture = get_kafka_fixture(scope="session") -mongodb_fixture = get_mongodb_fixture(scope="session") -s3_fixture = get_s3_fixture(scope="session") -second_s3_fixture = get_s3_fixture(scope="session") - - @dataclass class EndpointAliases: """Container class for endpoint aliases to be used by test code""" @@ -70,32 +62,19 @@ class JointFixture: keypair: KeypairFixture mongodb: MongoDbFixture s3: S3Fixture - second_s3: S3Fixture endpoint_aliases: EndpointAliases - async def reset_state(self): - """Completely reset fixture states""" - await self.s3.empty_buckets() - await self.second_s3.empty_buckets() - self.mongodb.empty_collections() - self.kafka.clear_topics() - self.keypair.regenerate() - -@pytest_asyncio.fixture(scope="session") +@pytest_asyncio.fixture(scope="function") async def joint_fixture( keypair_fixture: KeypairFixture, # noqa: F811 - kafka_fixture: KafkaFixture, - mongodb_fixture: MongoDbFixture, - s3_fixture: S3Fixture, - second_s3_fixture: S3Fixture, + kafka: KafkaFixture, + mongodb: MongoDbFixture, + s3: S3Fixture, ) -> AsyncGenerator[JointFixture, None]: """A fixture that embeds all other fixtures for integration testing""" node_config = S3ObjectStorageNodeConfig( - bucket=STAGING_BUCKET_ID, credentials=s3_fixture.config - ) - second_node_config = S3ObjectStorageNodeConfig( - bucket=STAGING_BUCKET_ID, credentials=second_s3_fixture.config + bucket=STAGING_BUCKET_ID, credentials=s3.config ) endpoint_aliases = EndpointAliases() @@ -103,17 +82,11 @@ async def joint_fixture( object_storage_config = S3ObjectStoragesConfig( object_storages={ endpoint_aliases.node1: node_config, - endpoint_aliases.node2: second_node_config, } ) - config = get_config( - sources=[kafka_fixture.config, mongodb_fixture.config, object_storage_config] - ) + config = get_config(sources=[kafka.config, mongodb.config, object_storage_config]) - await s3_fixture.populate_buckets([INBOX_BUCKET_ID, STAGING_BUCKET_ID]) - await second_s3_fixture.populate_buckets([INBOX_BUCKET_ID, STAGING_BUCKET_ID]) - - # Create joint_fixure using the injection + # Create joint_fixture using the inject module async with ( prepare_core(config=config) as interrogator, prepare_event_subscriber( @@ -124,20 +97,9 @@ async def joint_fixture( config=config, event_subscriber=event_subscriber, interrogator=interrogator, - kafka=kafka_fixture, + kafka=kafka, keypair=keypair_fixture, - mongodb=mongodb_fixture, - s3=s3_fixture, - second_s3=second_s3_fixture, + mongodb=mongodb, + s3=s3, endpoint_aliases=endpoint_aliases, ) - - -@pytest.fixture(autouse=True, scope="function") -def reset_state(joint_fixture: JointFixture): - """Clear joint_fixture state before tests that use this fixture. - - This is a function-level fixture because it needs to run in each test. - """ - loop = asyncio.get_event_loop() - loop.run_until_complete(joint_fixture.reset_state()) diff --git a/services/irs/tests_irs/test_cli.py b/services/irs/tests_irs/test_cli.py index 8f2cc2ff..fe9d8b9d 100644 --- a/services/irs/tests_irs/test_cli.py +++ b/services/irs/tests_irs/test_cli.py @@ -26,18 +26,14 @@ from tests_irs.fixtures.joint import ( STAGING_BUCKET_ID, JointFixture, - joint_fixture, # noqa: F401 - kafka_fixture, # noqa: F401 keypair_fixture, # noqa: F401 - mongodb_fixture, # noqa: F401 - s3_fixture, # noqa: F401 - second_s3_fixture, # noqa: F401 ) from tests_irs.fixtures.test_files import create_test_file +pytestmark = pytest.mark.asyncio() -@pytest.mark.asyncio(scope="session") -async def test_staging_inspector(caplog, joint_fixture: JointFixture): # noqa: F811 + +async def test_staging_inspector(caplog, joint_fixture: JointFixture): """Check storage inspector functionality.""" # prepare storage entries file_1 = await create_test_file( @@ -50,7 +46,7 @@ async def test_staging_inspector(caplog, joint_fixture: JointFixture): # noqa: bucket_id=STAGING_BUCKET_ID, private_key=joint_fixture.keypair.private, public_key=joint_fixture.keypair.public, - s3=joint_fixture.second_s3, + s3=joint_fixture.s3, ) file_3 = await create_test_file( bucket_id=STAGING_BUCKET_ID, @@ -68,7 +64,7 @@ async def test_staging_inspector(caplog, joint_fixture: JointFixture): # noqa: staging_object_2 = StagingObject( file_id=file_2.file_id, object_id=file_2.file_object.object_id, - storage_alias=joint_fixture.endpoint_aliases.node2, + storage_alias=joint_fixture.endpoint_aliases.node1, ) # modify second object to be recognized as stale @@ -94,7 +90,7 @@ async def test_staging_inspector(caplog, joint_fixture: JointFixture): # noqa: assert len(caplog.messages) == 2 assert ( - f"Stale object '{file_2.file_object.object_id}' found for file '{file_2.file_id}' in bucket '{STAGING_BUCKET_ID}' of storage '{joint_fixture.endpoint_aliases.node2}'." + f"Stale object '{file_2.file_object.object_id}' found for file '{file_2.file_id}' in bucket '{STAGING_BUCKET_ID}' of storage '{joint_fixture.endpoint_aliases.node1}'." in caplog.messages ) assert ( diff --git a/services/irs/tests_irs/test_event_handling.py b/services/irs/tests_irs/test_event_handling.py index 1d26bd20..ec771bcc 100644 --- a/services/irs/tests_irs/test_event_handling.py +++ b/services/irs/tests_irs/test_event_handling.py @@ -33,21 +33,18 @@ from irs.core.models import InterrogationSubject, UploadReceivedFingerprint from tests_irs.fixtures.config import Config -from tests_irs.fixtures.joint import ( +from tests_irs.fixtures.joint import ( # noqa: F401 INBOX_BUCKET_ID, STAGING_BUCKET_ID, JointFixture, - joint_fixture, # noqa: F401 - kafka_fixture, # noqa: F401 - keypair_fixture, # noqa: F401 - mongodb_fixture, # noqa: F401 - s3_fixture, # noqa: F401 - second_s3_fixture, # noqa: F401 + keypair_fixture, ) from tests_irs.fixtures.test_files import EncryptedData, create_test_file EKSS_NEW_SECRET = os.urandom(32) +pytestmark = pytest.mark.asyncio() + def _incoming_event_file_registered( payload: dict[str, object], config: Config @@ -98,283 +95,264 @@ def _ekss_call( ) -@pytest.mark.asyncio(scope="session") -async def test_failure_event( - monkeypatch, - joint_fixture: JointFixture, # noqa: F811 -): +async def test_failure_event(monkeypatch, joint_fixture: JointFixture): """Test the whole pipeline from receiving an event to notifying about failure""" - for s3, endpoint_alias in ( - (joint_fixture.s3, joint_fixture.endpoint_aliases.node1), - (joint_fixture.second_s3, joint_fixture.endpoint_aliases.node2), - ): - data = await create_test_file( - bucket_id=INBOX_BUCKET_ID, - private_key=joint_fixture.keypair.private, - public_key=joint_fixture.keypair.public, - s3=s3, - ) - ekss_patch = partial(_ekss_call, data=data) - - monkeypatch.setattr( - "irs.core.interrogator.call_eks_api", - ekss_patch, - ) - - payload_in = { - "s3_endpoint_alias": endpoint_alias, - "file_id": data.file_id, - "object_id": data.file_object.object_id, - "bucket_id": INBOX_BUCKET_ID, - "submitter_public_key": base64.b64encode( - joint_fixture.keypair.public - ).decode("utf-8"), - "upload_date": data.upload_date, - "expected_decrypted_sha256": data.checksum, - "decrypted_size": data.file_size, - } - - # introduce invalid checksum - payload_in["expected_decrypted_sha256"] = payload_in[ - "expected_decrypted_sha256" - ][1:] - event_in = _incoming_event_upload_received( - payload=payload_in, config=joint_fixture.config - ) - - payload_out = { - "s3_endpoint_alias": endpoint_alias, - "file_id": data.file_id, - "bucket_id": STAGING_BUCKET_ID, - "reason": "Checksum mismatch", - "upload_date": data.upload_date, - } - expected_event_out = ExpectedEvent( - payload=payload_out, - type_=joint_fixture.config.interrogation_failure_type, - key=data.file_id, - ) - - async with joint_fixture.kafka.record_events( - in_topic=joint_fixture.config.interrogation_topic, - ) as event_recorder: - await joint_fixture.kafka.publish_event(**event_in) - await joint_fixture.event_subscriber.run(forever=False) - - recorded_events = event_recorder.recorded_events - - assert len(recorded_events) == 1 - assert recorded_events[0].payload["object_id"] != "" - expected_event_out.payload["object_id"] = recorded_events[0].payload[ - "object_id" - ] - assert recorded_events[0].payload == expected_event_out.payload - - # check staging object dao state - staging_object_dao = await StagingObjectDaoConstructor.construct( - dao_factory=joint_fixture.mongodb.dao_factory - ) - with pytest.raises(ResourceNotFoundError): - await staging_object_dao.get_by_id(id_=data.file_id) - - # check fingerprint is created for unsuccessful processing - fingerprint_dao = await FingerprintDaoConstructor.construct( - dao_factory=joint_fixture.mongodb.dao_factory - ) - - seen_event = _populate_subject(payload_in) - fingerprint = UploadReceivedFingerprint.generate(seen_event) - - await fingerprint_dao.get_by_id(fingerprint.checksum) - - -@pytest.mark.asyncio(scope="session") -async def test_success_event( - monkeypatch, - joint_fixture: JointFixture, # noqa: F811 -): + storage = joint_fixture.s3 + storage_alias = joint_fixture.endpoint_aliases.node1 + data = await create_test_file( + bucket_id=INBOX_BUCKET_ID, + private_key=joint_fixture.keypair.private, + public_key=joint_fixture.keypair.public, + s3=storage, + ) + ekss_patch = partial(_ekss_call, data=data) + + monkeypatch.setattr( + "irs.core.interrogator.call_eks_api", + ekss_patch, + ) + + payload_in = { + "s3_endpoint_alias": storage_alias, + "file_id": data.file_id, + "object_id": data.file_object.object_id, + "bucket_id": INBOX_BUCKET_ID, + "submitter_public_key": base64.b64encode(joint_fixture.keypair.public).decode( + "utf-8" + ), + "upload_date": data.upload_date, + "expected_decrypted_sha256": data.checksum, + "decrypted_size": data.file_size, + } + + # introduce invalid checksum + payload_in["expected_decrypted_sha256"] = payload_in["expected_decrypted_sha256"][ + 1: + ] + event_in = _incoming_event_upload_received( + payload=payload_in, config=joint_fixture.config + ) + + payload_out = { + "s3_endpoint_alias": storage_alias, + "file_id": data.file_id, + "bucket_id": STAGING_BUCKET_ID, + "reason": "Checksum mismatch", + "upload_date": data.upload_date, + } + expected_event_out = ExpectedEvent( + payload=payload_out, + type_=joint_fixture.config.interrogation_failure_type, + key=data.file_id, + ) + + async with joint_fixture.kafka.record_events( + in_topic=joint_fixture.config.interrogation_topic, + ) as event_recorder: + await joint_fixture.kafka.publish_event(**event_in) + await joint_fixture.event_subscriber.run(forever=False) + + recorded_events = event_recorder.recorded_events + + assert len(recorded_events) == 1 + assert recorded_events[0].payload["object_id"] != "" + expected_event_out.payload["object_id"] = recorded_events[0].payload["object_id"] # type: ignore[index] + assert recorded_events[0].payload == expected_event_out.payload + + # check staging object dao state + staging_object_dao = await StagingObjectDaoConstructor.construct( + dao_factory=joint_fixture.mongodb.dao_factory + ) + with pytest.raises(ResourceNotFoundError): + await staging_object_dao.get_by_id(id_=data.file_id) + + # check fingerprint is created for unsuccessful processing + fingerprint_dao = await FingerprintDaoConstructor.construct( + dao_factory=joint_fixture.mongodb.dao_factory + ) + + seen_event = _populate_subject(payload_in) + fingerprint = UploadReceivedFingerprint.generate(seen_event) + + await fingerprint_dao.get_by_id(fingerprint.checksum) + + +async def test_success_event(monkeypatch, joint_fixture: JointFixture): """Test the whole pipeline from receiving an event to notifying about success""" secret_id = "secret_id" encrypted_parts_md5 = ["abc", "def", "ghi"] encrypted_parts_sha256 = ["abc", "def", "ghi"] - for s3, endpoint_alias in ( - (joint_fixture.s3, joint_fixture.endpoint_aliases.node1), - (joint_fixture.second_s3, joint_fixture.endpoint_aliases.node2), - ): - data = await create_test_file( - bucket_id=INBOX_BUCKET_ID, - private_key=joint_fixture.keypair.private, - public_key=joint_fixture.keypair.public, - s3=s3, - ) - - ekss_patch = partial(_ekss_call, data=data) - - monkeypatch.setattr( - "irs.core.interrogator.call_eks_api", - ekss_patch, - ) - - payload_in = { - "s3_endpoint_alias": endpoint_alias, - "file_id": data.file_id, - "object_id": data.file_object.object_id, - "bucket_id": INBOX_BUCKET_ID, - "submitter_public_key": base64.b64encode( - joint_fixture.keypair.public - ).decode("utf-8"), - "upload_date": data.upload_date, - "expected_decrypted_sha256": data.checksum, - "decrypted_size": data.file_size, - } - event_in = _incoming_event_upload_received( - payload=payload_in, config=joint_fixture.config - ) - - part_size = calc_part_size(file_size=data.file_size) - - payload_out = { - "s3_endpoint_alias": endpoint_alias, - "file_id": data.file_id, - "object_id": data.file_object.object_id, - "bucket_id": STAGING_BUCKET_ID, - "upload_date": data.upload_date, - "decryption_secret_id": secret_id, - "content_offset": data.offset, - "encrypted_part_size": part_size, - "decrypted_sha256": data.checksum, - } - expected_event_out = ExpectedEvent( - payload=payload_out, - type_=joint_fixture.config.interrogation_success_type, - key=data.file_id, - ) - - async with joint_fixture.kafka.record_events( - in_topic=joint_fixture.config.interrogation_topic, - ) as event_recorder: - await joint_fixture.kafka.publish_event(**event_in) - - await joint_fixture.event_subscriber.run(forever=False) - - recorded_events = event_recorder.recorded_events - - assert len(recorded_events) == 1 - event = recorded_events[0] - - expected_event_out.payload["object_id"] = event.payload["object_id"] - for key in payload_out: - assert event.payload[key] == expected_event_out.payload[key] - - # check staging object dao state and ensure, object actually exists in storage - staging_object_dao = await StagingObjectDaoConstructor.construct( - dao_factory=joint_fixture.mongodb.dao_factory - ) - staging_object = await staging_object_dao.get_by_id(id_=data.file_id) - - assert await s3.storage.does_object_exist( - bucket_id=STAGING_BUCKET_ID, object_id=staging_object.object_id - ) - - # check event fingerprint is stored in DB - mongo_dao = await FingerprintDaoConstructor.construct( - dao_factory=joint_fixture.mongodb.dao_factory - ) - - seen_event = _populate_subject(payload_in) - fingerprint = UploadReceivedFingerprint.generate(seen_event) - - await mongo_dao.get_by_id(fingerprint.checksum) - - # check removal on successful registration - payload_remove_object = { - "file_id": data.file_id, - "object_id": data.file_object.object_id, - "bucket_id": data.file_object.bucket_id, - "s3_endpoint_alias": endpoint_alias, - "decrypted_size": data.file_size, - "decryption_secret_id": secret_id, - "content_offset": data.offset, - "encrypted_part_size": part_size, - "encrypted_parts_md5": encrypted_parts_md5, - "encrypted_parts_sha256": encrypted_parts_sha256, - "decrypted_sha256": data.checksum, - "upload_date": now_as_utc().isoformat(), - } - - remove_event = _incoming_event_file_registered( - payload=payload_remove_object, config=joint_fixture.config - ) - - async with joint_fixture.kafka.record_events( - in_topic=joint_fixture.config.file_registered_event_topic, - ) as event_recorder: - await joint_fixture.kafka.publish_event(**remove_event) - await joint_fixture.event_subscriber.run(forever=False) - - assert len(event_recorder.recorded_events) == 1 - - assert not await s3.storage.does_object_exist( - bucket_id=STAGING_BUCKET_ID, object_id=staging_object.object_id - ) - - -@pytest.mark.asyncio(scope="session") + storage = joint_fixture.s3 + storage_alias = joint_fixture.endpoint_aliases.node1 + data = await create_test_file( + bucket_id=INBOX_BUCKET_ID, + private_key=joint_fixture.keypair.private, + public_key=joint_fixture.keypair.public, + s3=storage, + ) + + ekss_patch = partial(_ekss_call, data=data) + + monkeypatch.setattr( + "irs.core.interrogator.call_eks_api", + ekss_patch, + ) + + payload_in = { + "s3_endpoint_alias": storage_alias, + "file_id": data.file_id, + "object_id": data.file_object.object_id, + "bucket_id": INBOX_BUCKET_ID, + "submitter_public_key": base64.b64encode(joint_fixture.keypair.public).decode( + "utf-8" + ), + "upload_date": data.upload_date, + "expected_decrypted_sha256": data.checksum, + "decrypted_size": data.file_size, + } + event_in = _incoming_event_upload_received( + payload=payload_in, config=joint_fixture.config + ) + + part_size = calc_part_size(file_size=data.file_size) + + payload_out = { + "s3_endpoint_alias": storage_alias, + "file_id": data.file_id, + "object_id": data.file_object.object_id, + "bucket_id": STAGING_BUCKET_ID, + "upload_date": data.upload_date, + "decryption_secret_id": secret_id, + "content_offset": data.offset, + "encrypted_part_size": part_size, + "decrypted_sha256": data.checksum, + } + expected_event_out = ExpectedEvent( + payload=payload_out, + type_=joint_fixture.config.interrogation_success_type, + key=data.file_id, + ) + + async with joint_fixture.kafka.record_events( + in_topic=joint_fixture.config.interrogation_topic, + ) as event_recorder: + await joint_fixture.kafka.publish_event(**event_in) + + await joint_fixture.event_subscriber.run(forever=False) + + recorded_events = event_recorder.recorded_events + + assert len(recorded_events) == 1 + event = recorded_events[0] + + expected_event_out.payload["object_id"] = event.payload["object_id"] # type: ignore[index] + for key in payload_out: + assert event.payload[key] == expected_event_out.payload[key] + + # check staging object dao state and ensure, object actually exists in storage + staging_object_dao = await StagingObjectDaoConstructor.construct( + dao_factory=joint_fixture.mongodb.dao_factory + ) + staging_object = await staging_object_dao.get_by_id(id_=data.file_id) + + assert await storage.storage.does_object_exist( + bucket_id=STAGING_BUCKET_ID, object_id=staging_object.object_id + ) + + # check event fingerprint is stored in DB + mongo_dao = await FingerprintDaoConstructor.construct( + dao_factory=joint_fixture.mongodb.dao_factory + ) + + seen_event = _populate_subject(payload_in) + fingerprint = UploadReceivedFingerprint.generate(seen_event) + + await mongo_dao.get_by_id(fingerprint.checksum) + + # check removal on successful registration + payload_remove_object = { + "file_id": data.file_id, + "object_id": data.file_object.object_id, + "bucket_id": data.file_object.bucket_id, + "s3_endpoint_alias": storage_alias, + "decrypted_size": data.file_size, + "decryption_secret_id": secret_id, + "content_offset": data.offset, + "encrypted_part_size": part_size, + "encrypted_parts_md5": encrypted_parts_md5, + "encrypted_parts_sha256": encrypted_parts_sha256, + "decrypted_sha256": data.checksum, + "upload_date": now_as_utc().isoformat(), + } + + remove_event = _incoming_event_file_registered( + payload=payload_remove_object, config=joint_fixture.config + ) + + async with joint_fixture.kafka.record_events( + in_topic=joint_fixture.config.file_registered_event_topic, + ) as event_recorder: + await joint_fixture.kafka.publish_event(**remove_event) + await joint_fixture.event_subscriber.run(forever=False) + + assert len(event_recorder.recorded_events) == 1 + + assert not await storage.storage.does_object_exist( + bucket_id=STAGING_BUCKET_ID, object_id=staging_object.object_id + ) + + async def test_fingerprint_already_present( - caplog, - monkeypatch, - joint_fixture: JointFixture, # noqa: F811 + caplog, monkeypatch, joint_fixture: JointFixture ): """Test the whole pipeline from receiving an event to notifying about success""" - for s3, endpoint_alias in ( - (joint_fixture.s3, joint_fixture.endpoint_aliases.node1), - (joint_fixture.second_s3, joint_fixture.endpoint_aliases.node2), - ): - data = await create_test_file( - bucket_id=INBOX_BUCKET_ID, - private_key=joint_fixture.keypair.private, - public_key=joint_fixture.keypair.public, - s3=s3, - ) - - ekss_patch = partial(_ekss_call, data=data) - - monkeypatch.setattr( - "irs.core.interrogator.call_eks_api", - ekss_patch, - ) - - payload_in = { - "s3_endpoint_alias": endpoint_alias, - "file_id": data.file_id, - "object_id": data.file_object.object_id, - "bucket_id": INBOX_BUCKET_ID, - "submitter_public_key": base64.b64encode( - joint_fixture.keypair.public - ).decode("utf-8"), - "upload_date": data.upload_date, - "expected_decrypted_sha256": data.checksum, - "decrypted_size": data.file_size, - } - event_in = _incoming_event_upload_received( - payload=payload_in, config=joint_fixture.config - ) - - # create db fingerprint entry - mongo_dao = await FingerprintDaoConstructor.construct( - dao_factory=joint_fixture.mongodb.dao_factory - ) - seen_event = _populate_subject(payload_in) - fingerprint = UploadReceivedFingerprint.generate(seen_event) - - await mongo_dao.insert(fingerprint) - - # reset captured logs - caplog.clear() - await joint_fixture.kafka.publish_event(**event_in) - await joint_fixture.event_subscriber.run(forever=False) - assert ( - f"Payload for file ID '{seen_event.file_id}' has already been processed." - in caplog.messages - ) + storage = joint_fixture.s3 + storage_alias = joint_fixture.endpoint_aliases.node1 + data = await create_test_file( + bucket_id=INBOX_BUCKET_ID, + private_key=joint_fixture.keypair.private, + public_key=joint_fixture.keypair.public, + s3=storage, + ) + + ekss_patch = partial(_ekss_call, data=data) + + monkeypatch.setattr( + "irs.core.interrogator.call_eks_api", + ekss_patch, + ) + + payload_in = { + "s3_endpoint_alias": storage_alias, + "file_id": data.file_id, + "object_id": data.file_object.object_id, + "bucket_id": INBOX_BUCKET_ID, + "submitter_public_key": base64.b64encode(joint_fixture.keypair.public).decode( + "utf-8" + ), + "upload_date": data.upload_date, + "expected_decrypted_sha256": data.checksum, + "decrypted_size": data.file_size, + } + event_in = _incoming_event_upload_received( + payload=payload_in, config=joint_fixture.config + ) + + # create db fingerprint entry + mongo_dao = await FingerprintDaoConstructor.construct( + dao_factory=joint_fixture.mongodb.dao_factory + ) + seen_event = _populate_subject(payload_in) + fingerprint = UploadReceivedFingerprint.generate(seen_event) + + await mongo_dao.insert(fingerprint) + + # reset captured logs + caplog.clear() + await joint_fixture.kafka.publish_event(**event_in) + await joint_fixture.event_subscriber.run(forever=False) + assert ( + f"Payload for file ID '{seen_event.file_id}' has already been processed." + in caplog.messages + ) diff --git a/services/pcs/scripts/app_openapi.py b/services/pcs/scripts/app_openapi.py index 4a38213d..ef098522 100755 --- a/services/pcs/scripts/app_openapi.py +++ b/services/pcs/scripts/app_openapi.py @@ -34,7 +34,7 @@ def custom_openapi() -> dict[str, Any]: # noqa: D103 return app.openapi_schema openapi_schema = get_openapi_schema(app) app.openapi_schema = openapi_schema - return app.openapi_schema + return openapi_schema def main(): diff --git a/services/pcs/src/pcs/main.py b/services/pcs/src/pcs/main.py index aff17686..0bb6ef8c 100644 --- a/services/pcs/src/pcs/main.py +++ b/services/pcs/src/pcs/main.py @@ -24,7 +24,7 @@ async def run_rest_app(): """Run the HTTP REST API.""" - config = Config() # type: ignore + config = Config() configure_logging(config=config) async with prepare_rest_app(config=config) as app: diff --git a/services/pcs/tests_pcs/fixtures/config.py b/services/pcs/tests_pcs/fixtures/config.py index f115c451..5a49c076 100644 --- a/services/pcs/tests_pcs/fixtures/config.py +++ b/services/pcs/tests_pcs/fixtures/config.py @@ -39,4 +39,4 @@ def get_config( for source in sources: sources_dict.update(**source.model_dump()) - return Config(config_yaml=default_config_yaml, **sources_dict) # type: ignore + return Config(config_yaml=default_config_yaml, **sources_dict) diff --git a/services/pcs/tests_pcs/fixtures/joint.py b/services/pcs/tests_pcs/fixtures/joint.py index 24d8b05a..b0135b2b 100644 --- a/services/pcs/tests_pcs/fixtures/joint.py +++ b/services/pcs/tests_pcs/fixtures/joint.py @@ -22,7 +22,11 @@ import pytest_asyncio from ghga_service_commons.api.testing import AsyncTestClient from ghga_service_commons.utils.simple_token import generate_token_and_hash -from hexkit.providers.akafka.testutils import KafkaFixture, kafka_fixture +from hexkit.providers.akafka.testutils import ( + KafkaFixture, + get_clean_kafka_fixture, + kafka_container_fixture, +) from pcs.adapters.inbound.fastapi_.config import TokenHashConfig from pcs.config import Config from pcs.inject import prepare_core, prepare_rest_app @@ -30,11 +34,10 @@ from tests_pcs.fixtures.config import get_config -__all__ = [ - "joint_fixture", - "JointFixture", - "kafka_fixture", -] +__all__ = ["joint_fixture", "JointFixture", "kafka", "kafka_container_fixture"] + + +kafka = get_clean_kafka_fixture("session") @dataclass @@ -50,14 +53,14 @@ class JointFixture: @pytest_asyncio.fixture async def joint_fixture( - kafka_fixture: KafkaFixture, + kafka: KafkaFixture, ) -> AsyncGenerator[JointFixture, None]: """A fixture that embeds all other fixtures for API-level integration testing""" token, hash = generate_token_and_hash() token_hash_config = TokenHashConfig(token_hashes=[hash]) - config = get_config(sources=[kafka_fixture.config, token_hash_config]) + config = get_config(sources=[kafka.config, token_hash_config]) async with prepare_core(config=config) as file_deletion: async with prepare_rest_app(config=config, core_override=file_deletion) as app: @@ -66,6 +69,6 @@ async def joint_fixture( config=config, file_deletion=file_deletion, rest_client=rest_client, - kafka=kafka_fixture, + kafka=kafka, token=token, ) diff --git a/services/pcs/tests_pcs/test_typical_journey.py b/services/pcs/tests_pcs/test_typical_journey.py index 39cebb53..cbda81d6 100644 --- a/services/pcs/tests_pcs/test_typical_journey.py +++ b/services/pcs/tests_pcs/test_typical_journey.py @@ -27,7 +27,8 @@ from tests_pcs.fixtures.joint import ( # noqa: F401 JointFixture, joint_fixture, - kafka_fixture, + kafka, + kafka_container_fixture, )