diff --git a/.github/workflows/lint-test.yml b/.github/workflows/lint-test.yml new file mode 100644 index 0000000..dc422a6 --- /dev/null +++ b/.github/workflows/lint-test.yml @@ -0,0 +1,49 @@ +# Linters & tests running workflow + +name: Decision Making Application + +on: + + workflow_call: + + pull_request: + branches: [ master, dev, ] + push: + branches: [ master, dev, ] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install poetry + run: pipx install poetry + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "poetry" + cache-dependency-path: poetry.lock + - name: Install dependencies + run: poetry install --with lint,test + - name: Lint with ruff + run: poetry run ruff check + - name: Lint with mypy + run: poetry run mypy . + test: + runs-on: ubuntu-latest + needs: lint + steps: + - uses: actions/checkout@v3 + - name: Install poetry + run: pipx install poetry + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "poetry" + cache-dependency-path: poetry.lock + - name: Install dependencies + run: poetry install --with test + - name: Test with pytest + run: poetry run pytest diff --git a/.gitignore b/.gitignore index 143cce0..8678be6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ .idea .python-version .DS_Store +.mypy_cache/ +.pytest_cache/ +.ruff_cache/ __pycache__/ config/local.ini diff --git a/Dockerfile b/Dockerfile index 0b0e2db..1c7174b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim-buster as python-base +FROM python:3.11 as python-base ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ @@ -16,26 +16,25 @@ ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" FROM python-base as builder-base RUN apt-get update \ - && apt-get install -y gcc git + && apt-get install -y gcc git libpq-dev WORKDIR $PYSETUP_PATH -COPY ./pyproject.toml . +# due to the installation of the project itself, it should contain all the files +COPY . . RUN pip install --no-cache-dir --upgrade pip \ && pip install --no-cache-dir setuptools wheel \ && pip install --no-cache-dir poetry -RUN poetry install --no-root --only main +RUN poetry install --only main FROM python-base as production COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH -RUN apt-get update && apt-get install -y curl - WORKDIR decision-making-app/ COPY . /decision-making-app/ -CMD ["python", "-Om", "src.app"] +CMD ["python", "-Om", "dma"] diff --git a/alembic.ini b/alembic.ini index c33f3ff..949d672 100644 --- a/alembic.ini +++ b/alembic.ini @@ -2,7 +2,7 @@ [alembic] # path to migration scripts -script_location = ./src/app/infrastructure/database/migrations +script_location = ./src/dma/infrastructure/database/migrations # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s # Uncomment the line below if you want the files to be prepended with date and time diff --git a/config/local.dist.ini b/config/local.dist.ini index 4e3bda7..be57608 100644 --- a/config/local.dist.ini +++ b/config/local.dist.ini @@ -4,9 +4,23 @@ port = 5000 logging_level = DEBUG [database] -host = webchat.postgres +host = decision_making_app.postgres port = 5432 -database = webchat -user = admin -password = admin +database = decision_making_app +user = decision_making_app_admin +password = decision_making_app_admin echo = true + +[object_storage] +access_key = decision_making_app_admin +secret_key = decision_making_app_admin +bucket_name = decision_making_app + +[message_queue] +host = decision_making_app.rabbitmq +port = 5672 +username = decision_making_app_admin +password = decision_making_app_admin +connection_pool_max_size = 3 +channel_pool_max_size = 15 +default_exchange_name = decision_making_app diff --git a/docker-compose.yml b/docker-compose.yml index aa15434..217ee4e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,15 +12,21 @@ services: ports: - "5000:5000" depends_on: + minio: + condition: service_healthy postgres: condition: service_healthy + rabbitmq: + condition: service_healthy networks: + - decision_making_app.minio.network - decision_making_app.postgres.network + - decision_making_app.rabbitmq.network volumes: - ./config:/decision_making_app/config:ro environment: - - CONFIG_PATH=${CONFIG_PATH:-./config/local.ini} - command: [ "python", "-Om", "src.app" ] + CONFIG_PATH: ${CONFIG_PATH:-./config/local.ini} + command: [ "python", "-Om", "dma" ] healthcheck: test: [ "CMD-SHELL", "curl -fsSL http://localhost:5000/healthcheck/" ] interval: 10s @@ -31,8 +37,8 @@ services: postgres: profiles: [ "api", "migration" ] container_name: decision_making_app.postgres - image: "postgres:15-alpine" hostname: decision_making_app.postgres + image: "postgres:15-alpine" restart: unless-stopped expose: - "5432" @@ -41,13 +47,13 @@ services: networks: - decision_making_app.postgres.network environment: - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-admin} - POSTGRES_USER: ${POSTGRES_USER:-admin} - POSTGRES_DATABASE: ${POSTGRES_DATABASE:-decision_making_app} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-decision_making_app_admin} + POSTGRES_USER: ${POSTGRES_USER:-decision_making_app_admin} + POSTGRES_DB: ${POSTGRES_DB:-decision_making_app} volumes: - decision_making_app.postgres.data:/var/lib/postgresql/data:rw healthcheck: - test: [ "CMD-SHELL", "pg_isready -d $${POSTGRES_DATABASE} -U $${POSTGRES_USER}" ] + test: [ "CMD-SHELL", "pg_isready -d $$POSTGRES_DB -U $$POSTGRES_USER" ] interval: 10s timeout: 60s retries: 5 @@ -67,14 +73,128 @@ services: volumes: - ./config:/decision_making_app/config:ro - ./alembic.ini:/decision_making_app/alembic.ini:ro - - ./src/app/infrastructure/database/migrations:/decision_making_app/src/app/infrastructure/database/migrations:ro + - ./src/dma/infrastructure/database/migrations:/decision_making_app/src/dma/infrastructure/database/migrations:ro + environment: + CONFIG_PATH: ${CONFIG_PATH:-./config/local.ini} + command: [ "python", "-Om", "alembic", "upgrade", "head" ] + + minio: + profiles: [ "api" ] + container_name: decision_making_app.minio + image: "quay.io/minio/minio" + command: [ "server", "--address", ":9000", "--console-address", ":9001", "/data" ] + ports: + - "9000:9000" + - "9001:9001" + networks: + - decision_making_app.minio.network + volumes: + - decision_making_app.minio.data:/data:rw + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER:-decision_making_app_admin} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-decision_making_app_admin} + healthcheck: + test: [ "CMD", "mc", "ready", "local" ] + interval: 5s + timeout: 5s + retries: 5 +# test: [ "CMD-SHELL", "curl -I http://localhost:9000/minio/health/live" ] +# interval: 10s +# timeout: 60s +# retries: 5 +# start_period: 10s + + rabbitmq: + profiles: [ "api" ] + image: rabbitmq:3.11-management-alpine + container_name: decision_making_app.rabbitmq + hostname: decision_making_app.rabbitmq + restart: unless-stopped + expose: + - "5672" # AMQP port + - "15672" # HTTP management UI dashboard port + ports: + - "127.0.0.1:5672:5672" + - "127.0.0.1:15672:15672" + networks: + - decision_making_app.rabbitmq.network + volumes: + - decision_making_app.rabbitmq.data:/var/lib/rabbitmq/:rw + environment: + RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-decision_making_app_admin} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-decision_making_app_admin} + healthcheck: + test: [ "CMD-SHELL", "rabbitmq-diagnostics check_running -q" ] + interval: 10s + timeout: 60s + retries: 5 + start_period: 10s + + grafana: + profiles: [ "grafana" ] + image: grafana/grafana:9.5.2 + container_name: decision_making_app.grafana + hostname: decision_making_app.grafana + restart: unless-stopped + expose: + - "3000" + ports: + - "127.0.0.1:3000:3000" + networks: + - decision_making_app.grafana.network + volumes: + - decision_making_app.grafana.data:/var/lib/grafana:rw + - ./grafana/provisioning:/etc/grafana/provisioning:rw environment: - - CONFIG_PATH=${CONFIG_PATH:-./config/local.ini} - command: [ "python", "-m", "alembic", "upgrade", "head" ] + - GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-decision_making_app_admin} + - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-decision_making_app_admin} + - GF_USERS_ALLOW_SIGN_UP=false + - VIRTUAL_HOST=decision_making_app.grafana + - NETWORK_ACCESS=internal + - VIRTUAL_PORT=3000 + loki: + profiles: [ "grafana" ] + image: grafana/loki:2.8.2 + container_name: decision_making_app.loki + hostname: decision_making_app.loki + expose: + - "3100" + volumes: + - ./loki/config.yaml:/etc/loki/config.yaml:ro + - decision_making_app.loki.data:/tmp/:rw + command: -config.file=/etc/loki/config.yaml + restart: unless-stopped + networks: + - decision_making_app.grafana.network + + vector: + profiles: [ "grafana" ] + image: timberio/vector:0.29.1-alpine + container_name: decision_making_app.vector + hostname: decision_making_app.vector + depends_on: + loki: + condition: service_started + command: --config /etc/vector/vector.toml + restart: unless-stopped + expose: + - "8383" + networks: + - decision_making_app.grafana.network + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./vector/vector.toml:/etc/vector/vector.toml:ro volumes: + decision_making_app.minio.data: decision_making_app.postgres.data: + decision_making_app.rabbitmq.data: + decision_making_app.grafana.data: + decision_making_app.loki.data: networks: + decision_making_app.minio.network: decision_making_app.postgres.network: + decision_making_app.rabbitmq.network: + decision_making_app.grafana.network: diff --git a/grafana/provisioning/datasources/loki.yaml b/grafana/provisioning/datasources/loki.yaml new file mode 100644 index 0000000..ae0fcdc --- /dev/null +++ b/grafana/provisioning/datasources/loki.yaml @@ -0,0 +1,14 @@ +apiVersion: 1 + +datasources: + - name: Loki + type: loki + access: proxy + url: http://decision_making_app.loki:3100 + basicAuth: false + isDefault: true + editable: true + orgId: 1 + version: 1 + jsonData: + timeInterval: 15s diff --git a/loki/config.yaml b/loki/config.yaml new file mode 100644 index 0000000..1cc13fd --- /dev/null +++ b/loki/config.yaml @@ -0,0 +1,37 @@ +auth_enabled: false + +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + +common: + path_prefix: /tmp/loki + storage: + filesystem: + chunks_directory: /tmp/loki/chunks + rules_directory: /tmp/loki/rules + replication_factor: 1 + ring: + instance_addr: 127.0.0.1 + kvstore: + store: inmemory + +schema_config: + configs: + - from: 2023-01-01 + store: boltdb-shipper + object_store: filesystem + schema: v11 + index: + prefix: index_ + period: 24h + +query_range: + results_cache: + cache: + embedded_cache: + enabled: true + max_size_mb: 100 + +ruler: + alertmanager_url: http://localhost:9093 diff --git a/poetry.lock b/poetry.lock index 18f916d..f4e8aa2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,204 @@ # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +[[package]] +name = "aio-pika" +version = "9.4.0" +description = "Wrapper around the aiormq for asyncio and humans" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "aio_pika-9.4.0-py3-none-any.whl", hash = "sha256:06d3680ea8515aa6c02ac6f94ffe2dde3396f141fde92eef63beb98c7a143cfd"}, + {file = "aio_pika-9.4.0.tar.gz", hash = "sha256:5199be0f50bd0fb1338962390383bb83a3ce8e760bb603aa071e58b56afeeec1"}, +] + +[package.dependencies] +aiormq = ">=6.8.0,<6.9.0" +yarl = "*" + +[[package]] +name = "aioboto3" +version = "12.1.0" +description = "Async boto3 wrapper" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "aioboto3-12.1.0-py3-none-any.whl", hash = "sha256:9f9e07261ddf3d6fec04dd8d5f5a55e0cb3250089f4282f7a60054495ad9699b"}, + {file = "aioboto3-12.1.0.tar.gz", hash = "sha256:8eae15dd52c9a43845448508ad0f912028a0a176bbd85b78e1377bb5f2a4d450"}, +] + +[package.dependencies] +aiobotocore = {version = "2.8.0", extras = ["boto3"]} + +[package.extras] +chalice = ["chalice (>=1.24.0)"] +s3cse = ["cryptography (>=2.3.1)"] + +[[package]] +name = "aiobotocore" +version = "2.8.0" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiobotocore-2.8.0-py3-none-any.whl", hash = "sha256:32e632fea387acd45416c2bbc03828ee2c2a66a7dc4bd3a9bcb808dea249c469"}, + {file = "aiobotocore-2.8.0.tar.gz", hash = "sha256:f160497cef21cfffc1a8d4219eeb27bb7b243389c2d021a812b9c0e3fb8e2bd1"}, +] + +[package.dependencies] +aiohttp = ">=3.7.4.post0,<4.0.0" +aioitertools = ">=0.5.1,<1.0.0" +boto3 = {version = ">=1.29.4,<1.33.2", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.32.4,<1.33.2" +wrapt = ">=1.10.10,<2.0.0" + +[package.extras] +awscli = ["awscli (>=1.30.4,<1.31.2)"] +boto3 = ["boto3 (>=1.29.4,<1.33.2)"] + +[[package]] +name = "aiohttp" +version = "3.9.3" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, + {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, + {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, + {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, + {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, + {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, + {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, + {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, + {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, + {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, + {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, + {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aioitertools" +version = "0.11.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] + +[[package]] +name = "aiormq" +version = "6.8.0" +description = "Pure python AMQP asynchronous client library" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "aiormq-6.8.0-py3-none-any.whl", hash = "sha256:9a16174dcae4078c957a773d2f02d3dfd6c2fcf12c909dc244333a458f2aeab0"}, + {file = "aiormq-6.8.0.tar.gz", hash = "sha256:198f9c7430feb7bc491016099a06266dc45880b6b1de3925d410fde6541a66fb"}, +] + +[package.dependencies] +pamqp = "3.3.0" +yarl = "*" + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "alembic" -version = "1.12.0" +version = "1.13.1" description = "A database migration tool for SQLAlchemy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "alembic-1.12.0-py3-none-any.whl", hash = "sha256:03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f"}, - {file = "alembic-1.12.0.tar.gz", hash = "sha256:8e7645c32e4f200675e69f0745415335eb59a3663f5feb487abfa0b30c45888b"}, + {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, + {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, ] [package.dependencies] @@ -17,17 +207,17 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["python-dateutil"] +tz = ["backports.zoneinfo"] [[package]] name = "annotated-types" -version = "0.5.0" +version = "0.6.0" description = "Reusable constraint types to use with typing.Annotated" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "annotated_types-0.5.0-py3-none-any.whl", hash = "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd"}, - {file = "annotated_types-0.5.0.tar.gz", hash = "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802"}, + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, ] [[package]] @@ -50,6 +240,311 @@ doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd- test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (<0.22)"] +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "boto3" +version = "1.33.1" +description = "The AWS SDK for Python" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "boto3-1.33.1-py3-none-any.whl", hash = "sha256:fa5aa92d16763cb906fb4a83d6eba887342202a980bea07862af5ba40827aa5a"}, + {file = "boto3-1.33.1.tar.gz", hash = "sha256:1fe5fa75ff0f0c29a6f55e818d149d33571731e692a7b785ded7a28ac832cae8"}, +] + +[package.dependencies] +botocore = ">=1.33.1,<1.34.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.8.0,<0.9.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.33.1" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">= 3.7" +files = [ + {file = "botocore-1.33.1-py3-none-any.whl", hash = "sha256:c744b90980786c610dd9ad9c50cf2cdde3f1c4634b954a33613f6f8a1865a1de"}, + {file = "botocore-1.33.1.tar.gz", hash = "sha256:d22d29916905e5f0670b91f07688e92b2c4a2075f9a474d6edbe7d22040d8fbf"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.19.17)"] + +[[package]] +name = "botocore-stubs" +version = "1.34.46" +description = "Type annotations and code completion for botocore" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "botocore_stubs-1.34.46-py3-none-any.whl", hash = "sha256:a501639bf8b0d94e945cea522a2cefd9d32bce3073db9be1dc240573aea76f7c"}, + {file = "botocore_stubs-1.34.46.tar.gz", hash = "sha256:e1bfb0ca3eafb101cfff810b04fb8f7a5a7d32f900357832733b0d6c9d5880e9"}, +] + +[package.dependencies] +types-awscrt = "*" + +[package.extras] +botocore = ["botocore"] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + [[package]] name = "click" version = "8.1.7" @@ -75,15 +570,50 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +optional = false +python-versions = "*" +files = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] + +[package.dependencies] +packaging = "*" + +[[package]] +name = "docker" +version = "7.0.0" +description = "A Python library for the Docker Engine API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "docker-7.0.0-py3-none-any.whl", hash = "sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b"}, + {file = "docker-7.0.0.tar.gz", hash = "sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3"}, +] + +[package.dependencies] +packaging = ">=14.0" +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" + +[package.extras] +ssh = ["paramiko (>=2.4.3)"] +websockets = ["websocket-client (>=1.3.0)"] + [[package]] name = "fastapi" -version = "0.103.1" +version = "0.103.2" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.7" files = [ - {file = "fastapi-0.103.1-py3-none-any.whl", hash = "sha256:5e5f17e826dbd9e9b5a5145976c5cd90bcaa61f2bf9a69aca423f2bcebe44d83"}, - {file = "fastapi-0.103.1.tar.gz", hash = "sha256:345844e6a82062f06a096684196aaf96c1198b25c06b72c1311b882aa2d8a35d"}, + {file = "fastapi-0.103.2-py3-none-any.whl", hash = "sha256:3270de872f0fe9ec809d4bd3d4d890c6d5cc7b9611d721d6438f9dacc8c4ef2e"}, + {file = "fastapi-0.103.2.tar.gz", hash = "sha256:75a11f6bfb8fc4d2bec0bd710c2d5f2829659c0e8c0afd5560fdda6ce25ec653"}, ] [package.dependencies] @@ -96,92 +626,160 @@ typing-extensions = ">=4.5.0" all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] [[package]] -name = "flake8" -version = "6.1.0" -description = "the modular source code checker: pep8 pyflakes and co" +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" optional = false -python-versions = ">=3.8.1" +python-versions = ">=3.8" files = [ - {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, - {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" -pyflakes = ">=3.1.0,<3.2.0" - [[package]] name = "greenlet" -version = "2.0.2" +version = "3.0.3" description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] [package.extras] -docs = ["Sphinx", "docutils (<0.18)"] +docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] [[package]] @@ -197,46 +795,47 @@ files = [ [[package]] name = "httptools" -version = "0.6.0" +version = "0.6.1" description = "A collection of framework independent HTTP protocol utils." optional = false -python-versions = ">=3.5.0" -files = [ - {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:818325afee467d483bfab1647a72054246d29f9053fd17cc4b86cda09cc60339"}, - {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72205730bf1be875003692ca54a4a7c35fac77b4746008966061d9d41a61b0f5"}, - {file = "httptools-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33eb1d4e609c835966e969a31b1dedf5ba16b38cab356c2ce4f3e33ffa94cad3"}, - {file = "httptools-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdc6675ec6cb79d27e0575750ac6e2b47032742e24eed011b8db73f2da9ed40"}, - {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:463c3bc5ef64b9cf091be9ac0e0556199503f6e80456b790a917774a616aff6e"}, - {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f228b88b0e8c6099a9c4757ce9fdbb8b45548074f8d0b1f0fc071e35655d1c"}, - {file = "httptools-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:0781fedc610293a2716bc7fa142d4c85e6776bc59d617a807ff91246a95dea35"}, - {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:721e503245d591527cddd0f6fd771d156c509e831caa7a57929b55ac91ee2b51"}, - {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:274bf20eeb41b0956e34f6a81f84d26ed57c84dd9253f13dcb7174b27ccd8aaf"}, - {file = "httptools-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:259920bbae18740a40236807915def554132ad70af5067e562f4660b62c59b90"}, - {file = "httptools-0.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03bfd2ae8a2d532952ac54445a2fb2504c804135ed28b53fefaf03d3a93eb1fd"}, - {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f959e4770b3fc8ee4dbc3578fd910fab9003e093f20ac8c621452c4d62e517cb"}, - {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e22896b42b95b3237eccc42278cd72c0df6f23247d886b7ded3163452481e38"}, - {file = "httptools-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:38f3cafedd6aa20ae05f81f2e616ea6f92116c8a0f8dcb79dc798df3356836e2"}, - {file = "httptools-0.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47043a6e0ea753f006a9d0dd076a8f8c99bc0ecae86a0888448eb3076c43d717"}, - {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a541579bed0270d1ac10245a3e71e5beeb1903b5fbbc8d8b4d4e728d48ff1d"}, - {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d802e7b2538a9756df5acc062300c160907b02e15ed15ba035b02bce43e89c"}, - {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26326e0a8fe56829f3af483200d914a7cd16d8d398d14e36888b56de30bec81a"}, - {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e41ccac9e77cd045f3e4ee0fc62cbf3d54d7d4b375431eb855561f26ee7a9ec4"}, - {file = "httptools-0.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e748fc0d5c4a629988ef50ac1aef99dfb5e8996583a73a717fc2cac4ab89932"}, - {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cf8169e839a0d740f3d3c9c4fa630ac1a5aaf81641a34575ca6773ed7ce041a1"}, - {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dcc14c090ab57b35908d4a4585ec5c0715439df07be2913405991dbb37e049d"}, - {file = "httptools-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0b0571806a5168013b8c3d180d9f9d6997365a4212cb18ea20df18b938aa0b"}, - {file = "httptools-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb4a608c631f7dcbdf986f40af7a030521a10ba6bc3d36b28c1dc9e9035a3c0"}, - {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:93f89975465133619aea8b1952bc6fa0e6bad22a447c6d982fc338fbb4c89649"}, - {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:73e9d66a5a28b2d5d9fbd9e197a31edd02be310186db423b28e6052472dc8201"}, - {file = "httptools-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:22c01fcd53648162730a71c42842f73b50f989daae36534c818b3f5050b54589"}, - {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f96d2a351b5625a9fd9133c95744e8ca06f7a4f8f0b8231e4bbaae2c485046a"}, - {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72ec7c70bd9f95ef1083d14a755f321d181f046ca685b6358676737a5fecd26a"}, - {file = "httptools-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b703d15dbe082cc23266bf5d9448e764c7cb3fcfe7cb358d79d3fd8248673ef9"}, - {file = "httptools-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c723ed5982f8ead00f8e7605c53e55ffe47c47465d878305ebe0082b6a1755"}, - {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0a816bb425c116a160fbc6f34cece097fd22ece15059d68932af686520966bd"}, - {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dea66d94e5a3f68c5e9d86e0894653b87d952e624845e0b0e3ad1c733c6cc75d"}, - {file = "httptools-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:23b09537086a5a611fad5696fc8963d67c7e7f98cb329d38ee114d588b0b74cd"}, - {file = "httptools-0.6.0.tar.gz", hash = "sha256:9fc6e409ad38cbd68b177cd5158fc4042c796b82ca88d99ec78f07bed6c6b796"}, +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, ] [package.extras] @@ -244,13 +843,13 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -265,31 +864,25 @@ files = [ ] [[package]] -name = "isort" -version = "5.12.0" -description = "A Python utility / library to sort Python imports." +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.7" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] -[package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] - [[package]] name = "mako" -version = "1.2.4" +version = "1.3.2" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, + {file = "Mako-1.3.2-py3-none-any.whl", hash = "sha256:32a99d70754dfce237019d17ffe4a282d2d3351b9c476e90d8a60e63f133b80c"}, + {file = "Mako-1.3.2.tar.gz", hash = "sha256:2a0c8ad7f6274271b3bb7467dd37cf9cc6dab4bc19cb69a4ef10669402de698e"}, ] [package.dependencies] @@ -302,108 +895,224 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, -] - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "minio" +version = "7.2.4" +description = "MinIO Python SDK for Amazon S3 Compatible Cloud Storage" optional = false -python-versions = ">=3.6" +python-versions = "*" files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, + {file = "minio-7.2.4-py3-none-any.whl", hash = "sha256:91b51c21d25e3ee6d51f52eab126d6c974371add0d77951e42c322a59c5533e7"}, + {file = "minio-7.2.4.tar.gz", hash = "sha256:d504d8464e5198fb74dd9b572cc88b185ae7997c17705e8c09f3fef2f439d984"}, +] + +[package.dependencies] +argon2-cffi = "*" +certifi = "*" +pycryptodome = "*" +typing-extensions = "*" +urllib3 = "*" + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] name = "mypy" -version = "1.5.1" +version = "1.8.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, - {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, - {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, - {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, - {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, - {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, - {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, - {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, - {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, - {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, - {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, - {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, - {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, - {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, - {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, - {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, - {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, - {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, - {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, ] [package.dependencies] @@ -413,6 +1122,7 @@ typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -428,93 +1138,114 @@ files = [ [[package]] name = "orjson" -version = "3.9.7" +version = "3.9.14" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "orjson-3.9.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6df858e37c321cefbf27fe7ece30a950bcc3a75618a804a0dcef7ed9dd9c92d"}, - {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5198633137780d78b86bb54dafaaa9baea698b4f059456cd4554ab7009619221"}, - {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e736815b30f7e3c9044ec06a98ee59e217a833227e10eb157f44071faddd7c5"}, - {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a19e4074bc98793458b4b3ba35a9a1d132179345e60e152a1bb48c538ab863c4"}, - {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80acafe396ab689a326ab0d80f8cc61dec0dd2c5dca5b4b3825e7b1e0132c101"}, - {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:355efdbbf0cecc3bd9b12589b8f8e9f03c813a115efa53f8dc2a523bfdb01334"}, - {file = "orjson-3.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3aab72d2cef7f1dd6104c89b0b4d6b416b0db5ca87cc2fac5f79c5601f549cc2"}, - {file = "orjson-3.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36b1df2e4095368ee388190687cb1b8557c67bc38400a942a1a77713580b50ae"}, - {file = "orjson-3.9.7-cp310-none-win32.whl", hash = "sha256:e94b7b31aa0d65f5b7c72dd8f8227dbd3e30354b99e7a9af096d967a77f2a580"}, - {file = "orjson-3.9.7-cp310-none-win_amd64.whl", hash = "sha256:82720ab0cf5bb436bbd97a319ac529aee06077ff7e61cab57cee04a596c4f9b4"}, - {file = "orjson-3.9.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1f8b47650f90e298b78ecf4df003f66f54acdba6a0f763cc4df1eab048fe3738"}, - {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f738fee63eb263530efd4d2e9c76316c1f47b3bbf38c1bf45ae9625feed0395e"}, - {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38e34c3a21ed41a7dbd5349e24c3725be5416641fdeedf8f56fcbab6d981c900"}, - {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21a3344163be3b2c7e22cef14fa5abe957a892b2ea0525ee86ad8186921b6cf0"}, - {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23be6b22aab83f440b62a6f5975bcabeecb672bc627face6a83bc7aeb495dc7e"}, - {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5205ec0dfab1887dd383597012199f5175035e782cdb013c542187d280ca443"}, - {file = "orjson-3.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8769806ea0b45d7bf75cad253fba9ac6700b7050ebb19337ff6b4e9060f963fa"}, - {file = "orjson-3.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f9e01239abea2f52a429fe9d95c96df95f078f0172489d691b4a848ace54a476"}, - {file = "orjson-3.9.7-cp311-none-win32.whl", hash = "sha256:8bdb6c911dae5fbf110fe4f5cba578437526334df381b3554b6ab7f626e5eeca"}, - {file = "orjson-3.9.7-cp311-none-win_amd64.whl", hash = "sha256:9d62c583b5110e6a5cf5169ab616aa4ec71f2c0c30f833306f9e378cf51b6c86"}, - {file = "orjson-3.9.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1c3cee5c23979deb8d1b82dc4cc49be59cccc0547999dbe9adb434bb7af11cf7"}, - {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a347d7b43cb609e780ff8d7b3107d4bcb5b6fd09c2702aa7bdf52f15ed09fa09"}, - {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:154fd67216c2ca38a2edb4089584504fbb6c0694b518b9020ad35ecc97252bb9"}, - {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea3e63e61b4b0beeb08508458bdff2daca7a321468d3c4b320a758a2f554d31"}, - {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb0b0b2476f357eb2975ff040ef23978137aa674cd86204cfd15d2d17318588"}, - {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b9a20a03576c6b7022926f614ac5a6b0914486825eac89196adf3267c6489d"}, - {file = "orjson-3.9.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:915e22c93e7b7b636240c5a79da5f6e4e84988d699656c8e27f2ac4c95b8dcc0"}, - {file = "orjson-3.9.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f26fb3e8e3e2ee405c947ff44a3e384e8fa1843bc35830fe6f3d9a95a1147b6e"}, - {file = "orjson-3.9.7-cp312-none-win_amd64.whl", hash = "sha256:d8692948cada6ee21f33db5e23460f71c8010d6dfcfe293c9b96737600a7df78"}, - {file = "orjson-3.9.7-cp37-cp37m-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7bab596678d29ad969a524823c4e828929a90c09e91cc438e0ad79b37ce41166"}, - {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63ef3d371ea0b7239ace284cab9cd00d9c92b73119a7c274b437adb09bda35e6"}, - {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f8fcf696bbbc584c0c7ed4adb92fd2ad7d153a50258842787bc1524e50d7081"}, - {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90fe73a1f0321265126cbba13677dcceb367d926c7a65807bd80916af4c17047"}, - {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45a47f41b6c3beeb31ac5cf0ff7524987cfcce0a10c43156eb3ee8d92d92bf22"}, - {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a2937f528c84e64be20cb80e70cea76a6dfb74b628a04dab130679d4454395c"}, - {file = "orjson-3.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b4fb306c96e04c5863d52ba8d65137917a3d999059c11e659eba7b75a69167bd"}, - {file = "orjson-3.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:410aa9d34ad1089898f3db461b7b744d0efcf9252a9415bbdf23540d4f67589f"}, - {file = "orjson-3.9.7-cp37-none-win32.whl", hash = "sha256:26ffb398de58247ff7bde895fe30817a036f967b0ad0e1cf2b54bda5f8dcfdd9"}, - {file = "orjson-3.9.7-cp37-none-win_amd64.whl", hash = "sha256:bcb9a60ed2101af2af450318cd89c6b8313e9f8df4e8fb12b657b2e97227cf08"}, - {file = "orjson-3.9.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5da9032dac184b2ae2da4bce423edff7db34bfd936ebd7d4207ea45840f03905"}, - {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7951af8f2998045c656ba8062e8edf5e83fd82b912534ab1de1345de08a41d2b"}, - {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8e59650292aa3a8ea78073fc84184538783966528e442a1b9ed653aa282edcf"}, - {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9274ba499e7dfb8a651ee876d80386b481336d3868cba29af839370514e4dce0"}, - {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca1706e8b8b565e934c142db6a9592e6401dc430e4b067a97781a997070c5378"}, - {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cc275cf6dcb1a248e1876cdefd3f9b5f01063854acdfd687ec360cd3c9712a"}, - {file = "orjson-3.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:11c10f31f2c2056585f89d8229a56013bc2fe5de51e095ebc71868d070a8dd81"}, - {file = "orjson-3.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cf334ce1d2fadd1bf3e5e9bf15e58e0c42b26eb6590875ce65bd877d917a58aa"}, - {file = "orjson-3.9.7-cp38-none-win32.whl", hash = "sha256:76a0fc023910d8a8ab64daed8d31d608446d2d77c6474b616b34537aa7b79c7f"}, - {file = "orjson-3.9.7-cp38-none-win_amd64.whl", hash = "sha256:7a34a199d89d82d1897fd4a47820eb50947eec9cda5fd73f4578ff692a912f89"}, - {file = "orjson-3.9.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e7e7f44e091b93eb39db88bb0cb765db09b7a7f64aea2f35e7d86cbf47046c65"}, - {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d647b2a9c45a23a84c3e70e19d120011cba5f56131d185c1b78685457320bb"}, - {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0eb850a87e900a9c484150c414e21af53a6125a13f6e378cf4cc11ae86c8f9c5"}, - {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f4b0042d8388ac85b8330b65406c84c3229420a05068445c13ca28cc222f1f7"}, - {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd3e7aae977c723cc1dbb82f97babdb5e5fbce109630fbabb2ea5053523c89d3"}, - {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c616b796358a70b1f675a24628e4823b67d9e376df2703e893da58247458956"}, - {file = "orjson-3.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3ba725cf5cf87d2d2d988d39c6a2a8b6fc983d78ff71bc728b0be54c869c884"}, - {file = "orjson-3.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4891d4c934f88b6c29b56395dfc7014ebf7e10b9e22ffd9877784e16c6b2064f"}, - {file = "orjson-3.9.7-cp39-none-win32.whl", hash = "sha256:14d3fb6cd1040a4a4a530b28e8085131ed94ebc90d72793c59a713de34b60838"}, - {file = "orjson-3.9.7-cp39-none-win_amd64.whl", hash = "sha256:9ef82157bbcecd75d6296d5d8b2d792242afcd064eb1ac573f8847b52e58f677"}, - {file = "orjson-3.9.7.tar.gz", hash = "sha256:85e39198f78e2f7e054d296395f6c96f5e02892337746ef5b6a1bf3ed5910142"}, + {file = "orjson-3.9.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:793f6c9448ab6eb7d4974b4dde3f230345c08ca6c7995330fbceeb43a5c8aa5e"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bc7928d161840096adc956703494b5c0193ede887346f028216cac0af87500"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58b36f54da759602d8e2f7dad958752d453dfe2c7122767bc7f765e17dc59959"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abcda41ecdc950399c05eff761c3de91485d9a70d8227cb599ad3a66afe93bcc"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df76ecd17b1b3627bddfd689faaf206380a1a38cc9f6c4075bd884eaedcf46c2"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d450a8e0656efb5d0fcb062157b918ab02dcca73278975b4ee9ea49e2fcf5bd5"}, + {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:95c03137b0cf66517c8baa65770507a756d3a89489d8ecf864ea92348e1beabe"}, + {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20837e10835c98973673406d6798e10f821e7744520633811a5a3d809762d8cc"}, + {file = "orjson-3.9.14-cp310-none-win32.whl", hash = "sha256:1f7b6f3ef10ae8e3558abb729873d033dbb5843507c66b1c0767e32502ba96bb"}, + {file = "orjson-3.9.14-cp310-none-win_amd64.whl", hash = "sha256:ea890e6dc1711aeec0a33b8520e395c2f3d59ead5b4351a788e06bf95fc7ba81"}, + {file = "orjson-3.9.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c19009ff37f033c70acd04b636380379499dac2cba27ae7dfc24f304deabbc81"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19cdea0664aec0b7f385be84986d4defd3334e9c3c799407686ee1c26f7b8251"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:135d518f73787ce323b1a5e21fb854fe22258d7a8ae562b81a49d6c7f826f2a3"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2cf1d0557c61c75e18cf7d69fb689b77896e95553e212c0cc64cf2087944b84"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7c11667421df2d8b18b021223505dcc3ee51be518d54e4dc49161ac88ac2b87"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eefc41ba42e75ed88bc396d8fe997beb20477f3e7efa000cd7a47eda452fbb2"}, + {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:917311d6a64d1c327c0dfda1e41f3966a7fb72b11ca7aa2e7a68fcccc7db35d9"}, + {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4dc1c132259b38d12c6587d190cd09cd76e3b5273ce71fe1372437b4cbc65f6f"}, + {file = "orjson-3.9.14-cp311-none-win32.whl", hash = "sha256:6f39a10408478f4c05736a74da63727a1ae0e83e3533d07b19443400fe8591ca"}, + {file = "orjson-3.9.14-cp311-none-win_amd64.whl", hash = "sha256:26280a7fcb62d8257f634c16acebc3bec626454f9ab13558bbf7883b9140760e"}, + {file = "orjson-3.9.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:08e722a8d06b13b67a51f247a24938d1a94b4b3862e40e0eef3b2e98c99cd04c"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2591faa0c031cf3f57e5bce1461cfbd6160f3f66b5a72609a130924917cb07d"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2450d87dd7b4f277f4c5598faa8b49a0c197b91186c47a2c0b88e15531e4e3e"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90903d2908158a2c9077a06f11e27545de610af690fb178fd3ba6b32492d4d1c"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce6f095eef0026eae76fc212f20f786011ecf482fc7df2f4c272a8ae6dd7b1ef"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:751250a31fef2bac05a2da2449aae7142075ea26139271f169af60456d8ad27a"}, + {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9a1af21160a38ee8be3f4fcf24ee4b99e6184cadc7f915d599f073f478a94d2c"}, + {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:449bf090b2aa4e019371d7511a6ea8a5a248139205c27d1834bb4b1e3c44d936"}, + {file = "orjson-3.9.14-cp312-none-win_amd64.whl", hash = "sha256:a603161318ff699784943e71f53899983b7dee571b4dd07c336437c9c5a272b0"}, + {file = "orjson-3.9.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:814f288c011efdf8f115c5ebcc1ab94b11da64b207722917e0ceb42f52ef30a3"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88cafb100af68af3b9b29b5ccd09fdf7a48c63327916c8c923a94c336d38dd3"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba3518b999f88882ade6686f1b71e207b52e23546e180499be5bbb63a2f9c6e6"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978f416bbff9da8d2091e3cf011c92da68b13f2c453dcc2e8109099b2a19d234"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75fc593cf836f631153d0e21beaeb8d26e144445c73645889335c2247fcd71a0"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d1528db3c7554f9d6eeb09df23cb80dd5177ec56eeb55cc5318826928de506"}, + {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7183cc68ee2113b19b0b8714221e5e3b07b3ba10ca2bb108d78fd49cefaae101"}, + {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:df3266d54246cb56b8bb17fa908660d2a0f2e3f63fbc32451ffc1b1505051d07"}, + {file = "orjson-3.9.14-cp38-none-win32.whl", hash = "sha256:7913079b029e1b3501854c9a78ad938ed40d61fe09bebab3c93e60ff1301b189"}, + {file = "orjson-3.9.14-cp38-none-win_amd64.whl", hash = "sha256:29512eb925b620e5da2fd7585814485c67cc6ba4fe739a0a700c50467a8a8065"}, + {file = "orjson-3.9.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5bf597530544db27a8d76aced49cfc817ee9503e0a4ebf0109cd70331e7bbe0c"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac650d49366fa41fe702e054cb560171a8634e2865537e91f09a8d05ea5b1d37"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:236230433a9a4968ab895140514c308fdf9f607cb8bee178a04372b771123860"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3014ccbda9be0b1b5f8ea895121df7e6524496b3908f4397ff02e923bcd8f6dd"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac0c7eae7ad3a223bde690565442f8a3d620056bd01196f191af8be58a5248e1"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca33fdd0b38839b01912c57546d4f412ba7bfa0faf9bf7453432219aec2df07"}, + {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f75823cc1674a840a151e999a7dfa0d86c911150dd6f951d0736ee9d383bf415"}, + {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f52ac2eb49e99e7373f62e2a68428c6946cda52ce89aa8fe9f890c7278e2d3a"}, + {file = "orjson-3.9.14-cp39-none-win32.whl", hash = "sha256:0572f174f50b673b7df78680fb52cd0087a8585a6d06d295a5f790568e1064c6"}, + {file = "orjson-3.9.14-cp39-none-win_amd64.whl", hash = "sha256:ab90c02cb264250b8a58cedcc72ed78a4a257d956c8d3c8bebe9751b818dfad8"}, + {file = "orjson-3.9.14.tar.gz", hash = "sha256:06fb40f8e49088ecaa02f1162581d39e2cf3fd9dbbfe411eb2284147c99bad79"}, ] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pamqp" +version = "3.3.0" +description = "RabbitMQ Focused AMQP low-level library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pamqp-3.3.0-py2.py3-none-any.whl", hash = "sha256:c901a684794157ae39b52cbf700db8c9aae7a470f13528b9d7b4e5f7202f8eb0"}, + {file = "pamqp-3.3.0.tar.gz", hash = "sha256:40b8795bd4efcf2b0f8821c1de83d12ca16d5760f4507836267fd7a02b06763b"}, +] + +[package.extras] +codegen = ["lxml", "requests", "yapf"] +testing = ["coverage", "flake8", "flake8-comprehensions", "flake8-deprecated", "flake8-import-order", "flake8-print", "flake8-quotes", "flake8-rst-docstrings", "flake8-tuple", "yapf"] + +[[package]] +name = "pika" +version = "1.3.2" +description = "Pika Python AMQP Client Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pika-1.3.2-py3-none-any.whl", hash = "sha256:0779a7c1fafd805672796085560d290213a465e4f6f76a6fb19e378d8041a14f"}, + {file = "pika-1.3.2.tar.gz", hash = "sha256:b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f"}, ] +[package.extras] +gevent = ["gevent"] +tornado = ["tornado"] +twisted = ["twisted"] + [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -522,30 +1253,186 @@ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] -name = "pycodestyle" -version = "2.11.0" -description = "Python style guide checker" +name = "psycopg" +version = "3.1.18" +description = "PostgreSQL database adapter for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" +files = [ + {file = "psycopg-3.1.18-py3-none-any.whl", hash = "sha256:4d5a0a5a8590906daa58ebd5f3cfc34091377354a1acced269dd10faf55da60e"}, + {file = "psycopg-3.1.18.tar.gz", hash = "sha256:31144d3fb4c17d78094d9e579826f047d4af1da6a10427d91dfcfb6ecdf6f12b"}, +] + +[package.dependencies] +psycopg-c = {version = "3.1.18", optional = true, markers = "implementation_name != \"pypy\" and extra == \"c\""} +typing-extensions = ">=4.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +binary = ["psycopg-binary (==3.1.18)"] +c = ["psycopg-c (==3.1.18)"] +dev = ["black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] +pool = ["psycopg-pool"] +test = ["anyio (>=3.6.2,<4.0)", "mypy (>=1.4.1)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] + +[[package]] +name = "psycopg-c" +version = "3.1.18" +description = "PostgreSQL database adapter for Python -- C optimisation distribution" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg-c-3.1.18.tar.gz", hash = "sha256:ffff0c4a9c0e0b7aadb1acb7b61eb8f886365dd8ef00120ce14676235846ba73"}, +] + +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodome" +version = "3.20.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "pycodestyle-2.11.0-py2.py3-none-any.whl", hash = "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8"}, - {file = "pycodestyle-2.11.0.tar.gz", hash = "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, ] [[package]] name = "pydantic" -version = "2.3.0" +version = "2.6.1" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic-2.3.0-py3-none-any.whl", hash = "sha256:45b5e446c6dfaad9444819a293b921a40e1db1aa61ea08aede0522529ce90e81"}, - {file = "pydantic-2.3.0.tar.gz", hash = "sha256:1607cc106602284cd4a00882986570472f193fde9cb1259bceeaedb26aa79a6d"}, + {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"}, + {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.6.3" +pydantic-core = "2.16.2" typing-extensions = ">=4.6.1" [package.extras] @@ -553,142 +1440,104 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.6.3" +version = "2.16.2" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.6.3-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:1a0ddaa723c48af27d19f27f1c73bdc615c73686d763388c8683fe34ae777bad"}, - {file = "pydantic_core-2.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5cfde4fab34dd1e3a3f7f3db38182ab6c95e4ea91cf322242ee0be5c2f7e3d2f"}, - {file = "pydantic_core-2.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5493a7027bfc6b108e17c3383959485087d5942e87eb62bbac69829eae9bc1f7"}, - {file = "pydantic_core-2.6.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84e87c16f582f5c753b7f39a71bd6647255512191be2d2dbf49458c4ef024588"}, - {file = "pydantic_core-2.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:522a9c4a4d1924facce7270c84b5134c5cabcb01513213662a2e89cf28c1d309"}, - {file = "pydantic_core-2.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaafc776e5edc72b3cad1ccedb5fd869cc5c9a591f1213aa9eba31a781be9ac1"}, - {file = "pydantic_core-2.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a750a83b2728299ca12e003d73d1264ad0440f60f4fc9cee54acc489249b728"}, - {file = "pydantic_core-2.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e8b374ef41ad5c461efb7a140ce4730661aadf85958b5c6a3e9cf4e040ff4bb"}, - {file = "pydantic_core-2.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b594b64e8568cf09ee5c9501ede37066b9fc41d83d58f55b9952e32141256acd"}, - {file = "pydantic_core-2.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2a20c533cb80466c1d42a43a4521669ccad7cf2967830ac62c2c2f9cece63e7e"}, - {file = "pydantic_core-2.6.3-cp310-none-win32.whl", hash = "sha256:04fe5c0a43dec39aedba0ec9579001061d4653a9b53a1366b113aca4a3c05ca7"}, - {file = "pydantic_core-2.6.3-cp310-none-win_amd64.whl", hash = "sha256:6bf7d610ac8f0065a286002a23bcce241ea8248c71988bda538edcc90e0c39ad"}, - {file = "pydantic_core-2.6.3-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:6bcc1ad776fffe25ea5c187a028991c031a00ff92d012ca1cc4714087e575973"}, - {file = "pydantic_core-2.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:df14f6332834444b4a37685810216cc8fe1fe91f447332cd56294c984ecbff1c"}, - {file = "pydantic_core-2.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b7486d85293f7f0bbc39b34e1d8aa26210b450bbd3d245ec3d732864009819"}, - {file = "pydantic_core-2.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a892b5b1871b301ce20d40b037ffbe33d1407a39639c2b05356acfef5536d26a"}, - {file = "pydantic_core-2.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:883daa467865e5766931e07eb20f3e8152324f0adf52658f4d302242c12e2c32"}, - {file = "pydantic_core-2.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4eb77df2964b64ba190eee00b2312a1fd7a862af8918ec70fc2d6308f76ac64"}, - {file = "pydantic_core-2.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce8c84051fa292a5dc54018a40e2a1926fd17980a9422c973e3ebea017aa8da"}, - {file = "pydantic_core-2.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22134a4453bd59b7d1e895c455fe277af9d9d9fbbcb9dc3f4a97b8693e7e2c9b"}, - {file = "pydantic_core-2.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:02e1c385095efbd997311d85c6021d32369675c09bcbfff3b69d84e59dc103f6"}, - {file = "pydantic_core-2.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d79f1f2f7ebdb9b741296b69049ff44aedd95976bfee38eb4848820628a99b50"}, - {file = "pydantic_core-2.6.3-cp311-none-win32.whl", hash = "sha256:430ddd965ffd068dd70ef4e4d74f2c489c3a313adc28e829dd7262cc0d2dd1e8"}, - {file = "pydantic_core-2.6.3-cp311-none-win_amd64.whl", hash = "sha256:84f8bb34fe76c68c9d96b77c60cef093f5e660ef8e43a6cbfcd991017d375950"}, - {file = "pydantic_core-2.6.3-cp311-none-win_arm64.whl", hash = "sha256:5a2a3c9ef904dcdadb550eedf3291ec3f229431b0084666e2c2aa8ff99a103a2"}, - {file = "pydantic_core-2.6.3-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:8421cf496e746cf8d6b677502ed9a0d1e4e956586cd8b221e1312e0841c002d5"}, - {file = "pydantic_core-2.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bb128c30cf1df0ab78166ded1ecf876620fb9aac84d2413e8ea1594b588c735d"}, - {file = "pydantic_core-2.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37a822f630712817b6ecc09ccc378192ef5ff12e2c9bae97eb5968a6cdf3b862"}, - {file = "pydantic_core-2.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:240a015102a0c0cc8114f1cba6444499a8a4d0333e178bc504a5c2196defd456"}, - {file = "pydantic_core-2.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f90e5e3afb11268628c89f378f7a1ea3f2fe502a28af4192e30a6cdea1e7d5e"}, - {file = "pydantic_core-2.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:340e96c08de1069f3d022a85c2a8c63529fd88709468373b418f4cf2c949fb0e"}, - {file = "pydantic_core-2.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1480fa4682e8202b560dcdc9eeec1005f62a15742b813c88cdc01d44e85308e5"}, - {file = "pydantic_core-2.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f14546403c2a1d11a130b537dda28f07eb6c1805a43dae4617448074fd49c282"}, - {file = "pydantic_core-2.6.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a87c54e72aa2ef30189dc74427421e074ab4561cf2bf314589f6af5b37f45e6d"}, - {file = "pydantic_core-2.6.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f93255b3e4d64785554e544c1c76cd32f4a354fa79e2eeca5d16ac2e7fdd57aa"}, - {file = "pydantic_core-2.6.3-cp312-none-win32.whl", hash = "sha256:f70dc00a91311a1aea124e5f64569ea44c011b58433981313202c46bccbec0e1"}, - {file = "pydantic_core-2.6.3-cp312-none-win_amd64.whl", hash = "sha256:23470a23614c701b37252618e7851e595060a96a23016f9a084f3f92f5ed5881"}, - {file = "pydantic_core-2.6.3-cp312-none-win_arm64.whl", hash = "sha256:1ac1750df1b4339b543531ce793b8fd5c16660a95d13aecaab26b44ce11775e9"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:a53e3195f134bde03620d87a7e2b2f2046e0e5a8195e66d0f244d6d5b2f6d31b"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:f2969e8f72c6236c51f91fbb79c33821d12a811e2a94b7aa59c65f8dbdfad34a"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:672174480a85386dd2e681cadd7d951471ad0bb028ed744c895f11f9d51b9ebe"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:002d0ea50e17ed982c2d65b480bd975fc41086a5a2f9c924ef8fc54419d1dea3"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ccc13afee44b9006a73d2046068d4df96dc5b333bf3509d9a06d1b42db6d8bf"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:439a0de139556745ae53f9cc9668c6c2053444af940d3ef3ecad95b079bc9987"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63b7545d489422d417a0cae6f9898618669608750fc5e62156957e609e728a5"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b44c42edc07a50a081672e25dfe6022554b47f91e793066a7b601ca290f71e42"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1c721bfc575d57305dd922e6a40a8fe3f762905851d694245807a351ad255c58"}, - {file = "pydantic_core-2.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5e4a2cf8c4543f37f5dc881de6c190de08096c53986381daebb56a355be5dfe6"}, - {file = "pydantic_core-2.6.3-cp37-none-win32.whl", hash = "sha256:d9b4916b21931b08096efed090327f8fe78e09ae8f5ad44e07f5c72a7eedb51b"}, - {file = "pydantic_core-2.6.3-cp37-none-win_amd64.whl", hash = "sha256:a8acc9dedd304da161eb071cc7ff1326aa5b66aadec9622b2574ad3ffe225525"}, - {file = "pydantic_core-2.6.3-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:5e9c068f36b9f396399d43bfb6defd4cc99c36215f6ff33ac8b9c14ba15bdf6b"}, - {file = "pydantic_core-2.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e61eae9b31799c32c5f9b7be906be3380e699e74b2db26c227c50a5fc7988698"}, - {file = "pydantic_core-2.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85463560c67fc65cd86153a4975d0b720b6d7725cf7ee0b2d291288433fc21b"}, - {file = "pydantic_core-2.6.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9616567800bdc83ce136e5847d41008a1d602213d024207b0ff6cab6753fe645"}, - {file = "pydantic_core-2.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e9b65a55bbabda7fccd3500192a79f6e474d8d36e78d1685496aad5f9dbd92c"}, - {file = "pydantic_core-2.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f468d520f47807d1eb5d27648393519655eadc578d5dd862d06873cce04c4d1b"}, - {file = "pydantic_core-2.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9680dd23055dd874173a3a63a44e7f5a13885a4cfd7e84814be71be24fba83db"}, - {file = "pydantic_core-2.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a718d56c4d55efcfc63f680f207c9f19c8376e5a8a67773535e6f7e80e93170"}, - {file = "pydantic_core-2.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8ecbac050856eb6c3046dea655b39216597e373aa8e50e134c0e202f9c47efec"}, - {file = "pydantic_core-2.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:788be9844a6e5c4612b74512a76b2153f1877cd845410d756841f6c3420230eb"}, - {file = "pydantic_core-2.6.3-cp38-none-win32.whl", hash = "sha256:07a1aec07333bf5adebd8264047d3dc518563d92aca6f2f5b36f505132399efc"}, - {file = "pydantic_core-2.6.3-cp38-none-win_amd64.whl", hash = "sha256:621afe25cc2b3c4ba05fff53525156d5100eb35c6e5a7cf31d66cc9e1963e378"}, - {file = "pydantic_core-2.6.3-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:813aab5bfb19c98ae370952b6f7190f1e28e565909bfc219a0909db168783465"}, - {file = "pydantic_core-2.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:50555ba3cb58f9861b7a48c493636b996a617db1a72c18da4d7f16d7b1b9952b"}, - {file = "pydantic_core-2.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e20f8baedd7d987bd3f8005c146e6bcbda7cdeefc36fad50c66adb2dd2da48"}, - {file = "pydantic_core-2.6.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0a5d7edb76c1c57b95df719af703e796fc8e796447a1da939f97bfa8a918d60"}, - {file = "pydantic_core-2.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f06e21ad0b504658a3a9edd3d8530e8cea5723f6ea5d280e8db8efc625b47e49"}, - {file = "pydantic_core-2.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea053cefa008fda40f92aab937fb9f183cf8752e41dbc7bc68917884454c6362"}, - {file = "pydantic_core-2.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:171a4718860790f66d6c2eda1d95dd1edf64f864d2e9f9115840840cf5b5713f"}, - {file = "pydantic_core-2.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ed7ceca6aba5331ece96c0e328cd52f0dcf942b8895a1ed2642de50800b79d3"}, - {file = "pydantic_core-2.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:acafc4368b289a9f291e204d2c4c75908557d4f36bd3ae937914d4529bf62a76"}, - {file = "pydantic_core-2.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1aa712ba150d5105814e53cb141412217146fedc22621e9acff9236d77d2a5ef"}, - {file = "pydantic_core-2.6.3-cp39-none-win32.whl", hash = "sha256:44b4f937b992394a2e81a5c5ce716f3dcc1237281e81b80c748b2da6dd5cf29a"}, - {file = "pydantic_core-2.6.3-cp39-none-win_amd64.whl", hash = "sha256:9b33bf9658cb29ac1a517c11e865112316d09687d767d7a0e4a63d5c640d1b17"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d7050899026e708fb185e174c63ebc2c4ee7a0c17b0a96ebc50e1f76a231c057"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:99faba727727b2e59129c59542284efebbddade4f0ae6a29c8b8d3e1f437beb7"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fa159b902d22b283b680ef52b532b29554ea2a7fc39bf354064751369e9dbd7"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:046af9cfb5384f3684eeb3f58a48698ddab8dd870b4b3f67f825353a14441418"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:930bfe73e665ebce3f0da2c6d64455098aaa67e1a00323c74dc752627879fc67"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:85cc4d105747d2aa3c5cf3e37dac50141bff779545ba59a095f4a96b0a460e70"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b25afe9d5c4f60dcbbe2b277a79be114e2e65a16598db8abee2a2dcde24f162b"}, - {file = "pydantic_core-2.6.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e49ce7dc9f925e1fb010fc3d555250139df61fa6e5a0a95ce356329602c11ea9"}, - {file = "pydantic_core-2.6.3-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:2dd50d6a1aef0426a1d0199190c6c43ec89812b1f409e7fe44cb0fbf6dfa733c"}, - {file = "pydantic_core-2.6.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6595b0d8c8711e8e1dc389d52648b923b809f68ac1c6f0baa525c6440aa0daa"}, - {file = "pydantic_core-2.6.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ef724a059396751aef71e847178d66ad7fc3fc969a1a40c29f5aac1aa5f8784"}, - {file = "pydantic_core-2.6.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3c8945a105f1589ce8a693753b908815e0748f6279959a4530f6742e1994dcb6"}, - {file = "pydantic_core-2.6.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c8c6660089a25d45333cb9db56bb9e347241a6d7509838dbbd1931d0e19dbc7f"}, - {file = "pydantic_core-2.6.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:692b4ff5c4e828a38716cfa92667661a39886e71136c97b7dac26edef18767f7"}, - {file = "pydantic_core-2.6.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f1a5d8f18877474c80b7711d870db0eeef9442691fcdb00adabfc97e183ee0b0"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3796a6152c545339d3b1652183e786df648ecdf7c4f9347e1d30e6750907f5bb"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b962700962f6e7a6bd77e5f37320cabac24b4c0f76afeac05e9f93cf0c620014"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56ea80269077003eaa59723bac1d8bacd2cd15ae30456f2890811efc1e3d4413"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c0ebbebae71ed1e385f7dfd9b74c1cff09fed24a6df43d326dd7f12339ec34"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:252851b38bad3bfda47b104ffd077d4f9604a10cb06fe09d020016a25107bf98"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:6656a0ae383d8cd7cc94e91de4e526407b3726049ce8d7939049cbfa426518c8"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d9140ded382a5b04a1c030b593ed9bf3088243a0a8b7fa9f071a5736498c5483"}, - {file = "pydantic_core-2.6.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d38bbcef58220f9c81e42c255ef0bf99735d8f11edef69ab0b499da77105158a"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c9d469204abcca28926cbc28ce98f28e50e488767b084fb3fbdf21af11d3de26"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48c1ed8b02ffea4d5c9c220eda27af02b8149fe58526359b3c07eb391cb353a2"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b2b1bfed698fa410ab81982f681f5b1996d3d994ae8073286515ac4d165c2e7"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf9d42a71a4d7a7c1f14f629e5c30eac451a6fc81827d2beefd57d014c006c4a"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4292ca56751aebbe63a84bbfc3b5717abb09b14d4b4442cc43fd7c49a1529efd"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7dc2ce039c7290b4ef64334ec7e6ca6494de6eecc81e21cb4f73b9b39991408c"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:615a31b1629e12445c0e9fc8339b41aaa6cc60bd53bf802d5fe3d2c0cda2ae8d"}, - {file = "pydantic_core-2.6.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1fa1f6312fb84e8c281f32b39affe81984ccd484da6e9d65b3d18c202c666149"}, - {file = "pydantic_core-2.6.3.tar.gz", hash = "sha256:1508f37ba9e3ddc0189e6ff4e2228bd2d3c3a4641cbe8c07177162f76ed696c7"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"}, + {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"}, + {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"}, + {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"}, + {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"}, + {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"}, + {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"}, + {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"}, + {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"}, + {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"}, + {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"}, + {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"}, + {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"}, + {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" -[[package]] -name = "pyflakes" -version = "3.1.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, - {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, -] - [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -718,20 +1567,71 @@ pytest = ">=7.0.0" docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] +[[package]] +name = "pytest-order" +version = "1.2.0" +description = "pytest plugin to run your tests in a specific order" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-order-1.2.0.tar.gz", hash = "sha256:944f86b6d441aa7b1da80f801c6ab65b84bbeba472d0a7a12eb43ba26650101a"}, + {file = "pytest_order-1.2.0-py3-none-any.whl", hash = "sha256:9d65c3b6dc6d6ee984d6ae2c6c4aa4f1331e5b915116219075c888c8bcbb93b8"}, +] + +[package.dependencies] +pytest = {version = ">=6.2.4", markers = "python_version >= \"3.10\""} + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-dotenv" -version = "1.0.0" +version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -791,6 +1691,81 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "ruff" +version = "0.1.15" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, + {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, + {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, + {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, + {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, + {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, + {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, + {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, + {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, + {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, + {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, + {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, + {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, + {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, + {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, + {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, + {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, +] + +[[package]] +name = "s3transfer" +version = "0.8.0" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.8.0-py3-none-any.whl", hash = "sha256:baa479dc2e63e5c2ed51611b4d46cdf0295e2070d8d0b86b22f335ee5b954986"}, + {file = "s3transfer-0.8.0.tar.gz", hash = "sha256:e8d6bd52ffd99841e3a57b34370a54841f12d3aab072af862cdcc50955288002"}, +] + +[package.dependencies] +botocore = ">=1.32.7,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.32.7,<2.0a.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + [[package]] name = "sniffio" version = "1.3.0" @@ -804,61 +1779,70 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.21" +version = "2.0.27" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.21-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1e7dc99b23e33c71d720c4ae37ebb095bebebbd31a24b7d99dfc4753d2803ede"}, - {file = "SQLAlchemy-2.0.21-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f0c4ee579acfe6c994637527c386d1c22eb60bc1c1d36d940d8477e482095d4"}, - {file = "SQLAlchemy-2.0.21-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f7d57a7e140efe69ce2d7b057c3f9a595f98d0bbdfc23fd055efdfbaa46e3a5"}, - {file = "SQLAlchemy-2.0.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca38746eac23dd7c20bec9278d2058c7ad662b2f1576e4c3dbfcd7c00cc48fa"}, - {file = "SQLAlchemy-2.0.21-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3cf229704074bce31f7f47d12883afee3b0a02bb233a0ba45ddbfe542939cca4"}, - {file = "SQLAlchemy-2.0.21-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fb87f763b5d04a82ae84ccff25554ffd903baafba6698e18ebaf32561f2fe4aa"}, - {file = "SQLAlchemy-2.0.21-cp310-cp310-win32.whl", hash = "sha256:89e274604abb1a7fd5c14867a412c9d49c08ccf6ce3e1e04fffc068b5b6499d4"}, - {file = "SQLAlchemy-2.0.21-cp310-cp310-win_amd64.whl", hash = "sha256:e36339a68126ffb708dc6d1948161cea2a9e85d7d7b0c54f6999853d70d44430"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf8eebccc66829010f06fbd2b80095d7872991bfe8415098b9fe47deaaa58063"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b977bfce15afa53d9cf6a632482d7968477625f030d86a109f7bdfe8ce3c064a"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ff3dc2f60dbf82c9e599c2915db1526d65415be323464f84de8db3e361ba5b9"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44ac5c89b6896f4740e7091f4a0ff2e62881da80c239dd9408f84f75a293dae9"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:87bf91ebf15258c4701d71dcdd9c4ba39521fb6a37379ea68088ce8cd869b446"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b69f1f754d92eb1cc6b50938359dead36b96a1dcf11a8670bff65fd9b21a4b09"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-win32.whl", hash = "sha256:af520a730d523eab77d754f5cf44cc7dd7ad2d54907adeb3233177eeb22f271b"}, - {file = "SQLAlchemy-2.0.21-cp311-cp311-win_amd64.whl", hash = "sha256:141675dae56522126986fa4ca713739d00ed3a6f08f3c2eb92c39c6dfec463ce"}, - {file = "SQLAlchemy-2.0.21-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7614f1eab4336df7dd6bee05bc974f2b02c38d3d0c78060c5faa4cd1ca2af3b8"}, - {file = "SQLAlchemy-2.0.21-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d59cb9e20d79686aa473e0302e4a82882d7118744d30bb1dfb62d3c47141b3ec"}, - {file = "SQLAlchemy-2.0.21-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a95aa0672e3065d43c8aa80080cdd5cc40fe92dc873749e6c1cf23914c4b83af"}, - {file = "SQLAlchemy-2.0.21-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8c323813963b2503e54d0944813cd479c10c636e3ee223bcbd7bd478bf53c178"}, - {file = "SQLAlchemy-2.0.21-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:419b1276b55925b5ac9b4c7044e999f1787c69761a3c9756dec6e5c225ceca01"}, - {file = "SQLAlchemy-2.0.21-cp37-cp37m-win32.whl", hash = "sha256:4615623a490e46be85fbaa6335f35cf80e61df0783240afe7d4f544778c315a9"}, - {file = "SQLAlchemy-2.0.21-cp37-cp37m-win_amd64.whl", hash = "sha256:cca720d05389ab1a5877ff05af96551e58ba65e8dc65582d849ac83ddde3e231"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b4eae01faee9f2b17f08885e3f047153ae0416648f8e8c8bd9bc677c5ce64be9"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3eb7c03fe1cd3255811cd4e74db1ab8dca22074d50cd8937edf4ef62d758cdf4"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2d494b6a2a2d05fb99f01b84cc9af9f5f93bf3e1e5dbdafe4bed0c2823584c1"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b19ae41ef26c01a987e49e37c77b9ad060c59f94d3b3efdfdbf4f3daaca7b5fe"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fc6b15465fabccc94bf7e38777d665b6a4f95efd1725049d6184b3a39fd54880"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:014794b60d2021cc8ae0f91d4d0331fe92691ae5467a00841f7130fe877b678e"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-win32.whl", hash = "sha256:0268256a34806e5d1c8f7ee93277d7ea8cc8ae391f487213139018b6805aeaf6"}, - {file = "SQLAlchemy-2.0.21-cp38-cp38-win_amd64.whl", hash = "sha256:73c079e21d10ff2be54a4699f55865d4b275fd6c8bd5d90c5b1ef78ae0197301"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:785e2f2c1cb50d0a44e2cdeea5fd36b5bf2d79c481c10f3a88a8be4cfa2c4615"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c111cd40910ffcb615b33605fc8f8e22146aeb7933d06569ac90f219818345ef"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9cba4e7369de663611ce7460a34be48e999e0bbb1feb9130070f0685e9a6b66"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a69067af86ec7f11a8e50ba85544657b1477aabf64fa447fd3736b5a0a4f67"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ccb99c3138c9bde118b51a289d90096a3791658da9aea1754667302ed6564f6e"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:513fd5b6513d37e985eb5b7ed89da5fd9e72354e3523980ef00d439bc549c9e9"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-win32.whl", hash = "sha256:f9fefd6298433b6e9188252f3bff53b9ff0443c8fde27298b8a2b19f6617eeb9"}, - {file = "SQLAlchemy-2.0.21-cp39-cp39-win_amd64.whl", hash = "sha256:2e617727fe4091cedb3e4409b39368f424934c7faa78171749f704b49b4bb4ce"}, - {file = "SQLAlchemy-2.0.21-py3-none-any.whl", hash = "sha256:ea7da25ee458d8f404b93eb073116156fd7d8c2a776d8311534851f28277b4ce"}, - {file = "SQLAlchemy-2.0.21.tar.gz", hash = "sha256:05b971ab1ac2994a14c56b35eaaa91f86ba080e9ad481b20d99d77f381bb6258"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-win32.whl", hash = "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-win32.whl", hash = "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-win_amd64.whl", hash = "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-win32.whl", hash = "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-win_amd64.whl", hash = "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-win32.whl", hash = "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c"}, + {file = "SQLAlchemy-2.0.27-cp37-cp37m-win_amd64.whl", hash = "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-win32.whl", hash = "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5"}, + {file = "SQLAlchemy-2.0.27-cp38-cp38-win_amd64.whl", hash = "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-win32.whl", hash = "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-win_amd64.whl", hash = "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620"}, + {file = "SQLAlchemy-2.0.27-py3-none-any.whl", hash = "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac"}, + {file = "SQLAlchemy-2.0.27.tar.gz", hash = "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} -typing-extensions = ">=4.2.0" +greenlet = {version = "!=0.4.17", optional = true, markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\" or extra == \"asyncio\""} +typing-extensions = ">=4.6.0" [package.extras] aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] @@ -868,7 +1852,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -878,7 +1862,7 @@ postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "starlette" @@ -897,17 +1881,1033 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +[[package]] +name = "testcontainers" +version = "3.7.1" +description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" +optional = false +python-versions = ">=3.7" +files = [ + {file = "testcontainers-3.7.1-py2.py3-none-any.whl", hash = "sha256:7f48cef4bf0ccd78f1a4534d4b701a003a3bace851f24eae58a32f9e3f0aeba0"}, +] + +[package.dependencies] +deprecation = "*" +docker = ">=4.0.0" +pika = {version = "*", optional = true, markers = "extra == \"rabbitmq\""} +psycopg2-binary = {version = "*", optional = true, markers = "extra == \"postgresql\""} +sqlalchemy = {version = "*", optional = true, markers = "extra == \"postgresql\""} +wrapt = "*" + +[package.extras] +arangodb = ["python-arango"] +azurite = ["azure-storage-blob"] +clickhouse = ["clickhouse-driver"] +docker-compose = ["docker-compose"] +google-cloud-pubsub = ["google-cloud-pubsub (<2)"] +kafka = ["kafka-python"] +keycloak = ["python-keycloak"] +mongo = ["pymongo"] +mssqlserver = ["pymssql"] +mysql = ["pymysql", "sqlalchemy"] +neo4j = ["neo4j"] +oracle = ["cx-Oracle", "sqlalchemy"] +postgresql = ["psycopg2-binary", "sqlalchemy"] +rabbitmq = ["pika"] +redis = ["redis"] +selenium = ["selenium"] + +[[package]] +name = "testcontainers-core" +version = "0.0.1rc1" +description = "Core component of testcontainers-python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "testcontainers_core-0.0.1rc1-py3-none-any.whl", hash = "sha256:69a8bf2ddb52ac2d03c26401b12c70db0453cced40372ad783d6dce417e52095"}, +] + +[package.dependencies] +docker = ">=4.0.0" +wrapt = "*" + +[[package]] +name = "testcontainers-minio" +version = "0.0.1rc1" +description = "MinIO component of testcontainers-python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "testcontainers_minio-0.0.1rc1-py3-none-any.whl", hash = "sha256:54d330d085c0a11fc5da0b001af87aec4dd3e814104376bf7513e8646c77442a"}, +] + +[package.dependencies] +minio = "*" +testcontainers-core = "*" + +[[package]] +name = "types-aioboto3-lite" +version = "12.3.0" +description = "Type annotations for aioboto3 12.3.0 generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aioboto3-lite-12.3.0.tar.gz", hash = "sha256:2963477e903d10c016fe39126366d4b35991cd6127abf35b438b820dd2355a7c"}, + {file = "types_aioboto3_lite-12.3.0-py3-none-any.whl", hash = "sha256:e4930c361ed1f5b5feb1f3156159afa56a9e8c1b8500d4c3d3956e78c0bccb5d"}, +] + +[package.dependencies] +botocore-stubs = "*" +types-aiobotocore-cloudformation = {version = "*", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-dynamodb = {version = "*", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-ec2 = {version = "*", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-lambda = {version = "*", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-lite = "*" +types-aiobotocore-rds = {version = "*", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-s3 = {version = "*", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-sqs = {version = "*", optional = true, markers = "extra == \"essential\""} +types-s3transfer = "*" +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[package.extras] +accessanalyzer = ["types-aiobotocore-accessanalyzer"] +account = ["types-aiobotocore-account"] +acm = ["types-aiobotocore-acm"] +acm-pca = ["types-aiobotocore-acm-pca"] +aioboto3 = ["aioboto3 (==12.3.0)", "botocore (==1.34.34)"] +alexaforbusiness = ["types-aiobotocore-alexaforbusiness"] +all = ["types-aiobotocore-accessanalyzer", "types-aiobotocore-account", "types-aiobotocore-acm", "types-aiobotocore-acm-pca", "types-aiobotocore-alexaforbusiness", "types-aiobotocore-amp", "types-aiobotocore-amplify", "types-aiobotocore-amplifybackend", "types-aiobotocore-amplifyuibuilder", "types-aiobotocore-apigateway", "types-aiobotocore-apigatewaymanagementapi", "types-aiobotocore-apigatewayv2", "types-aiobotocore-appconfig", "types-aiobotocore-appconfigdata", "types-aiobotocore-appfabric", "types-aiobotocore-appflow", "types-aiobotocore-appintegrations", "types-aiobotocore-application-autoscaling", "types-aiobotocore-application-insights", "types-aiobotocore-applicationcostprofiler", "types-aiobotocore-appmesh", "types-aiobotocore-apprunner", "types-aiobotocore-appstream", "types-aiobotocore-appsync", "types-aiobotocore-arc-zonal-shift", "types-aiobotocore-athena", "types-aiobotocore-auditmanager", "types-aiobotocore-autoscaling", "types-aiobotocore-autoscaling-plans", "types-aiobotocore-b2bi", "types-aiobotocore-backup", "types-aiobotocore-backup-gateway", "types-aiobotocore-backupstorage", "types-aiobotocore-batch", "types-aiobotocore-bcm-data-exports", "types-aiobotocore-bedrock", "types-aiobotocore-bedrock-agent", "types-aiobotocore-bedrock-agent-runtime", "types-aiobotocore-bedrock-runtime", "types-aiobotocore-billingconductor", "types-aiobotocore-braket", "types-aiobotocore-budgets", "types-aiobotocore-ce", "types-aiobotocore-chime", "types-aiobotocore-chime-sdk-identity", "types-aiobotocore-chime-sdk-media-pipelines", "types-aiobotocore-chime-sdk-meetings", "types-aiobotocore-chime-sdk-messaging", "types-aiobotocore-chime-sdk-voice", "types-aiobotocore-cleanrooms", "types-aiobotocore-cleanroomsml", "types-aiobotocore-cloud9", "types-aiobotocore-cloudcontrol", "types-aiobotocore-clouddirectory", "types-aiobotocore-cloudformation", "types-aiobotocore-cloudfront", "types-aiobotocore-cloudfront-keyvaluestore", "types-aiobotocore-cloudhsm", "types-aiobotocore-cloudhsmv2", "types-aiobotocore-cloudsearch", "types-aiobotocore-cloudsearchdomain", "types-aiobotocore-cloudtrail", "types-aiobotocore-cloudtrail-data", "types-aiobotocore-cloudwatch", "types-aiobotocore-codeartifact", "types-aiobotocore-codebuild", "types-aiobotocore-codecatalyst", "types-aiobotocore-codecommit", "types-aiobotocore-codedeploy", "types-aiobotocore-codeguru-reviewer", "types-aiobotocore-codeguru-security", "types-aiobotocore-codeguruprofiler", "types-aiobotocore-codepipeline", "types-aiobotocore-codestar", "types-aiobotocore-codestar-connections", "types-aiobotocore-codestar-notifications", "types-aiobotocore-cognito-identity", "types-aiobotocore-cognito-idp", "types-aiobotocore-cognito-sync", "types-aiobotocore-comprehend", "types-aiobotocore-comprehendmedical", "types-aiobotocore-compute-optimizer", "types-aiobotocore-config", "types-aiobotocore-connect", "types-aiobotocore-connect-contact-lens", "types-aiobotocore-connectcampaigns", "types-aiobotocore-connectcases", "types-aiobotocore-connectparticipant", "types-aiobotocore-controltower", "types-aiobotocore-cost-optimization-hub", "types-aiobotocore-cur", "types-aiobotocore-customer-profiles", "types-aiobotocore-databrew", "types-aiobotocore-dataexchange", "types-aiobotocore-datapipeline", "types-aiobotocore-datasync", "types-aiobotocore-datazone", "types-aiobotocore-dax", "types-aiobotocore-detective", "types-aiobotocore-devicefarm", "types-aiobotocore-devops-guru", "types-aiobotocore-directconnect", "types-aiobotocore-discovery", "types-aiobotocore-dlm", "types-aiobotocore-dms", "types-aiobotocore-docdb", "types-aiobotocore-docdb-elastic", "types-aiobotocore-drs", "types-aiobotocore-ds", "types-aiobotocore-dynamodb", "types-aiobotocore-dynamodbstreams", "types-aiobotocore-ebs", "types-aiobotocore-ec2", "types-aiobotocore-ec2-instance-connect", "types-aiobotocore-ecr", "types-aiobotocore-ecr-public", "types-aiobotocore-ecs", "types-aiobotocore-efs", "types-aiobotocore-eks", "types-aiobotocore-eks-auth", "types-aiobotocore-elastic-inference", "types-aiobotocore-elasticache", "types-aiobotocore-elasticbeanstalk", "types-aiobotocore-elastictranscoder", "types-aiobotocore-elb", "types-aiobotocore-elbv2", "types-aiobotocore-emr", "types-aiobotocore-emr-containers", "types-aiobotocore-emr-serverless", "types-aiobotocore-entityresolution", "types-aiobotocore-es", "types-aiobotocore-events", "types-aiobotocore-evidently", "types-aiobotocore-finspace", "types-aiobotocore-finspace-data", "types-aiobotocore-firehose", "types-aiobotocore-fis", "types-aiobotocore-fms", "types-aiobotocore-forecast", "types-aiobotocore-forecastquery", "types-aiobotocore-frauddetector", "types-aiobotocore-freetier", "types-aiobotocore-fsx", "types-aiobotocore-gamelift", "types-aiobotocore-glacier", "types-aiobotocore-globalaccelerator", "types-aiobotocore-glue", "types-aiobotocore-grafana", "types-aiobotocore-greengrass", "types-aiobotocore-greengrassv2", "types-aiobotocore-groundstation", "types-aiobotocore-guardduty", "types-aiobotocore-health", "types-aiobotocore-healthlake", "types-aiobotocore-honeycode", "types-aiobotocore-iam", "types-aiobotocore-identitystore", "types-aiobotocore-imagebuilder", "types-aiobotocore-importexport", "types-aiobotocore-inspector", "types-aiobotocore-inspector-scan", "types-aiobotocore-inspector2", "types-aiobotocore-internetmonitor", "types-aiobotocore-iot", "types-aiobotocore-iot-data", "types-aiobotocore-iot-jobs-data", "types-aiobotocore-iot-roborunner", "types-aiobotocore-iot1click-devices", "types-aiobotocore-iot1click-projects", "types-aiobotocore-iotanalytics", "types-aiobotocore-iotdeviceadvisor", "types-aiobotocore-iotevents", "types-aiobotocore-iotevents-data", "types-aiobotocore-iotfleethub", "types-aiobotocore-iotfleetwise", "types-aiobotocore-iotsecuretunneling", "types-aiobotocore-iotsitewise", "types-aiobotocore-iotthingsgraph", "types-aiobotocore-iottwinmaker", "types-aiobotocore-iotwireless", "types-aiobotocore-ivs", "types-aiobotocore-ivs-realtime", "types-aiobotocore-ivschat", "types-aiobotocore-kafka", "types-aiobotocore-kafkaconnect", "types-aiobotocore-kendra", "types-aiobotocore-kendra-ranking", "types-aiobotocore-keyspaces", "types-aiobotocore-kinesis", "types-aiobotocore-kinesis-video-archived-media", "types-aiobotocore-kinesis-video-media", "types-aiobotocore-kinesis-video-signaling", "types-aiobotocore-kinesis-video-webrtc-storage", "types-aiobotocore-kinesisanalytics", "types-aiobotocore-kinesisanalyticsv2", "types-aiobotocore-kinesisvideo", "types-aiobotocore-kms", "types-aiobotocore-lakeformation", "types-aiobotocore-lambda", "types-aiobotocore-launch-wizard", "types-aiobotocore-lex-models", "types-aiobotocore-lex-runtime", "types-aiobotocore-lexv2-models", "types-aiobotocore-lexv2-runtime", "types-aiobotocore-license-manager", "types-aiobotocore-license-manager-linux-subscriptions", "types-aiobotocore-license-manager-user-subscriptions", "types-aiobotocore-lightsail", "types-aiobotocore-location", "types-aiobotocore-logs", "types-aiobotocore-lookoutequipment", "types-aiobotocore-lookoutmetrics", "types-aiobotocore-lookoutvision", "types-aiobotocore-m2", "types-aiobotocore-machinelearning", "types-aiobotocore-macie2", "types-aiobotocore-managedblockchain", "types-aiobotocore-managedblockchain-query", "types-aiobotocore-marketplace-agreement", "types-aiobotocore-marketplace-catalog", "types-aiobotocore-marketplace-deployment", "types-aiobotocore-marketplace-entitlement", "types-aiobotocore-marketplacecommerceanalytics", "types-aiobotocore-mediaconnect", "types-aiobotocore-mediaconvert", "types-aiobotocore-medialive", "types-aiobotocore-mediapackage", "types-aiobotocore-mediapackage-vod", "types-aiobotocore-mediapackagev2", "types-aiobotocore-mediastore", "types-aiobotocore-mediastore-data", "types-aiobotocore-mediatailor", "types-aiobotocore-medical-imaging", "types-aiobotocore-memorydb", "types-aiobotocore-meteringmarketplace", "types-aiobotocore-mgh", "types-aiobotocore-mgn", "types-aiobotocore-migration-hub-refactor-spaces", "types-aiobotocore-migrationhub-config", "types-aiobotocore-migrationhuborchestrator", "types-aiobotocore-migrationhubstrategy", "types-aiobotocore-mobile", "types-aiobotocore-mq", "types-aiobotocore-mturk", "types-aiobotocore-mwaa", "types-aiobotocore-neptune", "types-aiobotocore-neptune-graph", "types-aiobotocore-neptunedata", "types-aiobotocore-network-firewall", "types-aiobotocore-networkmanager", "types-aiobotocore-networkmonitor", "types-aiobotocore-nimble", "types-aiobotocore-oam", "types-aiobotocore-omics", "types-aiobotocore-opensearch", "types-aiobotocore-opensearchserverless", "types-aiobotocore-opsworks", "types-aiobotocore-opsworkscm", "types-aiobotocore-organizations", "types-aiobotocore-osis", "types-aiobotocore-outposts", "types-aiobotocore-panorama", "types-aiobotocore-payment-cryptography", "types-aiobotocore-payment-cryptography-data", "types-aiobotocore-pca-connector-ad", "types-aiobotocore-personalize", "types-aiobotocore-personalize-events", "types-aiobotocore-personalize-runtime", "types-aiobotocore-pi", "types-aiobotocore-pinpoint", "types-aiobotocore-pinpoint-email", "types-aiobotocore-pinpoint-sms-voice", "types-aiobotocore-pinpoint-sms-voice-v2", "types-aiobotocore-pipes", "types-aiobotocore-polly", "types-aiobotocore-pricing", "types-aiobotocore-privatenetworks", "types-aiobotocore-proton", "types-aiobotocore-qbusiness", "types-aiobotocore-qconnect", "types-aiobotocore-qldb", "types-aiobotocore-qldb-session", "types-aiobotocore-quicksight", "types-aiobotocore-ram", "types-aiobotocore-rbin", "types-aiobotocore-rds", "types-aiobotocore-rds-data", "types-aiobotocore-redshift", "types-aiobotocore-redshift-data", "types-aiobotocore-redshift-serverless", "types-aiobotocore-rekognition", "types-aiobotocore-repostspace", "types-aiobotocore-resiliencehub", "types-aiobotocore-resource-explorer-2", "types-aiobotocore-resource-groups", "types-aiobotocore-resourcegroupstaggingapi", "types-aiobotocore-robomaker", "types-aiobotocore-rolesanywhere", "types-aiobotocore-route53", "types-aiobotocore-route53-recovery-cluster", "types-aiobotocore-route53-recovery-control-config", "types-aiobotocore-route53-recovery-readiness", "types-aiobotocore-route53domains", "types-aiobotocore-route53resolver", "types-aiobotocore-rum", "types-aiobotocore-s3", "types-aiobotocore-s3control", "types-aiobotocore-s3outposts", "types-aiobotocore-sagemaker", "types-aiobotocore-sagemaker-a2i-runtime", "types-aiobotocore-sagemaker-edge", "types-aiobotocore-sagemaker-featurestore-runtime", "types-aiobotocore-sagemaker-geospatial", "types-aiobotocore-sagemaker-metrics", "types-aiobotocore-sagemaker-runtime", "types-aiobotocore-savingsplans", "types-aiobotocore-scheduler", "types-aiobotocore-schemas", "types-aiobotocore-sdb", "types-aiobotocore-secretsmanager", "types-aiobotocore-securityhub", "types-aiobotocore-securitylake", "types-aiobotocore-serverlessrepo", "types-aiobotocore-service-quotas", "types-aiobotocore-servicecatalog", "types-aiobotocore-servicecatalog-appregistry", "types-aiobotocore-servicediscovery", "types-aiobotocore-ses", "types-aiobotocore-sesv2", "types-aiobotocore-shield", "types-aiobotocore-signer", "types-aiobotocore-simspaceweaver", "types-aiobotocore-sms", "types-aiobotocore-sms-voice", "types-aiobotocore-snow-device-management", "types-aiobotocore-snowball", "types-aiobotocore-sns", "types-aiobotocore-sqs", "types-aiobotocore-ssm", "types-aiobotocore-ssm-contacts", "types-aiobotocore-ssm-incidents", "types-aiobotocore-ssm-sap", "types-aiobotocore-sso", "types-aiobotocore-sso-admin", "types-aiobotocore-sso-oidc", "types-aiobotocore-stepfunctions", "types-aiobotocore-storagegateway", "types-aiobotocore-sts", "types-aiobotocore-supplychain", "types-aiobotocore-support", "types-aiobotocore-support-app", "types-aiobotocore-swf", "types-aiobotocore-synthetics", "types-aiobotocore-textract", "types-aiobotocore-timestream-query", "types-aiobotocore-timestream-write", "types-aiobotocore-tnb", "types-aiobotocore-transcribe", "types-aiobotocore-transfer", "types-aiobotocore-translate", "types-aiobotocore-trustedadvisor", "types-aiobotocore-verifiedpermissions", "types-aiobotocore-voice-id", "types-aiobotocore-vpc-lattice", "types-aiobotocore-waf", "types-aiobotocore-waf-regional", "types-aiobotocore-wafv2", "types-aiobotocore-wellarchitected", "types-aiobotocore-wisdom", "types-aiobotocore-workdocs", "types-aiobotocore-worklink", "types-aiobotocore-workmail", "types-aiobotocore-workmailmessageflow", "types-aiobotocore-workspaces", "types-aiobotocore-workspaces-thin-client", "types-aiobotocore-workspaces-web", "types-aiobotocore-xray"] +amp = ["types-aiobotocore-amp"] +amplify = ["types-aiobotocore-amplify"] +amplifybackend = ["types-aiobotocore-amplifybackend"] +amplifyuibuilder = ["types-aiobotocore-amplifyuibuilder"] +apigateway = ["types-aiobotocore-apigateway"] +apigatewaymanagementapi = ["types-aiobotocore-apigatewaymanagementapi"] +apigatewayv2 = ["types-aiobotocore-apigatewayv2"] +appconfig = ["types-aiobotocore-appconfig"] +appconfigdata = ["types-aiobotocore-appconfigdata"] +appfabric = ["types-aiobotocore-appfabric"] +appflow = ["types-aiobotocore-appflow"] +appintegrations = ["types-aiobotocore-appintegrations"] +application-autoscaling = ["types-aiobotocore-application-autoscaling"] +application-insights = ["types-aiobotocore-application-insights"] +applicationcostprofiler = ["types-aiobotocore-applicationcostprofiler"] +appmesh = ["types-aiobotocore-appmesh"] +apprunner = ["types-aiobotocore-apprunner"] +appstream = ["types-aiobotocore-appstream"] +appsync = ["types-aiobotocore-appsync"] +arc-zonal-shift = ["types-aiobotocore-arc-zonal-shift"] +athena = ["types-aiobotocore-athena"] +auditmanager = ["types-aiobotocore-auditmanager"] +autoscaling = ["types-aiobotocore-autoscaling"] +autoscaling-plans = ["types-aiobotocore-autoscaling-plans"] +b2bi = ["types-aiobotocore-b2bi"] +backup = ["types-aiobotocore-backup"] +backup-gateway = ["types-aiobotocore-backup-gateway"] +backupstorage = ["types-aiobotocore-backupstorage"] +batch = ["types-aiobotocore-batch"] +bcm-data-exports = ["types-aiobotocore-bcm-data-exports"] +bedrock = ["types-aiobotocore-bedrock"] +bedrock-agent = ["types-aiobotocore-bedrock-agent"] +bedrock-agent-runtime = ["types-aiobotocore-bedrock-agent-runtime"] +bedrock-runtime = ["types-aiobotocore-bedrock-runtime"] +billingconductor = ["types-aiobotocore-billingconductor"] +braket = ["types-aiobotocore-braket"] +budgets = ["types-aiobotocore-budgets"] +ce = ["types-aiobotocore-ce"] +chime = ["types-aiobotocore-chime"] +chime-sdk-identity = ["types-aiobotocore-chime-sdk-identity"] +chime-sdk-media-pipelines = ["types-aiobotocore-chime-sdk-media-pipelines"] +chime-sdk-meetings = ["types-aiobotocore-chime-sdk-meetings"] +chime-sdk-messaging = ["types-aiobotocore-chime-sdk-messaging"] +chime-sdk-voice = ["types-aiobotocore-chime-sdk-voice"] +cleanrooms = ["types-aiobotocore-cleanrooms"] +cleanroomsml = ["types-aiobotocore-cleanroomsml"] +cloud9 = ["types-aiobotocore-cloud9"] +cloudcontrol = ["types-aiobotocore-cloudcontrol"] +clouddirectory = ["types-aiobotocore-clouddirectory"] +cloudformation = ["types-aiobotocore-cloudformation"] +cloudfront = ["types-aiobotocore-cloudfront"] +cloudfront-keyvaluestore = ["types-aiobotocore-cloudfront-keyvaluestore"] +cloudhsm = ["types-aiobotocore-cloudhsm"] +cloudhsmv2 = ["types-aiobotocore-cloudhsmv2"] +cloudsearch = ["types-aiobotocore-cloudsearch"] +cloudsearchdomain = ["types-aiobotocore-cloudsearchdomain"] +cloudtrail = ["types-aiobotocore-cloudtrail"] +cloudtrail-data = ["types-aiobotocore-cloudtrail-data"] +cloudwatch = ["types-aiobotocore-cloudwatch"] +codeartifact = ["types-aiobotocore-codeartifact"] +codebuild = ["types-aiobotocore-codebuild"] +codecatalyst = ["types-aiobotocore-codecatalyst"] +codecommit = ["types-aiobotocore-codecommit"] +codedeploy = ["types-aiobotocore-codedeploy"] +codeguru-reviewer = ["types-aiobotocore-codeguru-reviewer"] +codeguru-security = ["types-aiobotocore-codeguru-security"] +codeguruprofiler = ["types-aiobotocore-codeguruprofiler"] +codepipeline = ["types-aiobotocore-codepipeline"] +codestar = ["types-aiobotocore-codestar"] +codestar-connections = ["types-aiobotocore-codestar-connections"] +codestar-notifications = ["types-aiobotocore-codestar-notifications"] +cognito-identity = ["types-aiobotocore-cognito-identity"] +cognito-idp = ["types-aiobotocore-cognito-idp"] +cognito-sync = ["types-aiobotocore-cognito-sync"] +comprehend = ["types-aiobotocore-comprehend"] +comprehendmedical = ["types-aiobotocore-comprehendmedical"] +compute-optimizer = ["types-aiobotocore-compute-optimizer"] +config = ["types-aiobotocore-config"] +connect = ["types-aiobotocore-connect"] +connect-contact-lens = ["types-aiobotocore-connect-contact-lens"] +connectcampaigns = ["types-aiobotocore-connectcampaigns"] +connectcases = ["types-aiobotocore-connectcases"] +connectparticipant = ["types-aiobotocore-connectparticipant"] +controltower = ["types-aiobotocore-controltower"] +cost-optimization-hub = ["types-aiobotocore-cost-optimization-hub"] +cur = ["types-aiobotocore-cur"] +customer-profiles = ["types-aiobotocore-customer-profiles"] +databrew = ["types-aiobotocore-databrew"] +dataexchange = ["types-aiobotocore-dataexchange"] +datapipeline = ["types-aiobotocore-datapipeline"] +datasync = ["types-aiobotocore-datasync"] +datazone = ["types-aiobotocore-datazone"] +dax = ["types-aiobotocore-dax"] +detective = ["types-aiobotocore-detective"] +devicefarm = ["types-aiobotocore-devicefarm"] +devops-guru = ["types-aiobotocore-devops-guru"] +directconnect = ["types-aiobotocore-directconnect"] +discovery = ["types-aiobotocore-discovery"] +dlm = ["types-aiobotocore-dlm"] +dms = ["types-aiobotocore-dms"] +docdb = ["types-aiobotocore-docdb"] +docdb-elastic = ["types-aiobotocore-docdb-elastic"] +drs = ["types-aiobotocore-drs"] +ds = ["types-aiobotocore-ds"] +dynamodb = ["types-aiobotocore-dynamodb"] +dynamodbstreams = ["types-aiobotocore-dynamodbstreams"] +ebs = ["types-aiobotocore-ebs"] +ec2 = ["types-aiobotocore-ec2"] +ec2-instance-connect = ["types-aiobotocore-ec2-instance-connect"] +ecr = ["types-aiobotocore-ecr"] +ecr-public = ["types-aiobotocore-ecr-public"] +ecs = ["types-aiobotocore-ecs"] +efs = ["types-aiobotocore-efs"] +eks = ["types-aiobotocore-eks"] +eks-auth = ["types-aiobotocore-eks-auth"] +elastic-inference = ["types-aiobotocore-elastic-inference"] +elasticache = ["types-aiobotocore-elasticache"] +elasticbeanstalk = ["types-aiobotocore-elasticbeanstalk"] +elastictranscoder = ["types-aiobotocore-elastictranscoder"] +elb = ["types-aiobotocore-elb"] +elbv2 = ["types-aiobotocore-elbv2"] +emr = ["types-aiobotocore-emr"] +emr-containers = ["types-aiobotocore-emr-containers"] +emr-serverless = ["types-aiobotocore-emr-serverless"] +entityresolution = ["types-aiobotocore-entityresolution"] +es = ["types-aiobotocore-es"] +essential = ["types-aiobotocore-cloudformation", "types-aiobotocore-dynamodb", "types-aiobotocore-ec2", "types-aiobotocore-lambda", "types-aiobotocore-rds", "types-aiobotocore-s3", "types-aiobotocore-sqs"] +events = ["types-aiobotocore-events"] +evidently = ["types-aiobotocore-evidently"] +finspace = ["types-aiobotocore-finspace"] +finspace-data = ["types-aiobotocore-finspace-data"] +firehose = ["types-aiobotocore-firehose"] +fis = ["types-aiobotocore-fis"] +fms = ["types-aiobotocore-fms"] +forecast = ["types-aiobotocore-forecast"] +forecastquery = ["types-aiobotocore-forecastquery"] +frauddetector = ["types-aiobotocore-frauddetector"] +freetier = ["types-aiobotocore-freetier"] +fsx = ["types-aiobotocore-fsx"] +gamelift = ["types-aiobotocore-gamelift"] +glacier = ["types-aiobotocore-glacier"] +globalaccelerator = ["types-aiobotocore-globalaccelerator"] +glue = ["types-aiobotocore-glue"] +grafana = ["types-aiobotocore-grafana"] +greengrass = ["types-aiobotocore-greengrass"] +greengrassv2 = ["types-aiobotocore-greengrassv2"] +groundstation = ["types-aiobotocore-groundstation"] +guardduty = ["types-aiobotocore-guardduty"] +health = ["types-aiobotocore-health"] +healthlake = ["types-aiobotocore-healthlake"] +honeycode = ["types-aiobotocore-honeycode"] +iam = ["types-aiobotocore-iam"] +identitystore = ["types-aiobotocore-identitystore"] +imagebuilder = ["types-aiobotocore-imagebuilder"] +importexport = ["types-aiobotocore-importexport"] +inspector = ["types-aiobotocore-inspector"] +inspector-scan = ["types-aiobotocore-inspector-scan"] +inspector2 = ["types-aiobotocore-inspector2"] +internetmonitor = ["types-aiobotocore-internetmonitor"] +iot = ["types-aiobotocore-iot"] +iot-data = ["types-aiobotocore-iot-data"] +iot-jobs-data = ["types-aiobotocore-iot-jobs-data"] +iot-roborunner = ["types-aiobotocore-iot-roborunner"] +iot1click-devices = ["types-aiobotocore-iot1click-devices"] +iot1click-projects = ["types-aiobotocore-iot1click-projects"] +iotanalytics = ["types-aiobotocore-iotanalytics"] +iotdeviceadvisor = ["types-aiobotocore-iotdeviceadvisor"] +iotevents = ["types-aiobotocore-iotevents"] +iotevents-data = ["types-aiobotocore-iotevents-data"] +iotfleethub = ["types-aiobotocore-iotfleethub"] +iotfleetwise = ["types-aiobotocore-iotfleetwise"] +iotsecuretunneling = ["types-aiobotocore-iotsecuretunneling"] +iotsitewise = ["types-aiobotocore-iotsitewise"] +iotthingsgraph = ["types-aiobotocore-iotthingsgraph"] +iottwinmaker = ["types-aiobotocore-iottwinmaker"] +iotwireless = ["types-aiobotocore-iotwireless"] +ivs = ["types-aiobotocore-ivs"] +ivs-realtime = ["types-aiobotocore-ivs-realtime"] +ivschat = ["types-aiobotocore-ivschat"] +kafka = ["types-aiobotocore-kafka"] +kafkaconnect = ["types-aiobotocore-kafkaconnect"] +kendra = ["types-aiobotocore-kendra"] +kendra-ranking = ["types-aiobotocore-kendra-ranking"] +keyspaces = ["types-aiobotocore-keyspaces"] +kinesis = ["types-aiobotocore-kinesis"] +kinesis-video-archived-media = ["types-aiobotocore-kinesis-video-archived-media"] +kinesis-video-media = ["types-aiobotocore-kinesis-video-media"] +kinesis-video-signaling = ["types-aiobotocore-kinesis-video-signaling"] +kinesis-video-webrtc-storage = ["types-aiobotocore-kinesis-video-webrtc-storage"] +kinesisanalytics = ["types-aiobotocore-kinesisanalytics"] +kinesisanalyticsv2 = ["types-aiobotocore-kinesisanalyticsv2"] +kinesisvideo = ["types-aiobotocore-kinesisvideo"] +kms = ["types-aiobotocore-kms"] +lakeformation = ["types-aiobotocore-lakeformation"] +lambda = ["types-aiobotocore-lambda"] +launch-wizard = ["types-aiobotocore-launch-wizard"] +lex-models = ["types-aiobotocore-lex-models"] +lex-runtime = ["types-aiobotocore-lex-runtime"] +lexv2-models = ["types-aiobotocore-lexv2-models"] +lexv2-runtime = ["types-aiobotocore-lexv2-runtime"] +license-manager = ["types-aiobotocore-license-manager"] +license-manager-linux-subscriptions = ["types-aiobotocore-license-manager-linux-subscriptions"] +license-manager-user-subscriptions = ["types-aiobotocore-license-manager-user-subscriptions"] +lightsail = ["types-aiobotocore-lightsail"] +location = ["types-aiobotocore-location"] +logs = ["types-aiobotocore-logs"] +lookoutequipment = ["types-aiobotocore-lookoutequipment"] +lookoutmetrics = ["types-aiobotocore-lookoutmetrics"] +lookoutvision = ["types-aiobotocore-lookoutvision"] +m2 = ["types-aiobotocore-m2"] +machinelearning = ["types-aiobotocore-machinelearning"] +macie2 = ["types-aiobotocore-macie2"] +managedblockchain = ["types-aiobotocore-managedblockchain"] +managedblockchain-query = ["types-aiobotocore-managedblockchain-query"] +marketplace-agreement = ["types-aiobotocore-marketplace-agreement"] +marketplace-catalog = ["types-aiobotocore-marketplace-catalog"] +marketplace-deployment = ["types-aiobotocore-marketplace-deployment"] +marketplace-entitlement = ["types-aiobotocore-marketplace-entitlement"] +marketplacecommerceanalytics = ["types-aiobotocore-marketplacecommerceanalytics"] +mediaconnect = ["types-aiobotocore-mediaconnect"] +mediaconvert = ["types-aiobotocore-mediaconvert"] +medialive = ["types-aiobotocore-medialive"] +mediapackage = ["types-aiobotocore-mediapackage"] +mediapackage-vod = ["types-aiobotocore-mediapackage-vod"] +mediapackagev2 = ["types-aiobotocore-mediapackagev2"] +mediastore = ["types-aiobotocore-mediastore"] +mediastore-data = ["types-aiobotocore-mediastore-data"] +mediatailor = ["types-aiobotocore-mediatailor"] +medical-imaging = ["types-aiobotocore-medical-imaging"] +memorydb = ["types-aiobotocore-memorydb"] +meteringmarketplace = ["types-aiobotocore-meteringmarketplace"] +mgh = ["types-aiobotocore-mgh"] +mgn = ["types-aiobotocore-mgn"] +migration-hub-refactor-spaces = ["types-aiobotocore-migration-hub-refactor-spaces"] +migrationhub-config = ["types-aiobotocore-migrationhub-config"] +migrationhuborchestrator = ["types-aiobotocore-migrationhuborchestrator"] +migrationhubstrategy = ["types-aiobotocore-migrationhubstrategy"] +mobile = ["types-aiobotocore-mobile"] +mq = ["types-aiobotocore-mq"] +mturk = ["types-aiobotocore-mturk"] +mwaa = ["types-aiobotocore-mwaa"] +neptune = ["types-aiobotocore-neptune"] +neptune-graph = ["types-aiobotocore-neptune-graph"] +neptunedata = ["types-aiobotocore-neptunedata"] +network-firewall = ["types-aiobotocore-network-firewall"] +networkmanager = ["types-aiobotocore-networkmanager"] +networkmonitor = ["types-aiobotocore-networkmonitor"] +nimble = ["types-aiobotocore-nimble"] +oam = ["types-aiobotocore-oam"] +omics = ["types-aiobotocore-omics"] +opensearch = ["types-aiobotocore-opensearch"] +opensearchserverless = ["types-aiobotocore-opensearchserverless"] +opsworks = ["types-aiobotocore-opsworks"] +opsworkscm = ["types-aiobotocore-opsworkscm"] +organizations = ["types-aiobotocore-organizations"] +osis = ["types-aiobotocore-osis"] +outposts = ["types-aiobotocore-outposts"] +panorama = ["types-aiobotocore-panorama"] +payment-cryptography = ["types-aiobotocore-payment-cryptography"] +payment-cryptography-data = ["types-aiobotocore-payment-cryptography-data"] +pca-connector-ad = ["types-aiobotocore-pca-connector-ad"] +personalize = ["types-aiobotocore-personalize"] +personalize-events = ["types-aiobotocore-personalize-events"] +personalize-runtime = ["types-aiobotocore-personalize-runtime"] +pi = ["types-aiobotocore-pi"] +pinpoint = ["types-aiobotocore-pinpoint"] +pinpoint-email = ["types-aiobotocore-pinpoint-email"] +pinpoint-sms-voice = ["types-aiobotocore-pinpoint-sms-voice"] +pinpoint-sms-voice-v2 = ["types-aiobotocore-pinpoint-sms-voice-v2"] +pipes = ["types-aiobotocore-pipes"] +polly = ["types-aiobotocore-polly"] +pricing = ["types-aiobotocore-pricing"] +privatenetworks = ["types-aiobotocore-privatenetworks"] +proton = ["types-aiobotocore-proton"] +qbusiness = ["types-aiobotocore-qbusiness"] +qconnect = ["types-aiobotocore-qconnect"] +qldb = ["types-aiobotocore-qldb"] +qldb-session = ["types-aiobotocore-qldb-session"] +quicksight = ["types-aiobotocore-quicksight"] +ram = ["types-aiobotocore-ram"] +rbin = ["types-aiobotocore-rbin"] +rds = ["types-aiobotocore-rds"] +rds-data = ["types-aiobotocore-rds-data"] +redshift = ["types-aiobotocore-redshift"] +redshift-data = ["types-aiobotocore-redshift-data"] +redshift-serverless = ["types-aiobotocore-redshift-serverless"] +rekognition = ["types-aiobotocore-rekognition"] +repostspace = ["types-aiobotocore-repostspace"] +resiliencehub = ["types-aiobotocore-resiliencehub"] +resource-explorer-2 = ["types-aiobotocore-resource-explorer-2"] +resource-groups = ["types-aiobotocore-resource-groups"] +resourcegroupstaggingapi = ["types-aiobotocore-resourcegroupstaggingapi"] +robomaker = ["types-aiobotocore-robomaker"] +rolesanywhere = ["types-aiobotocore-rolesanywhere"] +route53 = ["types-aiobotocore-route53"] +route53-recovery-cluster = ["types-aiobotocore-route53-recovery-cluster"] +route53-recovery-control-config = ["types-aiobotocore-route53-recovery-control-config"] +route53-recovery-readiness = ["types-aiobotocore-route53-recovery-readiness"] +route53domains = ["types-aiobotocore-route53domains"] +route53resolver = ["types-aiobotocore-route53resolver"] +rum = ["types-aiobotocore-rum"] +s3 = ["types-aiobotocore-s3"] +s3control = ["types-aiobotocore-s3control"] +s3outposts = ["types-aiobotocore-s3outposts"] +sagemaker = ["types-aiobotocore-sagemaker"] +sagemaker-a2i-runtime = ["types-aiobotocore-sagemaker-a2i-runtime"] +sagemaker-edge = ["types-aiobotocore-sagemaker-edge"] +sagemaker-featurestore-runtime = ["types-aiobotocore-sagemaker-featurestore-runtime"] +sagemaker-geospatial = ["types-aiobotocore-sagemaker-geospatial"] +sagemaker-metrics = ["types-aiobotocore-sagemaker-metrics"] +sagemaker-runtime = ["types-aiobotocore-sagemaker-runtime"] +savingsplans = ["types-aiobotocore-savingsplans"] +scheduler = ["types-aiobotocore-scheduler"] +schemas = ["types-aiobotocore-schemas"] +sdb = ["types-aiobotocore-sdb"] +secretsmanager = ["types-aiobotocore-secretsmanager"] +securityhub = ["types-aiobotocore-securityhub"] +securitylake = ["types-aiobotocore-securitylake"] +serverlessrepo = ["types-aiobotocore-serverlessrepo"] +service-quotas = ["types-aiobotocore-service-quotas"] +servicecatalog = ["types-aiobotocore-servicecatalog"] +servicecatalog-appregistry = ["types-aiobotocore-servicecatalog-appregistry"] +servicediscovery = ["types-aiobotocore-servicediscovery"] +ses = ["types-aiobotocore-ses"] +sesv2 = ["types-aiobotocore-sesv2"] +shield = ["types-aiobotocore-shield"] +signer = ["types-aiobotocore-signer"] +simspaceweaver = ["types-aiobotocore-simspaceweaver"] +sms = ["types-aiobotocore-sms"] +sms-voice = ["types-aiobotocore-sms-voice"] +snow-device-management = ["types-aiobotocore-snow-device-management"] +snowball = ["types-aiobotocore-snowball"] +sns = ["types-aiobotocore-sns"] +sqs = ["types-aiobotocore-sqs"] +ssm = ["types-aiobotocore-ssm"] +ssm-contacts = ["types-aiobotocore-ssm-contacts"] +ssm-incidents = ["types-aiobotocore-ssm-incidents"] +ssm-sap = ["types-aiobotocore-ssm-sap"] +sso = ["types-aiobotocore-sso"] +sso-admin = ["types-aiobotocore-sso-admin"] +sso-oidc = ["types-aiobotocore-sso-oidc"] +stepfunctions = ["types-aiobotocore-stepfunctions"] +storagegateway = ["types-aiobotocore-storagegateway"] +sts = ["types-aiobotocore-sts"] +supplychain = ["types-aiobotocore-supplychain"] +support = ["types-aiobotocore-support"] +support-app = ["types-aiobotocore-support-app"] +swf = ["types-aiobotocore-swf"] +synthetics = ["types-aiobotocore-synthetics"] +textract = ["types-aiobotocore-textract"] +timestream-query = ["types-aiobotocore-timestream-query"] +timestream-write = ["types-aiobotocore-timestream-write"] +tnb = ["types-aiobotocore-tnb"] +transcribe = ["types-aiobotocore-transcribe"] +transfer = ["types-aiobotocore-transfer"] +translate = ["types-aiobotocore-translate"] +trustedadvisor = ["types-aiobotocore-trustedadvisor"] +verifiedpermissions = ["types-aiobotocore-verifiedpermissions"] +voice-id = ["types-aiobotocore-voice-id"] +vpc-lattice = ["types-aiobotocore-vpc-lattice"] +waf = ["types-aiobotocore-waf"] +waf-regional = ["types-aiobotocore-waf-regional"] +wafv2 = ["types-aiobotocore-wafv2"] +wellarchitected = ["types-aiobotocore-wellarchitected"] +wisdom = ["types-aiobotocore-wisdom"] +workdocs = ["types-aiobotocore-workdocs"] +worklink = ["types-aiobotocore-worklink"] +workmail = ["types-aiobotocore-workmail"] +workmailmessageflow = ["types-aiobotocore-workmailmessageflow"] +workspaces = ["types-aiobotocore-workspaces"] +workspaces-thin-client = ["types-aiobotocore-workspaces-thin-client"] +workspaces-web = ["types-aiobotocore-workspaces-web"] +xray = ["types-aiobotocore-xray"] + +[[package]] +name = "types-aiobotocore-cloudformation" +version = "2.11.2" +description = "Type annotations for aiobotocore.CloudFormation 2.11.2 service generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-cloudformation-2.11.2.tar.gz", hash = "sha256:405ba9450f03b52c1d76aad354452b5232f2282860b849d2998aaf89c689240f"}, + {file = "types_aiobotocore_cloudformation-2.11.2-py3-none-any.whl", hash = "sha256:79d1769da14ee4fd92ccbf6d95dc6a8ea57d23ab182d4c3106024e84f95617b9"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[[package]] +name = "types-aiobotocore-dynamodb" +version = "2.11.2" +description = "Type annotations for aiobotocore.DynamoDB 2.11.2 service generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-dynamodb-2.11.2.tar.gz", hash = "sha256:9c1c4a2c7748775d66a3fd0fe0b160291528057ba6d8e1ed24eef08f2d322bfa"}, + {file = "types_aiobotocore_dynamodb-2.11.2-py3-none-any.whl", hash = "sha256:7f88e3690a4ad3c610da72d7d2b4933c994350aca6ee229ef5d403c6fcfb1db4"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[[package]] +name = "types-aiobotocore-ec2" +version = "2.11.2" +description = "Type annotations for aiobotocore.EC2 2.11.2 service generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-ec2-2.11.2.tar.gz", hash = "sha256:41b2e3c88a6d649a0a9bbf5bc84001860e5358f8db1d39aad917a26ee0b6dbeb"}, + {file = "types_aiobotocore_ec2-2.11.2-py3-none-any.whl", hash = "sha256:649648e0c66e9cba1f03e7141809e04ff7da574fbc0fbb564cd5dd8019f5b8cf"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[[package]] +name = "types-aiobotocore-lambda" +version = "2.11.2" +description = "Type annotations for aiobotocore.Lambda 2.11.2 service generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-lambda-2.11.2.tar.gz", hash = "sha256:6f440fb525884ebbc8ad07697056fb9b91046e0cb25f551a137e83b3653389e6"}, + {file = "types_aiobotocore_lambda-2.11.2-py3-none-any.whl", hash = "sha256:39f2700bb9d2f55cae83b65fb41ab8530ced69c48b318815a63fe64c39737f18"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[[package]] +name = "types-aiobotocore-lite" +version = "2.11.2" +description = "Type annotations for aiobotocore 2.11.2 generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-lite-2.11.2.tar.gz", hash = "sha256:c9c1b38708f3407ec6e30417a14fefccde6c4dfffb3ebee2c90f1f2627f679ae"}, + {file = "types_aiobotocore_lite-2.11.2-py3-none-any.whl", hash = "sha256:8f6f717e4936fd897f740ab19c599a191949fba390bb847260e75f589cae6e14"}, +] + +[package.dependencies] +botocore-stubs = "*" +types-aiobotocore-s3 = {version = ">=2.11.0,<2.12.0", optional = true, markers = "extra == \"s3\""} +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[package.extras] +accessanalyzer = ["types-aiobotocore-accessanalyzer (>=2.11.0,<2.12.0)"] +account = ["types-aiobotocore-account (>=2.11.0,<2.12.0)"] +acm = ["types-aiobotocore-acm (>=2.11.0,<2.12.0)"] +acm-pca = ["types-aiobotocore-acm-pca (>=2.11.0,<2.12.0)"] +aiobotocore = ["aiobotocore (==2.11.2)", "botocore (==1.34.34)"] +alexaforbusiness = ["types-aiobotocore-alexaforbusiness (>=2.11.0,<2.12.0)"] +all = ["types-aiobotocore-accessanalyzer (>=2.11.0,<2.12.0)", "types-aiobotocore-account (>=2.11.0,<2.12.0)", "types-aiobotocore-acm (>=2.11.0,<2.12.0)", "types-aiobotocore-acm-pca (>=2.11.0,<2.12.0)", "types-aiobotocore-alexaforbusiness (>=2.11.0,<2.12.0)", "types-aiobotocore-amp (>=2.11.0,<2.12.0)", "types-aiobotocore-amplify (>=2.11.0,<2.12.0)", "types-aiobotocore-amplifybackend (>=2.11.0,<2.12.0)", "types-aiobotocore-amplifyuibuilder (>=2.11.0,<2.12.0)", "types-aiobotocore-apigateway (>=2.11.0,<2.12.0)", "types-aiobotocore-apigatewaymanagementapi (>=2.11.0,<2.12.0)", "types-aiobotocore-apigatewayv2 (>=2.11.0,<2.12.0)", "types-aiobotocore-appconfig (>=2.11.0,<2.12.0)", "types-aiobotocore-appconfigdata (>=2.11.0,<2.12.0)", "types-aiobotocore-appfabric (>=2.11.0,<2.12.0)", "types-aiobotocore-appflow (>=2.11.0,<2.12.0)", "types-aiobotocore-appintegrations (>=2.11.0,<2.12.0)", "types-aiobotocore-application-autoscaling (>=2.11.0,<2.12.0)", "types-aiobotocore-application-insights (>=2.11.0,<2.12.0)", "types-aiobotocore-applicationcostprofiler (>=2.11.0,<2.12.0)", "types-aiobotocore-appmesh (>=2.11.0,<2.12.0)", "types-aiobotocore-apprunner (>=2.11.0,<2.12.0)", "types-aiobotocore-appstream (>=2.11.0,<2.12.0)", "types-aiobotocore-appsync (>=2.11.0,<2.12.0)", "types-aiobotocore-arc-zonal-shift (>=2.11.0,<2.12.0)", "types-aiobotocore-athena (>=2.11.0,<2.12.0)", "types-aiobotocore-auditmanager (>=2.11.0,<2.12.0)", "types-aiobotocore-autoscaling (>=2.11.0,<2.12.0)", "types-aiobotocore-autoscaling-plans (>=2.11.0,<2.12.0)", "types-aiobotocore-b2bi (>=2.11.0,<2.12.0)", "types-aiobotocore-backup (>=2.11.0,<2.12.0)", "types-aiobotocore-backup-gateway (>=2.11.0,<2.12.0)", "types-aiobotocore-backupstorage (>=2.11.0,<2.12.0)", "types-aiobotocore-batch (>=2.11.0,<2.12.0)", "types-aiobotocore-bcm-data-exports (>=2.11.0,<2.12.0)", "types-aiobotocore-bedrock (>=2.11.0,<2.12.0)", "types-aiobotocore-bedrock-agent (>=2.11.0,<2.12.0)", "types-aiobotocore-bedrock-agent-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-bedrock-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-billingconductor (>=2.11.0,<2.12.0)", "types-aiobotocore-braket (>=2.11.0,<2.12.0)", "types-aiobotocore-budgets (>=2.11.0,<2.12.0)", "types-aiobotocore-ce (>=2.11.0,<2.12.0)", "types-aiobotocore-chime (>=2.11.0,<2.12.0)", "types-aiobotocore-chime-sdk-identity (>=2.11.0,<2.12.0)", "types-aiobotocore-chime-sdk-media-pipelines (>=2.11.0,<2.12.0)", "types-aiobotocore-chime-sdk-meetings (>=2.11.0,<2.12.0)", "types-aiobotocore-chime-sdk-messaging (>=2.11.0,<2.12.0)", "types-aiobotocore-chime-sdk-voice (>=2.11.0,<2.12.0)", "types-aiobotocore-cleanrooms (>=2.11.0,<2.12.0)", "types-aiobotocore-cleanroomsml (>=2.11.0,<2.12.0)", "types-aiobotocore-cloud9 (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudcontrol (>=2.11.0,<2.12.0)", "types-aiobotocore-clouddirectory (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudformation (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudfront (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudfront-keyvaluestore (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudhsm (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudhsmv2 (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudsearch (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudsearchdomain (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudtrail (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudtrail-data (>=2.11.0,<2.12.0)", "types-aiobotocore-cloudwatch (>=2.11.0,<2.12.0)", "types-aiobotocore-codeartifact (>=2.11.0,<2.12.0)", "types-aiobotocore-codebuild (>=2.11.0,<2.12.0)", "types-aiobotocore-codecatalyst (>=2.11.0,<2.12.0)", "types-aiobotocore-codecommit (>=2.11.0,<2.12.0)", "types-aiobotocore-codedeploy (>=2.11.0,<2.12.0)", "types-aiobotocore-codeguru-reviewer (>=2.11.0,<2.12.0)", "types-aiobotocore-codeguru-security (>=2.11.0,<2.12.0)", "types-aiobotocore-codeguruprofiler (>=2.11.0,<2.12.0)", "types-aiobotocore-codepipeline (>=2.11.0,<2.12.0)", "types-aiobotocore-codestar (>=2.11.0,<2.12.0)", "types-aiobotocore-codestar-connections (>=2.11.0,<2.12.0)", "types-aiobotocore-codestar-notifications (>=2.11.0,<2.12.0)", "types-aiobotocore-cognito-identity (>=2.11.0,<2.12.0)", "types-aiobotocore-cognito-idp (>=2.11.0,<2.12.0)", "types-aiobotocore-cognito-sync (>=2.11.0,<2.12.0)", "types-aiobotocore-comprehend (>=2.11.0,<2.12.0)", "types-aiobotocore-comprehendmedical (>=2.11.0,<2.12.0)", "types-aiobotocore-compute-optimizer (>=2.11.0,<2.12.0)", "types-aiobotocore-config (>=2.11.0,<2.12.0)", "types-aiobotocore-connect (>=2.11.0,<2.12.0)", "types-aiobotocore-connect-contact-lens (>=2.11.0,<2.12.0)", "types-aiobotocore-connectcampaigns (>=2.11.0,<2.12.0)", "types-aiobotocore-connectcases (>=2.11.0,<2.12.0)", "types-aiobotocore-connectparticipant (>=2.11.0,<2.12.0)", "types-aiobotocore-controltower (>=2.11.0,<2.12.0)", "types-aiobotocore-cost-optimization-hub (>=2.11.0,<2.12.0)", "types-aiobotocore-cur (>=2.11.0,<2.12.0)", "types-aiobotocore-customer-profiles (>=2.11.0,<2.12.0)", "types-aiobotocore-databrew (>=2.11.0,<2.12.0)", "types-aiobotocore-dataexchange (>=2.11.0,<2.12.0)", "types-aiobotocore-datapipeline (>=2.11.0,<2.12.0)", "types-aiobotocore-datasync (>=2.11.0,<2.12.0)", "types-aiobotocore-datazone (>=2.11.0,<2.12.0)", "types-aiobotocore-dax (>=2.11.0,<2.12.0)", "types-aiobotocore-detective (>=2.11.0,<2.12.0)", "types-aiobotocore-devicefarm (>=2.11.0,<2.12.0)", "types-aiobotocore-devops-guru (>=2.11.0,<2.12.0)", "types-aiobotocore-directconnect (>=2.11.0,<2.12.0)", "types-aiobotocore-discovery (>=2.11.0,<2.12.0)", "types-aiobotocore-dlm (>=2.11.0,<2.12.0)", "types-aiobotocore-dms (>=2.11.0,<2.12.0)", "types-aiobotocore-docdb (>=2.11.0,<2.12.0)", "types-aiobotocore-docdb-elastic (>=2.11.0,<2.12.0)", "types-aiobotocore-drs (>=2.11.0,<2.12.0)", "types-aiobotocore-ds (>=2.11.0,<2.12.0)", "types-aiobotocore-dynamodb (>=2.11.0,<2.12.0)", "types-aiobotocore-dynamodbstreams (>=2.11.0,<2.12.0)", "types-aiobotocore-ebs (>=2.11.0,<2.12.0)", "types-aiobotocore-ec2 (>=2.11.0,<2.12.0)", "types-aiobotocore-ec2-instance-connect (>=2.11.0,<2.12.0)", "types-aiobotocore-ecr (>=2.11.0,<2.12.0)", "types-aiobotocore-ecr-public (>=2.11.0,<2.12.0)", "types-aiobotocore-ecs (>=2.11.0,<2.12.0)", "types-aiobotocore-efs (>=2.11.0,<2.12.0)", "types-aiobotocore-eks (>=2.11.0,<2.12.0)", "types-aiobotocore-eks-auth (>=2.11.0,<2.12.0)", "types-aiobotocore-elastic-inference (>=2.11.0,<2.12.0)", "types-aiobotocore-elasticache (>=2.11.0,<2.12.0)", "types-aiobotocore-elasticbeanstalk (>=2.11.0,<2.12.0)", "types-aiobotocore-elastictranscoder (>=2.11.0,<2.12.0)", "types-aiobotocore-elb (>=2.11.0,<2.12.0)", "types-aiobotocore-elbv2 (>=2.11.0,<2.12.0)", "types-aiobotocore-emr (>=2.11.0,<2.12.0)", "types-aiobotocore-emr-containers (>=2.11.0,<2.12.0)", "types-aiobotocore-emr-serverless (>=2.11.0,<2.12.0)", "types-aiobotocore-entityresolution (>=2.11.0,<2.12.0)", "types-aiobotocore-es (>=2.11.0,<2.12.0)", "types-aiobotocore-events (>=2.11.0,<2.12.0)", "types-aiobotocore-evidently (>=2.11.0,<2.12.0)", "types-aiobotocore-finspace (>=2.11.0,<2.12.0)", "types-aiobotocore-finspace-data (>=2.11.0,<2.12.0)", "types-aiobotocore-firehose (>=2.11.0,<2.12.0)", "types-aiobotocore-fis (>=2.11.0,<2.12.0)", "types-aiobotocore-fms (>=2.11.0,<2.12.0)", "types-aiobotocore-forecast (>=2.11.0,<2.12.0)", "types-aiobotocore-forecastquery (>=2.11.0,<2.12.0)", "types-aiobotocore-frauddetector (>=2.11.0,<2.12.0)", "types-aiobotocore-freetier (>=2.11.0,<2.12.0)", "types-aiobotocore-fsx (>=2.11.0,<2.12.0)", "types-aiobotocore-gamelift (>=2.11.0,<2.12.0)", "types-aiobotocore-glacier (>=2.11.0,<2.12.0)", "types-aiobotocore-globalaccelerator (>=2.11.0,<2.12.0)", "types-aiobotocore-glue (>=2.11.0,<2.12.0)", "types-aiobotocore-grafana (>=2.11.0,<2.12.0)", "types-aiobotocore-greengrass (>=2.11.0,<2.12.0)", "types-aiobotocore-greengrassv2 (>=2.11.0,<2.12.0)", "types-aiobotocore-groundstation (>=2.11.0,<2.12.0)", "types-aiobotocore-guardduty (>=2.11.0,<2.12.0)", "types-aiobotocore-health (>=2.11.0,<2.12.0)", "types-aiobotocore-healthlake (>=2.11.0,<2.12.0)", "types-aiobotocore-honeycode (>=2.11.0,<2.12.0)", "types-aiobotocore-iam (>=2.11.0,<2.12.0)", "types-aiobotocore-identitystore (>=2.11.0,<2.12.0)", "types-aiobotocore-imagebuilder (>=2.11.0,<2.12.0)", "types-aiobotocore-importexport (>=2.11.0,<2.12.0)", "types-aiobotocore-inspector (>=2.11.0,<2.12.0)", "types-aiobotocore-inspector-scan (>=2.11.0,<2.12.0)", "types-aiobotocore-inspector2 (>=2.11.0,<2.12.0)", "types-aiobotocore-internetmonitor (>=2.11.0,<2.12.0)", "types-aiobotocore-iot (>=2.11.0,<2.12.0)", "types-aiobotocore-iot-data (>=2.11.0,<2.12.0)", "types-aiobotocore-iot-jobs-data (>=2.11.0,<2.12.0)", "types-aiobotocore-iot-roborunner (>=2.11.0,<2.12.0)", "types-aiobotocore-iot1click-devices (>=2.11.0,<2.12.0)", "types-aiobotocore-iot1click-projects (>=2.11.0,<2.12.0)", "types-aiobotocore-iotanalytics (>=2.11.0,<2.12.0)", "types-aiobotocore-iotdeviceadvisor (>=2.11.0,<2.12.0)", "types-aiobotocore-iotevents (>=2.11.0,<2.12.0)", "types-aiobotocore-iotevents-data (>=2.11.0,<2.12.0)", "types-aiobotocore-iotfleethub (>=2.11.0,<2.12.0)", "types-aiobotocore-iotfleetwise (>=2.11.0,<2.12.0)", "types-aiobotocore-iotsecuretunneling (>=2.11.0,<2.12.0)", "types-aiobotocore-iotsitewise (>=2.11.0,<2.12.0)", "types-aiobotocore-iotthingsgraph (>=2.11.0,<2.12.0)", "types-aiobotocore-iottwinmaker (>=2.11.0,<2.12.0)", "types-aiobotocore-iotwireless (>=2.11.0,<2.12.0)", "types-aiobotocore-ivs (>=2.11.0,<2.12.0)", "types-aiobotocore-ivs-realtime (>=2.11.0,<2.12.0)", "types-aiobotocore-ivschat (>=2.11.0,<2.12.0)", "types-aiobotocore-kafka (>=2.11.0,<2.12.0)", "types-aiobotocore-kafkaconnect (>=2.11.0,<2.12.0)", "types-aiobotocore-kendra (>=2.11.0,<2.12.0)", "types-aiobotocore-kendra-ranking (>=2.11.0,<2.12.0)", "types-aiobotocore-keyspaces (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesis (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesis-video-archived-media (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesis-video-media (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesis-video-signaling (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesis-video-webrtc-storage (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesisanalytics (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesisanalyticsv2 (>=2.11.0,<2.12.0)", "types-aiobotocore-kinesisvideo (>=2.11.0,<2.12.0)", "types-aiobotocore-kms (>=2.11.0,<2.12.0)", "types-aiobotocore-lakeformation (>=2.11.0,<2.12.0)", "types-aiobotocore-lambda (>=2.11.0,<2.12.0)", "types-aiobotocore-launch-wizard (>=2.11.0,<2.12.0)", "types-aiobotocore-lex-models (>=2.11.0,<2.12.0)", "types-aiobotocore-lex-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-lexv2-models (>=2.11.0,<2.12.0)", "types-aiobotocore-lexv2-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-license-manager (>=2.11.0,<2.12.0)", "types-aiobotocore-license-manager-linux-subscriptions (>=2.11.0,<2.12.0)", "types-aiobotocore-license-manager-user-subscriptions (>=2.11.0,<2.12.0)", "types-aiobotocore-lightsail (>=2.11.0,<2.12.0)", "types-aiobotocore-location (>=2.11.0,<2.12.0)", "types-aiobotocore-logs (>=2.11.0,<2.12.0)", "types-aiobotocore-lookoutequipment (>=2.11.0,<2.12.0)", "types-aiobotocore-lookoutmetrics (>=2.11.0,<2.12.0)", "types-aiobotocore-lookoutvision (>=2.11.0,<2.12.0)", "types-aiobotocore-m2 (>=2.11.0,<2.12.0)", "types-aiobotocore-machinelearning (>=2.11.0,<2.12.0)", "types-aiobotocore-macie2 (>=2.11.0,<2.12.0)", "types-aiobotocore-managedblockchain (>=2.11.0,<2.12.0)", "types-aiobotocore-managedblockchain-query (>=2.11.0,<2.12.0)", "types-aiobotocore-marketplace-agreement (>=2.11.0,<2.12.0)", "types-aiobotocore-marketplace-catalog (>=2.11.0,<2.12.0)", "types-aiobotocore-marketplace-deployment (>=2.11.0,<2.12.0)", "types-aiobotocore-marketplace-entitlement (>=2.11.0,<2.12.0)", "types-aiobotocore-marketplacecommerceanalytics (>=2.11.0,<2.12.0)", "types-aiobotocore-mediaconnect (>=2.11.0,<2.12.0)", "types-aiobotocore-mediaconvert (>=2.11.0,<2.12.0)", "types-aiobotocore-medialive (>=2.11.0,<2.12.0)", "types-aiobotocore-mediapackage (>=2.11.0,<2.12.0)", "types-aiobotocore-mediapackage-vod (>=2.11.0,<2.12.0)", "types-aiobotocore-mediapackagev2 (>=2.11.0,<2.12.0)", "types-aiobotocore-mediastore (>=2.11.0,<2.12.0)", "types-aiobotocore-mediastore-data (>=2.11.0,<2.12.0)", "types-aiobotocore-mediatailor (>=2.11.0,<2.12.0)", "types-aiobotocore-medical-imaging (>=2.11.0,<2.12.0)", "types-aiobotocore-memorydb (>=2.11.0,<2.12.0)", "types-aiobotocore-meteringmarketplace (>=2.11.0,<2.12.0)", "types-aiobotocore-mgh (>=2.11.0,<2.12.0)", "types-aiobotocore-mgn (>=2.11.0,<2.12.0)", "types-aiobotocore-migration-hub-refactor-spaces (>=2.11.0,<2.12.0)", "types-aiobotocore-migrationhub-config (>=2.11.0,<2.12.0)", "types-aiobotocore-migrationhuborchestrator (>=2.11.0,<2.12.0)", "types-aiobotocore-migrationhubstrategy (>=2.11.0,<2.12.0)", "types-aiobotocore-mobile (>=2.11.0,<2.12.0)", "types-aiobotocore-mq (>=2.11.0,<2.12.0)", "types-aiobotocore-mturk (>=2.11.0,<2.12.0)", "types-aiobotocore-mwaa (>=2.11.0,<2.12.0)", "types-aiobotocore-neptune (>=2.11.0,<2.12.0)", "types-aiobotocore-neptune-graph (>=2.11.0,<2.12.0)", "types-aiobotocore-neptunedata (>=2.11.0,<2.12.0)", "types-aiobotocore-network-firewall (>=2.11.0,<2.12.0)", "types-aiobotocore-networkmanager (>=2.11.0,<2.12.0)", "types-aiobotocore-networkmonitor (>=2.11.0,<2.12.0)", "types-aiobotocore-nimble (>=2.11.0,<2.12.0)", "types-aiobotocore-oam (>=2.11.0,<2.12.0)", "types-aiobotocore-omics (>=2.11.0,<2.12.0)", "types-aiobotocore-opensearch (>=2.11.0,<2.12.0)", "types-aiobotocore-opensearchserverless (>=2.11.0,<2.12.0)", "types-aiobotocore-opsworks (>=2.11.0,<2.12.0)", "types-aiobotocore-opsworkscm (>=2.11.0,<2.12.0)", "types-aiobotocore-organizations (>=2.11.0,<2.12.0)", "types-aiobotocore-osis (>=2.11.0,<2.12.0)", "types-aiobotocore-outposts (>=2.11.0,<2.12.0)", "types-aiobotocore-panorama (>=2.11.0,<2.12.0)", "types-aiobotocore-payment-cryptography (>=2.11.0,<2.12.0)", "types-aiobotocore-payment-cryptography-data (>=2.11.0,<2.12.0)", "types-aiobotocore-pca-connector-ad (>=2.11.0,<2.12.0)", "types-aiobotocore-personalize (>=2.11.0,<2.12.0)", "types-aiobotocore-personalize-events (>=2.11.0,<2.12.0)", "types-aiobotocore-personalize-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-pi (>=2.11.0,<2.12.0)", "types-aiobotocore-pinpoint (>=2.11.0,<2.12.0)", "types-aiobotocore-pinpoint-email (>=2.11.0,<2.12.0)", "types-aiobotocore-pinpoint-sms-voice (>=2.11.0,<2.12.0)", "types-aiobotocore-pinpoint-sms-voice-v2 (>=2.11.0,<2.12.0)", "types-aiobotocore-pipes (>=2.11.0,<2.12.0)", "types-aiobotocore-polly (>=2.11.0,<2.12.0)", "types-aiobotocore-pricing (>=2.11.0,<2.12.0)", "types-aiobotocore-privatenetworks (>=2.11.0,<2.12.0)", "types-aiobotocore-proton (>=2.11.0,<2.12.0)", "types-aiobotocore-qbusiness (>=2.11.0,<2.12.0)", "types-aiobotocore-qconnect (>=2.11.0,<2.12.0)", "types-aiobotocore-qldb (>=2.11.0,<2.12.0)", "types-aiobotocore-qldb-session (>=2.11.0,<2.12.0)", "types-aiobotocore-quicksight (>=2.11.0,<2.12.0)", "types-aiobotocore-ram (>=2.11.0,<2.12.0)", "types-aiobotocore-rbin (>=2.11.0,<2.12.0)", "types-aiobotocore-rds (>=2.11.0,<2.12.0)", "types-aiobotocore-rds-data (>=2.11.0,<2.12.0)", "types-aiobotocore-redshift (>=2.11.0,<2.12.0)", "types-aiobotocore-redshift-data (>=2.11.0,<2.12.0)", "types-aiobotocore-redshift-serverless (>=2.11.0,<2.12.0)", "types-aiobotocore-rekognition (>=2.11.0,<2.12.0)", "types-aiobotocore-repostspace (>=2.11.0,<2.12.0)", "types-aiobotocore-resiliencehub (>=2.11.0,<2.12.0)", "types-aiobotocore-resource-explorer-2 (>=2.11.0,<2.12.0)", "types-aiobotocore-resource-groups (>=2.11.0,<2.12.0)", "types-aiobotocore-resourcegroupstaggingapi (>=2.11.0,<2.12.0)", "types-aiobotocore-robomaker (>=2.11.0,<2.12.0)", "types-aiobotocore-rolesanywhere (>=2.11.0,<2.12.0)", "types-aiobotocore-route53 (>=2.11.0,<2.12.0)", "types-aiobotocore-route53-recovery-cluster (>=2.11.0,<2.12.0)", "types-aiobotocore-route53-recovery-control-config (>=2.11.0,<2.12.0)", "types-aiobotocore-route53-recovery-readiness (>=2.11.0,<2.12.0)", "types-aiobotocore-route53domains (>=2.11.0,<2.12.0)", "types-aiobotocore-route53resolver (>=2.11.0,<2.12.0)", "types-aiobotocore-rum (>=2.11.0,<2.12.0)", "types-aiobotocore-s3 (>=2.11.0,<2.12.0)", "types-aiobotocore-s3control (>=2.11.0,<2.12.0)", "types-aiobotocore-s3outposts (>=2.11.0,<2.12.0)", "types-aiobotocore-sagemaker (>=2.11.0,<2.12.0)", "types-aiobotocore-sagemaker-a2i-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-sagemaker-edge (>=2.11.0,<2.12.0)", "types-aiobotocore-sagemaker-featurestore-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-sagemaker-geospatial (>=2.11.0,<2.12.0)", "types-aiobotocore-sagemaker-metrics (>=2.11.0,<2.12.0)", "types-aiobotocore-sagemaker-runtime (>=2.11.0,<2.12.0)", "types-aiobotocore-savingsplans (>=2.11.0,<2.12.0)", "types-aiobotocore-scheduler (>=2.11.0,<2.12.0)", "types-aiobotocore-schemas (>=2.11.0,<2.12.0)", "types-aiobotocore-sdb (>=2.11.0,<2.12.0)", "types-aiobotocore-secretsmanager (>=2.11.0,<2.12.0)", "types-aiobotocore-securityhub (>=2.11.0,<2.12.0)", "types-aiobotocore-securitylake (>=2.11.0,<2.12.0)", "types-aiobotocore-serverlessrepo (>=2.11.0,<2.12.0)", "types-aiobotocore-service-quotas (>=2.11.0,<2.12.0)", "types-aiobotocore-servicecatalog (>=2.11.0,<2.12.0)", "types-aiobotocore-servicecatalog-appregistry (>=2.11.0,<2.12.0)", "types-aiobotocore-servicediscovery (>=2.11.0,<2.12.0)", "types-aiobotocore-ses (>=2.11.0,<2.12.0)", "types-aiobotocore-sesv2 (>=2.11.0,<2.12.0)", "types-aiobotocore-shield (>=2.11.0,<2.12.0)", "types-aiobotocore-signer (>=2.11.0,<2.12.0)", "types-aiobotocore-simspaceweaver (>=2.11.0,<2.12.0)", "types-aiobotocore-sms (>=2.11.0,<2.12.0)", "types-aiobotocore-sms-voice (>=2.11.0,<2.12.0)", "types-aiobotocore-snow-device-management (>=2.11.0,<2.12.0)", "types-aiobotocore-snowball (>=2.11.0,<2.12.0)", "types-aiobotocore-sns (>=2.11.0,<2.12.0)", "types-aiobotocore-sqs (>=2.11.0,<2.12.0)", "types-aiobotocore-ssm (>=2.11.0,<2.12.0)", "types-aiobotocore-ssm-contacts (>=2.11.0,<2.12.0)", "types-aiobotocore-ssm-incidents (>=2.11.0,<2.12.0)", "types-aiobotocore-ssm-sap (>=2.11.0,<2.12.0)", "types-aiobotocore-sso (>=2.11.0,<2.12.0)", "types-aiobotocore-sso-admin (>=2.11.0,<2.12.0)", "types-aiobotocore-sso-oidc (>=2.11.0,<2.12.0)", "types-aiobotocore-stepfunctions (>=2.11.0,<2.12.0)", "types-aiobotocore-storagegateway (>=2.11.0,<2.12.0)", "types-aiobotocore-sts (>=2.11.0,<2.12.0)", "types-aiobotocore-supplychain (>=2.11.0,<2.12.0)", "types-aiobotocore-support (>=2.11.0,<2.12.0)", "types-aiobotocore-support-app (>=2.11.0,<2.12.0)", "types-aiobotocore-swf (>=2.11.0,<2.12.0)", "types-aiobotocore-synthetics (>=2.11.0,<2.12.0)", "types-aiobotocore-textract (>=2.11.0,<2.12.0)", "types-aiobotocore-timestream-query (>=2.11.0,<2.12.0)", "types-aiobotocore-timestream-write (>=2.11.0,<2.12.0)", "types-aiobotocore-tnb (>=2.11.0,<2.12.0)", "types-aiobotocore-transcribe (>=2.11.0,<2.12.0)", "types-aiobotocore-transfer (>=2.11.0,<2.12.0)", "types-aiobotocore-translate (>=2.11.0,<2.12.0)", "types-aiobotocore-trustedadvisor (>=2.11.0,<2.12.0)", "types-aiobotocore-verifiedpermissions (>=2.11.0,<2.12.0)", "types-aiobotocore-voice-id (>=2.11.0,<2.12.0)", "types-aiobotocore-vpc-lattice (>=2.11.0,<2.12.0)", "types-aiobotocore-waf (>=2.11.0,<2.12.0)", "types-aiobotocore-waf-regional (>=2.11.0,<2.12.0)", "types-aiobotocore-wafv2 (>=2.11.0,<2.12.0)", "types-aiobotocore-wellarchitected (>=2.11.0,<2.12.0)", "types-aiobotocore-wisdom (>=2.11.0,<2.12.0)", "types-aiobotocore-workdocs (>=2.11.0,<2.12.0)", "types-aiobotocore-worklink (>=2.11.0,<2.12.0)", "types-aiobotocore-workmail (>=2.11.0,<2.12.0)", "types-aiobotocore-workmailmessageflow (>=2.11.0,<2.12.0)", "types-aiobotocore-workspaces (>=2.11.0,<2.12.0)", "types-aiobotocore-workspaces-thin-client (>=2.11.0,<2.12.0)", "types-aiobotocore-workspaces-web (>=2.11.0,<2.12.0)", "types-aiobotocore-xray (>=2.11.0,<2.12.0)"] +amp = ["types-aiobotocore-amp (>=2.11.0,<2.12.0)"] +amplify = ["types-aiobotocore-amplify (>=2.11.0,<2.12.0)"] +amplifybackend = ["types-aiobotocore-amplifybackend (>=2.11.0,<2.12.0)"] +amplifyuibuilder = ["types-aiobotocore-amplifyuibuilder (>=2.11.0,<2.12.0)"] +apigateway = ["types-aiobotocore-apigateway (>=2.11.0,<2.12.0)"] +apigatewaymanagementapi = ["types-aiobotocore-apigatewaymanagementapi (>=2.11.0,<2.12.0)"] +apigatewayv2 = ["types-aiobotocore-apigatewayv2 (>=2.11.0,<2.12.0)"] +appconfig = ["types-aiobotocore-appconfig (>=2.11.0,<2.12.0)"] +appconfigdata = ["types-aiobotocore-appconfigdata (>=2.11.0,<2.12.0)"] +appfabric = ["types-aiobotocore-appfabric (>=2.11.0,<2.12.0)"] +appflow = ["types-aiobotocore-appflow (>=2.11.0,<2.12.0)"] +appintegrations = ["types-aiobotocore-appintegrations (>=2.11.0,<2.12.0)"] +application-autoscaling = ["types-aiobotocore-application-autoscaling (>=2.11.0,<2.12.0)"] +application-insights = ["types-aiobotocore-application-insights (>=2.11.0,<2.12.0)"] +applicationcostprofiler = ["types-aiobotocore-applicationcostprofiler (>=2.11.0,<2.12.0)"] +appmesh = ["types-aiobotocore-appmesh (>=2.11.0,<2.12.0)"] +apprunner = ["types-aiobotocore-apprunner (>=2.11.0,<2.12.0)"] +appstream = ["types-aiobotocore-appstream (>=2.11.0,<2.12.0)"] +appsync = ["types-aiobotocore-appsync (>=2.11.0,<2.12.0)"] +arc-zonal-shift = ["types-aiobotocore-arc-zonal-shift (>=2.11.0,<2.12.0)"] +athena = ["types-aiobotocore-athena (>=2.11.0,<2.12.0)"] +auditmanager = ["types-aiobotocore-auditmanager (>=2.11.0,<2.12.0)"] +autoscaling = ["types-aiobotocore-autoscaling (>=2.11.0,<2.12.0)"] +autoscaling-plans = ["types-aiobotocore-autoscaling-plans (>=2.11.0,<2.12.0)"] +b2bi = ["types-aiobotocore-b2bi (>=2.11.0,<2.12.0)"] +backup = ["types-aiobotocore-backup (>=2.11.0,<2.12.0)"] +backup-gateway = ["types-aiobotocore-backup-gateway (>=2.11.0,<2.12.0)"] +backupstorage = ["types-aiobotocore-backupstorage (>=2.11.0,<2.12.0)"] +batch = ["types-aiobotocore-batch (>=2.11.0,<2.12.0)"] +bcm-data-exports = ["types-aiobotocore-bcm-data-exports (>=2.11.0,<2.12.0)"] +bedrock = ["types-aiobotocore-bedrock (>=2.11.0,<2.12.0)"] +bedrock-agent = ["types-aiobotocore-bedrock-agent (>=2.11.0,<2.12.0)"] +bedrock-agent-runtime = ["types-aiobotocore-bedrock-agent-runtime (>=2.11.0,<2.12.0)"] +bedrock-runtime = ["types-aiobotocore-bedrock-runtime (>=2.11.0,<2.12.0)"] +billingconductor = ["types-aiobotocore-billingconductor (>=2.11.0,<2.12.0)"] +braket = ["types-aiobotocore-braket (>=2.11.0,<2.12.0)"] +budgets = ["types-aiobotocore-budgets (>=2.11.0,<2.12.0)"] +ce = ["types-aiobotocore-ce (>=2.11.0,<2.12.0)"] +chime = ["types-aiobotocore-chime (>=2.11.0,<2.12.0)"] +chime-sdk-identity = ["types-aiobotocore-chime-sdk-identity (>=2.11.0,<2.12.0)"] +chime-sdk-media-pipelines = ["types-aiobotocore-chime-sdk-media-pipelines (>=2.11.0,<2.12.0)"] +chime-sdk-meetings = ["types-aiobotocore-chime-sdk-meetings (>=2.11.0,<2.12.0)"] +chime-sdk-messaging = ["types-aiobotocore-chime-sdk-messaging (>=2.11.0,<2.12.0)"] +chime-sdk-voice = ["types-aiobotocore-chime-sdk-voice (>=2.11.0,<2.12.0)"] +cleanrooms = ["types-aiobotocore-cleanrooms (>=2.11.0,<2.12.0)"] +cleanroomsml = ["types-aiobotocore-cleanroomsml (>=2.11.0,<2.12.0)"] +cloud9 = ["types-aiobotocore-cloud9 (>=2.11.0,<2.12.0)"] +cloudcontrol = ["types-aiobotocore-cloudcontrol (>=2.11.0,<2.12.0)"] +clouddirectory = ["types-aiobotocore-clouddirectory (>=2.11.0,<2.12.0)"] +cloudformation = ["types-aiobotocore-cloudformation (>=2.11.0,<2.12.0)"] +cloudfront = ["types-aiobotocore-cloudfront (>=2.11.0,<2.12.0)"] +cloudfront-keyvaluestore = ["types-aiobotocore-cloudfront-keyvaluestore (>=2.11.0,<2.12.0)"] +cloudhsm = ["types-aiobotocore-cloudhsm (>=2.11.0,<2.12.0)"] +cloudhsmv2 = ["types-aiobotocore-cloudhsmv2 (>=2.11.0,<2.12.0)"] +cloudsearch = ["types-aiobotocore-cloudsearch (>=2.11.0,<2.12.0)"] +cloudsearchdomain = ["types-aiobotocore-cloudsearchdomain (>=2.11.0,<2.12.0)"] +cloudtrail = ["types-aiobotocore-cloudtrail (>=2.11.0,<2.12.0)"] +cloudtrail-data = ["types-aiobotocore-cloudtrail-data (>=2.11.0,<2.12.0)"] +cloudwatch = ["types-aiobotocore-cloudwatch (>=2.11.0,<2.12.0)"] +codeartifact = ["types-aiobotocore-codeartifact (>=2.11.0,<2.12.0)"] +codebuild = ["types-aiobotocore-codebuild (>=2.11.0,<2.12.0)"] +codecatalyst = ["types-aiobotocore-codecatalyst (>=2.11.0,<2.12.0)"] +codecommit = ["types-aiobotocore-codecommit (>=2.11.0,<2.12.0)"] +codedeploy = ["types-aiobotocore-codedeploy (>=2.11.0,<2.12.0)"] +codeguru-reviewer = ["types-aiobotocore-codeguru-reviewer (>=2.11.0,<2.12.0)"] +codeguru-security = ["types-aiobotocore-codeguru-security (>=2.11.0,<2.12.0)"] +codeguruprofiler = ["types-aiobotocore-codeguruprofiler (>=2.11.0,<2.12.0)"] +codepipeline = ["types-aiobotocore-codepipeline (>=2.11.0,<2.12.0)"] +codestar = ["types-aiobotocore-codestar (>=2.11.0,<2.12.0)"] +codestar-connections = ["types-aiobotocore-codestar-connections (>=2.11.0,<2.12.0)"] +codestar-notifications = ["types-aiobotocore-codestar-notifications (>=2.11.0,<2.12.0)"] +cognito-identity = ["types-aiobotocore-cognito-identity (>=2.11.0,<2.12.0)"] +cognito-idp = ["types-aiobotocore-cognito-idp (>=2.11.0,<2.12.0)"] +cognito-sync = ["types-aiobotocore-cognito-sync (>=2.11.0,<2.12.0)"] +comprehend = ["types-aiobotocore-comprehend (>=2.11.0,<2.12.0)"] +comprehendmedical = ["types-aiobotocore-comprehendmedical (>=2.11.0,<2.12.0)"] +compute-optimizer = ["types-aiobotocore-compute-optimizer (>=2.11.0,<2.12.0)"] +config = ["types-aiobotocore-config (>=2.11.0,<2.12.0)"] +connect = ["types-aiobotocore-connect (>=2.11.0,<2.12.0)"] +connect-contact-lens = ["types-aiobotocore-connect-contact-lens (>=2.11.0,<2.12.0)"] +connectcampaigns = ["types-aiobotocore-connectcampaigns (>=2.11.0,<2.12.0)"] +connectcases = ["types-aiobotocore-connectcases (>=2.11.0,<2.12.0)"] +connectparticipant = ["types-aiobotocore-connectparticipant (>=2.11.0,<2.12.0)"] +controltower = ["types-aiobotocore-controltower (>=2.11.0,<2.12.0)"] +cost-optimization-hub = ["types-aiobotocore-cost-optimization-hub (>=2.11.0,<2.12.0)"] +cur = ["types-aiobotocore-cur (>=2.11.0,<2.12.0)"] +customer-profiles = ["types-aiobotocore-customer-profiles (>=2.11.0,<2.12.0)"] +databrew = ["types-aiobotocore-databrew (>=2.11.0,<2.12.0)"] +dataexchange = ["types-aiobotocore-dataexchange (>=2.11.0,<2.12.0)"] +datapipeline = ["types-aiobotocore-datapipeline (>=2.11.0,<2.12.0)"] +datasync = ["types-aiobotocore-datasync (>=2.11.0,<2.12.0)"] +datazone = ["types-aiobotocore-datazone (>=2.11.0,<2.12.0)"] +dax = ["types-aiobotocore-dax (>=2.11.0,<2.12.0)"] +detective = ["types-aiobotocore-detective (>=2.11.0,<2.12.0)"] +devicefarm = ["types-aiobotocore-devicefarm (>=2.11.0,<2.12.0)"] +devops-guru = ["types-aiobotocore-devops-guru (>=2.11.0,<2.12.0)"] +directconnect = ["types-aiobotocore-directconnect (>=2.11.0,<2.12.0)"] +discovery = ["types-aiobotocore-discovery (>=2.11.0,<2.12.0)"] +dlm = ["types-aiobotocore-dlm (>=2.11.0,<2.12.0)"] +dms = ["types-aiobotocore-dms (>=2.11.0,<2.12.0)"] +docdb = ["types-aiobotocore-docdb (>=2.11.0,<2.12.0)"] +docdb-elastic = ["types-aiobotocore-docdb-elastic (>=2.11.0,<2.12.0)"] +drs = ["types-aiobotocore-drs (>=2.11.0,<2.12.0)"] +ds = ["types-aiobotocore-ds (>=2.11.0,<2.12.0)"] +dynamodb = ["types-aiobotocore-dynamodb (>=2.11.0,<2.12.0)"] +dynamodbstreams = ["types-aiobotocore-dynamodbstreams (>=2.11.0,<2.12.0)"] +ebs = ["types-aiobotocore-ebs (>=2.11.0,<2.12.0)"] +ec2 = ["types-aiobotocore-ec2 (>=2.11.0,<2.12.0)"] +ec2-instance-connect = ["types-aiobotocore-ec2-instance-connect (>=2.11.0,<2.12.0)"] +ecr = ["types-aiobotocore-ecr (>=2.11.0,<2.12.0)"] +ecr-public = ["types-aiobotocore-ecr-public (>=2.11.0,<2.12.0)"] +ecs = ["types-aiobotocore-ecs (>=2.11.0,<2.12.0)"] +efs = ["types-aiobotocore-efs (>=2.11.0,<2.12.0)"] +eks = ["types-aiobotocore-eks (>=2.11.0,<2.12.0)"] +eks-auth = ["types-aiobotocore-eks-auth (>=2.11.0,<2.12.0)"] +elastic-inference = ["types-aiobotocore-elastic-inference (>=2.11.0,<2.12.0)"] +elasticache = ["types-aiobotocore-elasticache (>=2.11.0,<2.12.0)"] +elasticbeanstalk = ["types-aiobotocore-elasticbeanstalk (>=2.11.0,<2.12.0)"] +elastictranscoder = ["types-aiobotocore-elastictranscoder (>=2.11.0,<2.12.0)"] +elb = ["types-aiobotocore-elb (>=2.11.0,<2.12.0)"] +elbv2 = ["types-aiobotocore-elbv2 (>=2.11.0,<2.12.0)"] +emr = ["types-aiobotocore-emr (>=2.11.0,<2.12.0)"] +emr-containers = ["types-aiobotocore-emr-containers (>=2.11.0,<2.12.0)"] +emr-serverless = ["types-aiobotocore-emr-serverless (>=2.11.0,<2.12.0)"] +entityresolution = ["types-aiobotocore-entityresolution (>=2.11.0,<2.12.0)"] +es = ["types-aiobotocore-es (>=2.11.0,<2.12.0)"] +essential = ["types-aiobotocore-cloudformation (>=2.11.0,<2.12.0)", "types-aiobotocore-dynamodb (>=2.11.0,<2.12.0)", "types-aiobotocore-ec2 (>=2.11.0,<2.12.0)", "types-aiobotocore-lambda (>=2.11.0,<2.12.0)", "types-aiobotocore-rds (>=2.11.0,<2.12.0)", "types-aiobotocore-s3 (>=2.11.0,<2.12.0)", "types-aiobotocore-sqs (>=2.11.0,<2.12.0)"] +events = ["types-aiobotocore-events (>=2.11.0,<2.12.0)"] +evidently = ["types-aiobotocore-evidently (>=2.11.0,<2.12.0)"] +finspace = ["types-aiobotocore-finspace (>=2.11.0,<2.12.0)"] +finspace-data = ["types-aiobotocore-finspace-data (>=2.11.0,<2.12.0)"] +firehose = ["types-aiobotocore-firehose (>=2.11.0,<2.12.0)"] +fis = ["types-aiobotocore-fis (>=2.11.0,<2.12.0)"] +fms = ["types-aiobotocore-fms (>=2.11.0,<2.12.0)"] +forecast = ["types-aiobotocore-forecast (>=2.11.0,<2.12.0)"] +forecastquery = ["types-aiobotocore-forecastquery (>=2.11.0,<2.12.0)"] +frauddetector = ["types-aiobotocore-frauddetector (>=2.11.0,<2.12.0)"] +freetier = ["types-aiobotocore-freetier (>=2.11.0,<2.12.0)"] +fsx = ["types-aiobotocore-fsx (>=2.11.0,<2.12.0)"] +gamelift = ["types-aiobotocore-gamelift (>=2.11.0,<2.12.0)"] +glacier = ["types-aiobotocore-glacier (>=2.11.0,<2.12.0)"] +globalaccelerator = ["types-aiobotocore-globalaccelerator (>=2.11.0,<2.12.0)"] +glue = ["types-aiobotocore-glue (>=2.11.0,<2.12.0)"] +grafana = ["types-aiobotocore-grafana (>=2.11.0,<2.12.0)"] +greengrass = ["types-aiobotocore-greengrass (>=2.11.0,<2.12.0)"] +greengrassv2 = ["types-aiobotocore-greengrassv2 (>=2.11.0,<2.12.0)"] +groundstation = ["types-aiobotocore-groundstation (>=2.11.0,<2.12.0)"] +guardduty = ["types-aiobotocore-guardduty (>=2.11.0,<2.12.0)"] +health = ["types-aiobotocore-health (>=2.11.0,<2.12.0)"] +healthlake = ["types-aiobotocore-healthlake (>=2.11.0,<2.12.0)"] +honeycode = ["types-aiobotocore-honeycode (>=2.11.0,<2.12.0)"] +iam = ["types-aiobotocore-iam (>=2.11.0,<2.12.0)"] +identitystore = ["types-aiobotocore-identitystore (>=2.11.0,<2.12.0)"] +imagebuilder = ["types-aiobotocore-imagebuilder (>=2.11.0,<2.12.0)"] +importexport = ["types-aiobotocore-importexport (>=2.11.0,<2.12.0)"] +inspector = ["types-aiobotocore-inspector (>=2.11.0,<2.12.0)"] +inspector-scan = ["types-aiobotocore-inspector-scan (>=2.11.0,<2.12.0)"] +inspector2 = ["types-aiobotocore-inspector2 (>=2.11.0,<2.12.0)"] +internetmonitor = ["types-aiobotocore-internetmonitor (>=2.11.0,<2.12.0)"] +iot = ["types-aiobotocore-iot (>=2.11.0,<2.12.0)"] +iot-data = ["types-aiobotocore-iot-data (>=2.11.0,<2.12.0)"] +iot-jobs-data = ["types-aiobotocore-iot-jobs-data (>=2.11.0,<2.12.0)"] +iot-roborunner = ["types-aiobotocore-iot-roborunner (>=2.11.0,<2.12.0)"] +iot1click-devices = ["types-aiobotocore-iot1click-devices (>=2.11.0,<2.12.0)"] +iot1click-projects = ["types-aiobotocore-iot1click-projects (>=2.11.0,<2.12.0)"] +iotanalytics = ["types-aiobotocore-iotanalytics (>=2.11.0,<2.12.0)"] +iotdeviceadvisor = ["types-aiobotocore-iotdeviceadvisor (>=2.11.0,<2.12.0)"] +iotevents = ["types-aiobotocore-iotevents (>=2.11.0,<2.12.0)"] +iotevents-data = ["types-aiobotocore-iotevents-data (>=2.11.0,<2.12.0)"] +iotfleethub = ["types-aiobotocore-iotfleethub (>=2.11.0,<2.12.0)"] +iotfleetwise = ["types-aiobotocore-iotfleetwise (>=2.11.0,<2.12.0)"] +iotsecuretunneling = ["types-aiobotocore-iotsecuretunneling (>=2.11.0,<2.12.0)"] +iotsitewise = ["types-aiobotocore-iotsitewise (>=2.11.0,<2.12.0)"] +iotthingsgraph = ["types-aiobotocore-iotthingsgraph (>=2.11.0,<2.12.0)"] +iottwinmaker = ["types-aiobotocore-iottwinmaker (>=2.11.0,<2.12.0)"] +iotwireless = ["types-aiobotocore-iotwireless (>=2.11.0,<2.12.0)"] +ivs = ["types-aiobotocore-ivs (>=2.11.0,<2.12.0)"] +ivs-realtime = ["types-aiobotocore-ivs-realtime (>=2.11.0,<2.12.0)"] +ivschat = ["types-aiobotocore-ivschat (>=2.11.0,<2.12.0)"] +kafka = ["types-aiobotocore-kafka (>=2.11.0,<2.12.0)"] +kafkaconnect = ["types-aiobotocore-kafkaconnect (>=2.11.0,<2.12.0)"] +kendra = ["types-aiobotocore-kendra (>=2.11.0,<2.12.0)"] +kendra-ranking = ["types-aiobotocore-kendra-ranking (>=2.11.0,<2.12.0)"] +keyspaces = ["types-aiobotocore-keyspaces (>=2.11.0,<2.12.0)"] +kinesis = ["types-aiobotocore-kinesis (>=2.11.0,<2.12.0)"] +kinesis-video-archived-media = ["types-aiobotocore-kinesis-video-archived-media (>=2.11.0,<2.12.0)"] +kinesis-video-media = ["types-aiobotocore-kinesis-video-media (>=2.11.0,<2.12.0)"] +kinesis-video-signaling = ["types-aiobotocore-kinesis-video-signaling (>=2.11.0,<2.12.0)"] +kinesis-video-webrtc-storage = ["types-aiobotocore-kinesis-video-webrtc-storage (>=2.11.0,<2.12.0)"] +kinesisanalytics = ["types-aiobotocore-kinesisanalytics (>=2.11.0,<2.12.0)"] +kinesisanalyticsv2 = ["types-aiobotocore-kinesisanalyticsv2 (>=2.11.0,<2.12.0)"] +kinesisvideo = ["types-aiobotocore-kinesisvideo (>=2.11.0,<2.12.0)"] +kms = ["types-aiobotocore-kms (>=2.11.0,<2.12.0)"] +lakeformation = ["types-aiobotocore-lakeformation (>=2.11.0,<2.12.0)"] +lambda = ["types-aiobotocore-lambda (>=2.11.0,<2.12.0)"] +launch-wizard = ["types-aiobotocore-launch-wizard (>=2.11.0,<2.12.0)"] +lex-models = ["types-aiobotocore-lex-models (>=2.11.0,<2.12.0)"] +lex-runtime = ["types-aiobotocore-lex-runtime (>=2.11.0,<2.12.0)"] +lexv2-models = ["types-aiobotocore-lexv2-models (>=2.11.0,<2.12.0)"] +lexv2-runtime = ["types-aiobotocore-lexv2-runtime (>=2.11.0,<2.12.0)"] +license-manager = ["types-aiobotocore-license-manager (>=2.11.0,<2.12.0)"] +license-manager-linux-subscriptions = ["types-aiobotocore-license-manager-linux-subscriptions (>=2.11.0,<2.12.0)"] +license-manager-user-subscriptions = ["types-aiobotocore-license-manager-user-subscriptions (>=2.11.0,<2.12.0)"] +lightsail = ["types-aiobotocore-lightsail (>=2.11.0,<2.12.0)"] +location = ["types-aiobotocore-location (>=2.11.0,<2.12.0)"] +logs = ["types-aiobotocore-logs (>=2.11.0,<2.12.0)"] +lookoutequipment = ["types-aiobotocore-lookoutequipment (>=2.11.0,<2.12.0)"] +lookoutmetrics = ["types-aiobotocore-lookoutmetrics (>=2.11.0,<2.12.0)"] +lookoutvision = ["types-aiobotocore-lookoutvision (>=2.11.0,<2.12.0)"] +m2 = ["types-aiobotocore-m2 (>=2.11.0,<2.12.0)"] +machinelearning = ["types-aiobotocore-machinelearning (>=2.11.0,<2.12.0)"] +macie2 = ["types-aiobotocore-macie2 (>=2.11.0,<2.12.0)"] +managedblockchain = ["types-aiobotocore-managedblockchain (>=2.11.0,<2.12.0)"] +managedblockchain-query = ["types-aiobotocore-managedblockchain-query (>=2.11.0,<2.12.0)"] +marketplace-agreement = ["types-aiobotocore-marketplace-agreement (>=2.11.0,<2.12.0)"] +marketplace-catalog = ["types-aiobotocore-marketplace-catalog (>=2.11.0,<2.12.0)"] +marketplace-deployment = ["types-aiobotocore-marketplace-deployment (>=2.11.0,<2.12.0)"] +marketplace-entitlement = ["types-aiobotocore-marketplace-entitlement (>=2.11.0,<2.12.0)"] +marketplacecommerceanalytics = ["types-aiobotocore-marketplacecommerceanalytics (>=2.11.0,<2.12.0)"] +mediaconnect = ["types-aiobotocore-mediaconnect (>=2.11.0,<2.12.0)"] +mediaconvert = ["types-aiobotocore-mediaconvert (>=2.11.0,<2.12.0)"] +medialive = ["types-aiobotocore-medialive (>=2.11.0,<2.12.0)"] +mediapackage = ["types-aiobotocore-mediapackage (>=2.11.0,<2.12.0)"] +mediapackage-vod = ["types-aiobotocore-mediapackage-vod (>=2.11.0,<2.12.0)"] +mediapackagev2 = ["types-aiobotocore-mediapackagev2 (>=2.11.0,<2.12.0)"] +mediastore = ["types-aiobotocore-mediastore (>=2.11.0,<2.12.0)"] +mediastore-data = ["types-aiobotocore-mediastore-data (>=2.11.0,<2.12.0)"] +mediatailor = ["types-aiobotocore-mediatailor (>=2.11.0,<2.12.0)"] +medical-imaging = ["types-aiobotocore-medical-imaging (>=2.11.0,<2.12.0)"] +memorydb = ["types-aiobotocore-memorydb (>=2.11.0,<2.12.0)"] +meteringmarketplace = ["types-aiobotocore-meteringmarketplace (>=2.11.0,<2.12.0)"] +mgh = ["types-aiobotocore-mgh (>=2.11.0,<2.12.0)"] +mgn = ["types-aiobotocore-mgn (>=2.11.0,<2.12.0)"] +migration-hub-refactor-spaces = ["types-aiobotocore-migration-hub-refactor-spaces (>=2.11.0,<2.12.0)"] +migrationhub-config = ["types-aiobotocore-migrationhub-config (>=2.11.0,<2.12.0)"] +migrationhuborchestrator = ["types-aiobotocore-migrationhuborchestrator (>=2.11.0,<2.12.0)"] +migrationhubstrategy = ["types-aiobotocore-migrationhubstrategy (>=2.11.0,<2.12.0)"] +mobile = ["types-aiobotocore-mobile (>=2.11.0,<2.12.0)"] +mq = ["types-aiobotocore-mq (>=2.11.0,<2.12.0)"] +mturk = ["types-aiobotocore-mturk (>=2.11.0,<2.12.0)"] +mwaa = ["types-aiobotocore-mwaa (>=2.11.0,<2.12.0)"] +neptune = ["types-aiobotocore-neptune (>=2.11.0,<2.12.0)"] +neptune-graph = ["types-aiobotocore-neptune-graph (>=2.11.0,<2.12.0)"] +neptunedata = ["types-aiobotocore-neptunedata (>=2.11.0,<2.12.0)"] +network-firewall = ["types-aiobotocore-network-firewall (>=2.11.0,<2.12.0)"] +networkmanager = ["types-aiobotocore-networkmanager (>=2.11.0,<2.12.0)"] +networkmonitor = ["types-aiobotocore-networkmonitor (>=2.11.0,<2.12.0)"] +nimble = ["types-aiobotocore-nimble (>=2.11.0,<2.12.0)"] +oam = ["types-aiobotocore-oam (>=2.11.0,<2.12.0)"] +omics = ["types-aiobotocore-omics (>=2.11.0,<2.12.0)"] +opensearch = ["types-aiobotocore-opensearch (>=2.11.0,<2.12.0)"] +opensearchserverless = ["types-aiobotocore-opensearchserverless (>=2.11.0,<2.12.0)"] +opsworks = ["types-aiobotocore-opsworks (>=2.11.0,<2.12.0)"] +opsworkscm = ["types-aiobotocore-opsworkscm (>=2.11.0,<2.12.0)"] +organizations = ["types-aiobotocore-organizations (>=2.11.0,<2.12.0)"] +osis = ["types-aiobotocore-osis (>=2.11.0,<2.12.0)"] +outposts = ["types-aiobotocore-outposts (>=2.11.0,<2.12.0)"] +panorama = ["types-aiobotocore-panorama (>=2.11.0,<2.12.0)"] +payment-cryptography = ["types-aiobotocore-payment-cryptography (>=2.11.0,<2.12.0)"] +payment-cryptography-data = ["types-aiobotocore-payment-cryptography-data (>=2.11.0,<2.12.0)"] +pca-connector-ad = ["types-aiobotocore-pca-connector-ad (>=2.11.0,<2.12.0)"] +personalize = ["types-aiobotocore-personalize (>=2.11.0,<2.12.0)"] +personalize-events = ["types-aiobotocore-personalize-events (>=2.11.0,<2.12.0)"] +personalize-runtime = ["types-aiobotocore-personalize-runtime (>=2.11.0,<2.12.0)"] +pi = ["types-aiobotocore-pi (>=2.11.0,<2.12.0)"] +pinpoint = ["types-aiobotocore-pinpoint (>=2.11.0,<2.12.0)"] +pinpoint-email = ["types-aiobotocore-pinpoint-email (>=2.11.0,<2.12.0)"] +pinpoint-sms-voice = ["types-aiobotocore-pinpoint-sms-voice (>=2.11.0,<2.12.0)"] +pinpoint-sms-voice-v2 = ["types-aiobotocore-pinpoint-sms-voice-v2 (>=2.11.0,<2.12.0)"] +pipes = ["types-aiobotocore-pipes (>=2.11.0,<2.12.0)"] +polly = ["types-aiobotocore-polly (>=2.11.0,<2.12.0)"] +pricing = ["types-aiobotocore-pricing (>=2.11.0,<2.12.0)"] +privatenetworks = ["types-aiobotocore-privatenetworks (>=2.11.0,<2.12.0)"] +proton = ["types-aiobotocore-proton (>=2.11.0,<2.12.0)"] +qbusiness = ["types-aiobotocore-qbusiness (>=2.11.0,<2.12.0)"] +qconnect = ["types-aiobotocore-qconnect (>=2.11.0,<2.12.0)"] +qldb = ["types-aiobotocore-qldb (>=2.11.0,<2.12.0)"] +qldb-session = ["types-aiobotocore-qldb-session (>=2.11.0,<2.12.0)"] +quicksight = ["types-aiobotocore-quicksight (>=2.11.0,<2.12.0)"] +ram = ["types-aiobotocore-ram (>=2.11.0,<2.12.0)"] +rbin = ["types-aiobotocore-rbin (>=2.11.0,<2.12.0)"] +rds = ["types-aiobotocore-rds (>=2.11.0,<2.12.0)"] +rds-data = ["types-aiobotocore-rds-data (>=2.11.0,<2.12.0)"] +redshift = ["types-aiobotocore-redshift (>=2.11.0,<2.12.0)"] +redshift-data = ["types-aiobotocore-redshift-data (>=2.11.0,<2.12.0)"] +redshift-serverless = ["types-aiobotocore-redshift-serverless (>=2.11.0,<2.12.0)"] +rekognition = ["types-aiobotocore-rekognition (>=2.11.0,<2.12.0)"] +repostspace = ["types-aiobotocore-repostspace (>=2.11.0,<2.12.0)"] +resiliencehub = ["types-aiobotocore-resiliencehub (>=2.11.0,<2.12.0)"] +resource-explorer-2 = ["types-aiobotocore-resource-explorer-2 (>=2.11.0,<2.12.0)"] +resource-groups = ["types-aiobotocore-resource-groups (>=2.11.0,<2.12.0)"] +resourcegroupstaggingapi = ["types-aiobotocore-resourcegroupstaggingapi (>=2.11.0,<2.12.0)"] +robomaker = ["types-aiobotocore-robomaker (>=2.11.0,<2.12.0)"] +rolesanywhere = ["types-aiobotocore-rolesanywhere (>=2.11.0,<2.12.0)"] +route53 = ["types-aiobotocore-route53 (>=2.11.0,<2.12.0)"] +route53-recovery-cluster = ["types-aiobotocore-route53-recovery-cluster (>=2.11.0,<2.12.0)"] +route53-recovery-control-config = ["types-aiobotocore-route53-recovery-control-config (>=2.11.0,<2.12.0)"] +route53-recovery-readiness = ["types-aiobotocore-route53-recovery-readiness (>=2.11.0,<2.12.0)"] +route53domains = ["types-aiobotocore-route53domains (>=2.11.0,<2.12.0)"] +route53resolver = ["types-aiobotocore-route53resolver (>=2.11.0,<2.12.0)"] +rum = ["types-aiobotocore-rum (>=2.11.0,<2.12.0)"] +s3 = ["types-aiobotocore-s3 (>=2.11.0,<2.12.0)"] +s3control = ["types-aiobotocore-s3control (>=2.11.0,<2.12.0)"] +s3outposts = ["types-aiobotocore-s3outposts (>=2.11.0,<2.12.0)"] +sagemaker = ["types-aiobotocore-sagemaker (>=2.11.0,<2.12.0)"] +sagemaker-a2i-runtime = ["types-aiobotocore-sagemaker-a2i-runtime (>=2.11.0,<2.12.0)"] +sagemaker-edge = ["types-aiobotocore-sagemaker-edge (>=2.11.0,<2.12.0)"] +sagemaker-featurestore-runtime = ["types-aiobotocore-sagemaker-featurestore-runtime (>=2.11.0,<2.12.0)"] +sagemaker-geospatial = ["types-aiobotocore-sagemaker-geospatial (>=2.11.0,<2.12.0)"] +sagemaker-metrics = ["types-aiobotocore-sagemaker-metrics (>=2.11.0,<2.12.0)"] +sagemaker-runtime = ["types-aiobotocore-sagemaker-runtime (>=2.11.0,<2.12.0)"] +savingsplans = ["types-aiobotocore-savingsplans (>=2.11.0,<2.12.0)"] +scheduler = ["types-aiobotocore-scheduler (>=2.11.0,<2.12.0)"] +schemas = ["types-aiobotocore-schemas (>=2.11.0,<2.12.0)"] +sdb = ["types-aiobotocore-sdb (>=2.11.0,<2.12.0)"] +secretsmanager = ["types-aiobotocore-secretsmanager (>=2.11.0,<2.12.0)"] +securityhub = ["types-aiobotocore-securityhub (>=2.11.0,<2.12.0)"] +securitylake = ["types-aiobotocore-securitylake (>=2.11.0,<2.12.0)"] +serverlessrepo = ["types-aiobotocore-serverlessrepo (>=2.11.0,<2.12.0)"] +service-quotas = ["types-aiobotocore-service-quotas (>=2.11.0,<2.12.0)"] +servicecatalog = ["types-aiobotocore-servicecatalog (>=2.11.0,<2.12.0)"] +servicecatalog-appregistry = ["types-aiobotocore-servicecatalog-appregistry (>=2.11.0,<2.12.0)"] +servicediscovery = ["types-aiobotocore-servicediscovery (>=2.11.0,<2.12.0)"] +ses = ["types-aiobotocore-ses (>=2.11.0,<2.12.0)"] +sesv2 = ["types-aiobotocore-sesv2 (>=2.11.0,<2.12.0)"] +shield = ["types-aiobotocore-shield (>=2.11.0,<2.12.0)"] +signer = ["types-aiobotocore-signer (>=2.11.0,<2.12.0)"] +simspaceweaver = ["types-aiobotocore-simspaceweaver (>=2.11.0,<2.12.0)"] +sms = ["types-aiobotocore-sms (>=2.11.0,<2.12.0)"] +sms-voice = ["types-aiobotocore-sms-voice (>=2.11.0,<2.12.0)"] +snow-device-management = ["types-aiobotocore-snow-device-management (>=2.11.0,<2.12.0)"] +snowball = ["types-aiobotocore-snowball (>=2.11.0,<2.12.0)"] +sns = ["types-aiobotocore-sns (>=2.11.0,<2.12.0)"] +sqs = ["types-aiobotocore-sqs (>=2.11.0,<2.12.0)"] +ssm = ["types-aiobotocore-ssm (>=2.11.0,<2.12.0)"] +ssm-contacts = ["types-aiobotocore-ssm-contacts (>=2.11.0,<2.12.0)"] +ssm-incidents = ["types-aiobotocore-ssm-incidents (>=2.11.0,<2.12.0)"] +ssm-sap = ["types-aiobotocore-ssm-sap (>=2.11.0,<2.12.0)"] +sso = ["types-aiobotocore-sso (>=2.11.0,<2.12.0)"] +sso-admin = ["types-aiobotocore-sso-admin (>=2.11.0,<2.12.0)"] +sso-oidc = ["types-aiobotocore-sso-oidc (>=2.11.0,<2.12.0)"] +stepfunctions = ["types-aiobotocore-stepfunctions (>=2.11.0,<2.12.0)"] +storagegateway = ["types-aiobotocore-storagegateway (>=2.11.0,<2.12.0)"] +sts = ["types-aiobotocore-sts (>=2.11.0,<2.12.0)"] +supplychain = ["types-aiobotocore-supplychain (>=2.11.0,<2.12.0)"] +support = ["types-aiobotocore-support (>=2.11.0,<2.12.0)"] +support-app = ["types-aiobotocore-support-app (>=2.11.0,<2.12.0)"] +swf = ["types-aiobotocore-swf (>=2.11.0,<2.12.0)"] +synthetics = ["types-aiobotocore-synthetics (>=2.11.0,<2.12.0)"] +textract = ["types-aiobotocore-textract (>=2.11.0,<2.12.0)"] +timestream-query = ["types-aiobotocore-timestream-query (>=2.11.0,<2.12.0)"] +timestream-write = ["types-aiobotocore-timestream-write (>=2.11.0,<2.12.0)"] +tnb = ["types-aiobotocore-tnb (>=2.11.0,<2.12.0)"] +transcribe = ["types-aiobotocore-transcribe (>=2.11.0,<2.12.0)"] +transfer = ["types-aiobotocore-transfer (>=2.11.0,<2.12.0)"] +translate = ["types-aiobotocore-translate (>=2.11.0,<2.12.0)"] +trustedadvisor = ["types-aiobotocore-trustedadvisor (>=2.11.0,<2.12.0)"] +verifiedpermissions = ["types-aiobotocore-verifiedpermissions (>=2.11.0,<2.12.0)"] +voice-id = ["types-aiobotocore-voice-id (>=2.11.0,<2.12.0)"] +vpc-lattice = ["types-aiobotocore-vpc-lattice (>=2.11.0,<2.12.0)"] +waf = ["types-aiobotocore-waf (>=2.11.0,<2.12.0)"] +waf-regional = ["types-aiobotocore-waf-regional (>=2.11.0,<2.12.0)"] +wafv2 = ["types-aiobotocore-wafv2 (>=2.11.0,<2.12.0)"] +wellarchitected = ["types-aiobotocore-wellarchitected (>=2.11.0,<2.12.0)"] +wisdom = ["types-aiobotocore-wisdom (>=2.11.0,<2.12.0)"] +workdocs = ["types-aiobotocore-workdocs (>=2.11.0,<2.12.0)"] +worklink = ["types-aiobotocore-worklink (>=2.11.0,<2.12.0)"] +workmail = ["types-aiobotocore-workmail (>=2.11.0,<2.12.0)"] +workmailmessageflow = ["types-aiobotocore-workmailmessageflow (>=2.11.0,<2.12.0)"] +workspaces = ["types-aiobotocore-workspaces (>=2.11.0,<2.12.0)"] +workspaces-thin-client = ["types-aiobotocore-workspaces-thin-client (>=2.11.0,<2.12.0)"] +workspaces-web = ["types-aiobotocore-workspaces-web (>=2.11.0,<2.12.0)"] +xray = ["types-aiobotocore-xray (>=2.11.0,<2.12.0)"] + +[[package]] +name = "types-aiobotocore-rds" +version = "2.11.2" +description = "Type annotations for aiobotocore.RDS 2.11.2 service generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-rds-2.11.2.tar.gz", hash = "sha256:a818f66a50b3d14b35bd4225b2d59afbe78f2603bbc58784d7a1e5ab6251c754"}, + {file = "types_aiobotocore_rds-2.11.2-py3-none-any.whl", hash = "sha256:ad06ee24a8e03f3f3fbb550f27252cb41c3b3c243a6be9176f47b584070e9294"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[[package]] +name = "types-aiobotocore-s3" +version = "2.11.2" +description = "Type annotations for aiobotocore.S3 2.11.2 service generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-s3-2.11.2.tar.gz", hash = "sha256:9f6867e7aad4541b92e6a35ea7b8ee9d5e4b1995862dd06de0456448e460d36b"}, + {file = "types_aiobotocore_s3-2.11.2-py3-none-any.whl", hash = "sha256:e4be40cadd777669f0ad05bf42e54a441825f5e30b18b12ad544602fa14dd85e"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[[package]] +name = "types-aiobotocore-sqs" +version = "2.11.2" +description = "Type annotations for aiobotocore.SQS 2.11.2 service generated with mypy-boto3-builder 7.23.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-aiobotocore-sqs-2.11.2.tar.gz", hash = "sha256:f5f558176a9f8cce43616646da16de83f5cfcfe2bcb721a1cd2c58f1e5b49872"}, + {file = "types_aiobotocore_sqs-2.11.2-py3-none-any.whl", hash = "sha256:a69431721cbcbf9c35e163474af2e53f38043486ca562a8e846fff0061049d07"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} + +[[package]] +name = "types-awscrt" +version = "0.20.3" +description = "Type annotations and code completion for awscrt" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "types_awscrt-0.20.3-py3-none-any.whl", hash = "sha256:f61a120d3e98ee1387bc5ca4b93437f258cc5c2af1f55f8634ec4cee5729f178"}, + {file = "types_awscrt-0.20.3.tar.gz", hash = "sha256:06a859189a329ca8e66d56ceeef2391488e39b878fbd2141f115eab4d416fe22"}, +] + +[[package]] +name = "types-s3transfer" +version = "0.10.0" +description = "Type annotations and code completion for s3transfer" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "types_s3transfer-0.10.0-py3-none-any.whl", hash = "sha256:44fcdf0097b924a9aab1ee4baa1179081a9559ca62a88c807e2b256893ce688f"}, + {file = "types_s3transfer-0.10.0.tar.gz", hash = "sha256:35e4998c25df7f8985ad69dedc8e4860e8af3b43b7615e940d53c00d413bdc69"}, +] + [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "urllib3" +version = "2.0.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, ] +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "uvicorn" version = "0.23.2" @@ -935,77 +2935,130 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "uvloop" -version = "0.17.0" +version = "0.19.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8.0" files = [ - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, - {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, - {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, ] [package.extras] -dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] [[package]] name = "watchfiles" -version = "0.20.0" +version = "0.21.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchfiles-0.20.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:3796312bd3587e14926013612b23066912cf45a14af71cf2b20db1c12dadf4e9"}, - {file = "watchfiles-0.20.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:d0002d81c89a662b595645fb684a371b98ff90a9c7d8f8630c82f0fde8310458"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:570848706440373b4cd8017f3e850ae17f76dbdf1e9045fc79023b11e1afe490"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a0351d20d03c6f7ad6b2e8a226a5efafb924c7755ee1e34f04c77c3682417fa"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:007dcc4a401093010b389c044e81172c8a2520dba257c88f8828b3d460c6bb38"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d82dbc1832da83e441d112069833eedd4cf583d983fb8dd666fbefbea9d99c0"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99f4c65fd2fce61a571b2a6fcf747d6868db0bef8a934e8ca235cc8533944d95"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5392dd327a05f538c56edb1c6ebba6af91afc81b40822452342f6da54907bbdf"}, - {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:08dc702529bb06a2b23859110c214db245455532da5eaea602921687cfcd23db"}, - {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7d4e66a857621584869cfbad87039e65dadd7119f0d9bb9dbc957e089e32c164"}, - {file = "watchfiles-0.20.0-cp37-abi3-win32.whl", hash = "sha256:a03d1e6feb7966b417f43c3e3783188167fd69c2063e86bad31e62c4ea794cc5"}, - {file = "watchfiles-0.20.0-cp37-abi3-win_amd64.whl", hash = "sha256:eccc8942bcdc7d638a01435d915b913255bbd66f018f1af051cd8afddb339ea3"}, - {file = "watchfiles-0.20.0-cp37-abi3-win_arm64.whl", hash = "sha256:b17d4176c49d207865630da5b59a91779468dd3e08692fe943064da260de2c7c"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d97db179f7566dcf145c5179ddb2ae2a4450e3a634eb864b09ea04e68c252e8e"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:835df2da7a5df5464c4a23b2d963e1a9d35afa422c83bf4ff4380b3114603644"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:608cd94a8767f49521901aff9ae0c92cc8f5a24d528db7d6b0295290f9d41193"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89d1de8218874925bce7bb2ae9657efc504411528930d7a83f98b1749864f2ef"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:13f995d5152a8ba4ed7c2bbbaeee4e11a5944defc7cacd0ccb4dcbdcfd78029a"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b5c8d3be7b502f8c43a33c63166ada8828dbb0c6d49c8f9ce990a96de2f5a49"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e43af4464daa08723c04b43cf978ab86cc55c684c16172622bdac64b34e36af0"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d9e1f75c4f86c93d73b5bd1ebe667558357548f11b4f8af4e0e272f79413ce"}, - {file = "watchfiles-0.20.0.tar.gz", hash = "sha256:728575b6b94c90dd531514677201e8851708e6e4b5fe7028ac506a200b622019"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, + {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, + {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, + {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, + {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, + {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, + {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, + {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, + {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, + {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, + {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, + {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, + {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, + {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, ] [package.dependencies] @@ -1013,84 +3066,268 @@ anyio = ">=3.0.0" [[package]] name = "websockets" -version = "11.0.3" +version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false python-versions = ">=3.7" files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "54cb7c06ce727496f93e1619421ce566e0a3bf55b2667896612854e9b2bff41b" +content-hash = "92fb08a05ffc64c218b61117c220d20fff65ecd089305a0bb4a738101d64d592" diff --git a/pyproject.toml b/pyproject.toml index 96bab71..bdbaa14 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,20 +5,24 @@ description = "" authors = ["hrimov "] readme = "README.md" packages = [ - { include = "app", from = "src" } + { include = "dma", from = "src" } ] [tool.poetry.scripts] -api = "src.app.__main__:run" +api = "src.dma.__main__:run" [tool.poetry.dependencies] python = "^3.11" fastapi = "^0.103.1" uvicorn = { extras = ["standard"], version = "^0.23.2" } -sqlalchemy = { extras = ["async"], version = "^2.0.21" } +sqlalchemy = { extras = ["asyncio"], version = "^2.0.21" } alembic = "^1.12.0" orjson = "^3.9.7" - +psycopg = { extras = ["c"], version = "^3.1.14" } +aio-pika = "^9.3.0" +aioboto3 = "12.1.0" +types-aioboto3-lite = { extras = ["essential"], version = "^12.1.0" } +types-aiobotocore-lite = { extras = ["s3"], version = "^2.9.0" } [tool.poetry.group.test] optional = true @@ -26,19 +30,33 @@ optional = true [tool.poetry.group.test.dependencies] pytest = "^7.4.2" pytest-asyncio = "^0.21.1" +pytest-order = "^1.2.0" +testcontainers = {extras = ["postgresql", "rabbitmq"], version = "^3.7.1"} +testcontainers-minio = "^0.0.1rc1" # for now, it's a separate package [tool.poetry.group.lint] optional = true [tool.poetry.group.lint.dependencies] -flake8 = "^6.1.0" -isort = "^5.12.0" +ruff = "^0.1.11" mypy = "^1.5.1" [tool.pytest.ini_options] pythonpath = ["src"] +testpaths = ["tests"] +asyncio_mode = "auto" +addopts = "-vv --order-scope=module" + + +[tool.ruff] +select = ["ALL"] +ignore = ["A003", "ANN", "D", "FA100", "FA102", "FIX", "I", "PGH003", "PGH004", "TD"] + +[tool.ruff.extend-per-file-ignores] +"src/dma/infrastructure/database/migrations/versions/*" = ["ALL"] +"tests/*" = ["ARG001", "F401", "PT003", "PT004", "S"] [build-system] diff --git a/src/app/infrastucture/config/__init__.py b/src/app/infrastucture/config/__init__.py deleted file mode 100644 index 626dfa1..0000000 --- a/src/app/infrastucture/config/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .models import AppConfig, Config, DatabaseConfig -from .parsers import load_config diff --git a/src/app/infrastucture/config/models/__init__.py b/src/app/infrastucture/config/models/__init__.py deleted file mode 100644 index 66d1604..0000000 --- a/src/app/infrastucture/config/models/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .application import AppConfig -from .database import DatabaseConfig -from .main import Config diff --git a/src/app/infrastucture/config/models/database.py b/src/app/infrastucture/config/models/database.py deleted file mode 100644 index 50167bc..0000000 --- a/src/app/infrastucture/config/models/database.py +++ /dev/null @@ -1,11 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class DatabaseConfig: - host: str - port: int - database: str - user: str - password: str - echo: bool diff --git a/src/app/infrastucture/config/parsers/__init__.py b/src/app/infrastucture/config/parsers/__init__.py deleted file mode 100644 index f2b6580..0000000 --- a/src/app/infrastucture/config/parsers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .main import load_config diff --git a/src/app/infrastucture/config/parsers/main.py b/src/app/infrastucture/config/parsers/main.py deleted file mode 100644 index b8c77d1..0000000 --- a/src/app/infrastucture/config/parsers/main.py +++ /dev/null @@ -1,37 +0,0 @@ -import configparser -import os - -from src.app.infrastucture.config.models import ( - AppConfig, - Config, - DatabaseConfig, -) - - -DEFAULT_CONFIG_PATH: str = "./config/local.ini" - - -def load_config(path: str | None = None) -> Config: - if path is None: - path = os.getenv("CONFIG_PATH", DEFAULT_CONFIG_PATH) - - parser = configparser.ConfigParser() - parser.read(path) - - application_data, database_data = parser["application"], parser["database"] - - application_config = AppConfig( - host=application_data.get("host"), - port=application_data.getint("port"), - logging_level=application_data.get("logging_level"), - ) - database_config = DatabaseConfig( - host=database_data.get("host"), - port=database_data.getint("port"), - database=database_data.get("database"), - user=database_data.get("user"), - password=database_data.get("password"), - echo=database_data.getboolean("echo"), - ) - - return Config(application_config, database_config) diff --git a/src/app/infrastucture/log/__init__.py b/src/app/infrastucture/log/__init__.py deleted file mode 100644 index 3c0d2c4..0000000 --- a/src/app/infrastucture/log/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .main import configure_logging diff --git a/src/app/infrastucture/log/formatters/__init__.py b/src/app/infrastucture/log/formatters/__init__.py deleted file mode 100644 index e39a1a8..0000000 --- a/src/app/infrastucture/log/formatters/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .main import MainConsoleFormatter diff --git a/src/app/presentation/api/__init__.py b/src/app/presentation/api/__init__.py deleted file mode 100644 index fb3c942..0000000 --- a/src/app/presentation/api/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .v1 import main diff --git a/src/app/presentation/api/v1/middlewares/main.py b/src/app/presentation/api/v1/middlewares/main.py deleted file mode 100644 index 5f2ff02..0000000 --- a/src/app/presentation/api/v1/middlewares/main.py +++ /dev/null @@ -1,5 +0,0 @@ -from fastapi import FastAPI - - -def setup(app: FastAPI) -> None: - ... diff --git a/src/app/presentation/api/v1/providers/main.py b/src/app/presentation/api/v1/providers/main.py deleted file mode 100644 index 5f2ff02..0000000 --- a/src/app/presentation/api/v1/providers/main.py +++ /dev/null @@ -1,5 +0,0 @@ -from fastapi import FastAPI - - -def setup(app: FastAPI) -> None: - ... diff --git a/src/app/__init__.py b/src/dma/__init__.py similarity index 100% rename from src/app/__init__.py rename to src/dma/__init__.py diff --git a/src/app/__main__.py b/src/dma/__main__.py similarity index 64% rename from src/app/__main__.py rename to src/dma/__main__.py index a9dafb1..75d6238 100644 --- a/src/app/__main__.py +++ b/src/dma/__main__.py @@ -1,4 +1,4 @@ -from src.app.presentation.api import v1 +from dma.presentation.api import v1 def run() -> None: diff --git a/src/app/application/__init__.py b/src/dma/application/__init__.py similarity index 100% rename from src/app/application/__init__.py rename to src/dma/application/__init__.py diff --git a/src/app/domain/__init__.py b/src/dma/application/comment/__init__.py similarity index 100% rename from src/app/domain/__init__.py rename to src/dma/application/comment/__init__.py diff --git a/src/dma/application/comment/dto.py b/src/dma/application/comment/dto.py new file mode 100644 index 0000000..4fc4812 --- /dev/null +++ b/src/dma/application/comment/dto.py @@ -0,0 +1,52 @@ +from dataclasses import dataclass +from datetime import datetime +from typing import List, TYPE_CHECKING + +from dma.application.common.dto import DTO + +if TYPE_CHECKING: + from dma.application.problem.dto import ProblemMember, ProblemStatement + from dma.application.stage.dto import Result, Suggestion + + +@dataclass(frozen=True) +class Comment(DTO): + id: int + text: str + posted: datetime + problem_member_id: int + + commentator: "ProblemMember" + + +@dataclass(frozen=True) +class ProblemStatementComment(DTO): + id: int + problem_statement_id: int + parent_comment_id: int + + problem_statement: "ProblemStatement" + parent: "ProblemStatementComment" + child_comments: List["ProblemStatementComment"] + + +@dataclass(frozen=True) +class SuggestionComment(DTO): + id: int + suggestion_id: int + parent_comment_id: int + + suggestion: "Suggestion" + parent: "SuggestionComment" + child_comments: List["SuggestionComment"] + + +@dataclass(frozen=True) +class ResultComment(DTO): + id: int + result_id: int + parent_comment_id: int + + result: "Result" + parent: "ResultComment" + child_comments: List["ResultComment"] diff --git a/src/app/infrastucture/__init__.py b/src/dma/application/comment/exceptions.py similarity index 100% rename from src/app/infrastucture/__init__.py rename to src/dma/application/comment/exceptions.py diff --git a/src/app/infrastucture/database/__init__.py b/src/dma/application/comment/interfaces.py similarity index 100% rename from src/app/infrastucture/database/__init__.py rename to src/dma/application/comment/interfaces.py diff --git a/src/app/infrastucture/database/migrations/__init__.py b/src/dma/application/common/__init__.py similarity index 100% rename from src/app/infrastucture/database/migrations/__init__.py rename to src/dma/application/common/__init__.py diff --git a/src/dma/application/common/dto.py b/src/dma/application/common/dto.py new file mode 100644 index 0000000..f0f8c5f --- /dev/null +++ b/src/dma/application/common/dto.py @@ -0,0 +1,12 @@ +import datetime + +from abc import ABC + + +class DTO(ABC): # noqa: B024 + pass + + +class StartedEndedAtMixin(DTO): + started_at: datetime.datetime + ended_at: datetime.datetime diff --git a/src/dma/application/common/exceptions.py b/src/dma/application/common/exceptions.py new file mode 100644 index 0000000..397eafa --- /dev/null +++ b/src/dma/application/common/exceptions.py @@ -0,0 +1,18 @@ +class ApplicationException(Exception): # noqa: N818 + """Base application exception""" + + @property + def title(self) -> str: + return "An application error occurred" + + +class GatewayError(ApplicationException): + pass + + +class DatabaseGatewayError(GatewayError): + pass + + +class ObjectStorageGatewayError(GatewayError): + pass diff --git a/src/dma/application/common/filters.py b/src/dma/application/common/filters.py new file mode 100644 index 0000000..aab5196 --- /dev/null +++ b/src/dma/application/common/filters.py @@ -0,0 +1,5 @@ +from abc import ABC + + +class Filters(ABC): # noqa: B024 + pass diff --git a/src/dma/application/common/interfaces.py b/src/dma/application/common/interfaces.py new file mode 100644 index 0000000..a48d8ca --- /dev/null +++ b/src/dma/application/common/interfaces.py @@ -0,0 +1,57 @@ +import abc +import io + +from typing import Callable, Protocol + + +class ObjectStorageGateway(Protocol): + @abc.abstractmethod + async def upload_file(self, file_path: str, name: str) -> None: + raise NotImplementedError + + @abc.abstractmethod + async def upload_file_object(self, file_object: io.BytesIO, name: str) -> None: + raise NotImplementedError + + @abc.abstractmethod + async def delete_object(self, name: str) -> None: + raise NotImplementedError + + @abc.abstractmethod + async def delete_all_objects(self) -> None: + raise NotImplementedError + + @abc.abstractmethod + async def get_file_presigned_url(self, name: str, expires_in: int) -> str: + raise NotImplementedError + + @abc.abstractmethod + async def get_file_object(self, name: str) -> io.BytesIO: + raise NotImplementedError + + +class MessageQueueGateway(Protocol): + @abc.abstractmethod + async def publish( + self, + *message_bodies: dict, + routing_key: str, + exchange_name: str | None = None, + ) -> None: + raise NotImplementedError + + @abc.abstractmethod + async def consume( + self, + queue_name: str, + callback: Callable, + ) -> None: + raise NotImplementedError + + @abc.abstractmethod + async def create_queue(self, name: str) -> None: + raise NotImplementedError + + @abc.abstractmethod + async def delete_queue(self, name: str) -> None: + raise NotImplementedError diff --git a/src/dma/application/common/pagination.py b/src/dma/application/common/pagination.py new file mode 100644 index 0000000..46fd613 --- /dev/null +++ b/src/dma/application/common/pagination.py @@ -0,0 +1,59 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from enum import Enum +from typing import Generic, List, TypeVar + +from dma.application.common.dto import DTO + + +Item = TypeVar("Item") + + +class SortOrder(str, Enum): + ASC = "ASC" + DESC = "DESC" + + +class Pagination: + pass + + +class PaginationResult(ABC): + @classmethod + @abstractmethod + def from_pagination(cls, pagination: Pagination, total: int) -> "PaginationResult": + raise NotImplementedError + + +@dataclass(frozen=True) +class LimitOffsetPagination(Pagination): + limit: int | None = None + offset: int | None = None + order: SortOrder = SortOrder.ASC + + +@dataclass(frozen=True) +class LimitOffsetPaginationResult(DTO, PaginationResult): + limit: int | None + offset: int | None + order: SortOrder + total: int + + @classmethod + def from_pagination( + cls, + pagination: LimitOffsetPagination, # type: ignore[override] + total: int, + ) -> "LimitOffsetPaginationResult": + return cls( + offset=pagination.offset, + limit=pagination.limit, + order=pagination.order, + total=total, + ) + + +@dataclass(frozen=True) +class PaginatedItems(DTO, Generic[Item]): + data: List[Item] + pagination: LimitOffsetPaginationResult diff --git a/src/app/infrastucture/database/models/__init__.py b/src/dma/application/problem/__init__.py similarity index 100% rename from src/app/infrastucture/database/models/__init__.py rename to src/dma/application/problem/__init__.py diff --git a/src/dma/application/problem/dto.py b/src/dma/application/problem/dto.py new file mode 100644 index 0000000..f2c76f5 --- /dev/null +++ b/src/dma/application/problem/dto.py @@ -0,0 +1,91 @@ +from dataclasses import dataclass +from typing import List, TypeAlias, TYPE_CHECKING + +from dma.application.common.dto import DTO +from dma.application.common.pagination import PaginatedItems + + +if TYPE_CHECKING: + from dma.application.comment.dto import Comment, ProblemStatementComment + from dma.application.stage.dto import Suggestion, SuggestionStage, VotingStage + from dma.application.user.dto import User + + +@dataclass(frozen=True) +class Problem(DTO): + id: int + title: str + description: str + creator_id: int + private: bool + state_id: int + + +@dataclass(frozen=True) +class ProblemCreate(DTO): + title: str + description: str + creator_id: int + private: bool + state_id: int + + +@dataclass(frozen=True) +class ProblemUpdate(DTO): + id: int + title: str | None = None + description: str | None = None + private: bool | None = None + state_id: int | None = None + + +@dataclass(frozen=True) +class ProblemWithRelations(Problem): + state: "ProblemState" + creator: "User" + problem_members: List["ProblemMember"] + suggestion_stage: "SuggestionStage" + suggestions: List["Suggestion"] + voting_stage: "VotingStage" + + +@dataclass(frozen=True) +class ProblemMember(DTO): + id: int + user_id: int + problem_id: int + + user: "User" + problem: "Problem" + comments: List["Comment"] + + +@dataclass(frozen=True) +class ProblemState(DTO): + id: int + name: str + + +@dataclass(frozen=True) +class ProblemStateCreate(DTO): + name: str + + +@dataclass(frozen=True) +class ProblemStateWithRelations(ProblemState): + problems: List["Problem"] + + +@dataclass(frozen=True) +class ProblemStatement(DTO): + id: int + description: str + content_path: str | None + problem_id: int + + problem: "Problem" + comments: List["ProblemStatementComment"] + + +Problems: TypeAlias = PaginatedItems[Problem] +ProblemStates: TypeAlias = PaginatedItems[ProblemState] diff --git a/src/dma/application/problem/exceptions.py b/src/dma/application/problem/exceptions.py new file mode 100644 index 0000000..a0ef96c --- /dev/null +++ b/src/dma/application/problem/exceptions.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass + +from dma.application.common.exceptions import DatabaseGatewayError + + +class ProblemDatabaseGatewayError(DatabaseGatewayError): + pass + + +class ProblemMemberDatabaseGatewayError(DatabaseGatewayError): + pass + + +class ProblemStateDatabaseGatewayError(DatabaseGatewayError): + pass + + +@dataclass(eq=False) +class ProblemIdNotExists(ProblemDatabaseGatewayError): # noqa: N818 + id: int + + @property + def title(self) -> str: + return f"A problem with id {self.id} does not exist" + + +@dataclass(eq=False) +class ProblemStateIdNotExists(ProblemStateDatabaseGatewayError): # noqa: N818 + id: int + + @property + def title(self) -> str: + return f"A problem state with id {self.id} does not exist" + + +@dataclass(eq=False) +class ProblemStateNameNotExists(ProblemStateDatabaseGatewayError): # noqa: N818 + name: str + + @property + def title(self) -> str: + return f"A problem state with name {self.name} does not exist" diff --git a/src/dma/application/problem/filters.py b/src/dma/application/problem/filters.py new file mode 100644 index 0000000..cd34c39 --- /dev/null +++ b/src/dma/application/problem/filters.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass + +from dma.application.common.filters import Filters + + +@dataclass(frozen=True) +class ProblemFilters(Filters): + ... + + +@dataclass(frozen=True) +class ProblemStateFilters(Filters): + ... diff --git a/src/app/infrastucture/database/repositories/__init__.py b/src/dma/application/problem/interfaces.py similarity index 100% rename from src/app/infrastucture/database/repositories/__init__.py rename to src/dma/application/problem/interfaces.py diff --git a/src/app/presentation/__init__.py b/src/dma/application/stage/__init__.py similarity index 100% rename from src/app/presentation/__init__.py rename to src/dma/application/stage/__init__.py diff --git a/src/dma/application/stage/dto.py b/src/dma/application/stage/dto.py new file mode 100644 index 0000000..6083ca0 --- /dev/null +++ b/src/dma/application/stage/dto.py @@ -0,0 +1,67 @@ +from dataclasses import dataclass +from typing import List, TYPE_CHECKING + +from dma.application.common.dto import DTO, StartedEndedAtMixin + + +if TYPE_CHECKING: + from dma.application.comment.dto import ResultComment, SuggestionComment + from dma.application.problem.dto import Problem + + +@dataclass(frozen=True) +class SuggestionStage(StartedEndedAtMixin): + id: int + problem_id: int + + problem: "Problem" + + +@dataclass(frozen=True) +class Suggestion(DTO): + id: int + title: str + description: str + content_path: str | None + creator_id: int + problem_id: int + + problem: "Problem" + suggestion_votes: List["SuggestionVote"] + comments: List["SuggestionComment"] + best: "Result" + + +@dataclass(frozen=True) +class VotingStage(StartedEndedAtMixin): + id: int + problem_id: int + + problem: "Problem" + suggestions_on_vote: List["SuggestionVote"] + + +@dataclass(frozen=True) +class SuggestionVote(DTO): + id: int + voter_id: int + suggestion_id: int + voting_id: int + + suggestion: "Suggestion" + voting: "VotingStage" + + +@dataclass(frozen=True) +class Result(DTO): + id: int + title: str + suggestion_id: int + decision: str + content_path: str | None + + suggestion: "Suggestion" + comments: List["ResultComment"] + + + diff --git a/src/dma/application/stage/exceptions.py b/src/dma/application/stage/exceptions.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/application/stage/interfaces.py b/src/dma/application/stage/interfaces.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/application/user/__init__.py b/src/dma/application/user/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/application/user/dto.py b/src/dma/application/user/dto.py new file mode 100644 index 0000000..44d4906 --- /dev/null +++ b/src/dma/application/user/dto.py @@ -0,0 +1,49 @@ +from dataclasses import dataclass +from typing import List, TypeAlias, TYPE_CHECKING + +from dma.application.common.dto import DTO +from dma.application.common.pagination import PaginatedItems + + +if TYPE_CHECKING: + from dma.application.problem.dto import Problem, ProblemMember + + +@dataclass(frozen=True) +class User(DTO): + id: int + nickname: str + fullname: str + email: str + photo_path: str | None + reputation: int + + +@dataclass(frozen=True) +class UserWithPassword(User): + password: str + + +@dataclass(frozen=True) +class UserCreate(DTO): + nickname: str + fullname: str + email: str + password: str + + +@dataclass(frozen=True) +class UserUpdate(DTO): + id: int + fullname: str | None = None + email: str | None = None + photo_path: str | None = None + + +@dataclass(frozen=True) +class UserWithRelations(User): + problems_created: List["Problem"] + member_of: List["ProblemMember"] + + +Users: TypeAlias = PaginatedItems[User] diff --git a/src/dma/application/user/exceptions.py b/src/dma/application/user/exceptions.py new file mode 100644 index 0000000..226874d --- /dev/null +++ b/src/dma/application/user/exceptions.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass + +from dma.application.common.exceptions import DatabaseGatewayError + + +class UserDatabaseGatewayError(DatabaseGatewayError): + pass + + +@dataclass(eq=False) +class UserIdNotExists(UserDatabaseGatewayError): # noqa: N818 + id: int + + @property + def title(self) -> str: + return f"A user with id {self.id} does not exist" + + +@dataclass(eq=False) +class UserNicknameNotExists(UserDatabaseGatewayError): # noqa: N818 + nickname: str + + @property + def title(self) -> str: + return f"A user with nickname `{self.nickname}` does not exist" diff --git a/src/dma/application/user/filters.py b/src/dma/application/user/filters.py new file mode 100644 index 0000000..fbc8aec --- /dev/null +++ b/src/dma/application/user/filters.py @@ -0,0 +1,8 @@ +from dataclasses import dataclass + +from dma.application.common.filters import Filters + + +@dataclass(frozen=True) +class UserFilters(Filters): + ... diff --git a/src/dma/application/user/interfaces.py b/src/dma/application/user/interfaces.py new file mode 100644 index 0000000..7db9a5e --- /dev/null +++ b/src/dma/application/user/interfaces.py @@ -0,0 +1,31 @@ +import abc + +from typing import Protocol + +from dma.application.common.pagination import Pagination +from dma.application.user import dto +from dma.application.user.filters import UserFilters + + +class UserGateway(Protocol): + @abc.abstractmethod + async def get_user_by_id(self, id_: int) -> dto.User: + raise NotImplementedError + + @abc.abstractmethod + async def get_user_by_nickname(self, nickname: str) -> dto.User: + raise NotImplementedError + + @abc.abstractmethod + async def get_users( + self, filters: UserFilters, pagination: Pagination, + ) -> dto.Users: + raise NotImplementedError + + @abc.abstractmethod + async def create_user(self, user_dto: dto.User) -> dto.User: + raise NotImplementedError + + @abc.abstractmethod + async def update_user(self, user_dto: dto.User) -> dto.User: + raise NotImplementedError diff --git a/src/dma/domain/__init__.py b/src/dma/domain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/__init__.py b/src/dma/infrastructure/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/base.py b/src/dma/infrastructure/base.py new file mode 100644 index 0000000..2d60223 --- /dev/null +++ b/src/dma/infrastructure/base.py @@ -0,0 +1,11 @@ +import aioboto3 + + +class AIOBotoGateway: + """ + Generic AIOBoto3 gateway that requires + an initialized session (with access-secret keys) + """ + + def __init__(self, session: aioboto3.Session): + self.session = session diff --git a/src/dma/infrastructure/config/__init__.py b/src/dma/infrastructure/config/__init__.py new file mode 100644 index 0000000..1ff81f8 --- /dev/null +++ b/src/dma/infrastructure/config/__init__.py @@ -0,0 +1,11 @@ +from .models import AppConfig, Config, DatabaseConfig, ObjectStorageConfig +from .parsers import load_config + + +__all__ = [ + "AppConfig", + "Config", + "DatabaseConfig", + "ObjectStorageConfig", + "load_config", +] diff --git a/src/dma/infrastructure/config/models/__init__.py b/src/dma/infrastructure/config/models/__init__.py new file mode 100644 index 0000000..4d3a649 --- /dev/null +++ b/src/dma/infrastructure/config/models/__init__.py @@ -0,0 +1,14 @@ +from .application import AppConfig +from .database import DatabaseConfig +from .main import Config +from .object_storage import ObjectStorageConfig +from .message_queue import MessageQueueConfig + + +__all__ = [ + "AppConfig", + "Config", + "DatabaseConfig", + "ObjectStorageConfig", + "MessageQueueConfig", +] diff --git a/src/app/infrastucture/config/models/application.py b/src/dma/infrastructure/config/models/application.py similarity index 100% rename from src/app/infrastucture/config/models/application.py rename to src/dma/infrastructure/config/models/application.py diff --git a/src/dma/infrastructure/config/models/database.py b/src/dma/infrastructure/config/models/database.py new file mode 100644 index 0000000..f3f7a2a --- /dev/null +++ b/src/dma/infrastructure/config/models/database.py @@ -0,0 +1,23 @@ +from dataclasses import dataclass + + +@dataclass +class DatabaseConfig: + host: str + port: int + database: str + user: str + password: str + echo: bool + + # default values + rdbms: str = "postgresql" + connector: str = "psycopg" + + @property + def full_url(self) -> str: + return "{}+{}://{}:{}@{}:{}/{}".format( + self.rdbms, self.connector, + self.user, self.password, + self.host, self.port, self.database, + ) diff --git a/src/app/infrastucture/config/models/main.py b/src/dma/infrastructure/config/models/main.py similarity index 51% rename from src/app/infrastucture/config/models/main.py rename to src/dma/infrastructure/config/models/main.py index b5ce7f7..3902904 100644 --- a/src/app/infrastucture/config/models/main.py +++ b/src/dma/infrastructure/config/models/main.py @@ -2,9 +2,13 @@ from .application import AppConfig from .database import DatabaseConfig +from .object_storage import ObjectStorageConfig +from .message_queue import MessageQueueConfig @dataclass class Config: app_config: AppConfig db_config: DatabaseConfig + storage_config: ObjectStorageConfig + message_queue_config: MessageQueueConfig diff --git a/src/dma/infrastructure/config/models/message_queue.py b/src/dma/infrastructure/config/models/message_queue.py new file mode 100644 index 0000000..1ba1568 --- /dev/null +++ b/src/dma/infrastructure/config/models/message_queue.py @@ -0,0 +1,24 @@ +from dataclasses import dataclass + + +@dataclass +class MessageQueueConfig: + host: str + port: str + username: str = "guest" + password: str = "guest" + connector_prefix: str = "amqp" + + # options that are not usable in the full url + connection_pool_max_size: int = 3 + channel_pool_max_size: int = 15 + batch_size: int = 200 + default_exchange_name: str = "decision_making_app" + + @property + def full_url(self) -> str: + return "{}://{}:{}@{}:{}".format( + self.connector_prefix, + self.username, self.password, + self.host, self.port, + ) diff --git a/src/dma/infrastructure/config/models/object_storage.py b/src/dma/infrastructure/config/models/object_storage.py new file mode 100644 index 0000000..3ddd47a --- /dev/null +++ b/src/dma/infrastructure/config/models/object_storage.py @@ -0,0 +1,8 @@ +from dataclasses import dataclass + + +@dataclass +class ObjectStorageConfig: + access_key: str + secret_key: str + bucket_name: str diff --git a/src/dma/infrastructure/config/parsers/__init__.py b/src/dma/infrastructure/config/parsers/__init__.py new file mode 100644 index 0000000..6982681 --- /dev/null +++ b/src/dma/infrastructure/config/parsers/__init__.py @@ -0,0 +1,6 @@ +from .main import load_config + + +__all__ = [ + "load_config", +] diff --git a/src/dma/infrastructure/config/parsers/main.py b/src/dma/infrastructure/config/parsers/main.py new file mode 100644 index 0000000..78652d6 --- /dev/null +++ b/src/dma/infrastructure/config/parsers/main.py @@ -0,0 +1,61 @@ +import configparser +import os + +from dma.infrastructure.config.models import ( + AppConfig, + Config, + DatabaseConfig, + ObjectStorageConfig, + MessageQueueConfig, +) + + +DEFAULT_CONFIG_PATH: str = "./config/local.ini" + + +def load_config(path: str | None = None) -> Config: + if path is None: + path = os.getenv("CONFIG_PATH", DEFAULT_CONFIG_PATH) + + parser = configparser.ConfigParser() + parser.read(path) + + application_data = parser["application"] + database_data = parser["database"] + object_storage_data = parser["object_storage"] + message_queue_data = parser["message_queue"] + + application_config = AppConfig( + host=application_data.get("host"), + port=application_data.getint("port"), + logging_level=application_data.get("logging_level"), + ) + database_config = DatabaseConfig( + host=database_data.get("host"), + port=database_data.getint("port"), + database=database_data.get("database"), + user=database_data.get("user"), + password=database_data.get("password"), + echo=database_data.getboolean("echo"), + ) + object_storage_config = ObjectStorageConfig( + access_key=object_storage_data.get("access_key"), + secret_key=object_storage_data.get("secret_key"), + bucket_name=object_storage_data.get("bucket_name"), + ) + message_queue_config = MessageQueueConfig( + host=message_queue_data.get("host"), + port=message_queue_data.get("port"), + username=message_queue_data.get("username"), + password=message_queue_data.get("password"), + connection_pool_max_size=message_queue_data.getint("connection_pool_max_size"), + channel_pool_max_size=message_queue_data.getint("channel_pool_max_size"), + default_exchange_name=message_queue_data.get("default_exchange_name"), + ) + + return Config( + application_config, + database_config, + object_storage_config, + message_queue_config, + ) diff --git a/src/dma/infrastructure/database/__init__.py b/src/dma/infrastructure/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/database/converters/__init__.py b/src/dma/infrastructure/database/converters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/database/converters/problem.py b/src/dma/infrastructure/database/converters/problem.py new file mode 100644 index 0000000..f489b5b --- /dev/null +++ b/src/dma/infrastructure/database/converters/problem.py @@ -0,0 +1,75 @@ +from dataclasses import fields + +from dma.application.problem import dto +from dma.infrastructure.database.models.problem import ( + Problem as ProblemModel, + ProblemState as ProblemStateModel, +) + + +def convert_db_model_to_problem_dto(problem: ProblemModel) -> dto.Problem: + return dto.Problem( + id=problem.id, + title=problem.title, + description=problem.description, + creator_id=problem.creator_id, + private=problem.private, + state_id=problem.state_id, + ) + + +def convert_problem_dto_to_db_model(problem_dto: dto.Problem) -> ProblemModel: + return ProblemModel( + id=problem_dto.id, + title=problem_dto.title, + description=problem_dto.description, + creator_id=problem_dto.creator_id, + private=problem_dto.private, + state_id=problem_dto.state_id, + ) + + +def convert_problem_create_dto_to_db_model( + problem_dto: dto.ProblemCreate, +) -> ProblemModel: + return ProblemModel( + title=problem_dto.title, + description=problem_dto.description, + creator_id=problem_dto.creator_id, + private=problem_dto.private, + state_id=problem_dto.state_id, + ) + + +def update_problem_fields( + existing_problem: dto.Problem, problem_update_dto: dto.ProblemUpdate, +) -> ProblemModel: + result_model = ProblemModel() + for field in fields(existing_problem): + existing_field_value = getattr(existing_problem, field.name) + + if hasattr(problem_update_dto, field.name): + new_value = getattr(problem_update_dto, field.name) + else: + new_value = None + + settable_value = new_value if new_value is not None else existing_field_value + setattr(result_model, field.name, settable_value) + return result_model + + +def convert_problem_state_create_dto_to_db_model( + problem_state_dto: dto.ProblemStateCreate, +) -> ProblemStateModel: + return ProblemStateModel( + name=problem_state_dto.name, + ) + + +def convert_db_model_to_problem_state_dto( + problem: ProblemStateModel, +) -> dto.ProblemState: + return dto.ProblemState( + id=problem.id, + name=problem.name, + ) diff --git a/src/dma/infrastructure/database/converters/user.py b/src/dma/infrastructure/database/converters/user.py new file mode 100644 index 0000000..7c32cea --- /dev/null +++ b/src/dma/infrastructure/database/converters/user.py @@ -0,0 +1,52 @@ +from dataclasses import fields + +from dma.application.user import dto +from dma.infrastructure.database.models.user import User as UserModel + + +def convert_db_model_to_user_dto(user_model: UserModel) -> dto.User: + return dto.User( + id=user_model.id, + nickname=user_model.nickname, + fullname=user_model.fullname, + email=user_model.email, + photo_path=user_model.photo_path, + reputation=user_model.reputation, + ) + + +def convert_user_dto_to_db_model(user_dto: dto.User) -> UserModel: + return UserModel( + id=user_dto.id, + nickname=user_dto.nickname, + fullname=user_dto.fullname, + email=user_dto.email, + photo_path=user_dto.photo_path, + reputation=user_dto.reputation, + ) + + +def convert_user_create_dto_to_db_model(user_dto: dto.UserCreate) -> UserModel: + return UserModel( + nickname=user_dto.nickname, + fullname=user_dto.fullname, + email=user_dto.email, + password=user_dto.password, + ) + + +def update_user_fields( + existing_user: dto.User, user_update_dto: dto.UserUpdate, +) -> UserModel: + result_model = UserModel() + for field in fields(existing_user): + existing_field_value = getattr(existing_user, field.name) + + if hasattr(user_update_dto, field.name): + new_value = getattr(user_update_dto, field.name) + else: + new_value = None + + settable_value = new_value if new_value is not None else existing_field_value + setattr(result_model, field.name, settable_value) + return result_model diff --git a/src/dma/infrastructure/database/exception_mapper.py b/src/dma/infrastructure/database/exception_mapper.py new file mode 100644 index 0000000..74d4a3c --- /dev/null +++ b/src/dma/infrastructure/database/exception_mapper.py @@ -0,0 +1,25 @@ +from collections.abc import Callable +from functools import wraps +from typing import Any, Coroutine, ParamSpec, TypeVar + +from sqlalchemy.exc import SQLAlchemyError + +from dma.application.common.exceptions import DatabaseGatewayError + + +Param = ParamSpec("Param") +ReturnType = TypeVar("ReturnType") +Func = Callable[Param, ReturnType] + + +def exception_mapper( + func: Callable[Param, Coroutine[Any, Any, ReturnType]], +) -> Callable[Param, Coroutine[Any, Any, ReturnType]]: + @wraps(func) + async def wrapped(*args: Param.args, **kwargs: Param.kwargs) -> ReturnType: + try: + return await func(*args, **kwargs) + except SQLAlchemyError as err: + raise DatabaseGatewayError from err + + return wrapped diff --git a/src/dma/infrastructure/database/factory.py b/src/dma/infrastructure/database/factory.py new file mode 100644 index 0000000..85b0ae4 --- /dev/null +++ b/src/dma/infrastructure/database/factory.py @@ -0,0 +1,35 @@ +from collections.abc import AsyncGenerator + +from sqlalchemy.ext.asyncio import ( + AsyncEngine, + AsyncSession, + async_sessionmaker, + create_async_engine, +) + +from dma.infrastructure.config.models.database import DatabaseConfig + + +async def build_sa_engine( + db_config: DatabaseConfig, +) -> AsyncGenerator[AsyncEngine, None]: + engine = create_async_engine( + db_config.full_url, + echo=True, + echo_pool=db_config.echo, + pool_size=50, + ) + yield engine + + await engine.dispose() + + +def build_sa_session_factory(engine: AsyncEngine) -> async_sessionmaker[AsyncSession]: + return async_sessionmaker(bind=engine, autoflush=False, expire_on_commit=False) + + +async def build_sa_session( + session_factory: async_sessionmaker[AsyncSession], +) -> AsyncGenerator[AsyncSession, None]: + async with session_factory() as session: + yield session diff --git a/src/dma/infrastructure/database/gateways/__init__.py b/src/dma/infrastructure/database/gateways/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/database/gateways/base.py b/src/dma/infrastructure/database/gateways/base.py new file mode 100644 index 0000000..92b2fb6 --- /dev/null +++ b/src/dma/infrastructure/database/gateways/base.py @@ -0,0 +1,6 @@ +from sqlalchemy.ext.asyncio import AsyncSession + + +class SQLAlchemyGateway: + def __init__(self, session: AsyncSession) -> None: + self.session = session diff --git a/src/dma/infrastructure/database/gateways/problem.py b/src/dma/infrastructure/database/gateways/problem.py new file mode 100644 index 0000000..ee50daa --- /dev/null +++ b/src/dma/infrastructure/database/gateways/problem.py @@ -0,0 +1,212 @@ +from typing import Iterable, NoReturn + +from sqlalchemy import func, select, Select +from sqlalchemy.exc import DBAPIError, IntegrityError +from sqlalchemy.ext.asyncio import AsyncSession + +from dma.application.common.pagination import ( + LimitOffsetPagination, + LimitOffsetPaginationResult, + SortOrder, +) +from dma.application.common.exceptions import DatabaseGatewayError +from dma.application.problem import dto +from dma.application.problem.filters import ProblemFilters, ProblemStateFilters +from dma.application.problem.exceptions import ( + ProblemIdNotExists, + ProblemStateIdNotExists, + ProblemStateNameNotExists, +) +from dma.infrastructure.database.converters.problem import ( + convert_db_model_to_problem_dto, + convert_db_model_to_problem_state_dto, + convert_problem_create_dto_to_db_model, + convert_problem_state_create_dto_to_db_model, + update_problem_fields, +) +from dma.infrastructure.database.exception_mapper import exception_mapper +from dma.infrastructure.database.models.problem import ( + Problem as ProblemModel, + ProblemState as ProblemStateModel, +) +from .base import SQLAlchemyGateway + + +class ProblemMemberGatewayImpl(SQLAlchemyGateway): + def _parse_error(self, error: DBAPIError) -> NoReturn: + raise NotImplementedError + + +class ProblemStateGatewayImpl(SQLAlchemyGateway): + @exception_mapper + async def create_problem_state( + self, problem_state_dto: dto.ProblemStateCreate, + ) -> dto.ProblemState: + database_problem_state = convert_problem_state_create_dto_to_db_model( + problem_state_dto, + ) + self.session.add(database_problem_state) + + try: + await self.session.flush((database_problem_state,)) + except IntegrityError as error: + self._parse_error(error) + + return convert_db_model_to_problem_state_dto(database_problem_state) + + @exception_mapper + async def get_problem_state_by_id(self, id_: int) -> dto.ProblemState: + problem_state: ProblemStateModel | None = await self.session.get( + ProblemStateModel, id_, + ) + + if problem_state is None: + raise ProblemStateIdNotExists(id_) + + return convert_db_model_to_problem_state_dto(problem_state) + + @exception_mapper + async def get_problem_state_by_name(self, name: str) -> dto.ProblemState: + statement = select(ProblemStateModel).where(ProblemStateModel.name == name) + problem_state: ProblemStateModel | None = await self.session.scalar(statement) + + if problem_state is None: + raise ProblemStateNameNotExists(name) + + return convert_db_model_to_problem_state_dto(problem_state) + + @exception_mapper + async def get_problem_states( + self, + filters: ProblemStateFilters, + pagination: LimitOffsetPagination, + ) -> dto.ProblemStates: + statement = select(ProblemStateModel) + statement = self._apply_filters(statement, filters) + statement = self._apply_pagination(statement, pagination) + + result: Iterable[ProblemStateModel] = await self.session.scalars(statement) + problem_states = [ + convert_db_model_to_problem_state_dto(problem_state) + for problem_state in result + ] + problem_states_count = await self._get_problem_states_count(filters) + return dto.ProblemStates( + data=problem_states, + pagination=LimitOffsetPaginationResult.from_pagination( + pagination, total=problem_states_count, + ), + ) + + # noinspection PyMethodMayBeStatic + def _apply_filters(self, statement: Select, filters: ProblemStateFilters) -> Select: # noqa + return statement + + # noinspection PyMethodMayBeStatic + def _apply_pagination(self, statement: Select, pagination: LimitOffsetPagination) -> Select: # noqa + return statement + + def _parse_error(self, error: DBAPIError) -> NoReturn: + raise NotImplementedError + + async def _get_problem_states_count(self, filters: ProblemStateFilters) -> int: + statement = select(func.count(ProblemStateModel.id)) + statement = self._apply_filters(statement, filters) + problem_states_count: int | None = await self.session.scalar(statement) + return problem_states_count if problem_states_count is not None else 0 + + +class ProblemGatewayImpl(SQLAlchemyGateway): + def __init__(self, session: AsyncSession): + super().__init__(session=session) + + self.state_gateway = ProblemStateGatewayImpl(session) + self.member_gateway = ProblemMemberGatewayImpl(session) + + @exception_mapper + async def get_problem_by_id(self, id_: int) -> dto.Problem: + problem: ProblemModel | None = await self.session.get(ProblemModel, id_) + + if problem is None: + raise ProblemIdNotExists(id_) + + return convert_db_model_to_problem_dto(problem) + + @exception_mapper + async def get_problems( + self, filters: ProblemFilters, pagination: LimitOffsetPagination, + ) -> dto.Problems: + statement = select(ProblemModel) + statement = self._apply_filters(statement, filters) + statement = self._apply_pagination(statement, pagination) + + result: Iterable[ProblemModel] = await self.session.scalars(statement) + problems = [convert_db_model_to_problem_dto(problem) for problem in result] + problems_count = await self._get_problems_count(filters) + return dto.Problems( + data=problems, + pagination=LimitOffsetPaginationResult.from_pagination( + pagination, total=problems_count, + ), + ) + + @exception_mapper + async def create_problem(self, problem_dto: dto.ProblemCreate) -> dto.Problem: + database_problem = convert_problem_create_dto_to_db_model(problem_dto) + self.session.add(database_problem) + + try: + await self.session.flush((database_problem,)) + except IntegrityError as error: + self._parse_error(error) + + return convert_db_model_to_problem_dto(database_problem) + + @exception_mapper + async def update_problem(self, problem_dto: dto.ProblemUpdate) -> dto.Problem: + existing_problem_dto: dto.Problem = await self.get_problem_by_id(problem_dto.id) + existing_problem: ProblemModel = update_problem_fields( + existing_problem=existing_problem_dto, + problem_update_dto=problem_dto, + ) + + try: + await self.session.merge(existing_problem) + except IntegrityError as error: + self._parse_error(error) + + return convert_db_model_to_problem_dto(existing_problem) + + # noinspection PyMethodMayBeStatic + # TODO: implement proper error handling + def _parse_error(self, error: DBAPIError) -> NoReturn: + match error.orig.diag.constraint_name: # type: ignore + case _: + raise DatabaseGatewayError from error + + # noinspection PyMethodMayBeStatic + # TODO: implement necessary filters for the Problem + def _apply_filters(self, statement: Select, filters: ProblemFilters) -> Select: # noqa + return statement + + # noinspection PyMethodMayBeStatic + def _apply_pagination( + self, statement: Select, pagination: LimitOffsetPagination, + ) -> Select: + if pagination.order is SortOrder.ASC: + statement = statement.order_by(ProblemModel.id.asc()) + else: + statement = statement.order_by(ProblemModel.id.desc()) + + if pagination.offset is not None: + statement = statement.offset(pagination.offset) + if pagination.limit is not None: + statement = statement.limit(pagination.limit) + + return statement + + async def _get_problems_count(self, filters: ProblemFilters) -> int: + statement = select(func.count(ProblemModel.id)) + statement = self._apply_filters(statement, filters) + problems_count: int | None = await self.session.scalar(statement) + return problems_count if problems_count is not None else 0 diff --git a/src/dma/infrastructure/database/gateways/user.py b/src/dma/infrastructure/database/gateways/user.py new file mode 100644 index 0000000..ef306ab --- /dev/null +++ b/src/dma/infrastructure/database/gateways/user.py @@ -0,0 +1,126 @@ +from typing import Iterable, NoReturn + +from sqlalchemy import func, select, Select +from sqlalchemy.exc import DBAPIError, IntegrityError + +from dma.application.common.pagination import ( + LimitOffsetPagination, + LimitOffsetPaginationResult, + SortOrder, +) +from dma.application.common.exceptions import DatabaseGatewayError +from dma.application.user import dto +from dma.application.user.exceptions import ( + UserIdNotExists, + UserNicknameNotExists, +) +from dma.application.user.filters import UserFilters +from dma.infrastructure.database.converters.user import ( + convert_db_model_to_user_dto, + convert_user_create_dto_to_db_model, + update_user_fields, +) +from dma.infrastructure.database.exception_mapper import exception_mapper +from dma.infrastructure.database.models.user import User as UserModel + +from .base import SQLAlchemyGateway + + +class UserGatewayImpl(SQLAlchemyGateway): + @exception_mapper + async def get_user_by_id(self, id_: int) -> dto.User: + user: UserModel | None = await self.session.get(UserModel, id_) + + if user is None: + raise UserIdNotExists(id_) + + return convert_db_model_to_user_dto(user) + + @exception_mapper + async def get_user_by_nickname(self, nickname: str) -> dto.User: + statement = select(UserModel).where(UserModel.nickname == nickname) + user: UserModel | None = await self.session.scalar(statement) + + if user is None: + raise UserNicknameNotExists(nickname) + + return convert_db_model_to_user_dto(user) + + @exception_mapper + async def get_users( + self, filters: UserFilters, pagination: LimitOffsetPagination, + ) -> dto.Users: + statement = select(UserModel) + statement = self._apply_filters(statement, filters) + statement = self._apply_pagination(statement, pagination) + + result: Iterable[UserModel] = await self.session.scalars(statement) + users = [convert_db_model_to_user_dto(user) for user in result] + users_count = await self._get_users_count(filters) + return dto.Users( + data=users, + pagination=LimitOffsetPaginationResult.from_pagination( + pagination, total=users_count, + ), + ) + + @exception_mapper + async def create_user(self, user_dto: dto.UserCreate) -> dto.User: + database_user = convert_user_create_dto_to_db_model(user_dto) + self.session.add(database_user) + + try: + await self.session.flush((database_user,)) + except IntegrityError as error: + self._parse_error(error) + + return convert_db_model_to_user_dto(database_user) + + @exception_mapper + async def update_user(self, user_dto: dto.UserUpdate) -> dto.User: + existing_user: dto.User = await self.get_user_by_id(user_dto.id) + updated_user: UserModel = update_user_fields( + existing_user=existing_user, + user_update_dto=user_dto, + ) + + try: + await self.session.merge(updated_user) + except IntegrityError as error: + self._parse_error(error) + + return convert_db_model_to_user_dto(updated_user) + + # noinspection PyMethodMayBeStatic + # TODO: implement proper error handling + def _parse_error(self, error: DBAPIError) -> NoReturn: + match error.orig.diag.constraint_name: # type: ignore + case _: + raise DatabaseGatewayError from error + + # noinspection PyMethodMayBeStatic + # TODO: implement necessary filters for the User + def _apply_filters(self, statement: Select, filters: UserFilters) -> Select: # noqa + return statement + + # noinspection PyMethodMayBeStatic + def _apply_pagination( + self, statement: Select, pagination: LimitOffsetPagination, + ) -> Select: + if pagination.order is SortOrder.ASC: + statement = statement.order_by(UserModel.id.asc()) + else: + statement = statement.order_by(UserModel.id.desc()) + + if pagination.offset is not None: + statement = statement.offset(pagination.offset) + if pagination.limit is not None: + statement = statement.limit(pagination.limit) + + return statement + + async def _get_users_count(self, filters: UserFilters) -> int: + statement = select(func.count(UserModel.id)) + statement = self._apply_filters(statement, filters) + users_count: int | None = await self.session.scalar(statement) + return users_count if users_count is not None else 0 diff --git a/src/app/infrastucture/database/migrations/README b/src/dma/infrastructure/database/migrations/README similarity index 100% rename from src/app/infrastucture/database/migrations/README rename to src/dma/infrastructure/database/migrations/README diff --git a/src/dma/infrastructure/database/migrations/__init__.py b/src/dma/infrastructure/database/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/app/infrastucture/database/migrations/env.py b/src/dma/infrastructure/database/migrations/env.py similarity index 74% rename from src/app/infrastucture/database/migrations/env.py rename to src/dma/infrastructure/database/migrations/env.py index 9f2d519..47d19da 100644 --- a/src/app/infrastucture/database/migrations/env.py +++ b/src/dma/infrastructure/database/migrations/env.py @@ -7,6 +7,9 @@ from alembic import context +from dma.infrastructure.config.parsers.main import load_config +from dma.infrastructure.database.models.base import BaseModel + # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config @@ -16,16 +19,10 @@ if config.config_file_name is not None: fileConfig(config.config_file_name) -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -target_metadata = None +target_metadata = BaseModel.metadata -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. +if not (full_url := config.get_main_option("sqlalchemy.url")): + full_url = load_config().db_config.full_url def run_migrations_offline() -> None: @@ -40,9 +37,8 @@ def run_migrations_offline() -> None: script output. """ - url = config.get_main_option("sqlalchemy.url") context.configure( - url=url, + url=full_url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, @@ -69,6 +65,8 @@ async def run_async_migrations() -> None: config.get_section(config.config_ini_section, {}), prefix="sqlalchemy.", poolclass=pool.NullPool, + future=True, + url=full_url, ) async with connectable.connect() as connection: @@ -78,9 +76,15 @@ async def run_async_migrations() -> None: def run_migrations_online() -> None: - """Run migrations in 'online' mode.""" - - asyncio.run(run_async_migrations()) + """Run migrations in 'online' mode. + In this scenario we need to create an Engine + and associate a connection with the context. + """ + connectable = config.attributes.get("connection", None) + if connectable is None: + asyncio.run(run_async_migrations()) + else: + do_run_migrations(connectable) if context.is_offline_mode(): diff --git a/src/app/infrastucture/database/migrations/script.py.mako b/src/dma/infrastructure/database/migrations/script.py.mako similarity index 100% rename from src/app/infrastucture/database/migrations/script.py.mako rename to src/dma/infrastructure/database/migrations/script.py.mako diff --git a/src/dma/infrastructure/database/migrations/versions/563a3bad61c9_initial.py b/src/dma/infrastructure/database/migrations/versions/563a3bad61c9_initial.py new file mode 100644 index 0000000..5616cc6 --- /dev/null +++ b/src/dma/infrastructure/database/migrations/versions/563a3bad61c9_initial.py @@ -0,0 +1,166 @@ +"""Initial + +Revision ID: 563a3bad61c9 +Revises: +Create Date: 2023-12-09 20:00:32.160164 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '563a3bad61c9' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('problem_states', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=20), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_problem_states')) + ) + op.create_table('users', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('nickname', sa.String(length=20), nullable=False), + sa.Column('fullname', sa.String(), nullable=False), + sa.Column('password', sa.String(), nullable=False), + sa.Column('email', sa.String(), nullable=False), + sa.Column('photo_path', sa.String(), nullable=True), + sa.Column('reputation', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), + sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_users')) + ) + op.create_table('problems', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('title', sa.String(length=20), nullable=False), + sa.Column('description', sa.String(), nullable=False), + sa.Column('creator_id', sa.Integer(), nullable=False), + sa.Column('private', sa.Boolean(), nullable=False), + sa.Column('state_id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), + sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['creator_id'], ['users.id'], name=op.f('fk_problems_creator_id_users')), + sa.ForeignKeyConstraint(['state_id'], ['problem_states.id'], name=op.f('fk_problems_state_id_problem_states')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_problems')) + ) + op.create_table('problem_members', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('problem_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['problem_id'], ['problems.id'], name=op.f('fk_problem_members_problem_id_problems')), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_problem_members_user_id_users')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_problem_members')) + ) + op.create_table('problem_statements', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('description', sa.String(), nullable=False), + sa.Column('content_path', sa.String(), nullable=True), + sa.Column('problem_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['problem_id'], ['problems.id'], name=op.f('fk_problem_statements_problem_id_problems')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_problem_statements')) + ) + op.create_table('suggestion_stages', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('problem_id', sa.Integer(), nullable=False), + sa.Column('started_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('ended_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['problem_id'], ['problems.id'], name=op.f('fk_suggestion_stages_problem_id_problems')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_suggestion_stages')) + ) + op.create_table('voting_stages', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('problem_id', sa.Integer(), nullable=False), + sa.Column('started_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('ended_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['problem_id'], ['problems.id'], name=op.f('fk_voting_stages_problem_id_problems')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_voting_stages')) + ) + op.create_table('comments', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('text', sa.String(length=100), nullable=False), + sa.Column('posted', sa.DateTime(timezone=True), nullable=False), + sa.Column('problem_member_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['problem_member_id'], ['problem_members.id'], name=op.f('fk_comments_problem_member_id_problem_members')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_comments')) + ) + op.create_table('problem_statement_comments', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('problem_statement_id', sa.Integer(), nullable=False), + sa.Column('parent_comment_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['parent_comment_id'], ['problem_statement_comments.id'], name=op.f('fk_problem_statement_comments_parent_comment_id_problem_statement_comments')), + sa.ForeignKeyConstraint(['problem_statement_id'], ['problem_statements.id'], name=op.f('fk_problem_statement_comments_problem_statement_id_problem_statements')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_problem_statement_comments')) + ) + op.create_table('suggestions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('title', sa.String(length=20), nullable=False), + sa.Column('description', sa.String(), nullable=False), + sa.Column('content_path', sa.String(), nullable=True), + sa.Column('creator_id', sa.Integer(), nullable=False), + sa.Column('problem_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['creator_id'], ['problem_members.id'], name=op.f('fk_suggestions_creator_id_problem_members')), + sa.ForeignKeyConstraint(['problem_id'], ['problems.id'], name=op.f('fk_suggestions_problem_id_problems')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_suggestions')) + ) + op.create_table('results', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('title', sa.String(length=20), nullable=False), + sa.Column('suggestion_id', sa.Integer(), nullable=False), + sa.Column('decision', sa.String(), nullable=False), + sa.Column('content_path', sa.String(), nullable=True), + sa.ForeignKeyConstraint(['suggestion_id'], ['suggestions.id'], name=op.f('fk_results_suggestion_id_suggestions')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_results')) + ) + op.create_table('suggestion_comments', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('suggestion_id', sa.Integer(), nullable=False), + sa.Column('parent_comment_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['parent_comment_id'], ['suggestion_comments.id'], name=op.f('fk_suggestion_comments_parent_comment_id_suggestion_comments')), + sa.ForeignKeyConstraint(['suggestion_id'], ['suggestions.id'], name=op.f('fk_suggestion_comments_suggestion_id_suggestions')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_suggestion_comments')) + ) + op.create_table('suggestion_votes', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('voter_id', sa.Integer(), nullable=False), + sa.Column('suggestion_id', sa.Integer(), nullable=False), + sa.Column('voting_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['suggestion_id'], ['suggestions.id'], name=op.f('fk_suggestion_votes_suggestion_id_suggestions')), + sa.ForeignKeyConstraint(['voter_id'], ['problem_members.id'], name=op.f('fk_suggestion_votes_voter_id_problem_members')), + sa.ForeignKeyConstraint(['voting_id'], ['voting_stages.id'], name=op.f('fk_suggestion_votes_voting_id_voting_stages')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_suggestion_votes')) + ) + op.create_table('result_comments', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('result_id', sa.Integer(), nullable=False), + sa.Column('parent_comment_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['parent_comment_id'], ['result_comments.id'], name=op.f('fk_result_comments_parent_comment_id_result_comments')), + sa.ForeignKeyConstraint(['result_id'], ['results.id'], name=op.f('fk_result_comments_result_id_results')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_result_comments')) + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('result_comments') + op.drop_table('suggestion_votes') + op.drop_table('suggestion_comments') + op.drop_table('results') + op.drop_table('suggestions') + op.drop_table('problem_statement_comments') + op.drop_table('comments') + op.drop_table('voting_stages') + op.drop_table('suggestion_stages') + op.drop_table('problem_statements') + op.drop_table('problem_members') + op.drop_table('problems') + op.drop_table('users') + op.drop_table('problem_states') + # ### end Alembic commands ### diff --git a/src/dma/infrastructure/database/migrations/versions/bba922808903_add_problemstate_values.py b/src/dma/infrastructure/database/migrations/versions/bba922808903_add_problemstate_values.py new file mode 100644 index 0000000..6c2ed1f --- /dev/null +++ b/src/dma/infrastructure/database/migrations/versions/bba922808903_add_problemstate_values.py @@ -0,0 +1,48 @@ +"""Add ProblemState values + +Revision ID: bba922808903 +Revises: 563a3bad61c9 +Create Date: 2023-12-25 21:46:29.128828 + +""" +import enum +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'bba922808903' +down_revision: Union[str, None] = '563a3bad61c9' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +class ProblemStateEnum(str, enum.Enum): + ACTIVE = "ACTIVE" + DELAYED = "DELAYED" + SUGGESTING = "SUGGESTING" + VOTING = "VOTING" + COMPLETED = "COMPLETED" + CANCELLED = "CANCELLED" + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.execute( + f'''INSERT INTO problem_states (name) VALUES + {','.join([f"('{state.value}')" for state in ProblemStateEnum])}; + ''' + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.execute( + """ + TRUNCATE problem_states CASCADE; + """ + ) + # ### end Alembic commands ### diff --git a/src/dma/infrastructure/database/models/__init__.py b/src/dma/infrastructure/database/models/__init__.py new file mode 100644 index 0000000..2ca0a36 --- /dev/null +++ b/src/dma/infrastructure/database/models/__init__.py @@ -0,0 +1,37 @@ +from .base import BaseModel +from .comment import ( + Comment, + ProblemStatementComment, + ResultComment, + SuggestionComment, +) +from .problem import Problem, ProblemState +from .problem_member import ProblemMember +from .stage import ( + ProblemStatement, + Result, + Suggestion, + SuggestionStage, + SuggestionVote, + VotingStage, +) +from .user import User + + +__all__ = [ + "BaseModel", + "Comment", + "Problem", + "ProblemMember", + "ProblemState", + "ProblemStatement", + "ProblemStatementComment", + "Result", + "ResultComment", + "Suggestion", + "SuggestionComment", + "SuggestionStage", + "SuggestionVote", + "User", + "VotingStage", +] diff --git a/src/dma/infrastructure/database/models/base.py b/src/dma/infrastructure/database/models/base.py new file mode 100644 index 0000000..24604eb --- /dev/null +++ b/src/dma/infrastructure/database/models/base.py @@ -0,0 +1,51 @@ +import datetime + +from sqlalchemy import func, MetaData, DateTime +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, registry + + +convention = { + "ix": "ix_%(column_0_label)s", # INDEX + "uq": "uq_%(table_name)s_%(column_0_N_name)s", # UNIQUE + "ck": "ck_%(table_name)s_%(constraint_name)s", # CHECK + "fk": "fk_%(table_name)s_%(column_0_N_name)s_%(referred_table_name)s", # FK + "pk": "pk_%(table_name)s", # PRIMARY KEY +} + +mapper_registry = registry(metadata=MetaData(naming_convention=convention)) + + +class BaseModel(DeclarativeBase): + registry = mapper_registry + metadata = mapper_registry.metadata + + +class CreatedUpdatedAtMixin(BaseModel): + """ + A model mixin that adds `created_at` and `updated_at` timestamp fields + """ + __abstract__ = True + + created_at: Mapped[datetime.datetime] = mapped_column( + nullable=False, + server_default=func.now(), + ) + updated_at: Mapped[datetime.datetime] = mapped_column( + nullable=False, + server_default=func.now(), + onupdate=func.now(), + ) + + +class StartedEndedAtMixin(BaseModel): + """ + A model mixin that adds `started_at` and `ended_at` timestamp fields + """ + __abstract__ = True + + started_at: Mapped[datetime.datetime] = mapped_column( + DateTime(timezone=True), + nullable=False, + server_default=func.now(), + ) + ended_at: Mapped[datetime.datetime] = mapped_column(DateTime(timezone=True)) diff --git a/src/dma/infrastructure/database/models/comment.py b/src/dma/infrastructure/database/models/comment.py new file mode 100644 index 0000000..c44e6e6 --- /dev/null +++ b/src/dma/infrastructure/database/models/comment.py @@ -0,0 +1,83 @@ +from datetime import datetime +from typing import TYPE_CHECKING + +from sqlalchemy import String, ForeignKey, DateTime +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column, relationship + +from .base import BaseModel + +if TYPE_CHECKING: + from .problem_member import ProblemMember + from .stage import ProblemStatement, Suggestion, Result + + +class Comment(BaseModel): + __tablename__ = "comments" + + id: Mapped[int] = mapped_column(primary_key=True) + text: Mapped[str] = mapped_column(String(100)) + posted: Mapped[datetime] = mapped_column(DateTime(timezone=True)) + problem_member_id: Mapped[int] = mapped_column(ForeignKey("problem_members.id")) + + commentator: Mapped["ProblemMember"] = relationship( + back_populates="comments", + ) + + +class ProblemStatementComment(BaseModel): + __tablename__ = "problem_statement_comments" + + id: Mapped[int] = mapped_column(primary_key=True) + problem_statement_id: Mapped[int] = mapped_column( + ForeignKey("problem_statements.id"), + ) + parent_comment_id: Mapped[int] = mapped_column( + ForeignKey("problem_statement_comments.id"), + ) + + problem_statement: Mapped["ProblemStatement"] = relationship( + back_populates="comments", + ) + parent: Mapped["ProblemStatementComment"] = relationship( + back_populates="child_comments", remote_side=[id], + ) + child_comments: Mapped[list["ProblemStatementComment"]] = relationship( + back_populates="parent", + ) + + +class SuggestionComment(BaseModel): + __tablename__ = "suggestion_comments" + + id: Mapped[int] = mapped_column(primary_key=True) + suggestion_id: Mapped[int] = mapped_column(ForeignKey("suggestions.id")) + parent_comment_id: Mapped[int] = mapped_column(ForeignKey("suggestion_comments.id")) + + suggestion: Mapped["Suggestion"] = relationship( + back_populates="comments", + ) + parent: Mapped["SuggestionComment"] = relationship( + back_populates="child_comments", remote_side=[id], + ) + child_comments: Mapped[list["SuggestionComment"]] = relationship( + back_populates="parent", + ) + + +class ResultComment(BaseModel): + __tablename__ = "result_comments" + + id: Mapped[int] = mapped_column(primary_key=True) + result_id: Mapped[int] = mapped_column(ForeignKey("results.id")) + parent_comment_id: Mapped[int] = mapped_column(ForeignKey("result_comments.id")) + + result: Mapped["Result"] = relationship( + back_populates="comments", + ) + parent: Mapped["ResultComment"] = relationship( + back_populates="child_comments", remote_side=[id], + ) + child_comments: Mapped[list["ResultComment"]] = relationship( + back_populates="parent", + ) diff --git a/src/dma/infrastructure/database/models/problem.py b/src/dma/infrastructure/database/models/problem.py new file mode 100644 index 0000000..486c858 --- /dev/null +++ b/src/dma/infrastructure/database/models/problem.py @@ -0,0 +1,57 @@ +from typing import TYPE_CHECKING + +from sqlalchemy import String, ForeignKey +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column, relationship + +from .base import BaseModel, CreatedUpdatedAtMixin + + +if TYPE_CHECKING: + from .user import User + from .stage import ProblemStatement, SuggestionStage, VotingStage, Suggestion + from .problem_member import ProblemMember + + +class Problem(CreatedUpdatedAtMixin): + __tablename__ = "problems" + + id: Mapped[int] = mapped_column(primary_key=True) + title: Mapped[str] = mapped_column(String(20)) + description: Mapped[str] + creator_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + private: Mapped[bool] + state_id: Mapped[int] = mapped_column(ForeignKey("problem_states.id")) + + state: Mapped["ProblemState"] = relationship( + back_populates="problems", + ) + creator: Mapped["User"] = relationship( + back_populates="created_problems", + ) + problem_members: Mapped[list["ProblemMember"]] = relationship( + back_populates="problem", + ) + problem_statement: Mapped["ProblemStatement"] = relationship( + back_populates="problem", + ) + suggestion_stage: Mapped["SuggestionStage"] = relationship( + back_populates="problem", + ) + suggestions: Mapped[list["Suggestion"]] = relationship( + back_populates="problem", + ) + voting_stage: Mapped["VotingStage"] = relationship( + back_populates="problem", + ) + + +class ProblemState(BaseModel): + __tablename__ = "problem_states" + + id: Mapped[int] = mapped_column(primary_key=True) + name: Mapped[str] = mapped_column(String(20)) + + problems: Mapped[list["Problem"]] = relationship( + back_populates="state", + ) diff --git a/src/dma/infrastructure/database/models/problem_member.py b/src/dma/infrastructure/database/models/problem_member.py new file mode 100644 index 0000000..b6a4bce --- /dev/null +++ b/src/dma/infrastructure/database/models/problem_member.py @@ -0,0 +1,24 @@ +from typing import TYPE_CHECKING + +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column, relationship + +from .base import BaseModel + +if TYPE_CHECKING: + from .problem import Problem + from .user import User + from .comment import Comment + + +class ProblemMember(BaseModel): + __tablename__ = "problem_members" + + id: Mapped[int] = mapped_column(primary_key=True) + user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + problem_id: Mapped[int] = mapped_column(ForeignKey("problems.id")) + + user: Mapped["User"] = relationship(back_populates="member_of") + problem: Mapped["Problem"] = relationship(back_populates="problem_members") + comments: Mapped[list["Comment"]] = relationship(back_populates="commentator") diff --git a/src/dma/infrastructure/database/models/stage.py b/src/dma/infrastructure/database/models/stage.py new file mode 100644 index 0000000..27f19c0 --- /dev/null +++ b/src/dma/infrastructure/database/models/stage.py @@ -0,0 +1,109 @@ +from typing import TYPE_CHECKING + +from sqlalchemy import String, ForeignKey +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column, relationship + +from .base import BaseModel, StartedEndedAtMixin + +if TYPE_CHECKING: + from .problem import Problem + from .comment import ProblemStatementComment, SuggestionComment, ResultComment + + +class ProblemStatement(BaseModel): + __tablename__ = "problem_statements" + + id: Mapped[int] = mapped_column(primary_key=True) + description: Mapped[str] + content_path: Mapped[str | None] + problem_id: Mapped[int] = mapped_column(ForeignKey("problems.id")) + + problem: Mapped["Problem"] = relationship( + back_populates="problem_statement", + ) + comments: Mapped[list["ProblemStatementComment"]] = relationship( + back_populates="problem_statement", + ) + + +class SuggestionStage(StartedEndedAtMixin): + __tablename__ = "suggestion_stages" + + id: Mapped[int] = mapped_column(primary_key=True) + problem_id: Mapped[int] = mapped_column(ForeignKey("problems.id")) + + problem: Mapped["Problem"] = relationship( + back_populates="suggestion_stage", + ) + + +class Suggestion(BaseModel): + __tablename__ = "suggestions" + + id: Mapped[int] = mapped_column(primary_key=True) + title: Mapped[str] = mapped_column(String(20)) + description: Mapped[str] + content_path: Mapped[str | None] + creator_id: Mapped[int] = mapped_column(ForeignKey("problem_members.id")) + problem_id: Mapped[int] = mapped_column(ForeignKey("problems.id")) + + problem: Mapped["Problem"] = relationship( + back_populates="suggestions", + ) + suggestion_votes: Mapped[list["SuggestionVote"]] = relationship( + back_populates="suggestion", + ) + comments: Mapped[list["SuggestionComment"]] = relationship( + back_populates="suggestion", + ) + best: Mapped["Result"] = relationship( + back_populates="suggestion", + ) + + +class VotingStage(StartedEndedAtMixin): + __tablename__ = "voting_stages" + + id: Mapped[int] = mapped_column(primary_key=True) + problem_id: Mapped[int] = mapped_column(ForeignKey("problems.id")) + + problem: Mapped["Problem"] = relationship( + back_populates="voting_stage", + ) + suggestions_on_vote: Mapped[list["SuggestionVote"]] = relationship( + back_populates="voting", + ) + + +class SuggestionVote(BaseModel): + __tablename__ = "suggestion_votes" + + id: Mapped[int] = mapped_column(primary_key=True) + voter_id: Mapped[int] = mapped_column(ForeignKey("problem_members.id")) + suggestion_id: Mapped[int] = mapped_column(ForeignKey("suggestions.id")) + voting_id: Mapped[int] = mapped_column(ForeignKey("voting_stages.id")) + + suggestion: Mapped["Suggestion"] = relationship( + back_populates="suggestion_votes", + ) + voting: Mapped["VotingStage"] = relationship( + back_populates="suggestions_on_vote", + ) + + +class Result(BaseModel): + __tablename__ = "results" + + id: Mapped[int] = mapped_column(primary_key=True) + title: Mapped[str] = mapped_column(String(20)) + suggestion_id: Mapped[int] = mapped_column(ForeignKey("suggestions.id")) + decision: Mapped[str] + content_path: Mapped[str | None] + + suggestion: Mapped["Suggestion"] = relationship( + back_populates="best", + ) + comments: Mapped[list["ResultComment"]] = relationship( + back_populates="result", + ) diff --git a/src/dma/infrastructure/database/models/user.py b/src/dma/infrastructure/database/models/user.py new file mode 100644 index 0000000..aee56d5 --- /dev/null +++ b/src/dma/infrastructure/database/models/user.py @@ -0,0 +1,26 @@ +from typing import TYPE_CHECKING + +from sqlalchemy import String, Integer +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column, relationship + +from .base import CreatedUpdatedAtMixin + +if TYPE_CHECKING: + from .problem import Problem + from .problem_member import ProblemMember + + +class User(CreatedUpdatedAtMixin): + __tablename__ = "users" + + id: Mapped[int] = mapped_column(primary_key=True) + nickname: Mapped[str] = mapped_column(String(20)) + fullname: Mapped[str] + password: Mapped[str] + email: Mapped[str] + photo_path: Mapped[str | None] + reputation: Mapped[int] = mapped_column(Integer(), default=0) + + created_problems: Mapped[list["Problem"]] = relationship(back_populates="creator") + member_of: Mapped[list["ProblemMember"]] = relationship(back_populates="user") diff --git a/src/dma/infrastructure/log/__init__.py b/src/dma/infrastructure/log/__init__.py new file mode 100644 index 0000000..f9a8884 --- /dev/null +++ b/src/dma/infrastructure/log/__init__.py @@ -0,0 +1,6 @@ +from .main import configure_logging + + +__all__ = [ + "configure_logging", +] diff --git a/src/dma/infrastructure/log/formatters/__init__.py b/src/dma/infrastructure/log/formatters/__init__.py new file mode 100644 index 0000000..00b15f9 --- /dev/null +++ b/src/dma/infrastructure/log/formatters/__init__.py @@ -0,0 +1,6 @@ +from .main import MainConsoleFormatter + + +__all__ = [ + "MainConsoleFormatter", +] diff --git a/src/app/infrastucture/log/formatters/main.py b/src/dma/infrastructure/log/formatters/main.py similarity index 89% rename from src/app/infrastucture/log/formatters/main.py rename to src/dma/infrastructure/log/formatters/main.py index 530114b..e9a6cb7 100644 --- a/src/app/infrastucture/log/formatters/main.py +++ b/src/dma/infrastructure/log/formatters/main.py @@ -1,4 +1,5 @@ import logging +from typing import ClassVar, Dict class MainConsoleFormatter(logging.Formatter): @@ -9,7 +10,7 @@ class MainConsoleFormatter(logging.Formatter): RESET = "\x1b[0m" FORMAT = "%(asctime)s - %(levelname)s - %(message)s" - FORMATS = { + FORMATS: ClassVar[Dict[int, str]] = { logging.DEBUG: GREY + FORMAT + RESET, logging.INFO: GREEN + FORMAT + RESET, logging.WARNING: YELLOW + FORMAT + RESET, diff --git a/src/app/infrastucture/log/main.py b/src/dma/infrastructure/log/main.py similarity index 53% rename from src/app/infrastucture/log/main.py rename to src/dma/infrastructure/log/main.py index e7ecddf..12beb19 100644 --- a/src/app/infrastucture/log/main.py +++ b/src/dma/infrastructure/log/main.py @@ -1,14 +1,17 @@ import logging -from src.app.infrastucture.config.models.application import AppConfig -from src.app.infrastucture.log.formatters import MainConsoleFormatter +from dma.infrastructure.config.models.application import AppConfig +from dma.infrastructure.log.formatters import MainConsoleFormatter DEFAULT_LOGGING_LEVEL: int = logging.INFO def configure_logging(config: AppConfig) -> None: - logging_level: int = config.logging_level if config.logging_level else DEFAULT_LOGGING_LEVEL + if config.logging_level: + logging_level: int = logging.getLevelName(config.logging_level) + else: + logging_level = DEFAULT_LOGGING_LEVEL console_handler = logging.StreamHandler() console_handler.setLevel(logging_level) diff --git a/src/dma/infrastructure/message_queue/__init__.py b/src/dma/infrastructure/message_queue/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/message_queue/gateway.py b/src/dma/infrastructure/message_queue/gateway.py new file mode 100644 index 0000000..56c4a3f --- /dev/null +++ b/src/dma/infrastructure/message_queue/gateway.py @@ -0,0 +1,133 @@ +import asyncio +from typing import Callable, Coroutine + +import orjson +from aio_pika import ( + Channel, + Connection, + ExchangeType, + Message, + connect_robust, +) +from aio_pika.abc import ( + AbstractExchange, + AbstractIncomingMessage, + AbstractRobustConnection, + DeliveryMode, +) +from aio_pika.pool import Pool + +from dma.infrastructure.config.models import MessageQueueConfig +from dma.application.common.interfaces import MessageQueueGateway + +from .iterables import batched + + +class MessageQueueGatewayImpl(MessageQueueGateway): + def __init__( + self, + settings: MessageQueueConfig, + batch_size: int | None = None, + ): + self._settings = settings + self._batch_size = batch_size if batch_size is not None else settings.batch_size + + self.connection_pool: Pool[Connection] = Pool( + self._get_connection, + max_size=settings.connection_pool_max_size, + ) + self.channel_pool: Pool[Channel] = Pool( + self._get_channel, + max_size=settings.channel_pool_max_size, + ) + self.default_exchange_name = settings.default_exchange_name + + async def publish( + self, + *message_bodies: dict, + routing_key: str, + exchange_name: str | None = None, + ) -> None: + async with self.channel_pool.acquire() as channel: + exchange = await self._get_exchange( + channel, + exchange_name=exchange_name or self.default_exchange_name, + ) + + messages = (self._serialize_message(m) for m in message_bodies) + for messages_batch in batched( + messages, + self._batch_size, + ): + tasks = [ + exchange.publish(message=m, routing_key=routing_key) + for m in messages_batch + ] + await asyncio.gather(*tasks) + + async def consume( + self, + queue_name: str, + callback: Callable[[AbstractIncomingMessage], Coroutine], + ) -> None: + async with self.channel_pool.acquire() as channel: + queue = await channel.get_queue(queue_name, ensure=True) + await queue.consume(callback, exclusive=True) # type: ignore + + async def create_exchange( + self, + name: str, + type_: ExchangeType = ExchangeType.TOPIC, + ) -> None: + async with self.channel_pool.acquire() as channel: + await channel.declare_exchange(name, type_) + + async def create_queue(self, name: str) -> None: + async with self.channel_pool.acquire() as channel: + await channel.declare_queue(name) + + async def bid_queue( + self, + queue_name: str, + routing_key: str, + exchange_name: str, + ) -> bool: + async with self.channel_pool.acquire() as channel: + queue = await channel.get_queue(queue_name) + exchange = await self._get_exchange(channel, exchange_name=exchange_name) + result = await queue.bind(exchange=exchange, routing_key=routing_key) + return result.name == "Queue.BindOk" + + async def delete_exchange(self, name: str) -> None: + async with self.channel_pool.acquire() as channel: + await channel.exchange_delete(name) + + async def delete_queue(self, name: str) -> None: + async with self.channel_pool.acquire() as channel: + await channel.queue_delete(name) + + async def shutdown(self) -> None: + await self.channel_pool.close() + await self.connection_pool.close() + + @staticmethod + def _serialize_message( + body: dict, + delivery_mode: DeliveryMode = DeliveryMode.PERSISTENT, + ) -> Message: + return Message(body=orjson.dumps(body), delivery_mode=delivery_mode) + + async def _get_exchange( + self, + channel: Channel, + exchange_name: str | None, + ) -> AbstractExchange: + exchange_name = exchange_name or self.default_exchange_name + return await channel.get_exchange(name=exchange_name, ensure=True) + + async def _get_connection(self) -> AbstractRobustConnection: + return await connect_robust(self._settings.full_url) + + async def _get_channel(self) -> Channel: + async with self.connection_pool.acquire() as connection: + return await connection.channel() # type: ignore diff --git a/src/dma/infrastructure/message_queue/iterables.py b/src/dma/infrastructure/message_queue/iterables.py new file mode 100644 index 0000000..d54b83d --- /dev/null +++ b/src/dma/infrastructure/message_queue/iterables.py @@ -0,0 +1,11 @@ +from itertools import islice +from typing import Iterable + + +def batched(iterable: Iterable, batch_size: int): + error_msg: str = "batch_size must be at least one" + if batch_size < 1: + raise ValueError(error_msg) + it = iter(iterable) + while batch := tuple(islice(it, batch_size)): + yield batch diff --git a/src/dma/infrastructure/object_storage/__init__.py b/src/dma/infrastructure/object_storage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/object_storage/factory.py b/src/dma/infrastructure/object_storage/factory.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/infrastructure/object_storage/gateway.py b/src/dma/infrastructure/object_storage/gateway.py new file mode 100644 index 0000000..890d685 --- /dev/null +++ b/src/dma/infrastructure/object_storage/gateway.py @@ -0,0 +1,65 @@ +import io + +import aioboto3 +from types_aiobotocore_s3.service_resource import Bucket, S3ServiceResource +from types_aiobotocore_s3.client import S3Client + +from dma.infrastructure.base import AIOBotoGateway + + +class ObjectStorageGatewayImpl(AIOBotoGateway): + def __init__( + self, + session: aioboto3.Session, + bucket_name: str, + endpoint_url: str | None = None, + ) -> None: + super().__init__(session=session) + self.bucket_name = bucket_name + self.bucket: Bucket | None = None + + self._endpoint_url = endpoint_url + + @property + def s3_resource_context(self) -> S3ServiceResource: + return self.session.resource(service_name="s3", endpoint_url=self._endpoint_url) # type: ignore + + @property + def s3_client_context(self) -> S3Client: + return self.session.client(service_name="s3") # type: ignore + + async def upload_file(self, file_path: str, name: str) -> None: + async with self.s3_resource_context as s3_resource: + self.bucket = await s3_resource.Bucket(self.bucket_name) + await self.bucket.upload_file(Filename=file_path, Key=name) + + async def upload_file_object(self, file_object: io.BytesIO, name: str) -> None: + async with self.s3_resource_context as s3_resource: + self.bucket = await s3_resource.Bucket(self.bucket_name) + await self.bucket.upload_fileobj(Fileobj=file_object, Key=name) + + async def delete_object(self, name: str) -> None: + async with self.s3_resource_context as s3_resource: + self.bucket = await s3_resource.Bucket(self.bucket_name) + await self.bucket.objects.filter(Prefix=name).delete() + + async def delete_all_objects(self) -> None: + async with self.s3_resource_context as s3_resource: + self.bucket = await s3_resource.Bucket(self.bucket_name) + await self.bucket.objects.all().delete() + + async def get_file_presigned_url(self, name: str, expires_in: int = 3_600) -> str: + async with self.s3_client_context as s3_client: + return await s3_client.generate_presigned_url( + "get_object", + Params={"Bucket": self.bucket_name, "Key": name}, + ExpiresIn=expires_in, + ) + + async def get_file_object(self, name: str) -> io.BytesIO: + async with self.s3_resource_context as s3_resource: + bytes_io = io.BytesIO() + self.bucket = await s3_resource.Bucket(self.bucket_name) + await self.bucket.download_fileobj(Key=name, Fileobj=bytes_io) + bytes_io.seek(0) + return bytes_io diff --git a/src/dma/presentation/__init__.py b/src/dma/presentation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dma/presentation/api/__init__.py b/src/dma/presentation/api/__init__.py new file mode 100644 index 0000000..3e952c5 --- /dev/null +++ b/src/dma/presentation/api/__init__.py @@ -0,0 +1,6 @@ +from .v1 import main + + +__all__ = [ + "main", +] diff --git a/src/app/presentation/api/v1/__init__.py b/src/dma/presentation/api/v1/__init__.py similarity index 100% rename from src/app/presentation/api/v1/__init__.py rename to src/dma/presentation/api/v1/__init__.py diff --git a/src/app/presentation/api/v1/__main__.py b/src/dma/presentation/api/v1/__main__.py similarity index 71% rename from src/app/presentation/api/v1/__main__.py rename to src/dma/presentation/api/v1/__main__.py index cc208d3..61f447c 100644 --- a/src/app/presentation/api/v1/__main__.py +++ b/src/dma/presentation/api/v1/__main__.py @@ -3,11 +3,11 @@ import uvicorn from fastapi import FastAPI -from src.app.infrastucture.config.models import AppConfig, Config -from src.app.infrastucture.config.parsers.main import load_config -from src.app.infrastucture.log.main import configure_logging -from src.app.presentation.api.v1 import controllers, middlewares, providers -from src.app.presentation.api.v1.factory import create_fastapi_app +from dma.infrastructure.config.models import AppConfig, Config +from dma.infrastructure.config.parsers.main import load_config +from dma.infrastructure.log.main import configure_logging +from dma.presentation.api.v1 import controllers, middlewares, providers +from dma.presentation.api.v1.factory import create_fastapi_app logger = logging.getLogger(__name__) diff --git a/src/app/presentation/api/v1/controllers/__init__.py b/src/dma/presentation/api/v1/controllers/__init__.py similarity index 100% rename from src/app/presentation/api/v1/controllers/__init__.py rename to src/dma/presentation/api/v1/controllers/__init__.py diff --git a/src/app/presentation/api/v1/controllers/healthcheck.py b/src/dma/presentation/api/v1/controllers/healthcheck.py similarity index 71% rename from src/app/presentation/api/v1/controllers/healthcheck.py rename to src/dma/presentation/api/v1/controllers/healthcheck.py index a3b18ff..6b00bc0 100644 --- a/src/app/presentation/api/v1/controllers/healthcheck.py +++ b/src/dma/presentation/api/v1/controllers/healthcheck.py @@ -1,6 +1,10 @@ +import logging + from fastapi import APIRouter, status +logger = logging.getLogger(__name__) + healthcheck_router = APIRouter( prefix="/healthcheck", tags=["healthcheck"], @@ -9,4 +13,5 @@ @healthcheck_router.get("/", status_code=status.HTTP_200_OK) async def get_status() -> dict[str, str]: + logger.debug("Healthcheck endpoint called") return {"message": "ok"} diff --git a/src/app/presentation/api/v1/controllers/main.py b/src/dma/presentation/api/v1/controllers/main.py similarity index 100% rename from src/app/presentation/api/v1/controllers/main.py rename to src/dma/presentation/api/v1/controllers/main.py diff --git a/src/app/presentation/api/v1/factory.py b/src/dma/presentation/api/v1/factory.py similarity index 100% rename from src/app/presentation/api/v1/factory.py rename to src/dma/presentation/api/v1/factory.py diff --git a/src/app/presentation/api/v1/middlewares/__init__.py b/src/dma/presentation/api/v1/middlewares/__init__.py similarity index 75% rename from src/app/presentation/api/v1/middlewares/__init__.py rename to src/dma/presentation/api/v1/middlewares/__init__.py index 8a306d0..69d0912 100644 --- a/src/app/presentation/api/v1/middlewares/__init__.py +++ b/src/dma/presentation/api/v1/middlewares/__init__.py @@ -2,5 +2,5 @@ __all__ = [ - "setup" + "setup", ] diff --git a/src/dma/presentation/api/v1/middlewares/main.py b/src/dma/presentation/api/v1/middlewares/main.py new file mode 100644 index 0000000..63583fc --- /dev/null +++ b/src/dma/presentation/api/v1/middlewares/main.py @@ -0,0 +1,5 @@ +from fastapi import FastAPI + + +def setup(app: FastAPI) -> None: # noqa + ... diff --git a/src/app/presentation/api/v1/providers/__init__.py b/src/dma/presentation/api/v1/providers/__init__.py similarity index 75% rename from src/app/presentation/api/v1/providers/__init__.py rename to src/dma/presentation/api/v1/providers/__init__.py index 8a306d0..69d0912 100644 --- a/src/app/presentation/api/v1/providers/__init__.py +++ b/src/dma/presentation/api/v1/providers/__init__.py @@ -2,5 +2,5 @@ __all__ = [ - "setup" + "setup", ] diff --git a/src/dma/presentation/api/v1/providers/main.py b/src/dma/presentation/api/v1/providers/main.py new file mode 100644 index 0000000..63583fc --- /dev/null +++ b/src/dma/presentation/api/v1/providers/main.py @@ -0,0 +1,5 @@ +from fastapi import FastAPI + + +def setup(app: FastAPI) -> None: # noqa + ... diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/infrastructure/__init__.py b/tests/integration/infrastructure/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/infrastructure/database/__init__.py b/tests/integration/infrastructure/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/infrastructure/database/conftest.py b/tests/integration/infrastructure/database/conftest.py new file mode 100644 index 0000000..7c51e24 --- /dev/null +++ b/tests/integration/infrastructure/database/conftest.py @@ -0,0 +1,67 @@ +import os +from typing import AsyncGenerator, Generator + +import pytest +import pytest_asyncio +from alembic.command import downgrade, upgrade +from alembic.config import Config as AlembicConfig +from sqlalchemy.ext.asyncio import ( + AsyncEngine, + AsyncSession, + async_sessionmaker, + create_async_engine, +) +from testcontainers.postgres import PostgresContainer # type: ignore[import-untyped] + + +@pytest.fixture(scope="session") +def postgres_url() -> Generator[str, None, None]: + postgres = PostgresContainer("postgres:15-alpine") + if os.name == "nt": # Note: from testcontainers/testcontainers-python#108 + postgres.get_container_host_ip = lambda: "localhost" + try: + postgres.start() + connection_url = postgres.get_connection_url().replace("psycopg2", "psycopg") + yield connection_url + finally: + postgres.stop() + + +@pytest.fixture(scope="session") +def alembic_config(postgres_url: str) -> AlembicConfig: + config = AlembicConfig("alembic.ini") + config.set_main_option("sqlalchemy.url", postgres_url) + return config + + +@pytest.fixture(scope="function", autouse=True) +def upgrade_database_schema( + alembic_config: AlembicConfig, +) -> Generator[None, None, None]: + upgrade(alembic_config, "head") + yield + downgrade(alembic_config, "base") + + +@pytest.fixture(scope="session") +def engine(postgres_url: str) -> AsyncEngine: + return create_async_engine(url=postgres_url) + + +@pytest_asyncio.fixture() +async def session_factory( + engine: AsyncEngine, +) -> AsyncGenerator[async_sessionmaker[AsyncSession], None]: + session_factory_: async_sessionmaker[AsyncSession] = async_sessionmaker( + bind=engine, expire_on_commit=False, autoflush=False, + ) + yield session_factory_ + await engine.dispose() + + +@pytest_asyncio.fixture() +async def session( + session_factory: async_sessionmaker[AsyncSession], +) -> AsyncGenerator[AsyncSession, None]: + async with session_factory() as session_: + yield session_ diff --git a/tests/integration/infrastructure/database/gateways/__init__.py b/tests/integration/infrastructure/database/gateways/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/infrastructure/database/gateways/conftest.py b/tests/integration/infrastructure/database/gateways/conftest.py new file mode 100644 index 0000000..ebd7238 --- /dev/null +++ b/tests/integration/infrastructure/database/gateways/conftest.py @@ -0,0 +1,25 @@ +import pytest + +from dma.application.problem.dto import ProblemCreate +from dma.application.user.dto import UserCreate + + +@pytest.fixture() +def problem_to_create() -> ProblemCreate: + return ProblemCreate( + title="title", + description="description", + creator_id=1, + private=True, + state_id=1, + ) + + +@pytest.fixture() +def user_to_create() -> UserCreate: + return UserCreate( + nickname="nickname", + fullname="fullname", + email="email", + password="pass", + ) diff --git a/tests/integration/infrastructure/database/gateways/test_problem_gateway.py b/tests/integration/infrastructure/database/gateways/test_problem_gateway.py new file mode 100644 index 0000000..d623c69 --- /dev/null +++ b/tests/integration/infrastructure/database/gateways/test_problem_gateway.py @@ -0,0 +1,225 @@ +import pytest +import pytest_asyncio + +from functools import reduce + +from sqlalchemy.ext.asyncio import AsyncSession + +from dma.application.problem.filters import ProblemFilters +from dma.application.common.pagination import LimitOffsetPagination, SortOrder +from dma.application.problem.dto import ( + Problem as ProblemDTO, + Problems as ProblemsDTO, + ProblemCreate as ProblemCreateDTO, + ProblemUpdate as ProblemUpdateDTO, +) +from dma.application.user.dto import ( + UserCreate as UserCreateDTO, +) +from dma.infrastructure.database.gateways.problem import ProblemGatewayImpl +from dma.infrastructure.database.gateways.user import UserGatewayImpl + + +async def test_create_problem( + session: AsyncSession, + user_to_create: UserCreateDTO, + problem_to_create: ProblemCreateDTO, +): + # we need a user present in the database with id # 1 + user_gateway = UserGatewayImpl(session) + async with session.begin(): + await user_gateway.create_user(user_to_create) + + problem_gateway = ProblemGatewayImpl(session) + async with session.begin(): + problem_dto: ProblemDTO = await problem_gateway.create_problem( + problem_to_create, + ) + + assert problem_dto.title == problem_to_create.title + assert problem_dto.description == problem_to_create.description + assert problem_dto.private == problem_to_create.private + assert isinstance(problem_dto.id, int) + + +async def test_update_problem( + session: AsyncSession, + user_to_create: UserCreateDTO, + problem_to_create: ProblemCreateDTO, +): + # we need a user present in the database with id # 1 + user_gateway = UserGatewayImpl(session) + async with session.begin(): + await user_gateway.create_user(user_to_create) + + problem_gateway = ProblemGatewayImpl(session) + async with session.begin(): + problem_dto: ProblemDTO = await problem_gateway.create_problem( + problem_to_create, + ) + + updated_title, updated_description = "update_title", "updated_description" + problem_to_update = ProblemUpdateDTO( + id=problem_dto.id, + title=updated_title, + description=updated_description, + ) + async with session.begin(): + new_problem_dto: ProblemDTO = await problem_gateway.update_problem( + problem_to_update, + ) + + assert problem_dto.id == new_problem_dto.id + assert problem_dto.creator_id == new_problem_dto.creator_id + assert problem_dto.state_id == new_problem_dto.state_id + assert problem_dto.title != new_problem_dto.title + assert problem_dto.description != new_problem_dto.description + assert new_problem_dto.title == updated_title + assert new_problem_dto.description == updated_description + + +async def test_get_problem_by_id( + session: AsyncSession, + user_to_create: UserCreateDTO, + problem_to_create: ProblemCreateDTO, +): + # we need a user present in the database with id # 1 + user_gateway = UserGatewayImpl(session) + async with session.begin(): + await user_gateway.create_user(user_to_create) + + problem_gateway = ProblemGatewayImpl(session) + async with session.begin(): + created_problem: ProblemDTO = await problem_gateway.create_problem( + problem_to_create, + ) + + problem_dto: ProblemDTO = await problem_gateway.get_problem_by_id( + created_problem.id, + ) + + assert problem_dto.id == created_problem.id + assert problem_dto.title == created_problem.title + assert problem_dto.description == created_problem.description + assert problem_dto.creator_id == created_problem.creator_id + assert problem_dto.state_id == created_problem.state_id + assert problem_dto.private == created_problem.private + + +async def test_get_problems( + session: AsyncSession, + user_to_create: UserCreateDTO, + problem_to_create: ProblemCreateDTO, +): + # we need a user present in the database with id # 1 + user_gateway = UserGatewayImpl(session) + async with session.begin(): + await user_gateway.create_user(user_to_create) + + problem_gateway = ProblemGatewayImpl(session) + + insert_problems_count: int = 10 + + async with session.begin(): + for _ in range(insert_problems_count): + await problem_gateway.create_problem(problem_to_create) + + filters = ProblemFilters() + pagination = LimitOffsetPagination() + result: ProblemsDTO = await problem_gateway.get_problems( + filters=filters, + pagination=pagination, + ) + + assert result.pagination.total == insert_problems_count + assert len(result.data) == insert_problems_count + + +async def test_get_problems_order( + session: AsyncSession, + user_to_create: UserCreateDTO, + problem_to_create: ProblemCreateDTO, +): + # we need a user present in the database with id # 1 + user_gateway = UserGatewayImpl(session) + async with session.begin(): + await user_gateway.create_user(user_to_create) + + problem_gateway = ProblemGatewayImpl(session) + + insert_problems_count: int = 10 + limit: int = 5 + + async with session.begin(): + for _ in range(insert_problems_count): + await problem_gateway.create_problem(problem_to_create) + + filters = ProblemFilters() + pagination = LimitOffsetPagination(limit=5, order=SortOrder.DESC) + result: ProblemsDTO = await problem_gateway.get_problems( + filters=filters, + pagination=pagination, + ) + + assert result.pagination.total == insert_problems_count + assert len(result.data) == limit + + # check every ID will be smaller than previous one + assert reduce( + lambda previous, current: ( + previous[0] and previous[1].id < current.id, current, + ), + result.data, + (True, result.data[0]), + ) + + filters = ProblemFilters() + pagination = LimitOffsetPagination(limit=5, order=SortOrder.ASC) + another_result: ProblemsDTO = await problem_gateway.get_problems( + filters=filters, + pagination=pagination, + ) + + assert another_result.pagination.total == insert_problems_count + assert len(another_result.data) == limit + + # check every ID will be bigger than previous one + assert reduce( + lambda previous, current: ( + previous[0] and previous[1].id > current.id, current, + ), + another_result.data, + (True, another_result.data[0]), + ) + + +async def test_get_problems_limit_offset( + session: AsyncSession, + user_to_create: UserCreateDTO, + problem_to_create: ProblemCreateDTO, +): + # we need a user present in the database with id # 1 + user_gateway = UserGatewayImpl(session) + async with session.begin(): + await user_gateway.create_user(user_to_create) + + problem_gateway = ProblemGatewayImpl(session) + + insert_problems_count: int = 10 + limit: int = 5 + offset: int = 3 + + async with session.begin(): + for _ in range(insert_problems_count): + await problem_gateway.create_problem(problem_to_create) + + filters = ProblemFilters() + pagination = LimitOffsetPagination(limit=limit, offset=offset, order=SortOrder.ASC) + result: ProblemsDTO = await problem_gateway.get_problems( + filters=filters, + pagination=pagination, + ) + + assert result.pagination.total == insert_problems_count + assert len(result.data) == limit + assert all(problem.id == offset + i for i, problem in enumerate(result.data, 1)) diff --git a/tests/integration/infrastructure/database/gateways/test_user_gateway.py b/tests/integration/infrastructure/database/gateways/test_user_gateway.py new file mode 100644 index 0000000..4da3f68 --- /dev/null +++ b/tests/integration/infrastructure/database/gateways/test_user_gateway.py @@ -0,0 +1,190 @@ +import pytest +import pytest_asyncio + +from functools import reduce + +from sqlalchemy.ext.asyncio import AsyncSession + +from dma.application.user.filters import UserFilters +from dma.application.common.pagination import LimitOffsetPagination, SortOrder +from dma.application.user.dto import ( + User as UserDTO, + Users as UsersDTO, + UserCreate as UserCreateDTO, + UserUpdate as UserUpdateDTO, +) +from dma.infrastructure.database.gateways.user import UserGatewayImpl + + +async def test_create_user( + session: AsyncSession, + user_to_create: UserCreateDTO, +): + user_gateway = UserGatewayImpl(session) + async with session.begin(): + user_dto: UserDTO = await user_gateway.create_user(user_to_create) + + assert user_dto.nickname == user_to_create.nickname + assert user_dto.fullname == user_to_create.fullname + assert user_dto.email == user_to_create.email + assert isinstance(user_dto.id, int) + assert isinstance(user_dto.reputation, int) + assert user_dto.reputation == 0 + + +async def test_update_user( + session: AsyncSession, + user_to_create: UserCreateDTO, +): + user_gateway = UserGatewayImpl(session) + async with session.begin(): + user_dto: UserDTO = await user_gateway.create_user(user_to_create) + + updated_email, updated_fullname = "update_email", "updated_fullname" + user_to_update = UserUpdateDTO( + id=user_dto.id, + email=updated_email, + fullname=updated_fullname, + ) + async with session.begin(): + new_user_dto: UserDTO = await user_gateway.update_user(user_to_update) + + assert user_dto.id == new_user_dto.id + assert user_dto.email != new_user_dto.email + assert user_dto.fullname != new_user_dto.fullname + assert new_user_dto.email == updated_email + assert new_user_dto.fullname == updated_fullname + + +async def test_get_user_by_nickname( + session: AsyncSession, + user_to_create: UserCreateDTO, +): + user_gateway = UserGatewayImpl(session) + async with session.begin(): + await user_gateway.create_user(user_to_create) + + user_dto: UserDTO = await user_gateway.get_user_by_nickname( + user_to_create.nickname, + ) + + assert user_dto.nickname == user_to_create.nickname + assert user_dto.fullname == user_to_create.fullname + assert user_dto.email == user_to_create.email + + +async def test_get_user_by_id( + session: AsyncSession, + user_to_create: UserCreateDTO, +): + user_gateway = UserGatewayImpl(session) + async with session.begin(): + created_user: UserDTO = await user_gateway.create_user(user_to_create) + + user_dto: UserDTO = await user_gateway.get_user_by_id(created_user.id) + + assert user_dto.id == created_user.id + assert user_dto.email == created_user.email + assert user_dto.nickname == created_user.nickname + assert user_dto.fullname == created_user.fullname + + +async def test_get_users( + session: AsyncSession, + user_to_create: UserCreateDTO, +): + user_gateway = UserGatewayImpl(session) + + insert_users_count: int = 10 + + async with session.begin(): + for _ in range(insert_users_count): + await user_gateway.create_user(user_to_create) + + filters = UserFilters() + pagination = LimitOffsetPagination() + result: UsersDTO = await user_gateway.get_users( + filters=filters, + pagination=pagination, + ) + + assert result.pagination.total == insert_users_count + assert len(result.data) == insert_users_count + + +async def test_get_users_order( + session: AsyncSession, + user_to_create: UserCreateDTO, +): + user_gateway = UserGatewayImpl(session) + + insert_users_count: int = 10 + limit: int = 5 + + async with session.begin(): + for _ in range(insert_users_count): + await user_gateway.create_user(user_to_create) + + filters = UserFilters() + pagination = LimitOffsetPagination(limit=5, order=SortOrder.DESC) + result: UsersDTO = await user_gateway.get_users( + filters=filters, + pagination=pagination, + ) + + assert result.pagination.total == insert_users_count + assert len(result.data) == limit + + # check every ID will be smaller than previous one + assert reduce( + lambda previous, current: ( + previous[0] and previous[1].id < current.id, current, + ), + result.data, + (True, result.data[0]), + ) + + filters = UserFilters() + pagination = LimitOffsetPagination(limit=5, order=SortOrder.ASC) + another_result: UsersDTO = await user_gateway.get_users( + filters=filters, + pagination=pagination, + ) + + assert another_result.pagination.total == insert_users_count + assert len(another_result.data) == limit + + # check every ID will be bigger than previous one + assert reduce( + lambda previous, current: ( + previous[0] and previous[1].id > current.id, current, + ), + another_result.data, + (True, another_result.data[0]), + ) + + +async def test_get_users_limit_offset( + session: AsyncSession, + user_to_create: UserCreateDTO, +): + user_gateway = UserGatewayImpl(session) + + insert_users_count: int = 10 + limit: int = 5 + offset: int = 3 + + async with session.begin(): + for _ in range(insert_users_count): + await user_gateway.create_user(user_to_create) + + filters = UserFilters() + pagination = LimitOffsetPagination(limit=limit, offset=offset, order=SortOrder.ASC) + result: UsersDTO = await user_gateway.get_users( + filters=filters, + pagination=pagination, + ) + + assert result.pagination.total == insert_users_count + assert len(result.data) == limit + assert all(user.id == offset + i for i, user in enumerate(result.data, 1)) diff --git a/tests/integration/infrastructure/database/test_stairway.py b/tests/integration/infrastructure/database/test_stairway.py new file mode 100644 index 0000000..4f6ed59 --- /dev/null +++ b/tests/integration/infrastructure/database/test_stairway.py @@ -0,0 +1,32 @@ +import pytest +from alembic.command import downgrade, upgrade +from alembic.config import Config as AlembicConfig +from alembic.script import Script, ScriptDirectory + + +def get_revisions(alembic_config: AlembicConfig) -> list[Script]: + # Get directory object with Alembic migrations + script_location = alembic_config.get_main_option( + "script_location", default="./src/dma/infrastructure/database/migrations", + ) + revisions_dir = ScriptDirectory(script_location) + + # Get & sort migrations, from first to last + revisions: list[Script] = list(revisions_dir.walk_revisions("base", "heads")) + revisions.reverse() + return revisions + + +@pytest.fixture(scope="module", autouse=True) +def drop_db(alembic_config: AlembicConfig) -> None: + downgrade(alembic_config, "base") + + +@pytest.mark.order("first") +def test_migrations_stairway(alembic_config: AlembicConfig) -> None: + for revision in get_revisions(alembic_config): + upgrade(alembic_config, revision.revision) + + # We need -1 for downgrading first migration (its down_revision is None) + downgrade(alembic_config, revision.down_revision or "-1") # type: ignore[arg-type] + upgrade(alembic_config, revision.revision) diff --git a/tests/integration/infrastructure/message_queue/__init__.py b/tests/integration/infrastructure/message_queue/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/infrastructure/message_queue/conftest.py b/tests/integration/infrastructure/message_queue/conftest.py new file mode 100644 index 0000000..74d60fd --- /dev/null +++ b/tests/integration/infrastructure/message_queue/conftest.py @@ -0,0 +1,57 @@ +from typing import Generator, AsyncGenerator +from uuid import uuid4 + +from testcontainers.rabbitmq import RabbitMqContainer # type: ignore[import-untyped] + +import pytest +import pytest_asyncio + +from dma.infrastructure.config.models import MessageQueueConfig +from dma.infrastructure.message_queue.gateway import MessageQueueGatewayImpl + + +@pytest.fixture(scope="session") +def rmq_container() -> Generator[RabbitMqContainer, None, None]: + rabbitmq_container = RabbitMqContainer( + username="guest", + password="guest", + ) + try: + rabbitmq_container.start() + yield rabbitmq_container + finally: + rabbitmq_container.stop() + + +@pytest_asyncio.fixture() +async def message_queue_gateway( + rmq_container: RabbitMqContainer, +) -> AsyncGenerator[MessageQueueGatewayImpl, None]: + config = MessageQueueConfig( + host=rmq_container.get_container_host_ip(), + port=rmq_container.get_exposed_port(5672), + ) + gateway = MessageQueueGatewayImpl(config) + yield gateway + await gateway.shutdown() + +@pytest.fixture() +async def queue(message_queue_gateway: MessageQueueGatewayImpl): + queue_name = str(uuid4()) + await message_queue_gateway.create_queue(queue_name) + + async with message_queue_gateway.channel_pool.acquire() as channel: + yield await channel.get_queue(name=queue_name, ensure=True) + + await message_queue_gateway.delete_queue(queue_name) + + +@pytest.fixture() +async def exchange(message_queue_gateway: MessageQueueGatewayImpl): + exchange_name = str(uuid4()) + await message_queue_gateway.create_exchange(exchange_name) + + async with message_queue_gateway.channel_pool.acquire() as channel: + yield await channel.get_exchange(name=exchange_name, ensure=True) + + await message_queue_gateway.delete_exchange(exchange_name) diff --git a/tests/integration/infrastructure/message_queue/test_gateway.py b/tests/integration/infrastructure/message_queue/test_gateway.py new file mode 100644 index 0000000..037dc9e --- /dev/null +++ b/tests/integration/infrastructure/message_queue/test_gateway.py @@ -0,0 +1,113 @@ +import asyncio +from uuid import uuid4 + +import pytest +from aio_pika import Queue, Exchange +from aio_pika.abc import AbstractIncomingMessage +from aiormq import ChannelNotFoundEntity + +from dma.infrastructure.message_queue.gateway import MessageQueueGatewayImpl + + +@pytest.mark.order(1) +async def test_declare_exchange(message_queue_gateway: MessageQueueGatewayImpl): + exchange_name = str(uuid4()) + await message_queue_gateway.create_exchange(exchange_name) + + async with message_queue_gateway.channel_pool.acquire() as channel: + exchange = await channel.get_exchange(name=exchange_name, ensure=True) + assert exchange.name == exchange_name + + +@pytest.mark.order(2) +async def test_declare_queue(message_queue_gateway: MessageQueueGatewayImpl): + queue_name = str(uuid4()) + await message_queue_gateway.create_queue(queue_name) + + async with message_queue_gateway.channel_pool.acquire() as channel: + queue = await channel.get_queue(name=queue_name, ensure=True) + assert queue.name == queue_name + + +@pytest.mark.order(3) +async def test_bid_queue( + message_queue_gateway: MessageQueueGatewayImpl, + queue: Queue, + exchange: Exchange, +): + bis_success = await message_queue_gateway.bid_queue( + queue_name=queue.name, + exchange_name=exchange.name, + routing_key="some-routing-key", + ) + assert bis_success is True + + +@pytest.mark.order(4) +async def test_publish_message( + message_queue_gateway: MessageQueueGatewayImpl, exchange: Exchange, +): + message = {"some": "some_value"} + await message_queue_gateway.publish( + message, routing_key="some_key", exchange_name=exchange.name, + ) + + +@pytest.mark.order(5) +async def test_publish_not_exist_exchange( + message_queue_gateway: MessageQueueGatewayImpl, +): + exchange_name = "not_real_exchange" + with pytest.raises(ChannelNotFoundEntity) as e: + await message_queue_gateway.publish( + {"some": "value"}, routing_key="some_key", exchange_name=exchange_name, + ) + + assert str(e.value) == f"NOT_FOUND - no exchange '{exchange_name}' in vhost '/'" + + +@pytest.mark.order(6) +async def test_consume_message( + message_queue_gateway: MessageQueueGatewayImpl, + queue: Queue, + exchange: Exchange, +): + routing_key = str(uuid4()) + message_body = {"some": "some_value"} + consumed = False + await message_queue_gateway.bid_queue( + queue_name=queue.name, routing_key=routing_key, exchange_name=exchange.name, + ) + await message_queue_gateway.publish( + message_body, routing_key=routing_key, exchange_name=exchange.name, + ) + + async def consume_callback(message: AbstractIncomingMessage) -> bool: + nonlocal consumed + async with message.process(): + assert message.routing_key == routing_key + assert message.exchange == exchange.name + consumed = True + await message.ack() + return True + + await message_queue_gateway.consume( + queue_name=queue.name, callback=consume_callback, + ) + + await asyncio.sleep(0.001) + assert consumed is True + + +@pytest.mark.order(7) +async def test_consume_not_exist_queue( + message_queue_gateway: MessageQueueGatewayImpl, +): + queue_name = "NotExistName" + with pytest.raises(ChannelNotFoundEntity) as e: + await message_queue_gateway.consume( + queue_name=queue_name, + callback=lambda m: m, # type: ignore + ) + + assert str(e.value) == f"NOT_FOUND - no queue '{queue_name}' in vhost '/'" diff --git a/tests/integration/infrastructure/object_storage/__init__.py b/tests/integration/infrastructure/object_storage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/infrastructure/object_storage/conftest.py b/tests/integration/infrastructure/object_storage/conftest.py new file mode 100644 index 0000000..e9077c8 --- /dev/null +++ b/tests/integration/infrastructure/object_storage/conftest.py @@ -0,0 +1,77 @@ +import io +import os +import tempfile +from typing import AsyncGenerator, Generator + +import aioboto3 +import pytest +import pytest_asyncio +from testcontainers.minio import MinioContainer # type: ignore[import-untyped] + +from dma.infrastructure.object_storage.gateway import ObjectStorageGatewayImpl + + +BUCKET_NAME: str = "bucket-name" + + +@pytest.fixture(scope="session") +def minio_container() -> Generator[MinioContainer, None, None]: + minio_container = MinioContainer( + access_key="access_key", + secret_key="secret_key", + ) + if os.name == "nt": # Note: from testcontainers/testcontainers-python#108 + minio_container.get_container_host_ip = lambda: "localhost" + try: + minio_container.start() + minio_container.get_container_host_ip() + minio_client = minio_container.get_client() + minio_client.make_bucket(BUCKET_NAME) + yield minio_container + finally: + minio_container.stop() + + +# noinspection PyUnusedLocal +@pytest_asyncio.fixture() +async def aioboto_session( + minio_container: MinioContainer, +) -> AsyncGenerator[aioboto3.Session, None]: + yield aioboto3.Session( + aws_access_key_id="access_key", + aws_secret_access_key="secret_key", + aws_session_token=None, + ) + + +@pytest_asyncio.fixture() +async def object_storage_gateway( + minio_container: MinioContainer, + aioboto_session: aioboto3.Session, +) -> AsyncGenerator[ObjectStorageGatewayImpl, None]: + host_ip = minio_container.get_container_host_ip() + port = minio_container.get_exposed_port(minio_container.port_to_expose) + gateway = ObjectStorageGatewayImpl( + session=aioboto_session, + bucket_name=BUCKET_NAME, + endpoint_url=f"http://{host_ip}:{port}", + ) + yield gateway + # objects cleanup + minio_client = minio_container.get_client() + objs = minio_client.list_objects(bucket_name=BUCKET_NAME) + minio_client.remove_objects(bucket_name=BUCKET_NAME, delete_object_list=objs) + + +@pytest.fixture() +def file_object_to_upload() -> io.BytesIO: + return io.BytesIO(b"Some binary data") + + +# noinspection PyProtectedMember +@pytest.fixture() +def file_to_upload() -> Generator[tempfile._TemporaryFileWrapper, None, None]: + with tempfile.NamedTemporaryFile(delete=False, mode="wb") as file: + file.write(b"Some binary data") + file.close() + yield file diff --git a/tests/integration/infrastructure/object_storage/test_gateway.py b/tests/integration/infrastructure/object_storage/test_gateway.py new file mode 100644 index 0000000..7e823bd --- /dev/null +++ b/tests/integration/infrastructure/object_storage/test_gateway.py @@ -0,0 +1,66 @@ +import io +import tempfile +from urllib.parse import urlparse + +import pytest +import pytest_asyncio + +from dma.infrastructure.object_storage.gateway import ObjectStorageGatewayImpl + + +@pytest.mark.order("first") +async def test_upload_file_object( + object_storage_gateway: ObjectStorageGatewayImpl, + file_object_to_upload: io.BytesIO, +): + await object_storage_gateway.upload_file_object( + file_object=file_object_to_upload, + name="some_binary_file.format", + ) + + +@pytest.mark.order("second") +async def test_upload_file( + object_storage_gateway: ObjectStorageGatewayImpl, + file_to_upload: tempfile._TemporaryFileWrapper, +): + await object_storage_gateway.upload_file( + file_path=file_to_upload.name, + name="some_binary_file.format", + ) + + +@pytest.mark.order(3) +async def test_get_file_object( + object_storage_gateway: ObjectStorageGatewayImpl, + file_object_to_upload: io.BytesIO, +): + await object_storage_gateway.upload_file_object( + file_object=file_object_to_upload, + name="some_binary_file.format", + ) + file_obj = await object_storage_gateway.get_file_object( + "some_binary_file.format", + ) + assert file_obj.getbuffer().nbytes > 0 + assert file_obj.getbuffer().nbytes == file_object_to_upload.getbuffer().nbytes + + +@pytest.mark.order(4) +async def test_get_file( + object_storage_gateway: ObjectStorageGatewayImpl, + file_to_upload: tempfile._TemporaryFileWrapper, +): + await object_storage_gateway.upload_file( + file_path=file_to_upload.name, + name="some_binary_file.format", + ) + file_presigned_url = await object_storage_gateway.get_file_presigned_url( + "some_binary_file.format", + ) + try: + parsed_url = urlparse(file_presigned_url) + is_valid_url = all([parsed_url.scheme, parsed_url.netloc]) + except ValueError: + is_valid_url = False + assert is_valid_url diff --git a/vector/vector.toml b/vector/vector.toml new file mode 100644 index 0000000..5c406f0 --- /dev/null +++ b/vector/vector.toml @@ -0,0 +1,16 @@ +[sources.docker] +type = "docker_logs" +docker_host = "/var/run/docker.sock" +include_containers = ["decision_making_app.api"] + +[sinks.console] +type = "console" +inputs = ["docker"] +encoding.codec = "text" + +[sinks.loki_sync_id] +type = "loki" +inputs = ["docker"] +encoding.codec = "text" +labels.event = "log" +endpoint = "http://decision_making_app.loki:3100"