From 4dd9714caccb9a81e46e53445a482a205e619767 Mon Sep 17 00:00:00 2001 From: Stefano Lottini <236640031+sl-at-ibm@users.noreply.github.com> Date: Mon, 15 Dec 2025 17:58:18 +0100 Subject: [PATCH] Introduce codecoverage combined calculation in CI most (local) test coverage/reporting in place draft for codecov orchestrator TEMP reduce it scope for testing codecov relative path of workflows, fix workflows called with full syntax nope, revert to abs path and nothing more standardize yaml naming standardize yaml naming 2 secret inheritance chain overhaul add env to unit test job add env block to all testing flows trying to debug uploader: trying to debug uploader 2 trying to debug uploader 3 trying to debug uploader 4 trying to debug uploader 5 remove debug what is in the downloaded things anyway? coverage calculation and posting to PR, attempt 1 coverage calculation and posting to PR, attempt 2 coverage calculation and posting to PR, attempt 3 coverage calculation and posting to PR, attempt 4 coverage calculation and posting to PR, attempt 5 coverage calculation and posting to PR, attempt 6 coverage calculation and posting to PR, attempt 7 coverage calculation and posting to PR, attempt 8 publish html codecov report publish html codecov report 2 publish html codecov report 3 publish html codecov report 4 remove and postpone the 'gh pages html publish' thing minor coverage message rephrase html report retention workaround 1 html report retention workaround 2 reinstate full test; coverage json uploaded for push-to-main suspend farr-related tests on HCD until dev rer.serv. back in action revert the exclusion of farr in hcd tests, i.e. include them again aggregator workflow cleanup 2 --- .github/workflows/codecov_aggregator.yml | 182 +++++++++ .github/workflows/local.yaml | 58 --- .github/workflows/local.yml | 83 ++++ .github/workflows/main.yml | 38 +- .github/workflows/unit.yaml | 44 -- .github/workflows/unit.yml | 65 +++ CHANGES | 1 + Makefile | 19 +- pyproject.toml | 1 + tests/env_templates/env.vectorize.template | 2 + tests/vectorize/vectorize_models.py | 444 +++++++++++---------- uv.lock | 210 +++------- 12 files changed, 660 insertions(+), 487 deletions(-) create mode 100644 .github/workflows/codecov_aggregator.yml delete mode 100644 .github/workflows/local.yaml create mode 100644 .github/workflows/local.yml delete mode 100644 .github/workflows/unit.yaml create mode 100644 .github/workflows/unit.yml diff --git a/.github/workflows/codecov_aggregator.yml b/.github/workflows/codecov_aggregator.yml new file mode 100644 index 00000000..20dd53f6 --- /dev/null +++ b/.github/workflows/codecov_aggregator.yml @@ -0,0 +1,182 @@ +name: CI codecov aggregator +on: + push: + branches: [main] + pull_request: + types: [opened, synchronize, reopened, closed] + branches: [main] + +permissions: + # required to post on the PR + pull-requests: write + # required for the local IT (which pulls HCD from ECR) + id-token: write + contents: write + # required to publish GH pages + pages: write + +concurrency: + group: preview-pages-${{ github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + main_it: + uses: ./.github/workflows/main.yml + if: ${{ github.event.action != 'closed' }} + with: + coverage_prefix: main_it + sha: ${{ github.sha }} + secrets: + ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.ASTRA_DB_APPLICATION_TOKEN }} + ASTRA_DB_API_ENDPOINT: ${{ secrets.ASTRA_DB_API_ENDPOINT }} + HEADER_EMBEDDING_API_KEY_OPENAI: ${{ secrets.HEADER_EMBEDDING_API_KEY_OPENAI }} + LEGACY_INSERTMANY_BEHAVIOUR_PRE2193: "yes" + + local_it: + uses: ./.github/workflows/local.yml + if: ${{ github.event.action != 'closed' }} + with: + coverage_prefix: local_it + sha: ${{ github.sha }} + secrets: + AWS_ECR_REGION: ${{ secrets.AWS_ECR_REGION }} + AWS_ECR_ACCOUNT_ID: ${{ secrets.AWS_ECR_ACCOUNT_ID }} + AWS_ECR_ROLE_NAME: ${{ secrets.AWS_ECR_ROLE_NAME }} + AWS_ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPOSITORY }} + AWS_ECR_REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }} + HEADER_EMBEDDING_API_KEY_OPENAI: ${{ secrets.HEADER_EMBEDDING_API_KEY_OPENAI }} + # hardcoding the target DB + DOCKER_COMPOSE_LOCAL_DATA_API: "yes" + # turn on header-based reranker auth + HEADER_RERANKING_API_KEY_NVIDIA: ${{ secrets.HEADER_RERANKING_API_KEY_NVIDIA }} + + ut: + uses: ./.github/workflows/unit.yml + if: ${{ github.event.action != 'closed' }} + with: + coverage_prefix: ut + sha: ${{ github.sha }} + coverage_python_version: "3.11" + secrets: + # basic secrets + ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.ASTRA_DB_APPLICATION_TOKEN }} + ASTRA_DB_API_ENDPOINT: ${{ secrets.ASTRA_DB_API_ENDPOINT }} + + aggregate: + runs-on: ubuntu-latest + needs: [main_it, local_it, ut] + steps: + - name: Checkout code + if: ${{ github.event.action != 'closed' }} + uses: actions/checkout@v2 + + - name: Set up Python + if: ${{ github.event.action != 'closed' }} + uses: actions/setup-python@v2 + with: + python-version: 3.11 + + - name: Install dependencies + if: ${{ github.event.action != 'closed' }} + run: | + python -m pip install --upgrade pip + pipx install uv + make venv + + - name: Download all coverage artifacts from this run + if: ${{ github.event.action != 'closed' }} + uses: actions/download-artifact@v4 + with: + path: ./all_coverage + + - name: Combine coverage data + if: ${{ github.event.action != 'closed' }} + run: uv run coverage combine $(find all_coverage/ -name ".coverage" 2>/dev/null) + + - name: produce coverage JSON report + if: ${{ github.event.action != 'closed' }} + run: uv run coverage json + + - name: verify JSON report output + if: ${{ github.event.action != 'closed' }} + run: cut -c -200 coverage.json + + - name: Upload coverage JSON report for mid-term storage + if: ${{ github.event_name == 'push' }} + uses: actions/upload-artifact@v4 + id: upload_json + with: + name: coverage-json-push-${{ github.sha }} + path: coverage.json + retention-days: 30 + + - name: produce coverage HTML report + if: ${{ github.event.action != 'closed' }} + run: | + uv run coverage html + test -f htmlcov/index.html + echo "commit=${GITHUB_SHA}" > htmlcov/_preview_build.txt + + # This uploads the coverage html report to make it available for offline inspection + - name: Upload coverage HTML report for reference + uses: actions/upload-artifact@v4 + id: upload_html + with: + name: coverage-html-report-${{ inputs.sha }} + path: htmlcov + retention-days: 7 + include-hidden-files: true + + # Note: the following would be to publish a PR-preview of the code coverage + # HTML report. Not completely set up, something does not work with publishing + # to GH Pages. Postponed. + + # - name: Sanity check coverage output (WIP) + # run: | + # echo "PWD=$PWD" + # ls -la + # ls -la htmlcov || true + # test -f htmlcov/index.html || (echo "ERROR: htmlcov/index.html not found." && exit 1) + # echo "Files in htmlcov:" + # find htmlcov -type f | head -100 + + # - name: Deploy PR preview to Pages (WIP) + # if: ${{ github.event.action != 'closed' }} + # uses: rossjrw/pr-preview-action@v1 + # with: + # source-dir: htmlcov + + # - name: Remove PR preview (WIP) + # if: ${{ github.event.action == 'closed' }} + # uses: rossjrw/pr-preview-action@v1 + # with: + # action: remove + + - name: generate code coverage short report + if: ${{ github.event.action != 'closed' }} + id: generate_coverage_report + shell: bash + run: | + set -o pipefail + OUTPUT=$(uv run coverage report) + # Multi-line safe write to $GITHUB_OUTPUT + echo "text<> "$GITHUB_OUTPUT" + echo "$OUTPUT" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + - name: Comment on PR + if: ${{ github.event.action != 'closed' && github.event_name == 'pull_request' }} + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = context.payload.pull_request.number; + const body = `### Coverage report\nfor commit: \`${{ github.sha }}\`.\ndownload detailed report [here](${{ steps.upload_html.outputs.artifact-url }}).\n\`\`\`\n${{ steps.generate_coverage_report.outputs.text }}\n\`\`\``; + await github.rest.issues.createComment({ + ...context.repo, + issue_number: prNumber, + body + }); diff --git a/.github/workflows/local.yaml b/.github/workflows/local.yaml deleted file mode 100644 index 1c1a91fd..00000000 --- a/.github/workflows/local.yaml +++ /dev/null @@ -1,58 +0,0 @@ -name: Run base integration tests on a local Data API - -on: - push: - branches: - - main - pull_request: - branches: - - main - -permissions: - id-token: write # required for OIDC - contents: read # required for actions/checkout if you use it - -env: - AWS_ECR_REGION: ${{ secrets.AWS_ECR_REGION }} - AWS_ECR_ACCOUNT_ID: ${{ secrets.AWS_ECR_ACCOUNT_ID }} - AWS_ECR_ROLE_NAME: ${{ secrets.AWS_ECR_ROLE_NAME }} - AWS_ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPOSITORY }} - AWS_ECR_REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }} - -jobs: - test: - env: - HEADER_EMBEDDING_API_KEY_OPENAI: ${{ secrets.HEADER_EMBEDDING_API_KEY_OPENAI }} - # hardcoding the target DB - DOCKER_COMPOSE_LOCAL_DATA_API: "yes" - # turn on header-based reranker auth - HEADER_RERANKING_API_KEY_NVIDIA: ${{ secrets.HEADER_RERANKING_API_KEY_NVIDIA }} - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.12 - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pipx install uv - make venv - - - name: Configure AWS credentials from OIDC - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::${{ env.AWS_ECR_ACCOUNT_ID }}:role/${{ env.AWS_ECR_ROLE_NAME }} - aws-region: ${{ env.AWS_ECR_REGION }} - - - name: Login to Amazon ECR - uses: aws-actions/amazon-ecr-login@v2 - - - name: Run pytest - run: | - uv run pytest tests/base/integration diff --git a/.github/workflows/local.yml b/.github/workflows/local.yml new file mode 100644 index 00000000..73f334a4 --- /dev/null +++ b/.github/workflows/local.yml @@ -0,0 +1,83 @@ +name: Run base integration tests on a local Data API + +on: + workflow_call: + inputs: + coverage_prefix: + description: "Code coverage file base name" + type: string + required: true + sha: + description: "Commit SHA of the code being tested" + type: string + required: true + secrets: + AWS_ECR_REGION: + required: true + AWS_ECR_ACCOUNT_ID: + required: true + AWS_ECR_ROLE_NAME: + required: true + AWS_ECR_REPOSITORY: + required: true + AWS_ECR_REGISTRY: + required: true + HEADER_EMBEDDING_API_KEY_OPENAI: + required: true + DOCKER_COMPOSE_LOCAL_DATA_API: + required: true + HEADER_RERANKING_API_KEY_NVIDIA: + required: true + +permissions: + id-token: write # required for OIDC + contents: read # required for actions/checkout if you use it + +jobs: + test: + env: + AWS_ECR_REGION: ${{ secrets.AWS_ECR_REGION }} + AWS_ECR_ACCOUNT_ID: ${{ secrets.AWS_ECR_ACCOUNT_ID }} + AWS_ECR_ROLE_NAME: ${{ secrets.AWS_ECR_ROLE_NAME }} + AWS_ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPOSITORY }} + AWS_ECR_REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }} + HEADER_EMBEDDING_API_KEY_OPENAI: ${{ secrets.HEADER_EMBEDDING_API_KEY_OPENAI }} + DOCKER_COMPOSE_LOCAL_DATA_API: ${{ secrets.DOCKER_COMPOSE_LOCAL_DATA_API }} + HEADER_RERANKING_API_KEY_NVIDIA: ${{ secrets.HEADER_RERANKING_API_KEY_NVIDIA }} + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.12 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pipx install uv + make venv + + - name: Configure AWS credentials from OIDC + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::${{ env.AWS_ECR_ACCOUNT_ID }}:role/${{ env.AWS_ECR_ROLE_NAME }} + aws-region: ${{ env.AWS_ECR_REGION }} + + - name: Login to Amazon ECR + uses: aws-actions/amazon-ecr-login@v2 + + - name: Run pytest + run: | + uv run pytest --cov=astrapy/ tests/base/integration -vv + + - name: Upload coverage data (unique per commit) + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.coverage_prefix }}-${{ inputs.sha }} + path: .coverage + retention-days: 1 + include-hidden-files: true diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2774f71d..3e914d1e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,21 +1,33 @@ name: Run base integration tests on Astra DB on: - push: - branches: - - main - pull_request: - branches: - - main + workflow_call: + inputs: + coverage_prefix: + description: "Code coverage file base name" + type: string + required: true + sha: + description: "Commit SHA of the code being tested" + type: string + required: true + secrets: + ASTRA_DB_APPLICATION_TOKEN: + required: true + ASTRA_DB_API_ENDPOINT: + required: true + HEADER_EMBEDDING_API_KEY_OPENAI: + required: true + LEGACY_INSERTMANY_BEHAVIOUR_PRE2193: + required: true jobs: test: env: - # basic secrets ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.ASTRA_DB_APPLICATION_TOKEN }} ASTRA_DB_API_ENDPOINT: ${{ secrets.ASTRA_DB_API_ENDPOINT }} HEADER_EMBEDDING_API_KEY_OPENAI: ${{ secrets.HEADER_EMBEDDING_API_KEY_OPENAI }} - LEGACY_INSERTMANY_BEHAVIOUR_PRE2193: "yes" + LEGACY_INSERTMANY_BEHAVIOUR_PRE2193: ${{ secrets.LEGACY_INSERTMANY_BEHAVIOUR_PRE2193 }} runs-on: ubuntu-latest steps: @@ -35,4 +47,12 @@ jobs: - name: Run pytest run: | - uv run pytest tests/base/integration + uv run pytest --cov=astrapy/ tests/base/integration -vv + + - name: Upload coverage data (unique per commit) + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.coverage_prefix }}-${{ inputs.sha }} + path: .coverage + retention-days: 1 + include-hidden-files: true diff --git a/.github/workflows/unit.yaml b/.github/workflows/unit.yaml deleted file mode 100644 index 7011aa35..00000000 --- a/.github/workflows/unit.yaml +++ /dev/null @@ -1,44 +0,0 @@ -name: Run unit tests - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - test: - env: - # basic secrets - ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.ASTRA_DB_APPLICATION_TOKEN }} - ASTRA_DB_API_ENDPOINT: ${{ secrets.ASTRA_DB_API_ENDPOINT }} - runs-on: ubuntu-latest - strategy: - matrix: - python-version: - - "3.8" - - "3.9" - - "3.10" - - "3.11" - - "3.12" - name: "unit test on #${{ matrix.python-version }}" - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pipx install uv - make venv - - - name: Run pytest - run: | - uv run pytest tests/base/unit diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml new file mode 100644 index 00000000..51d0e1f0 --- /dev/null +++ b/.github/workflows/unit.yml @@ -0,0 +1,65 @@ +name: Run unit tests + +on: + workflow_call: + inputs: + coverage_prefix: + description: "Code coverage file base name" + type: string + required: true + sha: + description: "Commit SHA of the code being tested" + type: string + required: true + coverage_python_version: + description: "Python version for collecting code coverage data" + type: string + required: true + secrets: + ASTRA_DB_APPLICATION_TOKEN: + required: true + ASTRA_DB_API_ENDPOINT: + required: true + +jobs: + test: + env: + ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.ASTRA_DB_APPLICATION_TOKEN }} + ASTRA_DB_API_ENDPOINT: ${{ secrets.ASTRA_DB_API_ENDPOINT }} + runs-on: ubuntu-latest + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + - "3.12" + name: "unit test on Python ${{ matrix.python-version }}" + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pipx install uv + make venv + + - name: Run pytest + run: | + uv run pytest --cov=astrapy/ tests/base/unit -vv + + - name: Upload coverage data (unique per commit) + if: matrix['python-version'] == inputs.coverage_python_version + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.coverage_prefix }}-${{ inputs.sha }} + path: ./.coverage + retention-days: 1 + include-hidden-files: true diff --git a/CHANGES b/CHANGES index b96d48b0..df56a8ed 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ main ==== +Add flag `TEST_EXTENDED_VECTORIZE` for explicit control Astra DB admin classes: - reworked polling logic: optimized and enriched with pollability pre-checks; - improvements in DevOps API response error handling. diff --git a/Makefile b/Makefile index 0e38b314..8d7c077d 100644 --- a/Makefile +++ b/Makefile @@ -38,18 +38,24 @@ format-fix-tests: FMT_FLAGS= format-fix-tests: format-tests test-integration: - uv run $(VENV_FLAGS) pytest tests/base/integration -vv + COVERAGE_FILE=".coverage.integration" uv run $(VENV_FLAGS) pytest --cov=astrapy/ tests/base/integration -vv test: - uv run $(VENV_FLAGS) pytest tests/base/unit -vv + COVERAGE_FILE=".coverage.unit" uv run $(VENV_FLAGS) pytest --cov=astrapy/ tests/base/unit -vv docker-test-integration: - DOCKER_COMPOSE_LOCAL_DATA_API="yes" uv run pytest tests/base/integration -vv + DOCKER_COMPOSE_LOCAL_DATA_API="yes" uv run pytest --cov=astrapy/ tests/base/integration -vv build: rm -f dist/astrapy* uv build +coverage: + rm htmlcov -rf + uv run coverage combine $(ls .coverage.unit .coverage.integration 2>/dev/null) + uv run coverage html + echo "OPEN file://${PWD}/htmlcov/index.html" + help: @echo "======================================================================" @echo "AstraPy make command purpose" @@ -61,8 +67,9 @@ help: @echo " format-fix fixing imports and style" @echo " format-fix-src limited to source" @echo " format-fix-tests limited to tests" - @echo "test run unit tests" - @echo "test-integration run integration tests" - @echo "docker-test-integration run int.tests on dockerized local" + @echo "test run unit tests" + @echo "test-integration run integration tests" + @echo "docker-test-integration run int.tests on dockerized local" + @echo "coverage HTML coverage map from last test" @echo "build build package ready for PyPI" @echo "======================================================================" diff --git a/pyproject.toml b/pyproject.toml index abe29ebf..fbbe9041 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ dev = [ "blockbuster ~= 1.5.5", "build >= 1.0.0", "cassio ~= 0.1.10; python_version >= '3.9'", + "coverage ~= 7.0.0", "faker ~= 23.1.0", "mypy ~= 1.9.0", "ruff >= 0.11.9,<0.12", diff --git a/tests/env_templates/env.vectorize.template b/tests/env_templates/env.vectorize.template index 2572d689..d657d83c 100644 --- a/tests/env_templates/env.vectorize.template +++ b/tests/env_templates/env.vectorize.template @@ -2,6 +2,8 @@ # FOR THE EXTENDED VECTORIZE TESTS: # ##################################### +# hardcoded to enable collection of these credentials: +export TEST_EXTENDED_VECTORIZE="yes" export HEADER_EMBEDDING_API_KEY_HUGGINGFACE="..." diff --git a/tests/vectorize/vectorize_models.py b/tests/vectorize/vectorize_models.py index cac6d340..2c36506a 100644 --- a/tests/vectorize/vectorize_models.py +++ b/tests/vectorize/vectorize_models.py @@ -31,6 +31,7 @@ alphanum = set("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890") +TEST_EXTENDED_VECTORIZE = bool(os.environ.get("TEST_EXTENDED_VECTORIZE")) DEFAULT_TEST_ASSETS = { "samples": [ @@ -114,70 +115,86 @@ # in a test model is PARAM_SKIP_MARKER, the combination is not emitted at all. PARAM_SKIP_MARKER = "__SKIP_ME__" -PARAMETER_VALUE_MAP = { - ("azureOpenAI", "text-embedding-3-large", "deploymentId"): os.environ[ - "AZURE_OPENAI_DEPLOY_ID_EMB3LARGE" - ], - ("azureOpenAI", "text-embedding-3-large", "resourceName"): os.environ[ - "AZURE_OPENAI_RESNAME_EMB3LARGE" - ], - ("azureOpenAI", "text-embedding-3-small", "deploymentId"): os.environ[ - "AZURE_OPENAI_DEPLOY_ID_EMB3SMALL" - ], - ("azureOpenAI", "text-embedding-3-small", "resourceName"): os.environ[ - "AZURE_OPENAI_RESNAME_EMB3SMALL" - ], - ("azureOpenAI", "text-embedding-ada-002", "deploymentId"): os.environ[ - "AZURE_OPENAI_DEPLOY_ID_ADA2" - ], - ("azureOpenAI", "text-embedding-ada-002", "resourceName"): os.environ[ - "AZURE_OPENAI_RESNAME_ADA2" - ], - ("jinaAI", "jina-embeddings-v3", "late_chunking"): True, - ("jinaAI", "jina-embeddings-v3", "task"): "text-matching", - ("voyageAI", "voyage-2", "autoTruncate"): True, - ("voyageAI", "voyage-code-2", "autoTruncate"): True, - ("voyageAI", "voyage-finance-2", "autoTruncate"): True, - ("voyageAI", "voyage-large-2", "autoTruncate"): True, - ("voyageAI", "voyage-large-2-instruct", "autoTruncate"): True, - ("voyageAI", "voyage-law-2", "autoTruncate"): True, - ("voyageAI", "voyage-multilingual-2", "autoTruncate"): True, - # - ("huggingfaceDedicated", "endpoint-defined-model", "endpointName"): os.environ[ - "HUGGINGFACEDED_ENDPOINTNAME" - ], - ("huggingfaceDedicated", "endpoint-defined-model", "regionName"): os.environ[ - "HUGGINGFACEDED_REGIONNAME" - ], - ("huggingfaceDedicated", "endpoint-defined-model", "cloudName"): os.environ[ - "HUGGINGFACEDED_CLOUDNAME" - ], - # - ("openai", "text-embedding-3-large", "organizationId"): os.environ[ - "OPENAI_ORGANIZATION_ID" - ], - ("openai", "text-embedding-3-large", "projectId"): os.environ["OPENAI_PROJECT_ID"], - ("openai", "text-embedding-3-small", "organizationId"): os.environ[ - "OPENAI_ORGANIZATION_ID" - ], - ("openai", "text-embedding-3-small", "projectId"): os.environ["OPENAI_PROJECT_ID"], - ("openai", "text-embedding-ada-002", "organizationId"): os.environ[ - "OPENAI_ORGANIZATION_ID" - ], - ("openai", "text-embedding-ada-002", "projectId"): os.environ["OPENAI_PROJECT_ID"], - # - ("bedrock", "amazon.titan-embed-text-v1", "region"): os.environ["BEDROCK_REGION"], - ("bedrock", "amazon.titan-embed-text-v2:0", "region"): os.environ["BEDROCK_REGION"], -} +PARAMETER_VALUE_MAP: dict[tuple[str, str, str], Any] +FORCE_DIMENSION_MAP: dict[tuple[str, str], Any] +if TEST_EXTENDED_VECTORIZE: + PARAMETER_VALUE_MAP = { + ("azureOpenAI", "text-embedding-3-large", "deploymentId"): os.environ[ + "AZURE_OPENAI_DEPLOY_ID_EMB3LARGE" + ], + ("azureOpenAI", "text-embedding-3-large", "resourceName"): os.environ[ + "AZURE_OPENAI_RESNAME_EMB3LARGE" + ], + ("azureOpenAI", "text-embedding-3-small", "deploymentId"): os.environ[ + "AZURE_OPENAI_DEPLOY_ID_EMB3SMALL" + ], + ("azureOpenAI", "text-embedding-3-small", "resourceName"): os.environ[ + "AZURE_OPENAI_RESNAME_EMB3SMALL" + ], + ("azureOpenAI", "text-embedding-ada-002", "deploymentId"): os.environ[ + "AZURE_OPENAI_DEPLOY_ID_ADA2" + ], + ("azureOpenAI", "text-embedding-ada-002", "resourceName"): os.environ[ + "AZURE_OPENAI_RESNAME_ADA2" + ], + ("jinaAI", "jina-embeddings-v3", "late_chunking"): True, + ("jinaAI", "jina-embeddings-v3", "task"): "text-matching", + ("voyageAI", "voyage-2", "autoTruncate"): True, + ("voyageAI", "voyage-code-2", "autoTruncate"): True, + ("voyageAI", "voyage-finance-2", "autoTruncate"): True, + ("voyageAI", "voyage-large-2", "autoTruncate"): True, + ("voyageAI", "voyage-large-2-instruct", "autoTruncate"): True, + ("voyageAI", "voyage-law-2", "autoTruncate"): True, + ("voyageAI", "voyage-multilingual-2", "autoTruncate"): True, + # + ("huggingfaceDedicated", "endpoint-defined-model", "endpointName"): os.environ[ + "HUGGINGFACEDED_ENDPOINTNAME" + ], + ("huggingfaceDedicated", "endpoint-defined-model", "regionName"): os.environ[ + "HUGGINGFACEDED_REGIONNAME" + ], + ("huggingfaceDedicated", "endpoint-defined-model", "cloudName"): os.environ[ + "HUGGINGFACEDED_CLOUDNAME" + ], + # + ("openai", "text-embedding-3-large", "organizationId"): os.environ[ + "OPENAI_ORGANIZATION_ID" + ], + ("openai", "text-embedding-3-large", "projectId"): os.environ[ + "OPENAI_PROJECT_ID" + ], + ("openai", "text-embedding-3-small", "organizationId"): os.environ[ + "OPENAI_ORGANIZATION_ID" + ], + ("openai", "text-embedding-3-small", "projectId"): os.environ[ + "OPENAI_PROJECT_ID" + ], + ("openai", "text-embedding-ada-002", "organizationId"): os.environ[ + "OPENAI_ORGANIZATION_ID" + ], + ("openai", "text-embedding-ada-002", "projectId"): os.environ[ + "OPENAI_PROJECT_ID" + ], + # + ("bedrock", "amazon.titan-embed-text-v1", "region"): os.environ[ + "BEDROCK_REGION" + ], + ("bedrock", "amazon.titan-embed-text-v2:0", "region"): os.environ[ + "BEDROCK_REGION" + ], + } -# this is ad-hoc for HF dedicated. Models here, though "optional" dimension, -# do not undergo the f/0 optional dimension because of that, rather have -# a forced fixed, provided dimension. -FORCE_DIMENSION_MAP = { - ("huggingfaceDedicated", "endpoint-defined-model"): int( - os.environ["HUGGINGFACEDED_DIMENSION"] - ), -} + # this is ad-hoc for HF dedicated. Models here, though "optional" dimension, + # do not undergo the f/0 optional dimension because of that, rather have + # a forced fixed, provided dimension. + FORCE_DIMENSION_MAP = { + ("huggingfaceDedicated", "endpoint-defined-model"): int( + os.environ["HUGGINGFACEDED_DIMENSION"] + ), + } +else: + PARAMETER_VALUE_MAP = {} + FORCE_DIMENSION_MAP = {} def live_test_models() -> Iterable[dict[str, Any]]: @@ -202,111 +219,143 @@ def _collapse(longt: str) -> str: else: return f"{longt[:30]}_{longt[-5:]}" - # generate the full list of models based on the live provider endpoint - provider_info = live_provider_info() - for provider_name, provider_desc in sorted( - provider_info.embedding_providers.items() - ): - for model in provider_desc.models: - for auth_type_name, auth_type_desc in sorted( - provider_desc.supported_authentication.items() - ): - if auth_type_desc.enabled: - # test assumptions on auth type - if auth_type_name == "NONE": - assert auth_type_desc.tokens == [] - elif auth_type_name == "HEADER": - header_names_lower = tuple( - sorted(t.accepted.lower() for t in auth_type_desc.tokens) - ) - assert header_names_lower in { - (EMBEDDING_HEADER_API_KEY.lower(),), - ( - EMBEDDING_HEADER_AWS_ACCESS_ID.lower(), - EMBEDDING_HEADER_AWS_SECRET_ID.lower(), - ), + if TEST_EXTENDED_VECTORIZE: + # generate the full list of models based on the live provider endpoint + provider_info = live_provider_info() + for provider_name, provider_desc in sorted( + provider_info.embedding_providers.items() + ): + for model in provider_desc.models: + for auth_type_name, auth_type_desc in sorted( + provider_desc.supported_authentication.items() + ): + if auth_type_desc.enabled: + # test assumptions on auth type + if auth_type_name == "NONE": + assert auth_type_desc.tokens == [] + elif auth_type_name == "HEADER": + header_names_lower = tuple( + sorted( + t.accepted.lower() for t in auth_type_desc.tokens + ) + ) + assert header_names_lower in { + (EMBEDDING_HEADER_API_KEY.lower(),), + ( + EMBEDDING_HEADER_AWS_ACCESS_ID.lower(), + EMBEDDING_HEADER_AWS_SECRET_ID.lower(), + ), + } + elif auth_type_name == "SHARED_SECRET": + authkey_names = tuple( + sorted(t.accepted for t in auth_type_desc.tokens) + ) + assert authkey_names in { + ("providerKey",), + ("accessId", "secretKey"), + } + else: + raise ValueError("Unknown auth type") + + # params + collated_params = provider_desc.parameters + model.parameters + all_nond_params = [ + param + for param in collated_params + if param.name != "vectorDimension" + ] + required_nond_params = { + param.name for param in all_nond_params if param.required } - elif auth_type_name == "SHARED_SECRET": - authkey_names = tuple( - sorted(t.accepted for t in auth_type_desc.tokens) - ) - assert authkey_names in { - ("providerKey",), - ("accessId", "secretKey"), + optional_nond_params = { + param.name + for param in all_nond_params + if not param.required } - else: - raise ValueError("Unknown auth type") - - # params - collated_params = provider_desc.parameters + model.parameters - all_nond_params = [ - param - for param in collated_params - if param.name != "vectorDimension" - ] - required_nond_params = { - param.name for param in all_nond_params if param.required - } - optional_nond_params = { - param.name for param in all_nond_params if not param.required - } - # - d_params = [ - param - for param in collated_params - if param.name == "vectorDimension" - ] - if d_params: - d_param = d_params[0] - if (provider_name, model.name) in FORCE_DIMENSION_MAP: - optional_dimension = False - dimension = FORCE_DIMENSION_MAP[(provider_name, model.name)] - elif d_param.default_value is not None: - optional_dimension = True - assert model.vector_dimension is None - dimension = _from_validation(d_param) + # + d_params = [ + param + for param in collated_params + if param.name == "vectorDimension" + ] + if d_params: + d_param = d_params[0] + if (provider_name, model.name) in FORCE_DIMENSION_MAP: + optional_dimension = False + dimension = FORCE_DIMENSION_MAP[ + (provider_name, model.name) + ] + elif d_param.default_value is not None: + optional_dimension = True + assert model.vector_dimension is None + dimension = _from_validation(d_param) + else: + optional_dimension = False + assert model.vector_dimension is None + dimension = _from_validation(d_param) else: optional_dimension = False - assert model.vector_dimension is None - dimension = _from_validation(d_param) - else: - optional_dimension = False - assert model.vector_dimension is not None - assert model.vector_dimension > 0 - dimension = model.vector_dimension + assert model.vector_dimension is not None + assert model.vector_dimension > 0 + dimension = model.vector_dimension - model_parameters = { - param_name: PARAMETER_VALUE_MAP[ - (provider_name, model.name, param_name) - ] - for param_name in required_nond_params - } - optional_model_parameters = { - param_name: PARAMETER_VALUE_MAP[ - (provider_name, model.name, param_name) - ] - for param_name in optional_nond_params - } + model_parameters = { + param_name: PARAMETER_VALUE_MAP[ + (provider_name, model.name, param_name) + ] + for param_name in required_nond_params + } + optional_model_parameters = { + param_name: PARAMETER_VALUE_MAP[ + (provider_name, model.name, param_name) + ] + for param_name in optional_nond_params + } - minimal_model_quadruple = ( - provider_name, - model.name, - auth_type_name, - "0", - ) - if minimal_model_quadruple not in EXCLUDED_MODEL_QUADRUPLES: - if optional_dimension or optional_nond_params != set(): - # we issue a minimal-params version - model_tag_0 = ( - f"{provider_name}/{model.name}/{auth_type_name}/0" - ) - this_minimal_model = { - "model_tag": model_tag_0, - "simple_tag": _collapse( - "".join(c for c in model_tag_0 if c in alphanum) - ), + minimal_model_quadruple = ( + provider_name, + model.name, + auth_type_name, + "0", + ) + if minimal_model_quadruple not in EXCLUDED_MODEL_QUADRUPLES: + if optional_dimension or optional_nond_params != set(): + # we issue a minimal-params version + model_tag_0 = ( + f"{provider_name}/{model.name}/{auth_type_name}/0" + ) + this_minimal_model = { + "model_tag": model_tag_0, + "simple_tag": _collapse( + "".join(c for c in model_tag_0 if c in alphanum) + ), + "auth_type_name": auth_type_name, + "auth_type_tokens": auth_type_desc.tokens, + "secret_tag": SECRET_NAME_ROOT_MAP[provider_name], + "test_assets": TEST_ASSETS_MAP.get( + (provider_name, model.name), DEFAULT_TEST_ASSETS + ), + "use_insert_one": USE_INSERT_ONE_MAP.get( + (provider_name, model.name), False + ), + "service_options": VectorServiceOptions( + provider=provider_name, + model_name=model.name, + parameters=model_parameters, + ), + } + yield this_minimal_model + + # and in any case we issue a 'full-spec' one ... + # ... unless explicitly marked as skipped + if all( + v != PARAM_SKIP_MARKER + for v in optional_model_parameters.values() + ): + root_model = { "auth_type_name": auth_type_name, "auth_type_tokens": auth_type_desc.tokens, + "dimension": dimension, "secret_tag": SECRET_NAME_ROOT_MAP[provider_name], "test_assets": TEST_ASSETS_MAP.get( (provider_name, model.name), DEFAULT_TEST_ASSETS @@ -314,54 +363,31 @@ def _collapse(longt: str) -> str: "use_insert_one": USE_INSERT_ONE_MAP.get( (provider_name, model.name), False ), - "service_options": VectorServiceOptions( - provider=provider_name, - model_name=model.name, - parameters=model_parameters, - ), } - yield this_minimal_model - - # and in any case we issue a 'full-spec' one ... - # ... unless explicitly marked as skipped - if all( - v != PARAM_SKIP_MARKER - for v in optional_model_parameters.values() - ): - root_model = { - "auth_type_name": auth_type_name, - "auth_type_tokens": auth_type_desc.tokens, - "dimension": dimension, - "secret_tag": SECRET_NAME_ROOT_MAP[provider_name], - "test_assets": TEST_ASSETS_MAP.get( - (provider_name, model.name), DEFAULT_TEST_ASSETS - ), - "use_insert_one": USE_INSERT_ONE_MAP.get( - (provider_name, model.name), False - ), - } - model_tag_f = f"{provider_name}/{model.name}/{auth_type_name}/f" - full_model_quadruple = ( - provider_name, - model.name, - auth_type_name, - "f", - ) - if full_model_quadruple not in EXCLUDED_MODEL_QUADRUPLES: - this_model = { - "model_tag": model_tag_f, - "simple_tag": _collapse( - "".join(c for c in model_tag_f if c in alphanum) - ), - "service_options": VectorServiceOptions( - provider=provider_name, - model_name=model.name, - parameters={ - **model_parameters, - **optional_model_parameters, - }, - ), - **root_model, - } - yield this_model + model_tag_f = ( + f"{provider_name}/{model.name}/{auth_type_name}/f" + ) + full_model_quadruple = ( + provider_name, + model.name, + auth_type_name, + "f", + ) + if full_model_quadruple not in EXCLUDED_MODEL_QUADRUPLES: + this_model = { + "model_tag": model_tag_f, + "simple_tag": _collapse( + "".join(c for c in model_tag_f if c in alphanum) + ), + "service_options": VectorServiceOptions( + provider=provider_name, + model_name=model.name, + parameters={ + **model_parameters, + **optional_model_parameters, + }, + ), + **root_model, + } + yield this_model diff --git a/uv.lock b/uv.lock index d3502f57..360ea2b0 100644 --- a/uv.lock +++ b/uv.lock @@ -79,6 +79,7 @@ dev = [ { name = "blockbuster" }, { name = "build" }, { name = "cassio", marker = "python_full_version >= '3.9'" }, + { name = "coverage" }, { name = "faker" }, { name = "mypy" }, { name = "pre-commit" }, @@ -112,6 +113,7 @@ dev = [ { name = "blockbuster", specifier = "~=1.5.5" }, { name = "build", specifier = ">=1.0.0" }, { name = "cassio", marker = "python_full_version >= '3.9'", specifier = "~=0.1.10" }, + { name = "coverage", specifier = "~=7.0.0" }, { name = "faker", specifier = "~=23.1.0" }, { name = "mypy", specifier = "~=1.9.0" }, { name = "pre-commit", specifier = "~=3.5.0" }, @@ -377,169 +379,56 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791, upload-time = "2024-08-04T19:45:30.9Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690, upload-time = "2024-08-04T19:43:07.695Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127, upload-time = "2024-08-04T19:43:10.15Z" }, - { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654, upload-time = "2024-08-04T19:43:12.405Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598, upload-time = "2024-08-04T19:43:14.078Z" }, - { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732, upload-time = "2024-08-04T19:43:16.632Z" }, - { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816, upload-time = "2024-08-04T19:43:19.049Z" }, - { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325, upload-time = "2024-08-04T19:43:21.246Z" }, - { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418, upload-time = "2024-08-04T19:43:22.945Z" }, - { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343, upload-time = "2024-08-04T19:43:25.121Z" }, - { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136, upload-time = "2024-08-04T19:43:26.851Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796, upload-time = "2024-08-04T19:43:29.115Z" }, - { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244, upload-time = "2024-08-04T19:43:31.285Z" }, - { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279, upload-time = "2024-08-04T19:43:33.581Z" }, - { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859, upload-time = "2024-08-04T19:43:35.301Z" }, - { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549, upload-time = "2024-08-04T19:43:37.578Z" }, - { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477, upload-time = "2024-08-04T19:43:39.92Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134, upload-time = "2024-08-04T19:43:41.453Z" }, - { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910, upload-time = "2024-08-04T19:43:43.037Z" }, - { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348, upload-time = "2024-08-04T19:43:44.787Z" }, - { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230, upload-time = "2024-08-04T19:43:46.707Z" }, - { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983, upload-time = "2024-08-04T19:43:49.082Z" }, - { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221, upload-time = "2024-08-04T19:43:52.15Z" }, - { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342, upload-time = "2024-08-04T19:43:53.746Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371, upload-time = "2024-08-04T19:43:55.993Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455, upload-time = "2024-08-04T19:43:57.618Z" }, - { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924, upload-time = "2024-08-04T19:44:00.012Z" }, - { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252, upload-time = "2024-08-04T19:44:01.713Z" }, - { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897, upload-time = "2024-08-04T19:44:03.898Z" }, - { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606, upload-time = "2024-08-04T19:44:05.532Z" }, - { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373, upload-time = "2024-08-04T19:44:07.079Z" }, - { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007, upload-time = "2024-08-04T19:44:09.453Z" }, - { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269, upload-time = "2024-08-04T19:44:11.045Z" }, - { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886, upload-time = "2024-08-04T19:44:12.83Z" }, - { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037, upload-time = "2024-08-04T19:44:15.393Z" }, - { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038, upload-time = "2024-08-04T19:44:17.466Z" }, - { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690, upload-time = "2024-08-04T19:44:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765, upload-time = "2024-08-04T19:44:20.994Z" }, - { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611, upload-time = "2024-08-04T19:44:22.616Z" }, - { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671, upload-time = "2024-08-04T19:44:24.418Z" }, - { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368, upload-time = "2024-08-04T19:44:26.276Z" }, - { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758, upload-time = "2024-08-04T19:44:29.028Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035, upload-time = "2024-08-04T19:44:30.673Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839, upload-time = "2024-08-04T19:44:32.412Z" }, - { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569, upload-time = "2024-08-04T19:44:34.547Z" }, - { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927, upload-time = "2024-08-04T19:44:36.313Z" }, - { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401, upload-time = "2024-08-04T19:44:38.155Z" }, - { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301, upload-time = "2024-08-04T19:44:39.883Z" }, - { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598, upload-time = "2024-08-04T19:44:41.59Z" }, - { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307, upload-time = "2024-08-04T19:44:43.301Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453, upload-time = "2024-08-04T19:44:45.677Z" }, - { url = "https://files.pythonhosted.org/packages/81/d0/d9e3d554e38beea5a2e22178ddb16587dbcbe9a1ef3211f55733924bf7fa/coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", size = 206674, upload-time = "2024-08-04T19:44:47.694Z" }, - { url = "https://files.pythonhosted.org/packages/38/ea/cab2dc248d9f45b2b7f9f1f596a4d75a435cb364437c61b51d2eb33ceb0e/coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", size = 207101, upload-time = "2024-08-04T19:44:49.32Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6f/f82f9a500c7c5722368978a5390c418d2a4d083ef955309a8748ecaa8920/coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", size = 236554, upload-time = "2024-08-04T19:44:51.631Z" }, - { url = "https://files.pythonhosted.org/packages/a6/94/d3055aa33d4e7e733d8fa309d9adf147b4b06a82c1346366fc15a2b1d5fa/coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", size = 234440, upload-time = "2024-08-04T19:44:53.464Z" }, - { url = "https://files.pythonhosted.org/packages/e4/6e/885bcd787d9dd674de4a7d8ec83faf729534c63d05d51d45d4fa168f7102/coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", size = 235889, upload-time = "2024-08-04T19:44:55.165Z" }, - { url = "https://files.pythonhosted.org/packages/f4/63/df50120a7744492710854860783d6819ff23e482dee15462c9a833cc428a/coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", size = 235142, upload-time = "2024-08-04T19:44:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/3a/5d/9d0acfcded2b3e9ce1c7923ca52ccc00c78a74e112fc2aee661125b7843b/coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", size = 233805, upload-time = "2024-08-04T19:44:59.033Z" }, - { url = "https://files.pythonhosted.org/packages/c4/56/50abf070cb3cd9b1dd32f2c88f083aab561ecbffbcd783275cb51c17f11d/coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", size = 234655, upload-time = "2024-08-04T19:45:01.398Z" }, - { url = "https://files.pythonhosted.org/packages/25/ee/b4c246048b8485f85a2426ef4abab88e48c6e80c74e964bea5cd4cd4b115/coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", size = 209296, upload-time = "2024-08-04T19:45:03.819Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/96cf86b70b69ea2b12924cdf7cabb8ad10e6130eab8d767a1099fbd2a44f/coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", size = 210137, upload-time = "2024-08-04T19:45:06.25Z" }, - { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688, upload-time = "2024-08-04T19:45:08.358Z" }, - { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120, upload-time = "2024-08-04T19:45:11.526Z" }, - { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249, upload-time = "2024-08-04T19:45:13.202Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237, upload-time = "2024-08-04T19:45:14.961Z" }, - { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311, upload-time = "2024-08-04T19:45:16.924Z" }, - { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453, upload-time = "2024-08-04T19:45:18.672Z" }, - { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958, upload-time = "2024-08-04T19:45:20.63Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938, upload-time = "2024-08-04T19:45:23.062Z" }, - { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352, upload-time = "2024-08-04T19:45:25.042Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153, upload-time = "2024-08-04T19:45:27.079Z" }, - { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926, upload-time = "2024-08-04T19:45:28.875Z" }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", marker = "python_full_version < '3.9'" }, -] - -[[package]] -name = "coverage" -version = "7.8.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872, upload-time = "2025-03-30T20:36:45.376Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/01/1c5e6ee4ebaaa5e079db933a9a45f61172048c7efa06648445821a201084/coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe", size = 211379, upload-time = "2025-03-30T20:34:53.904Z" }, - { url = "https://files.pythonhosted.org/packages/e9/16/a463389f5ff916963471f7c13585e5f38c6814607306b3cb4d6b4cf13384/coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28", size = 211814, upload-time = "2025-03-30T20:34:56.959Z" }, - { url = "https://files.pythonhosted.org/packages/b8/b1/77062b0393f54d79064dfb72d2da402657d7c569cfbc724d56ac0f9c67ed/coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3", size = 240937, upload-time = "2025-03-30T20:34:58.751Z" }, - { url = "https://files.pythonhosted.org/packages/d7/54/c7b00a23150083c124e908c352db03bcd33375494a4beb0c6d79b35448b9/coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676", size = 238849, upload-time = "2025-03-30T20:35:00.521Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ec/a6b7cfebd34e7b49f844788fda94713035372b5200c23088e3bbafb30970/coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d", size = 239986, upload-time = "2025-03-30T20:35:02.307Z" }, - { url = "https://files.pythonhosted.org/packages/21/8c/c965ecef8af54e6d9b11bfbba85d4f6a319399f5f724798498387f3209eb/coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a", size = 239896, upload-time = "2025-03-30T20:35:04.141Z" }, - { url = "https://files.pythonhosted.org/packages/40/83/070550273fb4c480efa8381735969cb403fa8fd1626d74865bfaf9e4d903/coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c", size = 238613, upload-time = "2025-03-30T20:35:05.889Z" }, - { url = "https://files.pythonhosted.org/packages/07/76/fbb2540495b01d996d38e9f8897b861afed356be01160ab4e25471f4fed1/coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f", size = 238909, upload-time = "2025-03-30T20:35:07.76Z" }, - { url = "https://files.pythonhosted.org/packages/a3/7e/76d604db640b7d4a86e5dd730b73e96e12a8185f22b5d0799025121f4dcb/coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f", size = 213948, upload-time = "2025-03-30T20:35:09.144Z" }, - { url = "https://files.pythonhosted.org/packages/5c/a7/f8ce4aafb4a12ab475b56c76a71a40f427740cf496c14e943ade72e25023/coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23", size = 214844, upload-time = "2025-03-30T20:35:10.734Z" }, - { url = "https://files.pythonhosted.org/packages/2b/77/074d201adb8383addae5784cb8e2dac60bb62bfdf28b2b10f3a3af2fda47/coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27", size = 211493, upload-time = "2025-03-30T20:35:12.286Z" }, - { url = "https://files.pythonhosted.org/packages/a9/89/7a8efe585750fe59b48d09f871f0e0c028a7b10722b2172dfe021fa2fdd4/coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea", size = 211921, upload-time = "2025-03-30T20:35:14.18Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ef/96a90c31d08a3f40c49dbe897df4f1fd51fb6583821a1a1c5ee30cc8f680/coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7", size = 244556, upload-time = "2025-03-30T20:35:15.616Z" }, - { url = "https://files.pythonhosted.org/packages/89/97/dcd5c2ce72cee9d7b0ee8c89162c24972fb987a111b92d1a3d1d19100c61/coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040", size = 242245, upload-time = "2025-03-30T20:35:18.648Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7b/b63cbb44096141ed435843bbb251558c8e05cc835c8da31ca6ffb26d44c0/coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543", size = 244032, upload-time = "2025-03-30T20:35:20.131Z" }, - { url = "https://files.pythonhosted.org/packages/97/e3/7fa8c2c00a1ef530c2a42fa5df25a6971391f92739d83d67a4ee6dcf7a02/coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2", size = 243679, upload-time = "2025-03-30T20:35:21.636Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b3/e0a59d8df9150c8a0c0841d55d6568f0a9195692136c44f3d21f1842c8f6/coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318", size = 241852, upload-time = "2025-03-30T20:35:23.525Z" }, - { url = "https://files.pythonhosted.org/packages/9b/82/db347ccd57bcef150c173df2ade97976a8367a3be7160e303e43dd0c795f/coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9", size = 242389, upload-time = "2025-03-30T20:35:25.09Z" }, - { url = "https://files.pythonhosted.org/packages/21/f6/3f7d7879ceb03923195d9ff294456241ed05815281f5254bc16ef71d6a20/coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c", size = 213997, upload-time = "2025-03-30T20:35:26.914Z" }, - { url = "https://files.pythonhosted.org/packages/28/87/021189643e18ecf045dbe1e2071b2747901f229df302de01c998eeadf146/coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78", size = 214911, upload-time = "2025-03-30T20:35:28.498Z" }, - { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684, upload-time = "2025-03-30T20:35:29.959Z" }, - { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935, upload-time = "2025-03-30T20:35:31.912Z" }, - { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994, upload-time = "2025-03-30T20:35:33.455Z" }, - { url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885, upload-time = "2025-03-30T20:35:35.354Z" }, - { url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142, upload-time = "2025-03-30T20:35:37.121Z" }, - { url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906, upload-time = "2025-03-30T20:35:39.07Z" }, - { url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124, upload-time = "2025-03-30T20:35:40.598Z" }, - { url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317, upload-time = "2025-03-30T20:35:42.204Z" }, - { url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170, upload-time = "2025-03-30T20:35:44.216Z" }, - { url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969, upload-time = "2025-03-30T20:35:45.797Z" }, - { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708, upload-time = "2025-03-30T20:35:47.417Z" }, - { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981, upload-time = "2025-03-30T20:35:49.002Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495, upload-time = "2025-03-30T20:35:51.073Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538, upload-time = "2025-03-30T20:35:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561, upload-time = "2025-03-30T20:35:54.658Z" }, - { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633, upload-time = "2025-03-30T20:35:56.221Z" }, - { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712, upload-time = "2025-03-30T20:35:57.801Z" }, - { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000, upload-time = "2025-03-30T20:35:59.378Z" }, - { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195, upload-time = "2025-03-30T20:36:01.005Z" }, - { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998, upload-time = "2025-03-30T20:36:03.006Z" }, - { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541, upload-time = "2025-03-30T20:36:04.638Z" }, - { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767, upload-time = "2025-03-30T20:36:06.503Z" }, - { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997, upload-time = "2025-03-30T20:36:08.137Z" }, - { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708, upload-time = "2025-03-30T20:36:09.781Z" }, - { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046, upload-time = "2025-03-30T20:36:11.409Z" }, - { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139, upload-time = "2025-03-30T20:36:13.86Z" }, - { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307, upload-time = "2025-03-30T20:36:16.074Z" }, - { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116, upload-time = "2025-03-30T20:36:18.033Z" }, - { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909, upload-time = "2025-03-30T20:36:19.644Z" }, - { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068, upload-time = "2025-03-30T20:36:21.282Z" }, - { url = "https://files.pythonhosted.org/packages/60/0c/5da94be095239814bf2730a28cffbc48d6df4304e044f80d39e1ae581997/coverage-7.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f", size = 211377, upload-time = "2025-03-30T20:36:23.298Z" }, - { url = "https://files.pythonhosted.org/packages/d5/cb/b9e93ebf193a0bb89dbcd4f73d7b0e6ecb7c1b6c016671950e25f041835e/coverage-7.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96121edfa4c2dfdda409877ea8608dd01de816a4dc4a0523356067b305e4e17a", size = 211803, upload-time = "2025-03-30T20:36:25.74Z" }, - { url = "https://files.pythonhosted.org/packages/78/1a/cdbfe9e1bb14d3afcaf6bb6e1b9ba76c72666e329cd06865bbd241efd652/coverage-7.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8af63b9afa1031c0ef05b217faa598f3069148eeee6bb24b79da9012423b82", size = 240561, upload-time = "2025-03-30T20:36:27.548Z" }, - { url = "https://files.pythonhosted.org/packages/59/04/57f1223f26ac018d7ce791bfa65b0c29282de3e041c1cd3ed430cfeac5a5/coverage-7.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b1f4af0d4afe495cd4787a68e00f30f1d15939f550e869de90a86efa7e0814", size = 238488, upload-time = "2025-03-30T20:36:29.175Z" }, - { url = "https://files.pythonhosted.org/packages/b7/b1/0f25516ae2a35e265868670384feebe64e7857d9cffeeb3887b0197e2ba2/coverage-7.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ec0be97723ae72d63d3aa41961a0b9a6f5a53ff599813c324548d18e3b9e8c", size = 239589, upload-time = "2025-03-30T20:36:30.876Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a4/99d88baac0d1d5a46ceef2dd687aac08fffa8795e4c3e71b6f6c78e14482/coverage-7.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a1d96e780bdb2d0cbb297325711701f7c0b6f89199a57f2049e90064c29f6bd", size = 239366, upload-time = "2025-03-30T20:36:32.563Z" }, - { url = "https://files.pythonhosted.org/packages/ea/9e/1db89e135feb827a868ed15f8fc857160757f9cab140ffee21342c783ceb/coverage-7.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f1d8a2a57b47142b10374902777e798784abf400a004b14f1b0b9eaf1e528ba4", size = 237591, upload-time = "2025-03-30T20:36:34.721Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6d/ac4d6fdfd0e201bc82d1b08adfacb1e34b40d21a22cdd62cfaf3c1828566/coverage-7.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cf60dd2696b457b710dd40bf17ad269d5f5457b96442f7f85722bdb16fa6c899", size = 238572, upload-time = "2025-03-30T20:36:36.805Z" }, - { url = "https://files.pythonhosted.org/packages/25/5e/917cbe617c230f7f1745b6a13e780a3a1cd1cf328dbcd0fd8d7ec52858cd/coverage-7.8.0-cp39-cp39-win32.whl", hash = "sha256:be945402e03de47ba1872cd5236395e0f4ad635526185a930735f66710e1bd3f", size = 213966, upload-time = "2025-03-30T20:36:38.551Z" }, - { url = "https://files.pythonhosted.org/packages/bd/93/72b434fe550135869f9ea88dd36068af19afce666db576e059e75177e813/coverage-7.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:90e7fbc6216ecaffa5a880cdc9c77b7418c1dcb166166b78dbc630d07f278cc3", size = 214852, upload-time = "2025-03-30T20:36:40.209Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f1/1da77bb4c920aa30e82fa9b6ea065da3467977c2e5e032e38e66f1c57ffd/coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd", size = 203443, upload-time = "2025-03-30T20:36:41.959Z" }, - { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435, upload-time = "2025-03-30T20:36:43.61Z" }, +version = "7.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/b3/992a6b222b14c99e6d4aa9f448c670a5f614648597499de6ddc11be839e3/coverage-7.0.5.tar.gz", hash = "sha256:051afcbd6d2ac39298d62d340f94dbb6a1f31de06dfaf6fcef7b759dd3860c45", size = 796171, upload-time = "2023-01-11T00:01:02.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/79/7acd51daffd3e53f8a6f2f43543f686b46c206e6f36e2203ca2ca15d72ec/coverage-7.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a7f23bbaeb2a87f90f607730b45564076d870f1fb07b9318d0c21f36871932b", size = 197913, upload-time = "2023-01-10T23:59:50.667Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fe/5116a0d06a3f6b61d5f147e7d968cdd472b4213f497e3d600afea3ea2f1c/coverage-7.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c18d47f314b950dbf24a41787ced1474e01ca816011925976d90a88b27c22b89", size = 198212, upload-time = "2023-01-10T23:59:52.01Z" }, + { url = "https://files.pythonhosted.org/packages/7c/08/6e8508b6fdad45895daf46cf37a27e043e1162e1353b4f8940987bdaee1d/coverage-7.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef14d75d86f104f03dea66c13188487151760ef25dd6b2dbd541885185f05f40", size = 226699, upload-time = "2023-01-10T23:59:53.056Z" }, + { url = "https://files.pythonhosted.org/packages/63/74/a65dc4de105d34240d7c46c246371471d64b5b163d1503f29108f1297a4d/coverage-7.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66e50680e888840c0995f2ad766e726ce71ca682e3c5f4eee82272c7671d38a2", size = 225013, upload-time = "2023-01-10T23:59:54.592Z" }, + { url = "https://files.pythonhosted.org/packages/01/01/8d17427fbeb0ee132111c543bfeea5ab403d6869812cf6085adc18debecf/coverage-7.0.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9fed35ca8c6e946e877893bbac022e8563b94404a605af1d1e6accc7eb73289", size = 225885, upload-time = "2023-01-10T23:59:55.654Z" }, + { url = "https://files.pythonhosted.org/packages/71/5e/55d1d143327306f793fce0cb34b2a4ab0d5a1559d632ca5e327a9f9bb848/coverage-7.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d8d04e755934195bdc1db45ba9e040b8d20d046d04d6d77e71b3b34a8cc002d0", size = 231810, upload-time = "2023-01-10T23:59:57.122Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e0/1b5b5bf33eaba010395864415aaa5c036a3fb10780cc2c92b3a8e51f035b/coverage-7.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e109f1c9a3ece676597831874126555997c48f62bddbcace6ed17be3e372de8", size = 230047, upload-time = "2023-01-10T23:59:58.511Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7f/7875a6e6a2522e8b7bc683be78714badd4ac8b3d90b69fc2cadc20ca4d52/coverage-7.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0a1890fca2962c4f1ad16551d660b46ea77291fba2cc21c024cd527b9d9c8809", size = 231261, upload-time = "2023-01-10T23:59:59.657Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f1/c8c99bb9902df7a01ac80ca850a0fbf2c5d2bf25755841ffdb5d72c1b068/coverage-7.0.5-cp310-cp310-win32.whl", hash = "sha256:be9fcf32c010da0ba40bf4ee01889d6c737658f4ddff160bd7eb9cac8f094b21", size = 200364, upload-time = "2023-01-11T00:00:01.039Z" }, + { url = "https://files.pythonhosted.org/packages/87/f7/6259d91f3b3a0c38337e99b85a10ebfd3e1a15273452cee72151b281e57d/coverage-7.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:cbfcba14a3225b055a28b3199c3d81cd0ab37d2353ffd7f6fd64844cebab31ad", size = 201275, upload-time = "2023-01-11T00:00:02.246Z" }, + { url = "https://files.pythonhosted.org/packages/88/88/1bfb18b78f068ffae4c87cb39b0351e6709ce9a655cfe6b0a7e397b669f8/coverage-7.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:30b5fec1d34cc932c1bc04017b538ce16bf84e239378b8f75220478645d11fca", size = 198088, upload-time = "2023-01-11T00:00:03.435Z" }, + { url = "https://files.pythonhosted.org/packages/53/6c/d206426bd4896df14f88581e47198e509a376f50e3ced18bce75f31aabb5/coverage-7.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1caed2367b32cc80a2b7f58a9f46658218a19c6cfe5bc234021966dc3daa01f0", size = 198317, upload-time = "2023-01-11T00:00:04.82Z" }, + { url = "https://files.pythonhosted.org/packages/c6/81/e01309e5ba812a767bfd3ef692a619ee459af4d9313e7244305561aa2341/coverage-7.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d254666d29540a72d17cc0175746cfb03d5123db33e67d1020e42dae611dc196", size = 230348, upload-time = "2023-01-11T00:00:06.248Z" }, + { url = "https://files.pythonhosted.org/packages/cc/55/40719c5b7b7503144ffcf55ead8d37c6e8ec2269293a11c5d7654caa5228/coverage-7.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19245c249aa711d954623d94f23cc94c0fd65865661f20b7781210cb97c471c0", size = 227922, upload-time = "2023-01-11T00:00:07.719Z" }, + { url = "https://files.pythonhosted.org/packages/a4/3c/662aa204ff721bbad7321908013fca51ed6b64ae24e94c699f0789528111/coverage-7.0.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b05ed4b35bf6ee790832f68932baf1f00caa32283d66cc4d455c9e9d115aafc", size = 229726, upload-time = "2023-01-11T00:00:08.911Z" }, + { url = "https://files.pythonhosted.org/packages/a8/98/e0308655f42fa5b1daf3574c79c32628936ed6fa11d8e8f3b970d185220a/coverage-7.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:29de916ba1099ba2aab76aca101580006adfac5646de9b7c010a0f13867cba45", size = 238681, upload-time = "2023-01-11T00:00:10.12Z" }, + { url = "https://files.pythonhosted.org/packages/a4/dc/3671f11710feeb83fda4b2b7a70262c6bf7e32f8a43c31fa33b5d83bac0a/coverage-7.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e057e74e53db78122a3979f908973e171909a58ac20df05c33998d52e6d35757", size = 237093, upload-time = "2023-01-11T00:00:11.675Z" }, + { url = "https://files.pythonhosted.org/packages/ed/75/fa4b613e2d4d8b0773ac21061cedd29a7a158ab9139c932011fdafc0cbc3/coverage-7.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:411d4ff9d041be08fdfc02adf62e89c735b9468f6d8f6427f8a14b6bb0a85095", size = 238144, upload-time = "2023-01-11T00:00:13.012Z" }, + { url = "https://files.pythonhosted.org/packages/ed/38/150ae9c3ee2f9544a1c1c50a78c98364d4e6ce9025cd647b739ec3b776b7/coverage-7.0.5-cp311-cp311-win32.whl", hash = "sha256:52ab14b9e09ce052237dfe12d6892dd39b0401690856bcfe75d5baba4bfe2831", size = 200349, upload-time = "2023-01-11T00:00:14.446Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f4/4f4011153af468e75f9f4708953daf56c6945b3f0bf3fb813d9747f3eefa/coverage-7.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:1f66862d3a41674ebd8d1a7b6f5387fe5ce353f8719040a986551a545d7d83ea", size = 201372, upload-time = "2023-01-11T00:00:16.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/56/29e6648e9c0542602d0989c4848e605a6e2b98af79c454b6fd1f14ed03ee/coverage-7.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:790e4433962c9f454e213b21b0fd4b42310ade9c077e8edcb5113db0818450cb", size = 197881, upload-time = "2023-01-11T00:00:31.01Z" }, + { url = "https://files.pythonhosted.org/packages/d0/eb/52b1585f1da59f25a2d0ef79988795fa46ab99b48d44df2e38e99c725a63/coverage-7.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49640bda9bda35b057b0e65b7c43ba706fa2335c9a9896652aebe0fa399e80e6", size = 198176, upload-time = "2023-01-11T00:00:32.345Z" }, + { url = "https://files.pythonhosted.org/packages/13/31/f4b97b92913e6dbffc11e1e575e01eb8fff7abaaf4b38b11208ecc362207/coverage-7.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d66187792bfe56f8c18ba986a0e4ae44856b1c645336bd2c776e3386da91e1dd", size = 227824, upload-time = "2023-01-11T00:00:33.686Z" }, + { url = "https://files.pythonhosted.org/packages/39/ee/06bf06e1670678934b60c818ce295dea7b9c361e1adc72b4651e933f959a/coverage-7.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:276f4cd0001cd83b00817c8db76730938b1ee40f4993b6a905f40a7278103b3a", size = 225680, upload-time = "2023-01-11T00:00:35.121Z" }, + { url = "https://files.pythonhosted.org/packages/02/d6/c095845877f235b52a7113e08e750a9210feabf059b71133e9349eccb836/coverage-7.0.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95304068686545aa368b35dfda1cdfbbdbe2f6fe43de4a2e9baa8ebd71be46e2", size = 227022, upload-time = "2023-01-11T00:00:36.347Z" }, + { url = "https://files.pythonhosted.org/packages/66/c9/08ed37cdf2101a6832dfe99307fdbf6d9d5abc2070105ee061b7385a1f80/coverage-7.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:17e01dd8666c445025c29684d4aabf5a90dc6ef1ab25328aa52bedaa95b65ad7", size = 232754, upload-time = "2023-01-11T00:00:37.71Z" }, + { url = "https://files.pythonhosted.org/packages/06/45/d201ad5b5b7e44764769421fcd1a9cbb0fa3fc7bb4020d83f955e2a6fb2d/coverage-7.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea76dbcad0b7b0deb265d8c36e0801abcddf6cc1395940a24e3595288b405ca0", size = 231249, upload-time = "2023-01-11T00:00:39.133Z" }, + { url = "https://files.pythonhosted.org/packages/35/51/0dd2e96c0f2cbd08fca3277ab61728e9fa1e30b4a6fbf64ec112b86ac090/coverage-7.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:50a6adc2be8edd7ee67d1abc3cd20678987c7b9d79cd265de55941e3d0d56499", size = 232164, upload-time = "2023-01-11T00:00:40.576Z" }, + { url = "https://files.pythonhosted.org/packages/59/95/22de7c62c8e24b17cc5c337a0523e5e9c8cf63b0e8e10e3628863681875a/coverage-7.0.5-cp38-cp38-win32.whl", hash = "sha256:e4ce984133b888cc3a46867c8b4372c7dee9cee300335e2925e197bcd45b9e16", size = 200343, upload-time = "2023-01-11T00:00:42.018Z" }, + { url = "https://files.pythonhosted.org/packages/28/7c/7574b64b81d1be6fe5fb5ce9364a6c82507d474678d44c2bd69b7f40ffe9/coverage-7.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:4a950f83fd3f9bca23b77442f3a2b2ea4ac900944d8af9993743774c4fdc57af", size = 201266, upload-time = "2023-01-11T00:00:43.338Z" }, + { url = "https://files.pythonhosted.org/packages/3e/fc/80617dba15621700e9fee56ced5f728376a6f853e1e32181b63f64c0888a/coverage-7.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c2155943896ac78b9b0fd910fb381186d0c345911f5333ee46ac44c8f0e43ab", size = 197901, upload-time = "2023-01-11T00:00:45.159Z" }, + { url = "https://files.pythonhosted.org/packages/a5/da/f340fca24231ca2ac91807d2ea3596be6d4effab7b870c74949b9a92dbeb/coverage-7.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:54f7e9705e14b2c9f6abdeb127c390f679f6dbe64ba732788d3015f7f76ef637", size = 198207, upload-time = "2023-01-11T00:00:46.644Z" }, + { url = "https://files.pythonhosted.org/packages/ac/9a/5a0e4c17f105eb04caa7cd4e524a734badb6198c36617ac124002a68aa3b/coverage-7.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee30375b409d9a7ea0f30c50645d436b6f5dfee254edffd27e45a980ad2c7f4", size = 226272, upload-time = "2023-01-11T00:00:48.404Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ff/cfb9b03d3673d24aae2a40397d812cde590e36f5e4aad3efa946910965c3/coverage-7.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b78729038abea6a5df0d2708dce21e82073463b2d79d10884d7d591e0f385ded", size = 224612, upload-time = "2023-01-11T00:00:49.655Z" }, + { url = "https://files.pythonhosted.org/packages/9b/38/b407288f8142c3b14c3f36a145d1380e5750781b22997eb1b659f194b093/coverage-7.0.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13250b1f0bd023e0c9f11838bdeb60214dd5b6aaf8e8d2f110c7e232a1bff83b", size = 225438, upload-time = "2023-01-11T00:00:51.121Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fc/7deab9d5d5af9d9ac360922d088250a644a2a2d0627d70a2043b76c260cc/coverage-7.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c407b1950b2d2ffa091f4e225ca19a66a9bd81222f27c56bd12658fc5ca1209", size = 231390, upload-time = "2023-01-11T00:00:52.963Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c1/daf9e61cb35b8c5b781f94b85941fbbc233502f3dfda864d83f4c677391b/coverage-7.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c76a3075e96b9c9ff00df8b5f7f560f5634dffd1658bafb79eb2682867e94f78", size = 229636, upload-time = "2023-01-11T00:00:54.161Z" }, + { url = "https://files.pythonhosted.org/packages/a7/15/bbea207f612ba112536bcf7a4c57529738f11fcf41b307d62459ec788ca5/coverage-7.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f26648e1b3b03b6022b48a9b910d0ae209e2d51f50441db5dce5b530fad6d9b1", size = 230840, upload-time = "2023-01-11T00:00:55.612Z" }, + { url = "https://files.pythonhosted.org/packages/c2/46/fb2e5ea06f34fbefc6d56a49508865c0d8268a7fa4645313d3a176a41161/coverage-7.0.5-cp39-cp39-win32.whl", hash = "sha256:ba3027deb7abf02859aca49c865ece538aee56dcb4871b4cced23ba4d5088904", size = 200386, upload-time = "2023-01-11T00:00:57.203Z" }, + { url = "https://files.pythonhosted.org/packages/16/4b/25fffab188056faf56071b38b72e8e5ae74c7f7f5f8302a764f9f915512c/coverage-7.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:949844af60ee96a376aac1ded2a27e134b8c8d35cc006a52903fc06c24a3296f", size = 201295, upload-time = "2023-01-11T00:00:58.457Z" }, + { url = "https://files.pythonhosted.org/packages/1d/87/65a9ac379bd840950efd5d69cf97584a4f21ef939c3d05a74edbd308aa2b/coverage-7.0.5-pp37.pp38.pp39-none-any.whl", hash = "sha256:b9727ac4f5cf2cbf87880a63870b5b9730a8ae3a4a360241a0fdaa2f71240ff0", size = 190375, upload-time = "2023-01-11T00:01:00.003Z" }, ] [package.optional-dependencies] toml = [ - { name = "tomli", marker = "python_full_version >= '3.9' and python_full_version <= '3.11'" }, + { name = "tomli", marker = "python_full_version <= '3.11'" }, ] [[package]] @@ -1685,8 +1574,7 @@ name = "pytest-cov" version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.9'" }, - { name = "coverage", version = "7.8.0", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.9'" }, + { name = "coverage", extra = ["toml"] }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", size = 63245, upload-time = "2023-05-24T18:44:56.845Z" }