diff --git a/.github/ISSUE_TEMPLATE/---feature-request.yml b/.github/ISSUE_TEMPLATE/---feature-request.yml index 442cc4e61b2..63a90eec4ed 100644 --- a/.github/ISSUE_TEMPLATE/---feature-request.yml +++ b/.github/ISSUE_TEMPLATE/---feature-request.yml @@ -1,6 +1,6 @@ name: "\U0001F381 Feature Request" labels: ["kind/feature", "status/triage"] -description: "Did you find errors, omissions, or anything unintelligible in the documentation?" +description: "Want something new?" body: - type: markdown diff --git a/.github/workflows/.tests-matrix.yaml b/.github/workflows/.tests-matrix.yaml index 775466186a4..9a9bae65d01 100644 --- a/.github/workflows/.tests-matrix.yaml +++ b/.github/workflows/.tests-matrix.yaml @@ -22,13 +22,16 @@ defaults: run: shell: bash +env: + PYTHONWARNDEFAULTENCODING: 'true' + jobs: mypy: name: mypy runs-on: ${{ inputs.runner }} if: inputs.run-mypy steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - uses: ./.github/actions/bootstrap-poetry id: bootstrap-poetry @@ -37,7 +40,7 @@ jobs: - uses: ./.github/actions/poetry-install - - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4 + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: .mypy_cache key: mypy-${{ runner.os }}-py${{ steps.bootstrap-poetry.outputs.python-version }}-${{ hashFiles('pyproject.toml', 'poetry.lock') }} @@ -52,7 +55,7 @@ jobs: runs-on: ${{ inputs.runner }} if: inputs.run-pytest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - uses: ./.github/actions/bootstrap-poetry with: @@ -74,7 +77,7 @@ jobs: runs-on: ${{ inputs.runner }} if: inputs.run-pytest-export steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - uses: ./.github/actions/bootstrap-poetry with: @@ -87,7 +90,7 @@ jobs: - run: poetry run pip list --format json | jq -r '.[] | "\(.name)=\(.version)"' >> $GITHUB_OUTPUT id: package-versions - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: path: poetry-plugin-export repository: python-poetry/poetry-plugin-export diff --git a/.github/workflows/backport.yaml b/.github/workflows/backport.yaml index 307fa037359..0e7696f3b89 100644 --- a/.github/workflows/backport.yaml +++ b/.github/workflows/backport.yaml @@ -15,26 +15,19 @@ jobs: if: > github.event.pull_request.merged && ( - (github.event.action == 'closed' && contains(github.event.pull_request.labels.*.name, 'backport/')) + github.event.action == 'closed' || (github.event.action == 'labeled' && contains(github.event.label.name, 'backport/') ) ) steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - # This workflow requires a non-GHA token in order to trigger downstream CI, and to access the 'fork' repository. - - uses: actions/create-github-app-token@78e5f2ddc08efcb88fbbee6cfa3fed770ba550c3 # v1 + - uses: actions/create-github-app-token@7bfa3a4717ef143a604ee0a99d859b8886a96d00 # v1.9.3 id: app-token with: app-id: ${{ secrets.POETRY_TOKEN_APP_ID }} private-key: ${{ secrets.POETRY_TOKEN_APP_KEY }} - - name: backport.sh - run: | - git config --global user.name "${{ steps.app-token.outputs.slug }}[bot]" - git config --global user.email "${{ steps.app-token.outputs.slug }}[bot]@users.noreply.github.com" - - gh repo fork --remote-name fork - - ./.github/scripts/backport.sh --pr ${{ github.event.pull_request.number }} --comment --remote fork - env: - GH_TOKEN: ${{ steps.app-token.outputs.token }} + - uses: tibdex/backport@9565281eda0731b1d20c4025c43339fb0a23812e # v2.0.4 + with: + github_token: ${{ steps.app-token.outputs.token }} + title_template: "[<%= base %>] <%= title %>" + label_pattern: "^backport/(?([^ ]+))$" diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 15424e90fd1..d50675a3330 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -27,20 +27,20 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: repository: python-poetry/website - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: path: poetry ref: ${{ github.event.pull_request.head.sha }} - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: node-version: "18" - - uses: peaceiris/actions-hugo@16361eb4acea8698b220b76c0d4e84e1fd22c61d # v2 + - uses: peaceiris/actions-hugo@16361eb4acea8698b220b76c0d4e84e1fd22c61d # v2.6.0 with: hugo-version: '0.83.1' @@ -59,7 +59,7 @@ jobs: # Build the static website. hugo -v --minify - - uses: amondnet/vercel-action@16e87c0a08142b0d0d33b76aeaf20823c381b9b9 # v25 + - uses: amondnet/vercel-action@16e87c0a08142b0d0d33b76aeaf20823c381b9b9 # v25.2.0 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lock-threads.yaml b/.github/workflows/lock-threads.yaml index 09dafbbbac3..361ead63095 100644 --- a/.github/workflows/lock-threads.yaml +++ b/.github/workflows/lock-threads.yaml @@ -14,7 +14,7 @@ jobs: permissions: issues: write steps: - - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5 + - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 with: process-only: issues issue-inactive-days: 30 @@ -29,7 +29,7 @@ jobs: issues: write pull-requests: write steps: - - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5 + - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 with: process-only: prs pr-inactive-days: 30 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 471cac13971..93acf77946e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -9,11 +9,11 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - run: pipx run build - - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: distfiles path: dist/ @@ -26,11 +26,17 @@ jobs: contents: write needs: build steps: - - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4 + # We need to be in a git repo for gh to work. + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + + - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 with: name: distfiles + path: dist/ - run: gh release upload ${{ github.event.release.tag_name }} dist/*.{tar.gz,whl} + env: + GH_TOKEN: ${{ github.token }} upload-pypi: name: Upload (PyPI) @@ -42,10 +48,11 @@ jobs: id-token: write needs: build steps: - - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4 + - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 with: name: distfiles + path: dist/ - - uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # release/v1 + - uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14 with: print-hash: true diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index a4ff36417c2..72aecab2a4b 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -23,9 +23,9 @@ jobs: src: ${{ steps.changes.outputs.src }} tests: ${{ steps.changes.outputs.tests }} steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: changes with: filters: | @@ -54,7 +54,7 @@ jobs: if: needs.changes.outputs.project == 'true' needs: changes steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - uses: ./.github/actions/bootstrap-poetry @@ -66,7 +66,7 @@ jobs: if: needs.changes.outputs.project == 'true' needs: lockfile steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - run: pipx run build @@ -85,7 +85,7 @@ jobs: if: needs.changes.outputs.fixtures-pypi == 'true' needs: changes steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - uses: ./.github/actions/bootstrap-poetry @@ -100,7 +100,7 @@ jobs: tests-matrix: # Use this matrix with multiple jobs defined in a reusable workflow: uses: ./.github/workflows/.tests-matrix.yaml - name: ${{ matrix.os.name }} (Python ${{ matrix.python-version }}) + name: "${{ matrix.os.name }} (Python ${{ matrix.python-version }})" if: '!failure()' needs: - lockfile @@ -117,10 +117,12 @@ jobs: os: - name: Ubuntu image: ubuntu-22.04 - - name: macOS + - name: macOS x86_64 image: macos-13 - name: Windows image: windows-2022 + - name: macOS aarch64 + image: macos-14 python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] fail-fast: false diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 44b72ff4c0c..9b4c4bc74b1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: trailing-whitespace exclude: tests/repositories/fixtures/pypi.org/metadata/.*\.metadata @@ -22,12 +22,12 @@ repos: - id: check-docstring-first - repo: https://github.com/pre-commit/pre-commit - rev: v3.6.2 + rev: v3.7.1 hooks: - id: validate_manifest - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.3 + rev: v0.5.4 hooks: - id: ruff - id: ruff-format diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index 8f4e23448a4..6d060fa1cf7 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -4,7 +4,7 @@ entry: poetry check language: python pass_filenames: false - files: ^(.*/)?pyproject\.toml$ + files: ^(.*/)?(poetry\.lock|pyproject\.toml)$ - id: poetry-lock name: poetry-lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 29c0a6448be..3208cd05d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,43 @@ # Change Log +## [1.8.3] - 2024-05-08 + +### Added + +- Add support for untagged CPython builds with versions ending with a `+` ([#9207](https://github.com/python-poetry/poetry/pull/9207)). + +### Changed + +- Require `pkginfo>=1.10` to ensure support for packages with metadata version 2.3 ([#9130](https://github.com/python-poetry/poetry/pull/9130)). +- Improve locking on FIPS systems ([#9152](https://github.com/python-poetry/poetry/pull/9152)). + +### Fixed + +- Fix an issue where unrecognized package metadata versions silently resulted in empty dependencies ([#9203](https://github.com/python-poetry/poetry/pull/9203), + [#9226](https://github.com/python-poetry/poetry/pull/9226)). +- Fix an issue where trailing slashes in git URLs where not handled correctly ([#9205](https://github.com/python-poetry/poetry/pull/9205)). +- Fix an issue where `poetry self` commands printed a warning that the current project cannot be installed ([#9302](https://github.com/python-poetry/poetry/pull/9302)). +- Fix an issue where `poetry install` sporadically failed with a `KeyError` due to a race condition ([#9335](https://github.com/python-poetry/poetry/pull/9335)). + +### Docs + +- Fix incorrect information about `poetry shell` ([#9060](https://github.com/python-poetry/poetry/pull/9060)). +- Add a git subdirectory example to `poetry add` ([#9080](https://github.com/python-poetry/poetry/pull/9080)). +- Mention interactive credential configuration ([#9074](https://github.com/python-poetry/poetry/pull/9074)). +- Add notes for optional advanced installation steps ([#9098](https://github.com/python-poetry/poetry/pull/9098)). +- Add reference to configuration credentials in documentation of poetry `publish` ([#9110](https://github.com/python-poetry/poetry/pull/9110)). +- Improve documentation for configuring credentials via environment variables ([#9121](https://github.com/python-poetry/poetry/pull/9121)). +- Remove misleading wording around virtual environments ([#9213](https://github.com/python-poetry/poetry/pull/9213)). +- Remove outdated advice regarding seeding keyring backends ([#9164](https://github.com/python-poetry/poetry/pull/9164)). +- Add a `pyproject.toml` example for a dependency with multiple extras ([#9138](https://github.com/python-poetry/poetry/pull/9138)). +- Clarify help of `poetry add` ([#9230](https://github.com/python-poetry/poetry/pull/9230)). +- Add a note how to configure credentials for TestPyPI for `poetry publish` ([#9255](https://github.com/python-poetry/poetry/pull/9255)). +- Fix information about the `--readme` option in `poetry new` ([#9260](https://github.com/python-poetry/poetry/pull/9260)). +- Clarify what is special about the Python constraint in `dependencies` ([#9256](https://github.com/python-poetry/poetry/pull/9256)). +- Update how to uninstall plugins via `pipx` ([#9320](https://github.com/python-poetry/poetry/pull/9320)). + + ## [1.8.2] - 2024-03-02 ### Fixed @@ -10,7 +47,7 @@ - Improve `lazy-wheel` error handling if the index server pretends to support HTTP range requests but does not respect them ([#9084](https://github.com/python-poetry/poetry/pull/9084)). - Improve `lazy-wheel` to allow redirects for HEAD requests ([#9087](https://github.com/python-poetry/poetry/pull/9087)). - Improve debug logging for `lazy-wheel` errors ([#9059](https://github.com/python-poetry/poetry/pull/9059)). -- Fix an issue where the hash of a metadata file could not be calculated correctly due to an encoding issue ([#9048](https://github.com/python-poetry/poetry/pull/9048)). +- Fix an issue where the hash of a metadata file could not be calculated correctly due to an encoding issue ([#9049](https://github.com/python-poetry/poetry/pull/9049)). - Fix an issue where `poetry add` failed in non-package mode if no project name was set ([#9046](https://github.com/python-poetry/poetry/pull/9046)). - Fix an issue where a hint to non-package mode was not compliant with the final name of the setting ([#9073](https://github.com/python-poetry/poetry/pull/9073)). @@ -34,7 +71,7 @@ - **Add a `non-package` mode for use cases where Poetry is only used for dependency management** ([#8650](https://github.com/python-poetry/poetry/pull/8650)). - **Add support for PEP 658 to fetch metadata without having to download wheels** ([#5509](https://github.com/python-poetry/poetry/pull/5509)). - **Add a `lazy-wheel` config option (default: `true`) to reduce wheel downloads during dependency resolution** ([#8815](https://github.com/python-poetry/poetry/pull/8815), -[#8941](https://github.com/python-poetry/poetry/pull/8941)). + [#8941](https://github.com/python-poetry/poetry/pull/8941)). - Improve performance of dependency resolution by using shallow copies instead of deep copies ([#8671](https://github.com/python-poetry/poetry/pull/8671)). - `poetry check` validates that no unknown sources are referenced in dependencies ([#8709](https://github.com/python-poetry/poetry/pull/8709)). - Add archive validation during installation for further hash algorithms ([#8851](https://github.com/python-poetry/poetry/pull/8851)). @@ -110,9 +147,9 @@ - **Deprecate scripts that depend on extras** ([#690](https://github.com/python-poetry/poetry-core/pull/690)). - Add support for path dependencies that do not define a build system ([#675](https://github.com/python-poetry/poetry-core/pull/675)). - Update list of supported licenses ([#659](https://github.com/python-poetry/poetry-core/pull/659), -[#669](https://github.com/python-poetry/poetry-core/pull/669), -[#678](https://github.com/python-poetry/poetry-core/pull/678), -[#694](https://github.com/python-poetry/poetry-core/pull/694)). + [#669](https://github.com/python-poetry/poetry-core/pull/669), + [#678](https://github.com/python-poetry/poetry-core/pull/678), + [#694](https://github.com/python-poetry/poetry-core/pull/694)). - Rework list of files included in build artifacts ([#666](https://github.com/python-poetry/poetry-core/pull/666)). - Fix an issue where insignificant errors were printed if the working directory is not inside a git repository ([#684](https://github.com/python-poetry/poetry-core/pull/684)). - Fix an issue where the project's directory was not recognized as git repository on Windows due to an encoding issue ([#685](https://github.com/python-poetry/poetry-core/pull/685)). @@ -145,7 +182,7 @@ - Set Poetry as `user-agent` for all HTTP requests ([#8394](https://github.com/python-poetry/poetry/pull/8394)). - Do not install `setuptools` per default in Python 3.12 ([#7803](https://github.com/python-poetry/poetry/pull/7803)). - Do not install `wheel` per default ([#7803](https://github.com/python-poetry/poetry/pull/7803)). -- Remove `setuptools` and `wheel` when running `poetry install --sync` if they are not required by the project ([#8600](https://github.com/python-poetry/poetry/pull/#8600)). +- Remove `setuptools` and `wheel` when running `poetry install --sync` if they are not required by the project ([#8600](https://github.com/python-poetry/poetry/pull/8600)). - Improve error message about PEP-517 support ([#8463](https://github.com/python-poetry/poetry/pull/8463)). - Improve `keyring` handling ([#8227](https://github.com/python-poetry/poetry/pull/8227)). - Read the `description` field when extracting metadata from `setup.py` files ([#8545](https://github.com/python-poetry/poetry/pull/8545)). @@ -288,13 +325,13 @@ ### Added - **Introduce the new source priorities `explicit` and `supplemental`** ([#7658](https://github.com/python-poetry/poetry/pull/7658), -[#6879](https://github.com/python-poetry/poetry/pull/6879)). + [#6879](https://github.com/python-poetry/poetry/pull/6879)). - **Introduce the option to configure the priority of the implicit PyPI source** ([#7801](https://github.com/python-poetry/poetry/pull/7801)). - Add handling for corrupt cache files ([#7453](https://github.com/python-poetry/poetry/pull/7453)). - Improve caching of URL and git dependencies ([#7693](https://github.com/python-poetry/poetry/pull/7693), -[#7473](https://github.com/python-poetry/poetry/pull/7473)). + [#7473](https://github.com/python-poetry/poetry/pull/7473)). - Add option to skip installing directory dependencies ([#6845](https://github.com/python-poetry/poetry/pull/6845), -[#7923](https://github.com/python-poetry/poetry/pull/7923)). + [#7923](https://github.com/python-poetry/poetry/pull/7923)). - Add `--executable` option to `poetry env info` ([#7547](https://github.com/python-poetry/poetry/pull/7547)). - Add `--top-level` option to `poetry show` ([#7415](https://github.com/python-poetry/poetry/pull/7415)). - Add `--lock` option to `poetry remove` ([#7917](https://github.com/python-poetry/poetry/pull/7917)). @@ -385,7 +422,6 @@ - Clarify the behavior of the `--extras` option ([#7563](https://github.com/python-poetry/poetry/pull/7563)). - Expand the FAQ on reasons for slow dependency resolution ([#7620](https://github.com/python-poetry/poetry/pull/7620)). - ### poetry-core ([`1.5.2`](https://github.com/python-poetry/poetry-core/releases/tag/1.5.2)) - Fix an issue where wheels built on Windows could contain duplicate entries in the RECORD file ([#555](https://github.com/python-poetry/poetry-core/pull/555)). @@ -434,10 +470,10 @@ ### poetry-core ([`1.5.1`](https://github.com/python-poetry/poetry-core/releases/tag/1.5.1)) - Improve marker handling ([#528](https://github.com/python-poetry/poetry-core/pull/528), -[#534](https://github.com/python-poetry/poetry-core/pull/534), -[#530](https://github.com/python-poetry/poetry-core/pull/530), -[#546](https://github.com/python-poetry/poetry-core/pull/546), -[#547](https://github.com/python-poetry/poetry-core/pull/547)). + [#534](https://github.com/python-poetry/poetry-core/pull/534), + [#530](https://github.com/python-poetry/poetry-core/pull/530), + [#546](https://github.com/python-poetry/poetry-core/pull/546), + [#547](https://github.com/python-poetry/poetry-core/pull/547)). - Validate whether dependencies referenced in `extras` are defined in the main dependency group ([#542](https://github.com/python-poetry/poetry-core/pull/542)). - Poetry no longer generates a `setup.py` file in sdists by default ([#318](https://github.com/python-poetry/poetry-core/pull/318)). - Fix an issue where trailing newlines were allowed in `tool.poetry.description` ([#505](https://github.com/python-poetry/poetry-core/pull/505)). @@ -920,7 +956,7 @@ $ poetry cache clear pypi --all - Poetry now raises an error if the python version in the project environment is no longer compatible with the project ([#4520](https://github.com/python-poetry/poetry/pull/4520)). -## [1.1.13] - 2022-02-09 +## [1.1.13] - 2022-02-10 ### Fixed @@ -951,28 +987,28 @@ $ poetry cache clear pypi --all ### Fixed -- Fixed an issue where non-sha256 hashes were not checked. ([#4529](https://github.com/python-poetry/poetry/pull/4529)) +- Fixed an issue where non-sha256 hashes were not checked. ([#4529](https://github.com/python-poetry/poetry/pull/4529)) ## [1.1.9] - 2021-09-18 ### Fixed -- Fixed a security issue where file hashes were not checked prior to installation. ([#4420](https://github.com/python-poetry/poetry/pull/4420), [#4444](https://github.com/python-poetry/poetry/pull/4444), [python-poetry/poetry-core#193](https://github.com/python-poetry/poetry-core/pull/193)) -- Fixed the detection of the system environment when the setting `virtualenvs.create` is deactivated. ([#4507](https://github.com/python-poetry/poetry/pull/4507)) -- Fixed an issue where unsafe parameters could be passed to `git` commands. ([python-poetry/poetry-core#203](https://github.com/python-poetry/poetry-core/pull/203)) -- Fixed an issue where the wrong `git` executable could be used on Windows. ([python-poetry/poetry-core#205](https://github.com/python-poetry/poetry-core/pull/205)) +- Fixed a security issue where file hashes were not checked prior to installation. ([#4420](https://github.com/python-poetry/poetry/pull/4420), [#4444](https://github.com/python-poetry/poetry/pull/4444), [python-poetry/poetry-core#193](https://github.com/python-poetry/poetry-core/pull/193)) +- Fixed the detection of the system environment when the setting `virtualenvs.create` is deactivated. ([#4507](https://github.com/python-poetry/poetry/pull/4507)) +- Fixed an issue where unsafe parameters could be passed to `git` commands. ([python-poetry/poetry-core#203](https://github.com/python-poetry/poetry-core/pull/203)) +- Fixed an issue where the wrong `git` executable could be used on Windows. ([python-poetry/poetry-core#205](https://github.com/python-poetry/poetry-core/pull/205)) ## [1.1.8] - 2021-08-19 ### Fixed -- Fixed an error with repository prioritization when specifying secondary repositories. ([#4241](https://github.com/python-poetry/poetry/pull/4241)) -- Fixed the detection of the system environment when the setting `virtualenvs.create` is deactivated. ([#4330](https://github.com/python-poetry/poetry/pull/4330), [#4407](https://github.com/python-poetry/poetry/pull/4407)) -- Fixed the evaluation of relative path dependencies. ([#4246](https://github.com/python-poetry/poetry/pull/4246)) -- Fixed environment detection for Python 3.10 environments. ([#4387](https://github.com/python-poetry/poetry/pull/4387)) -- Fixed an error in the evaluation of `in/not in` markers ([python-poetry/poetry-core#189](https://github.com/python-poetry/poetry-core/pull/189)) +- Fixed an error with repository prioritization when specifying secondary repositories. ([#4241](https://github.com/python-poetry/poetry/pull/4241)) +- Fixed the detection of the system environment when the setting `virtualenvs.create` is deactivated. ([#4330](https://github.com/python-poetry/poetry/pull/4330), [#4407](https://github.com/python-poetry/poetry/pull/4407)) +- Fixed the evaluation of relative path dependencies. ([#4246](https://github.com/python-poetry/poetry/pull/4246)) +- Fixed environment detection for Python 3.10 environments. ([#4387](https://github.com/python-poetry/poetry/pull/4387)) +- Fixed an error in the evaluation of `in/not in` markers ([python-poetry/poetry-core#189](https://github.com/python-poetry/poetry-core/pull/189)) ## [1.2.0a2] - 2021-08-01 @@ -999,18 +1035,17 @@ $ poetry cache clear pypi --all ## [1.1.7] - 2021-06-25 -Note: Lock files might need to be regenerated for the first fix below to take effect.\ -You can use `poetry lock` to do so without the `--no-update` option. +**Note**: Lock files might need to be regenerated for the first fix below to take effect. +You can use `poetry lock` to do so **without** the `--no-update` option. ### Changed -- This release is compatible with the `install-poetry.py` installation script to ease the migration path from `1.1` releases to `1.2` releases. ([#4192](https://github.com/python-poetry/poetry/pull/4192)) +- This release is compatible with the `install-poetry.py` installation script to ease the migration path from `1.1` releases to `1.2` releases. ([#4192](https://github.com/python-poetry/poetry/pull/4192)) ### Fixed -- Fixed an issue where transitive dependencies of directory or VCS dependencies were not installed or otherwise removed. ([#4203](https://github.com/python-poetry/poetry/pull/4203)) -- Fixed an issue where the combination of the `--tree` and `--no-dev` options for the show command was still displaying development dependencies. ([#3992](https://github.com/python-poetry/poetry/pull/3992)) - +- Fixed an issue where transitive dependencies of directory or VCS dependencies were not installed or otherwise removed. ([#4203](https://github.com/python-poetry/poetry/pull/4203)) +- Fixed an issue where the combination of the `--tree` and `--no-dev` options for the show command was still displaying development dependencies. ([#3992](https://github.com/python-poetry/poetry/pull/3992)) ## [1.2.0a1] - 2021-05-21 @@ -1045,24 +1080,26 @@ It **drops** support for Python 2.7 and 3.5. ## [1.1.6] - 2021-04-14 ### Fixed -- Fixed export format for path dependencies. ([#3121](https://github.com/python-poetry/poetry/pull/3121)) -- Fixed errors caused by environment modification when executing some commands. ([#3253](https://github.com/python-poetry/poetry/pull/3253)) -- Fixed handling of wheel files with single-digit versions. ([#3338](https://github.com/python-poetry/poetry/pull/3338)) -- Fixed an error when handling single-digit Python markers. ([poetry-core#156](https://github.com/python-poetry/poetry-core/pull/156)) -- Fixed dependency markers not being properly copied when changing the constraint leading to resolution errors. ([poetry-core#163](https://github.com/python-poetry/poetry-core/pull/163)) -- Fixed an error where VCS dependencies were always updated. ([#3947](https://github.com/python-poetry/poetry/pull/3947)) -- Fixed an error where the incorrect version of a package was locked when using environment markers. ([#3945](https://github.com/python-poetry/poetry/pull/3945)) + +- Fixed export format for path dependencies. ([#3121](https://github.com/python-poetry/poetry/pull/3121)) +- Fixed errors caused by environment modification when executing some commands. ([#3253](https://github.com/python-poetry/poetry/pull/3253)) +- Fixed handling of wheel files with single-digit versions. ([#3338](https://github.com/python-poetry/poetry/pull/3338)) +- Fixed an error when handling single-digit Python markers. ([poetry-core#156](https://github.com/python-poetry/poetry-core/pull/156)) +- Fixed dependency markers not being properly copied when changing the constraint leading to resolution errors. ([poetry-core#163](https://github.com/python-poetry/poetry-core/pull/163)) +- Fixed an error where VCS dependencies were always updated. ([#3947](https://github.com/python-poetry/poetry/pull/3947)) +- Fixed an error where the incorrect version of a package was locked when using environment markers. ([#3945](https://github.com/python-poetry/poetry/pull/3945)) ## [1.1.5] - 2021-03-04 ### Fixed -- Fixed an error in the export command when no lock file existed and a verbose flag was passed to the command. (#3310) -- Fixed an error where the pyproject.toml was not reverted when using the add command. (#3622) -- Fixed errors when using non-HTTPS indices. (#3622) -- Fixed errors when handling simple indices redirection. (#3622) -- Fixed errors when trying to handle newer wheels by using the latest version of poetry-core and packaging. (#3677) -- Fixed an error when using some versions of poetry-core due to an incorrect import. (#3696) + +- Fixed an error in the `export` command when no lock file existed and a verbose flag was passed to the command. ([#3310](https://github.com/python-poetry/poetry/pull/3310)) +- Fixed an error where the `pyproject.toml` was not reverted when using the `add` command. ([#3622](https://github.com/python-poetry/poetry/pull/3622)) +- Fixed errors when using non-HTTPS indices. ([#3622](https://github.com/python-poetry/poetry/pull/3622)) +- Fixed errors when handling simple indices redirection. ([#3622](https://github.com/python-poetry/poetry/pull/3622)) +- Fixed errors when trying to handle newer wheels by using the latest version of `poetry-core` and `packaging`. ([#3677](https://github.com/python-poetry/poetry/pull/3677)) +- Fixed an error when using some versions of `poetry-core` due to an incorrect import . ([#3696](https://github.com/python-poetry/poetry/pull/3696)) ## [1.1.4] - 2020-10-23 @@ -1078,7 +1115,7 @@ It **drops** support for Python 2.7 and 3.5. ### Fixed - Fixed editable installation of poetry projects when using system environments. ([#3107](https://github.com/python-poetry/poetry/pull/3107)) -- Fixed locking of nested extra activations. If you were affected by this issue, you will need to regenerate the lock file using `poetry lock --no-update`. ([#3229](https://github.com/python-poetry/poetry/pull/3229)) +- Fixed locking of nested extra activations. If you were affected by this issue, you will need to regenerate the lock file using `poetry lock --no-update`. ([#3229](https://github.com/python-poetry/poetry/pull/3229)) - Fixed prioritisation of non-default custom package sources. ([#3251](https://github.com/python-poetry/poetry/pull/3251)) - Fixed detection of installed editable packages when non-poetry managed `.pth` file exists. ([#3210](https://github.com/python-poetry/poetry/pull/3210)) - Fixed scripts generated by editable builder to use valid import statements. ([#3214](https://github.com/python-poetry/poetry/pull/3214)) @@ -1104,6 +1141,7 @@ It **drops** support for Python 2.7 and 3.5. ## [1.1.2] - 2020-10-06 ### Changed + - Dependency installation of editable packages and all uninstall operations are now performed serially within their corresponding priority groups. ([#3099](https://github.com/python-poetry/poetry/pull/3099)) - Improved package metadata inspection of nested poetry projects within project path dependencies. ([#3105](https://github.com/python-poetry/poetry/pull/3105)) @@ -1124,7 +1162,7 @@ It **drops** support for Python 2.7 and 3.5. - Fixed export of `requirements.txt` dependencies to include development dependencies. ([#3024](https://github.com/python-poetry/poetry/pull/3024)) - Fixed incorrect selection of unsupported binary distribution formats when selecting a package artifact to install. ([#3058](https://github.com/python-poetry/poetry/pull/3058)) - Fixed incorrect use of system executable when building package distributions via `build` command. ([#3056](https://github.com/python-poetry/poetry/pull/3056)) -- Fixed errors in `init` command when specifying `--dependency` in non-interactive mode when a `pyproject.toml` file already exists. ([#3076](https://github.com/python-poetry/poetry/pull/3076)) +- Fixed errors in `init` command when specifying `--dependency` in non-interactive mode when a `pyproject.toml` file already exists. ([#3076](https://github.com/python-poetry/poetry/pull/3076)) - Fixed incorrect selection of configured source url when a publish repository url configuration with the same name already exists. ([#3047](https://github.com/python-poetry/poetry/pull/3047)) - Fixed dependency resolution issues when the same package is specified in multiple dependency extras. ([#3046](https://github.com/python-poetry/poetry/pull/3046)) @@ -1144,7 +1182,7 @@ It **drops** support for Python 2.7 and 3.5. - Fixed whitespaces not being accepted for the list of extras when adding packages ([#2985](https://github.com/python-poetry/poetry/pull/2985)). - Fixed repositories specified in the `pyproject.toml` file not being taken into account for authentication when downloading packages ([#2990](https://github.com/python-poetry/poetry/pull/2990)). - Fixed permission errors when installing the root project if the `site-packages` directory is not writeable ([#3002](https://github.com/python-poetry/poetry/pull/3002)). -- Fixed environment marker propagation when exporting to the `requirements.txt` format ([#3002](https://github.com/python-poetry/poetry/pull/3002)). +- Fixed environment marker propagation when exporting to the `requirements.txt` format ([#3002](https://github.com/python-poetry/poetry/pull/3002)). - Fixed errors when paths in run command contained spaces ([#3015](https://github.com/python-poetry/poetry/pull/3015)). @@ -1185,7 +1223,7 @@ It **drops** support for Python 2.7 and 3.5. - Fixed the detection of the type of installed packages ([#2722](https://github.com/python-poetry/poetry/pull/2722)). - Fixed deadlocks when installing packages on systems not supporting non-ascii characters ([#2721](https://github.com/python-poetry/poetry/pull/2721)). - Fixed handling of wildcard constraints for packages with prereleases only ([#2821](https://github.com/python-poetry/poetry/pull/2821)). -- Fixed dependencies of some packages not being discovered by ensuring we use the PEP-516 backend if specified ([#2810](https://github.com/python-poetry/poetry/pull/2810)). +- Fixed dependencies of some packages not being discovered by ensuring we use the PEP-516 backend if specified ([#2810](https://github.com/python-poetry/poetry/pull/2810)). - Fixed recursion errors when retrieving extras ([#2787](https://github.com/python-poetry/poetry/pull/2787)). - Fixed `PyPI` always being displayed when publishing even for custom repositories ([#2905](https://github.com/python-poetry/poetry/pull/2905)). - Fixed handling of packages extras when resolving dependencies ([#2887](https://github.com/python-poetry/poetry/pull/2887)). @@ -1467,7 +1505,7 @@ This release **must** be downloaded via the `get-poetry.py` script and not via t - Fixed an error in `show` when using the `-o/--outdated` option. - Fixed PEP 508 url dependency handling. - Fixed excluded files via the `exclude` being included in distributions. -- Fixed an error in `env use` if the `virtualenvs.in-project` setting is activated ([#1682](https://github.com/python-poetry/poetry/pull/1682)) +- Fixed an error in `env use` if the `virtualenvs.in-project` setting is activated ([#1682](https://github.com/python-poetry/poetry/pull/1682)) - Fixed handling of `empty` and `any` markers in unions of markers ([#1650](https://github.com/python-poetry/poetry/pull/1650)). @@ -1868,8 +1906,8 @@ This release **must** be downloaded via the `get-poetry.py` script and not via t - Changed CLI error style. - Improved debugging of dependency resolution. - Poetry now attempts to find `pyproject.toml` not only in the directory it was -invoked in, but in all its parents up to the root. This allows to run Poetry -commands in project subdirectories. + invoked in, but in all its parents up to the root. This allows to run Poetry + commands in project subdirectories. - Made the email address for authors optional. ### Fixed @@ -1919,7 +1957,7 @@ commands in project subdirectories. ### Fixed - Fixed `add` command picking up prereleases by default. -- Fixed dependendency resolution on Windows when unpacking distributions. +- Fixed dependency resolution on Windows when unpacking distributions. - Fixed dependency resolution with post releases. - Fixed dependencies being installed even if not necessary for current system. @@ -2152,7 +2190,8 @@ Initial release -[Unreleased]: https://github.com/python-poetry/poetry/compare/1.8.2...main +[Unreleased]: https://github.com/python-poetry/poetry/compare/1.8.3...main +[1.8.3]: https://github.com/python-poetry/poetry/releases/tag/1.8.3 [1.8.2]: https://github.com/python-poetry/poetry/releases/tag/1.8.2 [1.8.1]: https://github.com/python-poetry/poetry/releases/tag/1.8.1 [1.8.0]: https://github.com/python-poetry/poetry/releases/tag/1.8.0 @@ -2178,6 +2217,7 @@ Initial release [1.2.0b1]: https://github.com/python-poetry/poetry/releases/tag/1.2.0b1 [1.2.0a2]: https://github.com/python-poetry/poetry/releases/tag/1.2.0a2 [1.2.0a1]: https://github.com/python-poetry/poetry/releases/tag/1.2.0a1 +[1.1.15]: https://github.com/python-poetry/poetry/releases/tag/1.1.15 [1.1.14]: https://github.com/python-poetry/poetry/releases/tag/1.1.14 [1.1.13]: https://github.com/python-poetry/poetry/releases/tag/1.1.13 [1.1.12]: https://github.com/python-poetry/poetry/releases/tag/1.1.12 diff --git a/docs/_index.md b/docs/_index.md index 199498f283f..bc7432855d6 100644 --- a/docs/_index.md +++ b/docs/_index.md @@ -165,7 +165,7 @@ source, using a pre-release build, configuring a different installation location By default, Poetry is installed into a platform and user-specific directory: -- `~/Library/Application Support/pypoetry` on MacOS. +- `~/Library/Application Support/pypoetry` on macOS. - `~/.local/share/pypoetry` on Linux/Unix. - `%APPDATA%\pypoetry` on Windows. @@ -213,7 +213,7 @@ as `poetry`. Alternatively, the full path to the `poetry` binary can always be used: -- `~/Library/Application Support/pypoetry/venv/bin/poetry` on MacOS. +- `~/Library/Application Support/pypoetry/venv/bin/poetry` on macOS. - `~/.local/share/pypoetry/venv/bin/poetry` on Linux/Unix. - `%APPDATA%\pypoetry\venv\Scripts\poetry` on Windows. - `$POETRY_HOME/venv/bin/poetry` if `$POETRY_HOME` is set. @@ -228,7 +228,7 @@ Once Poetry is installed and in your `$PATH`, you can execute the following: poetry --version ``` -If you see something like `Poetry (version 1.2.0)`, your install is ready to use! +If you see something like `Poetry (version 1.2.0)`, your installation is ready to use! {{< /step >}} {{< step >}} **Update Poetry** diff --git a/docs/basic-usage.md b/docs/basic-usage.md index be9365a103d..425742e9fc2 100644 --- a/docs/basic-usage.md +++ b/docs/basic-usage.md @@ -83,7 +83,7 @@ python = "^3.7.0" we are allowing any version of Python 3 that is greater than `3.7.0`. -When you run `poetry install`, you must have access to some version of a Python inrepreter that satisfies this constraint available on your system. +When you run `poetry install`, you must have access to some version of a Python interpreter that satisfies this constraint available on your system. Poetry will not install a Python interpreter for you. If you use a tool like `pyenv`, you can use the experimental configuration value [`virtualenvs.prefer-active-python`]({{< relref "configuration/#virtualenvsprefer-active-python-experimental" >}}). diff --git a/docs/cli.md b/docs/cli.md index 2e6a8fdd21c..6ff3f48664a 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -249,12 +249,6 @@ you can use the `--compile` option: poetry install --compile ``` -{{% note %}} -The `--compile` option has no effect if `installer.modern-installation` -is set to `false` because the old installer always compiles source files to bytecode. -{{% /note %}} - - ### Options * `--without`: The dependency groups to ignore. diff --git a/docs/configuration.md b/docs/configuration.md index aa619217995..7c64129d1ab 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -122,7 +122,7 @@ Poetry uses the following default directories: - Linux: `$XDG_CONFIG_HOME/pypoetry` or `~/.config/pypoetry` - Windows: `%APPDATA%\pypoetry` -- MacOS: `~/Library/Application Support/pypoetry` +- macOS: `~/Library/Application Support/pypoetry` You can override the Config directory by setting the `POETRY_CONFIG_DIR` environment variable. @@ -130,7 +130,7 @@ You can override the Config directory by setting the `POETRY_CONFIG_DIR` environ - Linux: `$XDG_DATA_HOME/pypoetry` or `~/.local/share/pypoetry` - Windows: `%APPDATA%\pypoetry` -- MacOS: `~/Library/Application Support/pypoetry` +- macOS: `~/Library/Application Support/pypoetry` You can override the Data directory by setting the `POETRY_DATA_DIR` or `POETRY_HOME` environment variables. If `POETRY_HOME` is set, it will be given higher priority. @@ -138,7 +138,7 @@ You can override the Data directory by setting the `POETRY_DATA_DIR` or `POETRY_ - Linux: `$XDG_CACHE_HOME/pypoetry` or `~/.cache/pypoetry` - Windows: `%LOCALAPPDATA%\pypoetry` -- MacOS: `~/Library/Caches/pypoetry` +- macOS: `~/Library/Caches/pypoetry` You can override the Cache directory by setting the `POETRY_CACHE_DIR` environment variable. @@ -195,21 +195,6 @@ the number of maximum workers is still limited at `number_of_cores + 4`. This configuration is ignored when `installer.parallel` is set to `false`. {{% /note %}} -### `installer.modern-installation` - -**Type**: `boolean` - -**Default**: `true` - -**Environment Variable**: `POETRY_INSTALLER_MODERN_INSTALLATION` - -*Introduced in 1.4.0* - -Use a more modern and faster method for package installation. - -If this causes issues, you can disable it by setting it to `false` and report the problems -you encounter on the [issue tracker](https://github.com/python-poetry/poetry/issues). - ### `installer.no-binary` **Type**: `string | boolean` @@ -287,6 +272,19 @@ values, usage instructions and warnings. Use parallel execution when using the new (`>=1.1.0`) installer. +### `requests.max-retries` + +**Type**: `int` + +**Default**: `0` + +**Environment Variable**: `POETRY_REQUESTS_MAX_RETRIES` + +*Introduced in 1.9.0* + +Set the maximum number of retries in an unstable network. +This setting has no effect if the server does not support HTTP range requests. + ### `solver.lazy-wheel` **Type**: `boolean` diff --git a/docs/contributing.md b/docs/contributing.md index 791c4f684b6..3d6d430b1fa 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -109,7 +109,7 @@ constantly evolving, and this means that sometimes our documentation has gaps. Y editing the existing content to be more accessible, or creating new content such as tutorials, FAQs, etc. {{% note %}} -Github [Discussions](https://github.com/python-poetry/poetry/discussions) and the +GitHub [Discussions](https://github.com/python-poetry/poetry/discussions) and the [kind/question label](https://github.com/python-poetry/poetry/labels/kind/question) are excellent sources for FAQ candidates. {{% /note %}} diff --git a/docs/plugins.md b/docs/plugins.md index cdd17e5a350..9f133b32024 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -202,7 +202,9 @@ pipx inject poetry poetry-plugin If you want to uninstall a plugin, you can run: ```shell -pipx runpip poetry uninstall poetry-plugin +pipx uninject poetry poetry-plugin # For pipx versions >= 1.2.0 + +pipx runpip poetry uninstall poetry-plugin # For pipx versions < 1.2.0 ``` ### With `pip` diff --git a/docs/repositories.md b/docs/repositories.md index 0cc0a6761d3..983628dd670 100644 --- a/docs/repositories.md +++ b/docs/repositories.md @@ -67,7 +67,7 @@ poetry add --source foo private-package Great, now all that is left is to publish your package. Assuming you'd want to share it privately with your team, you can configure the [Upload API](https://warehouse.pypa.io/api-reference/legacy.html#upload-api) endpoint for your -[publishable repository](#publishable-repository). +[publishable repository](#publishable-repositories). ```bash poetry config repositories.foo https://pypi.example.org/legacy/ @@ -95,7 +95,7 @@ export POETRY_HTTP_BASIC_FOO_PASSWORD= ``` {{% /note %}} -Now, all the is left is to build and publish your project using the +Now, all that is left is to build and publish your project using the [`publish`]({{< relref "cli#publish" >}}). ```bash @@ -378,7 +378,7 @@ package's versions, metadata, files, etc. {{% note %}} -If the the package's published metadata is invalid, Poetry will download the available bdist/sdist to +If the package's published metadata is invalid, Poetry will download the available bdist/sdist to inspect it locally to identify the relevant metadata. {{% /note %}} @@ -540,7 +540,7 @@ poetry config keyring.enabled false {{% note %}} -Poetry will fallback to Pip style use of keyring so that backends like +Poetry will fall back to Pip style use of keyring so that backends like Microsoft's [artifacts-keyring](https://pypi.org/project/artifacts-keyring/) get a chance to retrieve valid credentials. It will need to be properly installed into Poetry's virtualenv, preferably by installing a plugin. @@ -591,7 +591,7 @@ poetry config certificates.foo.cert false ``` {{% warning %}} -Disabling certificate verification is not recommended as it is does not conform to security +Disabling certificate verification is not recommended as it does not conform to security best practices. {{% /warning %}} {{% /note %}} diff --git a/poetry.lock b/poetry.lock index d0fe4a90d84..1b43ad8b9ec 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,11 +1,26 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +description = "Backport of CPython tarfile module" +optional = false +python-versions = ">=3.8" +files = [ + {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, + {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] [[package]] name = "build" version = "1.2.1" description = "A simple, correct Python build frontend" optional = false -python-versions = ">=3.8" +python-versions = ">= 3.8" files = [ {file = "build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"}, {file = "build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d"}, @@ -48,13 +63,13 @@ redis = ["redis (>=2.10.5)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -259,63 +274,63 @@ files = [ [[package]] name = "coverage" -version = "7.4.1" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, - {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, - {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, - {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, - {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, - {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, - {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, - {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, - {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, - {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, - {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, - {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, - {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, - {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.dependencies] @@ -337,43 +352,38 @@ files = [ [[package]] name = "cryptography" -version = "42.0.3" +version = "43.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:de5086cd475d67113ccb6f9fae6d8fe3ac54a4f9238fd08bfdb07b03d791ff0a"}, - {file = "cryptography-42.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:935cca25d35dda9e7bd46a24831dfd255307c55a07ff38fd1a92119cffc34857"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20100c22b298c9eaebe4f0b9032ea97186ac2555f426c3e70670f2517989543b"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb6368d5327d6455f20327fb6159b97538820355ec00f8cc9464d617caecead"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:39d5c93e95bcbc4c06313fc6a500cee414ee39b616b55320c1904760ad686938"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d96ea47ce6d0055d5b97e761d37b4e84195485cb5a38401be341fabf23bc32a"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d1998e545081da0ab276bcb4b33cce85f775adb86a516e8f55b3dac87f469548"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93fbee08c48e63d5d1b39ab56fd3fdd02e6c2431c3da0f4edaf54954744c718f"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:90147dad8c22d64b2ff7331f8d4cddfdc3ee93e4879796f837bdbb2a0b141e0c"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4dcab7c25e48fc09a73c3e463d09ac902a932a0f8d0c568238b3696d06bf377b"}, - {file = "cryptography-42.0.3-cp37-abi3-win32.whl", hash = "sha256:1e935c2900fb53d31f491c0de04f41110351377be19d83d908c1fd502ae8daa5"}, - {file = "cryptography-42.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:762f3771ae40e111d78d77cbe9c1035e886ac04a234d3ee0856bf4ecb3749d54"}, - {file = "cryptography-42.0.3-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d3ec384058b642f7fb7e7bff9664030011ed1af8f852540c76a1317a9dd0d20"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35772a6cffd1f59b85cb670f12faba05513446f80352fe811689b4e439b5d89e"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04859aa7f12c2b5f7e22d25198ddd537391f1695df7057c8700f71f26f47a129"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c3d1f5a1d403a8e640fa0887e9f7087331abb3f33b0f2207d2cc7f213e4a864c"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df34312149b495d9d03492ce97471234fd9037aa5ba217c2a6ea890e9166f151"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:de4ae486041878dc46e571a4c70ba337ed5233a1344c14a0790c4c4be4bbb8b4"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0fab2a5c479b360e5e0ea9f654bcebb535e3aa1e493a715b13244f4e07ea8eec"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25b09b73db78facdfd7dd0fa77a3f19e94896197c86e9f6dc16bce7b37a96504"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d5cf11bc7f0b71fb71af26af396c83dfd3f6eed56d4b6ef95d57867bf1e4ba65"}, - {file = "cryptography-42.0.3-cp39-abi3-win32.whl", hash = "sha256:0fea01527d4fb22ffe38cd98951c9044400f6eff4788cf52ae116e27d30a1ba3"}, - {file = "cryptography-42.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:2619487f37da18d6826e27854a7f9d4d013c51eafb066c80d09c63cf24505306"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ead69ba488f806fe1b1b4050febafdbf206b81fa476126f3e16110c818bac396"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:20180da1b508f4aefc101cebc14c57043a02b355d1a652b6e8e537967f1e1b46"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fbf0f3f0fac7c089308bd771d2c6c7b7d53ae909dce1db52d8e921f6c19bb3a"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c23f03cfd7d9826cdcbad7850de67e18b4654179e01fe9bc623d37c2638eb4ef"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db0480ffbfb1193ac4e1e88239f31314fe4c6cdcf9c0b8712b55414afbf80db4"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:6c25e1e9c2ce682d01fc5e2dde6598f7313027343bd14f4049b82ad0402e52cd"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9541c69c62d7446539f2c1c06d7046aef822940d248fa4b8962ff0302862cc1f"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b797099d221df7cce5ff2a1d272761d1554ddf9a987d3e11f6459b38cd300fd"}, - {file = "cryptography-42.0.3.tar.gz", hash = "sha256:069d2ce9be5526a44093a0991c450fe9906cdf069e0e7cd67d9dee49a62b9ebe"}, + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] [package.dependencies] @@ -386,25 +396,25 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "deepdiff" -version = "6.7.1" +version = "7.0.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"}, - {file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"}, + {file = "deepdiff-7.0.1-py3-none-any.whl", hash = "sha256:447760081918216aa4fd4ca78a4b6a848b81307b2ea94c810255334b759e1dc3"}, + {file = "deepdiff-7.0.1.tar.gz", hash = "sha256:260c16f052d4badbf60351b4f77e8390bee03a0b516246f6839bc813fb429ddf"}, ] [package.dependencies] -ordered-set = ">=4.0.2,<4.2.0" +ordered-set = ">=4.1.0,<4.2.0" [package.extras] -cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"] +cli = ["click (==8.1.7)", "pyyaml (==6.0.1)"] optimize = ["orjson"] [[package]] @@ -420,83 +430,62 @@ files = [ [[package]] name = "dulwich" -version = "0.21.7" +version = "0.22.1" description = "Python Git Library" optional = false python-versions = ">=3.7" files = [ - {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4c0110798099bb7d36a110090f2688050703065448895c4f53ade808d889dd3"}, - {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bc12697f0918bee324c18836053644035362bb3983dc1b210318f2fed1d7132"}, - {file = "dulwich-0.21.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:471305af74790827fcbafe330fc2e8bdcee4fb56ca1177c8c481b1c8f806c4a4"}, - {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54c9d0e845be26f65f954dff13a1cd3f2b9739820c19064257b8fd7435ab263"}, - {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d61334a575474e707614f2e93d6ed4cdae9eb47214f9277076d9e5615171d3"}, - {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e274cebaf345f0b1e3b70197f2651de92b652386b68020cfd3bf61bc30f6eaaa"}, - {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:817822f970e196e757ae01281ecbf21369383285b9f4a83496312204cf889b8c"}, - {file = "dulwich-0.21.7-cp310-cp310-win32.whl", hash = "sha256:7836da3f4110ce684dcd53489015fb7fa94ed33c5276e3318b8b1cbcb5b71e08"}, - {file = "dulwich-0.21.7-cp310-cp310-win_amd64.whl", hash = "sha256:4a043b90958cec866b4edc6aef5fe3c2c96a664d0b357e1682a46f6c477273c4"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ce8db196e79c1f381469410d26fb1d8b89c6b87a4e7f00ff418c22a35121405c"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62bfb26bdce869cd40be443dfd93143caea7089b165d2dcc33de40f6ac9d812a"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c01a735b9a171dcb634a97a3cec1b174cfbfa8e840156870384b633da0460f18"}, - {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4d14767cf7a49c9231c2e52cb2a3e90d0c83f843eb6a2ca2b5d81d254cf6b9"}, - {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bca4b86e96d6ef18c5bc39828ea349efb5be2f9b1f6ac9863f90589bac1084d"}, - {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7b5624b02ef808cdc62dabd47eb10cd4ac15e8ac6df9e2e88b6ac6b40133673"}, - {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3a539b4696a42fbdb7412cb7b66a4d4d332761299d3613d90a642923c7560e1"}, - {file = "dulwich-0.21.7-cp311-cp311-win32.whl", hash = "sha256:675a612ce913081beb0f37b286891e795d905691dfccfb9bf73721dca6757cde"}, - {file = "dulwich-0.21.7-cp311-cp311-win_amd64.whl", hash = "sha256:460ba74bdb19f8d498786ae7776745875059b1178066208c0fd509792d7f7bfc"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4c51058ec4c0b45dc5189225b9e0c671b96ca9713c1daf71d622c13b0ab07681"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4bc4c5366eaf26dda3fdffe160a3b515666ed27c2419f1d483da285ac1411de0"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0650ec77d89cb947e3e4bbd4841c96f74e52b4650830112c3057a8ca891dc2f"}, - {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f18f0a311fb7734b033a3101292b932158cade54b74d1c44db519e42825e5a2"}, - {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c589468e5c0cd84e97eb7ec209ab005a2cb69399e8c5861c3edfe38989ac3a8"}, - {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d62446797163317a397a10080c6397ffaaca51a7804c0120b334f8165736c56a"}, - {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e84cc606b1f581733df4350ca4070e6a8b30be3662bbb81a590b177d0c996c91"}, - {file = "dulwich-0.21.7-cp312-cp312-win32.whl", hash = "sha256:c3d1685f320907a52c40fd5890627945c51f3a5fa4bcfe10edb24fec79caadec"}, - {file = "dulwich-0.21.7-cp312-cp312-win_amd64.whl", hash = "sha256:6bd69921fdd813b7469a3c77bc75c1783cc1d8d72ab15a406598e5a3ba1a1503"}, - {file = "dulwich-0.21.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d8ab29c660125db52106775caa1f8f7f77a69ed1fe8bc4b42bdf115731a25bf"}, - {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0d2e4485b98695bf95350ce9d38b1bb0aaac2c34ad00a0df789aa33c934469b"}, - {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e138d516baa6b5bafbe8f030eccc544d0d486d6819b82387fc0e285e62ef5261"}, - {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f34bf9b9fa9308376263fd9ac43143c7c09da9bc75037bb75c6c2423a151b92c"}, - {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e2c66888207b71cd1daa2acb06d3984a6bc13787b837397a64117aa9fc5936a"}, - {file = "dulwich-0.21.7-cp37-cp37m-win32.whl", hash = "sha256:10893105c6566fc95bc2a67b61df7cc1e8f9126d02a1df6a8b2b82eb59db8ab9"}, - {file = "dulwich-0.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:460b3849d5c3d3818a80743b4f7a0094c893c559f678e56a02fff570b49a644a"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74700e4c7d532877355743336c36f51b414d01e92ba7d304c4f8d9a5946dbc81"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c92e72c43c9e9e936b01a57167e0ea77d3fd2d82416edf9489faa87278a1cdf7"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d097e963eb6b9fa53266146471531ad9c6765bf390849230311514546ed64db2"}, - {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:808e8b9cc0aa9ac74870b49db4f9f39a52fb61694573f84b9c0613c928d4caf8"}, - {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1957b65f96e36c301e419d7adaadcff47647c30eb072468901bb683b1000bc5"}, - {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4b09bc3a64fb70132ec14326ecbe6e0555381108caff3496898962c4136a48c6"}, - {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5882e70b74ac3c736a42d3fdd4f5f2e6570637f59ad5d3e684760290b58f041"}, - {file = "dulwich-0.21.7-cp38-cp38-win32.whl", hash = "sha256:29bb5c1d70eba155ded41ed8a62be2f72edbb3c77b08f65b89c03976292f6d1b"}, - {file = "dulwich-0.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:25c3ab8fb2e201ad2031ddd32e4c68b7c03cb34b24a5ff477b7a7dcef86372f5"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8929c37986c83deb4eb500c766ee28b6670285b512402647ee02a857320e377c"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc1e11be527ac06316539b57a7688bcb1b6a3e53933bc2f844397bc50734e9ae"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fc3078a1ba04c588fabb0969d3530efd5cd1ce2cf248eefb6baf7cbc15fc285"}, - {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dcbd29ba30ba2c5bfbab07a61a5f20095541d5ac66d813056c122244df4ac0"}, - {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8869fc8ec3dda743e03d06d698ad489b3705775fe62825e00fa95aa158097fc0"}, - {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d96ca5e0dde49376fbcb44f10eddb6c30284a87bd03bb577c59bb0a1f63903fa"}, - {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0064363bd5e814359657ae32517fa8001e8573d9d040bd997908d488ab886ed"}, - {file = "dulwich-0.21.7-cp39-cp39-win32.whl", hash = "sha256:869eb7be48243e695673b07905d18b73d1054a85e1f6e298fe63ba2843bb2ca1"}, - {file = "dulwich-0.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:404b8edeb3c3a86c47c0a498699fc064c93fa1f8bab2ffe919e8ab03eafaaad3"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e598d743c6c0548ebcd2baf94aa9c8bfacb787ea671eeeb5828cfbd7d56b552f"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d76c96426e791556836ef43542b639def81be4f1d6d4322cd886c115eae1"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c88acb60a1f4d31bd6d13bfba465853b3df940ee4a0f2a3d6c7a0778c705b7"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ecd315847dea406a4decfa39d388a2521e4e31acde3bd9c2609c989e817c6d62"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d05d3c781bc74e2c2a2a8f4e4e2ed693540fbe88e6ac36df81deac574a6dad99"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6de6f8de4a453fdbae8062a6faa652255d22a3d8bce0cd6d2d6701305c75f2b3"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e25953c7acbbe4e19650d0225af1c0c0e6882f8bddd2056f75c1cc2b109b88ad"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4637cbd8ed1012f67e1068aaed19fcc8b649bcf3e9e26649826a303298c89b9d"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:858842b30ad6486aacaa607d60bab9c9a29e7c59dc2d9cb77ae5a94053878c08"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739b191f61e1c4ce18ac7d520e7a7cbda00e182c3489552408237200ce8411ad"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:274c18ec3599a92a9b67abaf110e4f181a4f779ee1aaab9e23a72e89d71b2bd9"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2590e9b431efa94fc356ae33b38f5e64f1834ec3a94a6ac3a64283b206d07aa3"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed60d1f610ef6437586f7768254c2a93820ccbd4cfdac7d182cf2d6e615969bb"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8278835e168dd097089f9e53088c7a69c6ca0841aef580d9603eafe9aea8c358"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc27fb063f740712e02b4d2f826aee8bbed737ed799962fef625e2ce56e2d29"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61e3451bd3d3844f2dca53f131982553be4d1b1e1ebd9db701843dd76c4dba31"}, - {file = "dulwich-0.21.7.tar.gz", hash = "sha256:a9e9c66833cea580c3ac12927e4b9711985d76afca98da971405d414de60e968"}, + {file = "dulwich-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:892914dc2e80403d16e59a3b440044f6092fde5ffd4ec1fdf36d6ff20a8e624d"}, + {file = "dulwich-0.22.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b03092399f0f5d3e112405b890128afdb9e1f203eafb812f5d9105b0f5fac9d4"}, + {file = "dulwich-0.22.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2c790517ed884bc1b1590806222ab44989eeb7e7f14dfa915561c7ee3b9ac73"}, + {file = "dulwich-0.22.1-cp310-cp310-win32.whl", hash = "sha256:524d3497a86f79959c9c1d729715d60d8171ed3f71621d45afb4faee5a47e8a1"}, + {file = "dulwich-0.22.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3146843b972f744aed551e8ac9fac5714baa864393e480586d467b7b4488426"}, + {file = "dulwich-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:82f26e592e9a36ab33bcdb419c7d53320e26c85dfc254cdb84f5f561a2fcaabf"}, + {file = "dulwich-0.22.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e90b8a2f24149c5803b733a24f1a016a2943b1f5a9ab2360db545e4638354c35"}, + {file = "dulwich-0.22.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b069639757b2f287f9cd0daf6765b536558c5e28263bbbb28e3d1925bce75400"}, + {file = "dulwich-0.22.1-cp311-cp311-win32.whl", hash = "sha256:3ae006498fea11515027a417e6e68b82e1c195d3516188ba2cc08210e3022d14"}, + {file = "dulwich-0.22.1-cp311-cp311-win_amd64.whl", hash = "sha256:a18d1392eabd02f337dcba23d723a4dcca87274ce8693cf88e6320f38bc3fdcd"}, + {file = "dulwich-0.22.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:12482e318895da9acabea7c0cc70b35d36833e7cb2def511ab3a63617f5c1af3"}, + {file = "dulwich-0.22.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dc42afedc8cda4f2fd15a06d2e9e41281074a02cdf31bb2e0dde4d80766a408"}, + {file = "dulwich-0.22.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3c7774232a2c9b195bde4fb72ad71455e877a9e4e9c0b17a57b1d9bd478838c"}, + {file = "dulwich-0.22.1-cp312-cp312-win32.whl", hash = "sha256:41dfc52db29a06fe23a5029abc3bc13503e28233b1c3a9614bc1e5c4d6adc1ce"}, + {file = "dulwich-0.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:9d19f04ecd4628a0e4587b4c4e98e040b87924c1362ae5aa27420435f05d5dd8"}, + {file = "dulwich-0.22.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0d72a88c7af8fafa14c8743e8923c8d46bd0b850a0b7f5e34eb49201f1ead88e"}, + {file = "dulwich-0.22.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e36c8a3bb09db5730b3d5014d087bce977e878825cdd7ba8285abcd81c43bc0"}, + {file = "dulwich-0.22.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd51e77ff1b4ca08bc9b09b85646a3e77f275827b7b30180d76d769ce608e64d"}, + {file = "dulwich-0.22.1-cp37-cp37m-win32.whl", hash = "sha256:739ef91aeb13fa2aa187d0efd46d0ac168301f54a6ef748565c42876b4b3ce71"}, + {file = "dulwich-0.22.1-cp37-cp37m-win_amd64.whl", hash = "sha256:91966b7b48ec939e5083b03c9154fc450508056f01650ecb58724095307427f5"}, + {file = "dulwich-0.22.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:86be1e283d78cc3f7daee1dcd0254122160cde71ca8c5348315156045f8ac2bb"}, + {file = "dulwich-0.22.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926d671654a2f8cfa0b2fcb6b0c46833af95b5265d27a5c56c49c5a10f3ff3ba"}, + {file = "dulwich-0.22.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:467ff87fc4c61a23424b32acd952476ba17e7f7eeb8090e5957f68129784a35f"}, + {file = "dulwich-0.22.1-cp38-cp38-win32.whl", hash = "sha256:f9e10678fe0692c5167553981d97cbe342ed055c49016aef10da336e2962b1f2"}, + {file = "dulwich-0.22.1-cp38-cp38-win_amd64.whl", hash = "sha256:6386165c64ba5f61c416301f7f32bb899f8200ca575d76888697a42fda8a92d2"}, + {file = "dulwich-0.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:84db8aef08df6431b017cc3abe57b3d6885fd7436eec8d715603c309353b233c"}, + {file = "dulwich-0.22.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:155124219e6ce4b116d30ed1b9cc63c88021966b29ce761d3ce3caba064f9a13"}, + {file = "dulwich-0.22.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7579429e89deac6659b4ea70eb3de9063bb40508fd4a8a020fa67b02e0b59f4f"}, + {file = "dulwich-0.22.1-cp39-cp39-win32.whl", hash = "sha256:454d073e628043dde4f9bd34517736c1889dbe6417099bbae2119873b8d4d5da"}, + {file = "dulwich-0.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:e1b51d26108a832f151da8856a93676cc1a5cd8dd0bc20f06f4aee5774a7f0f9"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4c509e8172b9438536946097768413f297229b03eff064e4e06749cf5c28df78"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64eebe1d709539d6e80440fa1185f1eeb260d53bcb6435b1f753b4ce90a65e82"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52a8ddd1d9b5681de216a7af718720f5202d3c093ecc10dd4dfac6d25da605a6"}, + {file = "dulwich-0.22.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7244b796dd7e191753b822ac0ca871a4b9139b0b850770ac5bd347d5f8c76768"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7798e842ec506d25f21e825259b70109325ac1c9b43c2e287aad7559455951b"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9fcf7c5cf1e9d0bcc643672f81bf43ec81f6495b99809649f5bfcdff633ab0"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e346c1b86c5e5f175ca8f87f3873eea8b2e0eeb5d52033b475cf85641cb200c2"}, + {file = "dulwich-0.22.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b2054e1f2c7041857ce129443bde23298ca37592ce82f0fb5ed5704d5f3708dd"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3ad3462d070b678fe61d3bdd7c6ac3fdbd25cca66f32b6edf589dd88fff251d2"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc6575476539c0b4924abab3896fc76be2f413d5baa6b083c4dfc4abc59329e"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3de7a2eba26ff13a79670f78f73fc86fb8c87100508119f3b6bd61451bfdd4bf"}, + {file = "dulwich-0.22.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c3186cf76d598a9d42b35e09ef35d499118b4197624ba5bba1b3a39ac6a75f"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a366cdba24b8df31ad70b82bae55baa696c453678c1346da8390396a1d5cce4"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fb61891b2675664dc89d486eb5199e3659179ae04fc0a863ffc7e16b782b624"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea4c5feedd35e8bde175a9ab91ef6705c3cef5ee209eeb2f67dd0b59ff1825f"}, + {file = "dulwich-0.22.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f61f6dc0b075ca6459acbfb9527ee0e1ee02dccbed126dc492600bb7310d86"}, + {file = "dulwich-0.22.1.tar.gz", hash = "sha256:e36d85967cfbf25da1c7bc3d6921adc5baa976969d926aaf1582bd5fd7e94758"}, ] [package.dependencies] +setuptools = {version = "*", markers = "python_version >= \"3.12\""} urllib3 = ">=1.25" [package.extras] @@ -507,13 +496,13 @@ pgp = ["gpg"] [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -521,13 +510,13 @@ test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "2.0.2" +version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, - {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, ] [package.extras] @@ -535,13 +524,13 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "fastjsonschema" -version = "2.19.1" +version = "2.20.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] [package.extras] @@ -549,18 +538,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.13.1" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -575,13 +564,13 @@ files = [ [[package]] name = "identify" -version = "2.5.34" +version = "2.6.0" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.34-py2.py3-none-any.whl", hash = "sha256:a4316013779e433d08b96e5eabb7f641e6c7942e4ab5d4c509ebd2e7a8994aed"}, - {file = "identify-2.5.34.tar.gz", hash = "sha256:ee17bc9d499899bc9eaec1ac7bf2dc9eedd480db9d88b96d123d3b64a9d34f5d"}, + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, ] [package.extras] @@ -589,43 +578,43 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "6.1.1" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, ] [package.dependencies] @@ -633,7 +622,7 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "iniconfig" @@ -659,22 +648,58 @@ files = [ [[package]] name = "jaraco-classes" -version = "3.3.1" +version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" files = [ - {file = "jaraco.classes-3.3.1-py3-none-any.whl", hash = "sha256:86b534de565381f6b3c1c830d13f931d7be1a75f0081c57dff615578676e2206"}, - {file = "jaraco.classes-3.3.1.tar.gz", hash = "sha256:cb28a5ebda8bc47d8c8015307d93163464f9f2b91ab4006e09ff0ce07e8bfb30"}, + {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, + {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, ] [package.dependencies] more-itertools = "*" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +[[package]] +name = "jaraco-context" +version = "5.3.0" +description = "Useful decorators and context managers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jaraco.context-5.3.0-py3-none-any.whl", hash = "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266"}, + {file = "jaraco.context-5.3.0.tar.gz", hash = "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2"}, +] + +[package.dependencies] +"backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["portend", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "jaraco-functools" +version = "4.0.1" +description = "Functools like those found in stdlib" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jaraco.functools-4.0.1-py3-none-any.whl", hash = "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664"}, + {file = "jaraco_functools-4.0.1.tar.gz", hash = "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.classes", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [[package]] name = "jeepney" version = "0.8.0" @@ -692,144 +717,146 @@ trio = ["async_generator", "trio"] [[package]] name = "keyring" -version = "24.3.1" +version = "25.3.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.8" files = [ - {file = "keyring-24.3.1-py3-none-any.whl", hash = "sha256:df38a4d7419a6a60fea5cef1e45a948a3e8430dd12ad88b0f423c5c143906218"}, - {file = "keyring-24.3.1.tar.gz", hash = "sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db"}, + {file = "keyring-25.3.0-py3-none-any.whl", hash = "sha256:8d963da00ccdf06e356acd9bf3b743208878751032d8599c6cc89eb51310ffae"}, + {file = "keyring-25.3.0.tar.gz", hash = "sha256:8d85a1ea5d6db8515b59e1c5d1d1678b03cf7fc8b8dcfb1651e8c4a524eb42ef"}, ] [package.dependencies] importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} importlib-resources = {version = "*", markers = "python_version < \"3.9\""} "jaraco.classes" = "*" +"jaraco.context" = "*" +"jaraco.functools" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] completion = ["shtab (>=1.1.0)"] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "more-itertools" -version = "10.2.0" +version = "10.3.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.8" files = [ - {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, - {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, + {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, + {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, ] [[package]] name = "msgpack" -version = "1.0.7" +version = "1.0.8" description = "MessagePack serializer" optional = false python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, - {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, - {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, - {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, - {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, - {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, - {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, - {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, - {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, - {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, - {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, - {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, + {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, + {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, + {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, + {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, + {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, + {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, + {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, + {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, + {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, + {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] [[package]] name = "mypy" -version = "1.8.0" +version = "1.11.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, + {file = "mypy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3824187c99b893f90c845bab405a585d1ced4ff55421fdf5c84cb7710995229"}, + {file = "mypy-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96f8dbc2c85046c81bcddc246232d500ad729cb720da4e20fce3b542cab91287"}, + {file = "mypy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a5d8d8dd8613a3e2be3eae829ee891b6b2de6302f24766ff06cb2875f5be9c6"}, + {file = "mypy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72596a79bbfb195fd41405cffa18210af3811beb91ff946dbcb7368240eed6be"}, + {file = "mypy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:35ce88b8ed3a759634cb4eb646d002c4cef0a38f20565ee82b5023558eb90c00"}, + {file = "mypy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98790025861cb2c3db8c2f5ad10fc8c336ed2a55f4daf1b8b3f877826b6ff2eb"}, + {file = "mypy-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25bcfa75b9b5a5f8d67147a54ea97ed63a653995a82798221cca2a315c0238c1"}, + {file = "mypy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bea2a0e71c2a375c9fa0ede3d98324214d67b3cbbfcbd55ac8f750f85a414e3"}, + {file = "mypy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2b3d36baac48e40e3064d2901f2fbd2a2d6880ec6ce6358825c85031d7c0d4d"}, + {file = "mypy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8e2e43977f0e09f149ea69fd0556623919f816764e26d74da0c8a7b48f3e18a"}, + {file = "mypy-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d44c1e44a8be986b54b09f15f2c1a66368eb43861b4e82573026e04c48a9e20"}, + {file = "mypy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cea3d0fb69637944dd321f41bc896e11d0fb0b0aa531d887a6da70f6e7473aba"}, + {file = "mypy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a83ec98ae12d51c252be61521aa5731f5512231d0b738b4cb2498344f0b840cd"}, + {file = "mypy-1.11.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7b73a856522417beb78e0fb6d33ef89474e7a622db2653bc1285af36e2e3e3d"}, + {file = "mypy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:f2268d9fcd9686b61ab64f077be7ffbc6fbcdfb4103e5dd0cc5eaab53a8886c2"}, + {file = "mypy-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:940bfff7283c267ae6522ef926a7887305945f716a7704d3344d6d07f02df850"}, + {file = "mypy-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:14f9294528b5f5cf96c721f231c9f5b2733164e02c1c018ed1a0eff8a18005ac"}, + {file = "mypy-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7b54c27783991399046837df5c7c9d325d921394757d09dbcbf96aee4649fe9"}, + {file = "mypy-1.11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65f190a6349dec29c8d1a1cd4aa71284177aee5949e0502e6379b42873eddbe7"}, + {file = "mypy-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbe286303241fea8c2ea5466f6e0e6a046a135a7e7609167b07fd4e7baf151bf"}, + {file = "mypy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104e9c1620c2675420abd1f6c44bab7dd33cc85aea751c985006e83dcd001095"}, + {file = "mypy-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f006e955718ecd8d159cee9932b64fba8f86ee6f7728ca3ac66c3a54b0062abe"}, + {file = "mypy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:becc9111ca572b04e7e77131bc708480cc88a911adf3d0239f974c034b78085c"}, + {file = "mypy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6801319fe76c3f3a3833f2b5af7bd2c17bb93c00026a2a1b924e6762f5b19e13"}, + {file = "mypy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c1a184c64521dc549324ec6ef7cbaa6b351912be9cb5edb803c2808a0d7e85ac"}, + {file = "mypy-1.11.0-py3-none-any.whl", hash = "sha256:56913ec8c7638b0091ef4da6fcc9136896914a9d60d54670a75880c3e5b99ace"}, + {file = "mypy-1.11.0.tar.gz", hash = "sha256:93743608c7348772fdc717af4aeee1997293a1ad04bc0ea6efa15bf65385c538"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -850,18 +877,15 @@ files = [ [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "ordered-set" version = "4.1.0" @@ -878,13 +902,13 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -903,13 +927,13 @@ ptyprocess = ">=0.5" [[package]] name = "pkginfo" -version = "1.10.0" +version = "1.11.1" description = "Query metadata from sdists / bdists / installed packages." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"}, - {file = "pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297"}, + {file = "pkginfo-1.11.1-py3-none-any.whl", hash = "sha256:bfa76a714fdfc18a045fcd684dbfc3816b603d9d075febef17cb6582bea29573"}, + {file = "pkginfo-1.11.1.tar.gz", hash = "sha256:2e0dca1cf4c8e39644eed32408ea9966ee15e0d324c62ba899a393b3c6b467aa"}, ] [package.extras] @@ -917,28 +941,29 @@ testing = ["pytest", "pytest-cov", "wheel"] [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" -version = "1.4.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -958,18 +983,18 @@ files = [ [[package]] name = "poetry-plugin-export" -version = "1.7.0" +version = "1.8.0" description = "Poetry plugin to export the dependencies to various formats" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "poetry_plugin_export-1.7.0-py3-none-any.whl", hash = "sha256:2283b28e0209f9f9598c6fe44f30586ec91329ea1558f908708261e0516bf427"}, - {file = "poetry_plugin_export-1.7.0.tar.gz", hash = "sha256:e73f207fc0e08c2f59ead82cbe39ef259b351a318d5c0bddcec13990bcd324a7"}, + {file = "poetry_plugin_export-1.8.0-py3-none-any.whl", hash = "sha256:adbe232cfa0cc04991ea3680c865cf748bff27593b9abcb1f35fb50ed7ba2c22"}, + {file = "poetry_plugin_export-1.8.0.tar.gz", hash = "sha256:1fa6168a85d59395d835ca564bc19862a7c76061e60c3e7dfaec70d50937fc61"}, ] [package.dependencies] -poetry = ">=1.8.0,<2.0.0" -poetry-core = ">=1.7.0,<2.0.0" +poetry = ">=1.8.0,<3.0.0" +poetry-core = ">=1.7.0,<3.0.0" [[package]] name = "pre-commit" @@ -991,27 +1016,28 @@ virtualenv = ">=20.10.0" [[package]] name = "psutil" -version = "5.9.8" +version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [package.extras] @@ -1030,38 +1056,35 @@ files = [ [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pyproject-hooks" -version = "1.0.0" +version = "1.1.0" description = "Wrappers to call pyproject.toml-based build backend hooks." optional = false python-versions = ">=3.7" files = [ - {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, - {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, + {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, + {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, ] -[package.dependencies] -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - [[package]] name = "pytest" -version = "8.0.1" +version = "8.3.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"}, - {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"}, + {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, + {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, ] [package.dependencies] @@ -1069,21 +1092,21 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.3.0,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] @@ -1091,7 +1114,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-github-actions-annotate-failures" @@ -1109,17 +1132,17 @@ pytest = ">=4.0.0" [[package]] name = "pytest-mock" -version = "3.12.0" +version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, - {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -pytest = ">=5.0" +pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] @@ -1141,19 +1164,19 @@ pytest = "*" [[package]] name = "pytest-xdist" -version = "3.5.0" +version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, - {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, ] [package.dependencies] -execnet = ">=1.1" +execnet = ">=2.1" psutil = {version = ">=3.0", optional = true, markers = "extra == \"psutil\""} -pytest = ">=6.2.0" +pytest = ">=7.0.0" [package.extras] psutil = ["psutil (>=3.0)"] @@ -1233,101 +1256,104 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.6.1" +version = "3.9.4" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.8" files = [ - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"}, - {file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b9793c19bdf38656c8eaefbcf4549d798572dadd70581379e666035c9df781"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:015b5080b999404fe06ec2cb4f40b0be62f0710c926ab41e82dfbc28e80675b4"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc5ceca9c1e1663f3e6c23fb89a311f69b7615a40ddd7645e3435bf3082688a"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1424e238bc3f20e1759db1e0afb48a988a9ece183724bef91ea2a291c0b92a95"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed01378f605aa1f449bee82cd9c83772883120d6483e90aa6c5a4ce95dc5c3aa"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb26d412271e5a76cdee1c2d6bf9881310665d3fe43b882d0ed24edfcb891a84"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f37e9e1f17be193c41a31c864ad4cd3ebd2b40780db11cd5c04abf2bcf4201b"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d070ec5cf96b927c4dc5133c598c7ff6db3b833b363b2919b13417f1002560bc"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:10e61bb7bc807968cef09a0e32ce253711a2d450a4dce7841d21d45330ffdb24"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:31a2fc60bb2c7face4140010a7aeeafed18b4f9cdfa495cc644a68a8c60d1ff7"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fbebf1791a71a2e89f5c12b78abddc018354d5859e305ec3372fdae14f80a826"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aee9fc9e3bb488d040afc590c0a7904597bf4ccd50d1491c3f4a5e7e67e6cd2c"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win32.whl", hash = "sha256:005a02688a51c7d2451a2d41c79d737aa326ff54167211b78a383fc2aace2c2c"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:3a2e75e41ee3274754d3b2163cc6c82cd95b892a85ab031f57112e09da36455f"}, + {file = "rapidfuzz-3.9.4-cp310-cp310-win_arm64.whl", hash = "sha256:2c99d355f37f2b289e978e761f2f8efeedc2b14f4751d9ff7ee344a9a5ca98d9"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:07141aa6099e39d48637ce72a25b893fc1e433c50b3e837c75d8edf99e0c63e1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db1664eaff5d7d0f2542dd9c25d272478deaf2c8412e4ad93770e2e2d828e175"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc01a223f6605737bec3202e94dcb1a449b6c76d46082cfc4aa980f2a60fd40e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1869c42e73e2a8910b479be204fa736418741b63ea2325f9cc583c30f2ded41a"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62ea7007941fb2795fff305ac858f3521ec694c829d5126e8f52a3e92ae75526"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:698e992436bf7f0afc750690c301215a36ff952a6dcd62882ec13b9a1ebf7a39"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b76f611935f15a209d3730c360c56b6df8911a9e81e6a38022efbfb96e433bab"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129627d730db2e11f76169344a032f4e3883d34f20829419916df31d6d1338b1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:90a82143c14e9a14b723a118c9ef8d1bbc0c5a16b1ac622a1e6c916caff44dd8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ded58612fe3b0e0d06e935eaeaf5a9fd27da8ba9ed3e2596307f40351923bf72"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f16f5d1c4f02fab18366f2d703391fcdbd87c944ea10736ca1dc3d70d8bd2d8b"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26aa7eece23e0df55fb75fbc2a8fb678322e07c77d1fd0e9540496e6e2b5f03e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win32.whl", hash = "sha256:f187a9c3b940ce1ee324710626daf72c05599946bd6748abe9e289f1daa9a077"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d8e9130fe5d7c9182990b366ad78fd632f744097e753e08ace573877d67c32f8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_arm64.whl", hash = "sha256:40419e98b10cd6a00ce26e4837a67362f658fc3cd7a71bd8bd25c99f7ee8fea5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b5d5072b548db1b313a07d62d88fe0b037bd2783c16607c647e01b070f6cf9e5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf5bcf22e1f0fd273354462631d443ef78d677f7d2fc292de2aec72ae1473e66"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c8fc973adde8ed52810f590410e03fb6f0b541bbaeb04c38d77e63442b2df4c"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2464bb120f135293e9a712e342c43695d3d83168907df05f8c4ead1612310c7"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d9d58689aca22057cf1a5851677b8a3ccc9b535ca008c7ed06dc6e1899f7844"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167e745f98baa0f3034c13583e6302fb69249a01239f1483d68c27abb841e0a1"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0bf0663b4b6da1507869722420ea9356b6195aa907228d6201303e69837af9"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd6ac61b74fdb9e23f04d5f068e6cf554f47e77228ca28aa2347a6ca8903972f"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:60ff67c690acecf381759c16cb06c878328fe2361ddf77b25d0e434ea48a29da"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cb934363380c60f3a57d14af94325125cd8cded9822611a9f78220444034e36e"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe833493fb5cc5682c823ea3e2f7066b07612ee8f61ecdf03e1268f262106cdd"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2797fb847d89e04040d281cb1902cbeffbc4b5131a5c53fc0db490fd76b2a547"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win32.whl", hash = "sha256:52e3d89377744dae68ed7c84ad0ddd3f5e891c82d48d26423b9e066fc835cc7c"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:c76da20481c906e08400ee9be230f9e611d5931a33707d9df40337c2655c84b5"}, + {file = "rapidfuzz-3.9.4-cp312-cp312-win_arm64.whl", hash = "sha256:f2d2846f3980445864c7e8b8818a29707fcaff2f0261159ef6b7bd27ba139296"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:355fc4a268ffa07bab88d9adee173783ec8d20136059e028d2a9135c623c44e6"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d81a78f90269190b568a8353d4ea86015289c36d7e525cd4d43176c88eff429"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e618625ffc4660b26dc8e56225f8b966d5842fa190e70c60db6cd393e25b86e"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b712336ad6f2bacdbc9f1452556e8942269ef71f60a9e6883ef1726b52d9228a"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc1ee19fdad05770c897e793836c002344524301501d71ef2e832847425707"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1950f8597890c0c707cb7e0416c62a1cf03dcdb0384bc0b2dbda7e05efe738ec"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a6c35f272ec9c430568dc8c1c30cb873f6bc96be2c79795e0bce6db4e0e101d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1df0f9e9239132a231c86ae4f545ec2b55409fa44470692fcfb36b1bd00157ad"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d2c51955329bfccf99ae26f63d5928bf5be9fcfcd9f458f6847fd4b7e2b8986c"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:3c522f462d9fc504f2ea8d82e44aa580e60566acc754422c829ad75c752fbf8d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d8a52fc50ded60d81117d7647f262c529659fb21d23e14ebfd0b35efa4f1b83d"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:04dbdfb0f0bfd3f99cf1e9e24fadc6ded2736d7933f32f1151b0f2abb38f9a25"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-win32.whl", hash = "sha256:4968c8bd1df84b42f382549e6226710ad3476f976389839168db3e68fd373298"}, + {file = "rapidfuzz-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:3fe4545f89f8d6c27b6bbbabfe40839624873c08bd6700f63ac36970a179f8f5"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f256c8fb8f3125574c8c0c919ab0a1f75d7cba4d053dda2e762dcc36357969d"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fdc09cf6e9d8eac3ce48a4615b3a3ee332ea84ac9657dbbefef913b13e632f"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d395d46b80063d3b5d13c0af43d2c2cedf3ab48c6a0c2aeec715aa5455b0c632"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa714fb96ce9e70c37e64c83b62fe8307030081a0bfae74a76fac7ba0f91715"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc1a0f29f9119be7a8d3c720f1d2068317ae532e39e4f7f948607c3a6de8396"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6022674aa1747d6300f699cd7c54d7dae89bfe1f84556de699c4ac5df0838082"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb72e5f9762fd469701a7e12e94b924af9004954f8c739f925cb19c00862e38"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad04ae301129f0eb5b350a333accd375ce155a0c1cec85ab0ec01f770214e2e4"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f46a22506f17c0433e349f2d1dc11907c393d9b3601b91d4e334fa9a439a6a4d"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:01b42a8728c36011718da409aa86b84984396bf0ca3bfb6e62624f2014f6022c"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e590d5d5443cf56f83a51d3c4867bd1f6be8ef8cfcc44279522bcef3845b2a51"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c72078b5fdce34ba5753f9299ae304e282420e6455e043ad08e4488ca13a2b0"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win32.whl", hash = "sha256:f75639277304e9b75e6a7b3c07042d2264e16740a11e449645689ed28e9c2124"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:e81e27e8c32a1e1278a4bb1ce31401bfaa8c2cc697a053b985a6f8d013df83ec"}, + {file = "rapidfuzz-3.9.4-cp39-cp39-win_arm64.whl", hash = "sha256:15bc397ee9a3ed1210b629b9f5f1da809244adc51ce620c504138c6e7095b7bd"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:20488ade4e1ddba3cfad04f400da7a9c1b91eff5b7bd3d1c50b385d78b587f4f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e61b03509b1a6eb31bc5582694f6df837d340535da7eba7bedb8ae42a2fcd0b9"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:098d231d4e51644d421a641f4a5f2f151f856f53c252b03516e01389b2bfef99"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17ab8b7d10fde8dd763ad428aa961c0f30a1b44426e675186af8903b5d134fb0"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e272df61bee0a056a3daf99f9b1bd82cf73ace7d668894788139c868fdf37d6f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d6481e099ff8c4edda85b8b9b5174c200540fd23c8f38120016c765a86fa01f5"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ad61676e9bdae677d577fe80ec1c2cea1d150c86be647e652551dcfe505b1113"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:af65020c0dd48d0d8ae405e7e69b9d8ae306eb9b6249ca8bf511a13f465fad85"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d38b4e026fcd580e0bda6c0ae941e0e9a52c6bc66cdce0b8b0da61e1959f5f8"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f74ed072c2b9dc6743fb19994319d443a4330b0e64aeba0aa9105406c7c5b9c2"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee5f6b8321f90615c184bd8a4c676e9becda69b8e4e451a90923db719d6857c"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3a555e3c841d6efa350f862204bb0a3fea0c006b8acc9b152b374fa36518a1c6"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0772150d37bf018110351c01d032bf9ab25127b966a29830faa8ad69b7e2f651"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:addcdd3c3deef1bd54075bd7aba0a6ea9f1d01764a08620074b7a7b1e5447cb9"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fe86b82b776554add8f900b6af202b74eb5efe8f25acdb8680a5c977608727f"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0fc91ac59f4414d8542454dfd6287a154b8e6f1256718c898f695bdbb993467"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a944e546a296a5fdcaabb537b01459f1b14d66f74e584cb2a91448bffadc3c1"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fb96ba96d58c668a17a06b5b5e8340fedc26188e87b0d229d38104556f30cd8"}, + {file = "rapidfuzz-3.9.4.tar.gz", hash = "sha256:366bf8947b84e37f2f4cf31aaf5f37c39f620d8c0eddb8b633e6ba0129ca4a0a"}, ] [package.extras] @@ -1335,13 +1361,13 @@ full = ["numpy"] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1385,19 +1411,19 @@ jeepney = ">=0.6" [[package]] name = "setuptools" -version = "69.1.0" +version = "71.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, - {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, + {file = "setuptools-71.1.0-py3-none-any.whl", hash = "sha256:33874fdc59b3188304b2e7c80d9029097ea31627180896fb549c578ceb8a0855"}, + {file = "setuptools-71.1.0.tar.gz", hash = "sha256:032d42ee9fb536e33087fb66cac5f840eb9391ed05637b3f2a76a7c8fb477936"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shellingham" @@ -1423,35 +1449,35 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.3" +version = "0.13.0" description = "Style preserving TOML library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, - {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, + {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, + {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, ] [[package]] name = "trove-classifiers" -version = "2024.1.31" +version = "2024.7.2" description = "Canonical source for classifiers on PyPI (pypi.org)." optional = false python-versions = "*" files = [ - {file = "trove-classifiers-2024.1.31.tar.gz", hash = "sha256:bfdfe60bbf64985c524416afb637ecc79c558e0beb4b7f52b0039e01044b0229"}, - {file = "trove_classifiers-2024.1.31-py3-none-any.whl", hash = "sha256:854aba3358f3cf10e5c0916aa533f5a39e27aadd8ade26a54cdc2a93257e39c4"}, + {file = "trove_classifiers-2024.7.2-py3-none-any.whl", hash = "sha256:ccc57a33717644df4daca018e7ec3ef57a835c48e96a1e71fc07eb7edac67af6"}, + {file = "trove_classifiers-2024.7.2.tar.gz", hash = "sha256:8328f2ac2ce3fd773cbb37c765a0ed7a83f89dc564c7d452f039b69249d0ac35"}, ] [[package]] name = "types-requests" -version = "2.31.0.20240125" +version = "2.32.0.20240712" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.20240125.tar.gz", hash = "sha256:03a28ce1d7cd54199148e043b2079cdded22d6795d19a2c2a6791a4b2b5e2eb5"}, - {file = "types_requests-2.31.0.20240125-py3-none-any.whl", hash = "sha256:9592a9a4cb92d6d75d9b491a41477272b710e021011a2a3061157e2fb1f1a5d1"}, + {file = "types-requests-2.32.0.20240712.tar.gz", hash = "sha256:90c079ff05e549f6bf50e02e910210b98b8ff1ebdd18e19c873cd237737c1358"}, + {file = "types_requests-2.32.0.20240712-py3-none-any.whl", hash = "sha256:f754283e152c752e46e70942fa2a146b5bc70393522257bb85bd1ef7e019dcc3"}, ] [package.dependencies] @@ -1459,24 +1485,24 @@ urllib3 = ">=2" [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "2.2.0" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, - {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -1487,13 +1513,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.25.0" +version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, - {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] @@ -1502,7 +1528,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] @@ -1580,20 +1606,20 @@ test = ["pytest"] [[package]] name = "zipp" -version = "3.17.0" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e4cb3263453998e44156515f28d1d8c6030b956b2840264045bd57aff8033071" +content-hash = "8e40cd7dad5d45e8b7038be044dfdce858d38cdbc62727fabcc70f5ce9ccdd04" diff --git a/pyproject.toml b/pyproject.toml index fbaebe74b4d..f27b526d089 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,15 +32,15 @@ Changelog = "https://python-poetry.org/history/" python = "^3.8" poetry-core = "1.9.0" -poetry-plugin-export = "^1.7.0" +poetry-plugin-export = "^1.8.0" build = "^1.2.1" cachecontrol = { version = "^0.14.0", extras = ["filecache"] } cleo = "^2.1.0" -dulwich = "^0.21.2" +dulwich = "^0.22.1" fastjsonschema = "^2.18.0" importlib-metadata = { version = ">=4.4", python = "<3.10" } installer = "^0.7.0" -keyring = "^24.3.1" +keyring = "^25.1.0" # packaging uses calver, so version is unclamped packaging = ">=24.0" pexpect = "^4.7.0" @@ -59,17 +59,21 @@ xattr = { version = "^1.0.0", markers = "sys_platform == 'darwin'" } [tool.poetry.group.dev.dependencies] pre-commit = ">=2.10" +# add setuptools for PyCharm +# see https://youtrack.jetbrains.com/issue/PY-48909 +# and https://github.com/JetBrains/intellij-community/commit/3f37786ec0bf5066e4527690d1068b5a00680ea3 +setuptools = { version = ">=60", python = "<3.10" } [tool.poetry.group.test.dependencies] coverage = ">=7.2.0" -deepdiff = "^6.3" -httpretty = "^1.1" -jaraco-classes = "^3.3.1" -pytest = "^8.0" -pytest-cov = "^4.0" -pytest-mock = "^3.9" -pytest-randomly = "^3.12" -pytest-xdist = { version = "^3.1", extras = ["psutil"] } +deepdiff = ">=6.3" +httpretty = ">=1.1" +jaraco-classes = ">=3.3.1" +pytest = ">=8.0" +pytest-cov = ">=4.0" +pytest-mock = ">=3.9" +pytest-randomly = ">=3.12" +pytest-xdist = { version = ">=3.1", extras = ["psutil"] } [tool.poetry.group.typing.dependencies] mypy = ">=1.8.0" @@ -101,7 +105,6 @@ extend-exclude = [ ] fix = true line-length = 88 -src = ["src"] target-version = "py38" [tool.ruff.lint] @@ -149,7 +152,6 @@ files = "src, tests" mypy_path = "src" namespace_packages = true explicit_package_bases = true -show_error_codes = true strict = true enable_error_code = [ "ignore-without-code", @@ -167,9 +169,9 @@ exclude = [ # python versions. [[tool.mypy.overrides]] module = [ - 'poetry.plugins.plugin_manager', 'poetry.repositories.installed_repository', 'tests.console.commands.self.test_show_plugins', + 'tests.repositories.test_installed_repository', 'tests.helpers', ] warn_unused_ignores = false @@ -189,14 +191,35 @@ ignore_missing_imports = true [tool.pytest.ini_options] -addopts = "-n logical" +addopts = [ "-n", "logical", "-ra", "--strict-config", "--strict-markers" ] testpaths = ["tests"] markers = [ "network: mark tests that require internet access", ] +log_cli_level = "INFO" +xfail_strict = true [tool.coverage.report] exclude_also = [ "if TYPE_CHECKING:" ] + + +[tool.repo-review] +ignore = [ + "PY007", + "PP302", + "PP309", + "GH101", + "GH212", + "PC111", + "PC140", + "PC160", + "PC170", + "PC180", + "PC180", + "PC901", + "MY103", + "RTD100", +] diff --git a/src/poetry/config/config.py b/src/poetry/config/config.py index b253465ce20..bf2f0948d03 100644 --- a/src/poetry/config/config.py +++ b/src/poetry/config/config.py @@ -122,8 +122,10 @@ class Config: "experimental": { "system-git-client": False, }, + "requests": { + "max-retries": 0, + }, "installer": { - "modern-installation": True, "parallel": True, "max-workers": None, "no-binary": None, @@ -301,7 +303,6 @@ def _get_normalizer(name: str) -> Callable[[str], Any]: "virtualenvs.options.system-site-packages", "virtualenvs.options.prefer-active-python", "experimental.system-git-client", - "installer.modern-installation", "installer.parallel", "solver.lazy-wheel", "warnings.export", @@ -312,7 +313,10 @@ def _get_normalizer(name: str) -> Callable[[str], Any]: if name == "virtualenvs.path": return lambda val: str(Path(val)) - if name == "installer.max-workers": + if name in { + "installer.max-workers", + "requests.max-retries", + }: return int_normalizer if name in ["installer.no-binary", "installer.only-binary"]: diff --git a/src/poetry/config/source.py b/src/poetry/config/source.py index d3783bb5933..f2ff82c2ece 100644 --- a/src/poetry/config/source.py +++ b/src/poetry/config/source.py @@ -3,9 +3,15 @@ import dataclasses import warnings +from typing import TYPE_CHECKING + from poetry.repositories.repository_pool import Priority +if TYPE_CHECKING: + from tomlkit.items import Table + + @dataclasses.dataclass(order=True, eq=True) class Source: name: str @@ -41,3 +47,13 @@ def to_dict(self) -> dict[str, str | bool]: if v }, ) + + def to_toml_table(self) -> Table: + from tomlkit import nl + from tomlkit import table + + source_table: Table = table() + for key, value in self.to_dict().items(): + source_table.add(key, value) + source_table.add(nl()) + return source_table diff --git a/src/poetry/console/application.py b/src/poetry/console/application.py index 07b02f771d0..d144c427d4f 100644 --- a/src/poetry/console/application.py +++ b/src/poetry/console/application.py @@ -121,7 +121,7 @@ def poetry(self) -> Poetry: project_path = Path.cwd() if self._io and self._io.input.option("directory"): - project_path = self._io.input.option("directory") + project_path = Path(self._io.input.option("directory")).absolute() self._poetry = Factory().create_poetry( cwd=project_path, diff --git a/src/poetry/console/commands/config.py b/src/poetry/console/commands/config.py index f1fc7760ab4..2bc524bed41 100644 --- a/src/poetry/console/commands/config.py +++ b/src/poetry/console/commands/config.py @@ -70,7 +70,7 @@ def unique_config_values(self) -> dict[str, tuple[Any, Any]]: "virtualenvs.prefer-active-python": (boolean_validator, boolean_normalizer), "virtualenvs.prompt": (str, str), "experimental.system-git-client": (boolean_validator, boolean_normalizer), - "installer.modern-installation": (boolean_validator, boolean_normalizer), + "requests.max-retries": (lambda val: int(val) >= 0, int_normalizer), "installer.parallel": (boolean_validator, boolean_normalizer), "installer.max-workers": (lambda val: int(val) > 0, int_normalizer), "installer.no-binary": ( diff --git a/src/poetry/console/commands/init.py b/src/poetry/console/commands/init.py index 3e93adc763d..6725008daaf 100644 --- a/src/poetry/console/commands/init.py +++ b/src/poetry/console/commands/init.py @@ -173,7 +173,7 @@ def _init_pyproject( if not python: config = Config.create() python = ( - "^" + ">=" + EnvManager.get_python_version( precision=2, prefer_active_python=config.get("virtualenvs.prefer-active-python"), @@ -459,7 +459,8 @@ def _find_best_version_for_package( # TODO: find similar raise ValueError(f"Could not find a matching version of package {name}") - return package.pretty_name, f"^{package.version.to_string()}" + version = package.version.without_local() + return package.pretty_name, f"^{version.to_string()}" def _parse_requirements(self, requirements: list[str]) -> list[dict[str, Any]]: from poetry.core.pyproject.exceptions import PyProjectException diff --git a/src/poetry/console/commands/install.py b/src/poetry/console/commands/install.py index 7234a1cebcb..63f4f93cb48 100644 --- a/src/poetry/console/commands/install.py +++ b/src/poetry/console/commands/install.py @@ -65,9 +65,7 @@ class InstallCommand(InstallerCommand): option( "compile", None, - "Compile Python source files to bytecode." - " (This option has no effect if modern-installation is disabled" - " because the old installer always compiles.)", + "Compile Python source files to bytecode.", ), ] diff --git a/src/poetry/console/commands/self/self_command.py b/src/poetry/console/commands/self/self_command.py index db626f1ed4e..6b049d3b459 100644 --- a/src/poetry/console/commands/self/self_command.py +++ b/src/poetry/console/commands/self/self_command.py @@ -73,6 +73,7 @@ def generate_system_pyproject(self) -> None: package.python_versions = ".".join(str(v) for v in self.env.version_info[:3]) content = Factory.create_pyproject_from_package(package=package) + content["tool"]["poetry"]["package-mode"] = False # type: ignore[index] for key in preserved: content["tool"]["poetry"][key] = preserved[key] # type: ignore[index] diff --git a/src/poetry/console/commands/source/add.py b/src/poetry/console/commands/source/add.py index 9ce8ecc651d..669ac2f3c01 100644 --- a/src/poetry/console/commands/source/add.py +++ b/src/poetry/console/commands/source/add.py @@ -61,7 +61,6 @@ class SourceAddCommand(Command): def handle(self) -> int: from poetry.factory import Factory - from poetry.utils.source import source_to_table name: str = self.argument("name") lower_name = name.lower() @@ -147,11 +146,11 @@ def handle(self) -> int: source = new_source is_new_source = False - sources.append(source_to_table(source)) + sources.append(source.to_toml_table()) if is_new_source: self.line(f"Adding source with name {name}.") - sources.append(source_to_table(new_source)) + sources.append(new_source.to_toml_table()) else: self.line(f"Source with name {name} already exists. Updating.") diff --git a/src/poetry/console/commands/source/remove.py b/src/poetry/console/commands/source/remove.py index 776cc658737..f743361487f 100644 --- a/src/poetry/console/commands/source/remove.py +++ b/src/poetry/console/commands/source/remove.py @@ -25,8 +25,6 @@ class SourceRemoveCommand(Command): ] def handle(self) -> int: - from poetry.utils.source import source_to_table - name = self.argument("name") lower_name = name.lower() @@ -38,7 +36,7 @@ def handle(self) -> int: self.line(f"Removing source with name {source.name}.") removed = True continue - sources.append(source_to_table(source)) + sources.append(source.to_toml_table()) if not removed: self.line_error( diff --git a/src/poetry/installation/executor.py b/src/poetry/installation/executor.py index afb6ddc694d..d680d6934da 100644 --- a/src/poetry/installation/executor.py +++ b/src/poetry/installation/executor.py @@ -1,6 +1,5 @@ from __future__ import annotations -import contextlib import csv import functools import itertools @@ -14,7 +13,6 @@ from typing import TYPE_CHECKING from typing import Any -from cleo.io.null_io import NullIO from poetry.core.packages.utils.link import Link from poetry.installation.chef import Chef @@ -34,13 +32,11 @@ from poetry.utils.helpers import remove_directory from poetry.utils.isolated_build import IsolatedBuildError from poetry.utils.isolated_build import IsolatedBuildInstallError -from poetry.utils.pip import pip_install if TYPE_CHECKING: from cleo.io.io import IO from cleo.io.outputs.section_output import SectionOutput - from poetry.core.masonry.builders.builder import Builder from poetry.core.packages.package import Package from poetry.config.config import Config @@ -65,20 +61,6 @@ def __init__( self._enabled = True self._verbose = False self._wheel_installer = WheelInstaller(self._env) - self._use_modern_installation = config.get( - "installer.modern-installation", True - ) - if not self._use_modern_installation: - self._io.write_line( - "Warning: Setting `installer.modern-installation` to `false` " - "is deprecated." - ) - self._io.write_line( - "The pip-based installer will be removed in a future release." - ) - self._io.write_line( - "See https://github.com/python-poetry/poetry/issues/8987." - ) if parallel is None: parallel = config.get("installer.parallel", True) @@ -104,6 +86,11 @@ def __init__( self._shutdown = False self._hashes: dict[str, str] = {} + # Cache whether decorated output is supported. + # https://github.com/python-poetry/cleo/issues/423 + self._decorated_output: bool = self._io.output.is_decorated() + self._max_retries = config.get("requests.max-retries", 0) + @property def installations_count(self) -> int: return self._executed["install"] @@ -121,7 +108,7 @@ def enabled(self) -> bool: return self._enabled def supports_fancy_output(self) -> bool: - return self._io.output.is_decorated() and not self._dry_run + return self._decorated_output and not self._dry_run def disable(self) -> Executor: self._enabled = False @@ -141,22 +128,6 @@ def verbose(self, verbose: bool = True) -> Executor: def enable_bytecode_compilation(self, enable: bool = True) -> None: self._wheel_installer.enable_bytecode_compilation(enable) - def pip_install( - self, req: Path, upgrade: bool = False, editable: bool = False - ) -> int: - try: - pip_install(req, self._env, upgrade=upgrade, editable=editable) - except EnvCommandError as e: - output = decode(e.e.output) - if ( - "KeyboardInterrupt" in output - or "ERROR: Operation cancelled by user" in output - ): - return -2 - raise - - return 0 - def execute(self, operations: list[Operation]) -> int: for job_type in self._executed: self._executed[job_type] = 0 @@ -168,13 +139,6 @@ def execute(self, operations: list[Operation]) -> int: self._sections = {} self._yanked_warnings = [] - # pip has to be installed first without parallelism if we install via pip - for i, op in enumerate(operations): - if op.package.name == "pip": - wait([self._executor.submit(self._execute_operation, op)]) - del operations[i] - break - # We group operations by priority groups = itertools.groupby(operations, key=lambda o: -o.priority) for _, group in groups: @@ -204,7 +168,7 @@ def execute(self, operations: list[Operation]) -> int: wait(tasks) for operation in serial_operations: - wait([self._executor.submit(self._execute_operation, operation)]) + self._execute_operation(operation) except KeyboardInterrupt: self._shutdown = True @@ -531,8 +495,6 @@ def _execute_uninstall(self, operation: Uninstall) -> int: def _install(self, operation: Install | Update) -> int: package = operation.package - if package.source_type == "directory" and not self._use_modern_installation: - return self._install_directory_without_wheel_installer(operation) cleanup_archive: bool = False if package.source_type == "git": @@ -556,9 +518,6 @@ def _install(self, operation: Install | Update) -> int: ) self._write(operation, message) - if not self._use_modern_installation: - return self.pip_install(archive, upgrade=operation.job_type == "update") - try: if operation.job_type == "update": # Uninstall first @@ -671,59 +630,6 @@ def _prepare_git_archive(self, operation: Install | Update) -> Path: return archive - def _install_directory_without_wheel_installer( - self, operation: Install | Update - ) -> int: - from poetry.factory import Factory - from poetry.pyproject.toml import PyProjectTOML - - package = operation.package - operation_message = self.get_operation_message(operation) - - message = ( - f" - {operation_message}:" - " Building..." - ) - self._write(operation, message) - - assert package.source_url is not None - if package.root_dir: - req = package.root_dir / package.source_url - else: - req = Path(package.source_url).resolve(strict=False) - - if package.source_subdirectory: - req /= package.source_subdirectory - - pyproject = PyProjectTOML(req / "pyproject.toml") - - package_poetry = None - if pyproject.is_poetry_project(): - with contextlib.suppress(RuntimeError): - package_poetry = Factory().create_poetry(pyproject.file.path.parent) - - if package_poetry is not None: - builder: Builder - if package.develop and not package_poetry.package.build_script: - from poetry.masonry.builders.editable import EditableBuilder - - # This is a Poetry package in editable mode - # we can use the EditableBuilder without going through pip - # to install it, unless it has a build script. - builder = EditableBuilder(package_poetry, self._env, NullIO()) - builder.build() - - return 0 - - if package_poetry.package.build_script: - from poetry.core.masonry.builders.sdist import SdistBuilder - - builder = SdistBuilder(package_poetry) - with builder.setup_py(): - return self.pip_install(req, upgrade=True, editable=package.develop) - - return self.pip_install(req, upgrade=True, editable=package.develop) - def _download(self, operation: Install | Update) -> Path: link = self._chooser.choose_for(operation.package) @@ -814,7 +720,9 @@ def _download_archive( url: str, dest: Path, ) -> None: - downloader = Downloader(url, dest, self._authenticator) + downloader = Downloader( + url, dest, self._authenticator, max_retries=self._max_retries + ) wheel_size = downloader.total_size operation_message = self.get_operation_message(operation) @@ -862,18 +770,6 @@ def _save_url_reference(self, operation: Operation) -> None: package = operation.package if not package.source_url or package.source_type == "legacy": - if not self._use_modern_installation: - # Since we are installing from our own distribution cache pip will write - # a `direct_url.json` file pointing to the cache distribution. - # - # That's not what we want, so we remove the direct_url.json file, if it - # exists. - for ( - direct_url_json - ) in self._env.site_packages.find_distribution_direct_url_json_files( - distribution_name=package.name, writable_only=True - ): - direct_url_json.unlink(missing_ok=True) return url_reference: dict[str, Any] | None = None diff --git a/src/poetry/installation/installer.py b/src/poetry/installation/installer.py index 7bc9f23520d..5dc1606863f 100644 --- a/src/poetry/installation/installer.py +++ b/src/poetry/installation/installer.py @@ -7,14 +7,12 @@ from packaging.utils import canonicalize_name from poetry.installation.executor import Executor -from poetry.installation.operations import Install from poetry.installation.operations import Uninstall from poetry.installation.operations import Update from poetry.repositories import Repository from poetry.repositories import RepositoryPool from poetry.repositories.installed_repository import InstalledRepository from poetry.repositories.lockfile_repository import LockfileRepository -from poetry.utils.extras import get_extra_package_names if TYPE_CHECKING: @@ -239,15 +237,17 @@ def _do_install(self) -> int: source_root=self._env.path.joinpath("src") ): ops = solver.solve(use_latest=self._whitelist).calculate_operations() + + lockfile_repo = LockfileRepository() + self._populate_lockfile_repo(lockfile_repo, ops) + else: self._io.write_line("Installing dependencies from lock file") - locked_repository = self._locker.locked_repository() - if not self._locker.is_fresh(): raise ValueError( - "pyproject.toml changed significantly since poetry.lock was last generated. " - "Run `poetry lock [--no-update]` to fix the lock file." + "pyproject.toml changed significantly since poetry.lock was last" + " generated. Run `poetry lock [--no-update]` to fix the lock file." ) locker_extras = { @@ -258,30 +258,25 @@ def _do_install(self) -> int: if extra not in locker_extras: raise ValueError(f"Extra [{extra}] is not specified.") - # If we are installing from lock - # Filter the operations by comparing it with what is - # currently installed - ops = self._get_operations_from_lock(locked_repository) - - lockfile_repo = LockfileRepository() - uninstalls = self._populate_lockfile_repo(lockfile_repo, ops) + locked_repository = self._locker.locked_repository() + lockfile_repo = locked_repository if not self.executor.enabled: # If we are only in lock mode, no need to go any further self._write_lock_file(lockfile_repo) return 0 - if self._groups is not None: - root = self._package.with_dependency_groups(list(self._groups), only=True) - else: - root = self._package.without_optional_dependency_groups() - if self._io.is_verbose(): self._io.write_line("") self._io.write_line( "Finding the necessary packages for the current system" ) + if self._groups is not None: + root = self._package.with_dependency_groups(list(self._groups), only=True) + else: + root = self._package.without_optional_dependency_groups() + # We resolve again by only using the lock file packages = lockfile_repo.packages + locked_repository.packages pool = RepositoryPool.from_packages(packages, self._config) @@ -299,36 +294,12 @@ def _do_install(self) -> int: with solver.use_environment(self._env): ops = solver.solve(use_latest=self._whitelist).calculate_operations( - with_uninstalls=self._requires_synchronization, + with_uninstalls=self._requires_synchronization or self._update, synchronize=self._requires_synchronization, skip_directory=self._skip_directory, + extras=set(self._extras), ) - if not self._requires_synchronization: - # If no packages synchronisation has been requested we need - # to calculate the uninstall operations - from poetry.puzzle.transaction import Transaction - - transaction = Transaction( - locked_repository.packages, - [(package, 0) for package in lockfile_repo.packages], - installed_packages=self._installed_repository.packages, - root_package=root, - ) - - ops = [ - op - for op in transaction.calculate_operations(with_uninstalls=True) - if op.job_type == "uninstall" - ] + ops - else: - ops = uninstalls + ops - - # We need to filter operations so that packages - # not compatible with the current system, - # or optional and not requested, are dropped - self._filter_operations(ops, lockfile_repo) - # Validate the dependencies for op in ops: dep = op.package.to_dependency() @@ -358,86 +329,14 @@ def _execute(self, operations: list[Operation]) -> int: def _populate_lockfile_repo( self, repo: LockfileRepository, ops: Iterable[Operation] - ) -> list[Uninstall]: - uninstalls = [] + ) -> None: for op in ops: if isinstance(op, Uninstall): - uninstalls.append(op) continue package = op.target_package if isinstance(op, Update) else op.package if not repo.has_package(package): repo.add_package(package) - return uninstalls - - def _get_operations_from_lock( - self, locked_repository: Repository - ) -> list[Operation]: - installed_repo = self._installed_repository - ops: list[Operation] = [] - - extra_packages = self._get_extra_packages(locked_repository) - for locked in locked_repository.packages: - is_installed = False - for installed in installed_repo.packages: - if locked.name == installed.name: - is_installed = True - if locked.optional and locked.name not in extra_packages: - # Installed but optional and not requested in extras - ops.append(Uninstall(locked)) - elif locked.version != installed.version: - ops.append(Update(installed, locked)) - - # If it's optional and not in required extras - # we do not install - if locked.optional and locked.name not in extra_packages: - continue - - op = Install(locked) - if is_installed: - op.skip("Already installed") - - ops.append(op) - - return ops - - def _filter_operations(self, ops: Iterable[Operation], repo: Repository) -> None: - extra_packages = self._get_extra_packages(repo) - for op in ops: - package = op.target_package if isinstance(op, Update) else op.package - - if op.job_type == "uninstall": - continue - - if not self._env.is_valid_for_marker(package.marker): - op.skip("Not needed for the current environment") - continue - - # If a package is optional and not requested - # in any extra we skip it - if package.optional and package.name not in extra_packages: - op.skip("Not required") - - def _get_extra_packages(self, repo: Repository) -> set[NormalizedName]: - """ - Returns all package names required by extras. - - Maybe we just let the solver handle it? - """ - extras: dict[NormalizedName, list[NormalizedName]] - if self._update: - extras = {k: [d.name for d in v] for k, v in self._package.extras.items()} - else: - raw_extras = self._locker.lock_data.get("extras", {}) - extras = { - canonicalize_name(extra): [ - canonicalize_name(dependency) for dependency in dependencies - ] - for extra, dependencies in raw_extras.items() - } - - return get_extra_package_names(repo.packages, extras, self._extras) - def _get_installed(self) -> InstalledRepository: return InstalledRepository.load(self._env) diff --git a/src/poetry/masonry/builders/editable.py b/src/poetry/masonry/builders/editable.py index 93c06a7e729..6a077af7d77 100644 --- a/src/poetry/masonry/builders/editable.py +++ b/src/poetry/masonry/builders/editable.py @@ -3,7 +3,6 @@ import csv import hashlib import json -import locale import os from base64 import urlsafe_b64encode @@ -16,6 +15,7 @@ from poetry.utils._compat import WINDOWS from poetry.utils._compat import decode +from poetry.utils._compat import getencoding from poetry.utils.env import build_environment from poetry.utils.helpers import is_dir_writable from poetry.utils.pip import pip_install @@ -125,7 +125,7 @@ def _add_pth(self) -> list[Path]: try: pth_file = self._env.site_packages.write_text( - pth_file, content, encoding=locale.getpreferredencoding() + pth_file, content, encoding=getencoding() ) self._debug( f" - Adding {pth_file.name} to {pth_file.parent} for" @@ -252,7 +252,8 @@ def _add_dist_info(self, added_files: list[Path]) -> None: "dir_info": {"editable": True}, "url": self._poetry.file.path.parent.absolute().as_uri(), } - ) + ), + encoding="utf-8", ) added_files.append(direct_url_json) diff --git a/src/poetry/packages/direct_origin.py b/src/poetry/packages/direct_origin.py index 78bae1ee764..561b7a4223e 100644 --- a/src/poetry/packages/direct_origin.py +++ b/src/poetry/packages/direct_origin.py @@ -7,6 +7,7 @@ from poetry.core.packages.utils.link import Link +from poetry.config.config import Config from poetry.inspection.info import PackageInfo from poetry.inspection.info import PackageInfoError from poetry.utils.authenticator import get_default_authenticator @@ -57,6 +58,8 @@ def _get_package_from_git( class DirectOrigin: def __init__(self, artifact_cache: ArtifactCache) -> None: self._artifact_cache = artifact_cache + config = Config.create() + self._max_retries = config.get("requests.max-retries", 0) self._authenticator = get_default_authenticator() @classmethod @@ -77,7 +80,9 @@ def get_package_from_directory(cls, directory: Path) -> Package: return PackageInfo.from_directory(path=directory).to_package(root_dir=directory) def _download_file(self, url: str, dest: Path) -> None: - download_file(url, dest, session=self._authenticator) + download_file( + url, dest, session=self._authenticator, max_retries=self._max_retries + ) def get_package_from_url(self, url: str) -> Package: link = Link(url) diff --git a/src/poetry/packages/locker.py b/src/poetry/packages/locker.py index 589b63a9593..80177f16dd3 100644 --- a/src/poetry/packages/locker.py +++ b/src/poetry/packages/locker.py @@ -18,7 +18,6 @@ from poetry.core.constraints.version import parse_constraint from poetry.core.packages.dependency import Dependency from poetry.core.packages.package import Package -from poetry.core.version.markers import parse_marker from poetry.core.version.requirements import InvalidRequirement from tomlkit import array from tomlkit import comment @@ -205,22 +204,6 @@ def locked_repository(self) -> LockfileRepository: package.extras = package_extras - if "marker" in info: - package.marker = parse_marker(info["marker"]) - else: - # Compatibility for old locks - if "requirements" in info: - dep = Dependency("foo", "0.0.0") - for name, value in info["requirements"].items(): - if name == "python": - dep.python_versions = value - elif name == "platform": - dep.platform = value - - split_dep = dep.to_pep_508(False).split(";") - if len(split_dep) > 1: - package.marker = parse_marker(split_dep[1].strip()) - for dep_name, constraint in info.get("dependencies", {}).items(): root_dir = self.lock.parent if package.source_type == "directory": @@ -307,8 +290,33 @@ def _should_write(self, lock: TOMLDocument) -> bool: return do_write def _write_lock_data(self, data: TOMLDocument) -> None: - lockfile = TOMLFile(self.lock) - lockfile.write(data) + if self.lock.exists(): + # The following code is roughly equivalent to + # • lockfile = TOMLFile(self.lock) + # • lockfile.read() + # • lockfile.write(data) + # However, lockfile.read() takes more than half a second even + # for a modestly sized project like Poetry itself and the only reason + # for reading the lockfile is to determine the line endings. Thus, + # we do that part for ourselves here, which only takes about 10 ms. + + # get original line endings + with open(self.lock, encoding="utf-8", newline="") as f: + line = f.readline() + linesep = "\r\n" if line.endswith("\r\n") else "\n" + + # enforce original line endings + content = data.as_string() + if linesep == "\n": + content = content.replace("\r\n", "\n") + elif linesep == "\r\n": + content = re.sub(r"(? dict[str, Any]: ) metadata = lock_data["metadata"] - lock_version = Version.parse(metadata.get("lock-version", "1.0")) + if "lock-version" not in metadata: + raise RuntimeError( + "The lock file is not compatible with the current version of Poetry.\n" + "Regenerate the lock file with the `poetry lock` command." + ) + lock_version = Version.parse(metadata["lock-version"]) current_version = Version.parse(self._VERSION) accepted_versions = parse_constraint(self._READ_VERSION_RANGE) lock_version_allowed = accepted_versions.allows(lock_version) diff --git a/src/poetry/plugins/plugin_manager.py b/src/poetry/plugins/plugin_manager.py index 309facb1c39..4ab286c36f7 100644 --- a/src/poetry/plugins/plugin_manager.py +++ b/src/poetry/plugins/plugin_manager.py @@ -73,7 +73,7 @@ def activate(self, *args: Any, **kwargs: Any) -> None: def _load_plugin_entry_point(self, ep: metadata.EntryPoint) -> None: logger.debug("Loading the %s plugin", ep.name) - plugin = ep.load() # type: ignore[no-untyped-call] + plugin = ep.load() if not issubclass(plugin, (Plugin, ApplicationPlugin)): raise ValueError( diff --git a/src/poetry/puzzle/transaction.py b/src/poetry/puzzle/transaction.py index 7a5f8bcb31b..13d964f3876 100644 --- a/src/poetry/puzzle/transaction.py +++ b/src/poetry/puzzle/transaction.py @@ -2,8 +2,11 @@ from typing import TYPE_CHECKING +from poetry.utils.extras import get_extra_package_names + if TYPE_CHECKING: + from packaging.utils import NormalizedName from poetry.core.packages.package import Package from poetry.installation.operations.operation import Operation @@ -32,6 +35,7 @@ def calculate_operations( synchronize: bool = False, *, skip_directory: bool = False, + extras: set[NormalizedName] | None = None, ) -> list[Operation]: from poetry.installation.operations import Install from poetry.installation.operations import Uninstall @@ -39,16 +43,34 @@ def calculate_operations( operations: list[Operation] = [] + extra_packages: set[NormalizedName] = set() + if extras is not None: + assert self._root_package is not None + extra_packages = get_extra_package_names( + [package for package, _ in self._result_packages], + {k: [d.name for d in v] for k, v in self._root_package.extras.items()}, + extras, + ) + + uninstalls: set[NormalizedName] = set() for result_package, priority in self._result_packages: installed = False + is_unsolicited_extra = extras is not None and ( + result_package.optional and result_package.name not in extra_packages + ) for installed_package in self._installed_packages: if result_package.name == installed_package.name: installed = True + # Extras that were not requested are always uninstalled. + if is_unsolicited_extra: + uninstalls.add(installed_package.name) + operations.append(Uninstall(installed_package)) + # We have to perform an update if the version or another # attribute of the package has changed (source type, url, ref, ...). - if result_package.version != installed_package.version or ( + elif result_package.version != installed_package.version or ( ( # This has to be done because installed packages cannot # have type "legacy". If a package with type "legacy" @@ -78,10 +100,12 @@ def calculate_operations( installed or (skip_directory and result_package.source_type == "directory") ): - operations.append(Install(result_package, priority=priority)) + op = Install(result_package, priority=priority) + if is_unsolicited_extra: + op.skip("Not required") + operations.append(op) if with_uninstalls: - uninstalls: set[str] = set() for current_package in self._current_packages: found = any( current_package.name == result_package.name @@ -92,7 +116,7 @@ def calculate_operations( for installed_package in self._installed_packages: if installed_package.name == current_package.name: uninstalls.add(installed_package.name) - operations.append(Uninstall(current_package)) + operations.append(Uninstall(installed_package)) if synchronize: result_package_names = { diff --git a/src/poetry/repositories/http_repository.py b/src/poetry/repositories/http_repository.py index 54c7f0da1e9..7d0249b897d 100644 --- a/src/poetry/repositories/http_repository.py +++ b/src/poetry/repositories/http_repository.py @@ -66,6 +66,7 @@ def __init__( self.get_page = functools.lru_cache(maxsize=None)(self._get_page) self._lazy_wheel = config.get("solver.lazy-wheel", True) + self._max_retries = config.get("requests.max-retries", 0) # We are tracking if a domain supports range requests or not to avoid # unnecessary requests. # ATTENTION: A domain might support range requests only for some files, so the @@ -95,7 +96,11 @@ def _download( self, url: str, dest: Path, *, raise_accepts_ranges: bool = False ) -> None: return download_file( - url, dest, session=self.session, raise_accepts_ranges=raise_accepts_ranges + url, + dest, + session=self.session, + raise_accepts_ranges=raise_accepts_ranges, + max_retries=self._max_retries, ) @contextmanager diff --git a/src/poetry/repositories/installed_repository.py b/src/poetry/repositories/installed_repository.py index 1eb6b1d9742..07a92156a19 100644 --- a/src/poetry/repositories/installed_repository.py +++ b/src/poetry/repositories/installed_repository.py @@ -13,6 +13,7 @@ from poetry.core.utils.helpers import module_name from poetry.repositories.repository import Repository +from poetry.utils._compat import getencoding from poetry.utils._compat import metadata @@ -58,7 +59,7 @@ def get_package_paths(cls, env: Env, name: str) -> set[Path]: if not pth_file.exists(): continue - with pth_file.open() as f: + with pth_file.open(encoding=getencoding()) as f: for line in f: line = line.strip() if line and not line.startswith(("#", "import ", "import\t")): diff --git a/src/poetry/repositories/legacy_repository.py b/src/poetry/repositories/legacy_repository.py index a6edf66729c..8b1bcea8236 100644 --- a/src/poetry/repositories/legacy_repository.py +++ b/src/poetry/repositories/legacy_repository.py @@ -12,7 +12,7 @@ from poetry.inspection.info import PackageInfo from poetry.repositories.exceptions import PackageNotFound from poetry.repositories.http_repository import HTTPRepository -from poetry.repositories.link_sources.html import SimpleRepositoryPage +from poetry.repositories.link_sources.html import HTMLPage from poetry.repositories.link_sources.html import SimpleRepositoryRootPage @@ -125,10 +125,10 @@ def _get_release_info( ), ) - def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage: + def _get_page(self, name: NormalizedName) -> HTMLPage: if not (response := self._get_response(f"/{name}/")): raise PackageNotFound(f"Package [{name}] not found.") - return SimpleRepositoryPage(response.url, response.text) + return HTMLPage(response.url, response.text) @cached_property def root_page(self) -> SimpleRepositoryRootPage: diff --git a/src/poetry/repositories/link_sources/html.py b/src/poetry/repositories/link_sources/html.py index 3128b15fa1b..6b849e4e4cb 100644 --- a/src/poetry/repositories/link_sources/html.py +++ b/src/poetry/repositories/link_sources/html.py @@ -100,10 +100,3 @@ def package_names(self) -> list[str]: results.append(href.rstrip("/")) return results - - -class SimpleRepositoryPage(HTMLPage): - def __init__(self, url: str, content: str) -> None: - if not url.endswith("/"): - url += "/" - super().__init__(url=url, content=content) diff --git a/src/poetry/repositories/single_page_repository.py b/src/poetry/repositories/single_page_repository.py index 7bdc469bbf0..446957f12db 100644 --- a/src/poetry/repositories/single_page_repository.py +++ b/src/poetry/repositories/single_page_repository.py @@ -4,7 +4,7 @@ from poetry.repositories.exceptions import PackageNotFound from poetry.repositories.legacy_repository import LegacyRepository -from poetry.repositories.link_sources.html import SimpleRepositoryPage +from poetry.repositories.link_sources.html import HTMLPage if TYPE_CHECKING: @@ -12,11 +12,11 @@ class SinglePageRepository(LegacyRepository): - def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage: + def _get_page(self, name: NormalizedName) -> HTMLPage: """ Single page repositories only have one page irrespective of endpoint. """ response = self._get_response("") if not response: raise PackageNotFound(f"Package [{name}] not found.") - return SimpleRepositoryPage(response.url, response.text) + return HTMLPage(response.url, response.text) diff --git a/src/poetry/utils/_compat.py b/src/poetry/utils/_compat.py index f2d6157343f..6781096ddaf 100644 --- a/src/poetry/utils/_compat.py +++ b/src/poetry/utils/_compat.py @@ -1,5 +1,6 @@ from __future__ import annotations +import locale import sys from contextlib import suppress @@ -52,6 +53,13 @@ def encode(string: str, encodings: list[str] | None = None) -> bytes: return string.encode(encodings[0], errors="ignore") +def getencoding() -> str: + if sys.version_info < (3, 11): + return locale.getpreferredencoding() + else: + return locale.getencoding() + + def is_relative_to(this: Path, other: Path) -> bool: """ Return whether `this` path is relative to the `other` path. This is compatibility wrapper around @@ -72,6 +80,7 @@ def is_relative_to(this: Path, other: Path) -> bool: "WINDOWS", "decode", "encode", + "getencoding", "is_relative_to", "metadata", "tomllib", diff --git a/src/poetry/utils/env/base_env.py b/src/poetry/utils/env/base_env.py index f4e87d5a5fb..5a8f2fc6146 100644 --- a/src/poetry/utils/env/base_env.py +++ b/src/poetry/utils/env/base_env.py @@ -330,8 +330,9 @@ def _run(self, cmd: list[str], **kwargs: Any) -> str: subprocess.check_call(cmd, stderr=stderr, env=env, **kwargs) output = "" else: + encoding = "locale" if sys.version_info >= (3, 10) else None output = subprocess.check_output( - cmd, stderr=stderr, env=env, text=True, **kwargs + cmd, stderr=stderr, env=env, text=True, encoding=encoding, **kwargs ) except CalledProcessError as e: raise EnvCommandError(e) diff --git a/src/poetry/utils/env/env_manager.py b/src/poetry/utils/env/env_manager.py index 093a248a7e8..2e28e68fb9d 100644 --- a/src/poetry/utils/env/env_manager.py +++ b/src/poetry/utils/env/env_manager.py @@ -105,8 +105,11 @@ def _full_python_path(python: str) -> Path | None: return None try: + encoding = "locale" if sys.version_info >= (3, 10) else None executable = subprocess.check_output( - [path_python, "-c", "import sys; print(sys.executable)"], text=True + [path_python, "-c", "import sys; print(sys.executable)"], + text=True, + encoding=encoding, ).strip() return Path(executable) @@ -147,8 +150,11 @@ def get_python_version( executable = EnvManager._detect_active_python(io) if executable: + encoding = "locale" if sys.version_info >= (3, 10) else None python_patch = subprocess.check_output( - [executable, "-c", GET_PYTHON_VERSION_ONELINER], text=True + [executable, "-c", GET_PYTHON_VERSION_ONELINER], + text=True, + encoding=encoding, ).strip() version = ".".join(str(v) for v in python_patch.split(".")[:precision]) @@ -188,8 +194,11 @@ def activate(self, python: str) -> Env: raise PythonVersionNotFound(python) try: + encoding = "locale" if sys.version_info >= (3, 10) else None python_version_string = subprocess.check_output( - [python_path, "-c", GET_PYTHON_VERSION_ONELINER], text=True + [python_path, "-c", GET_PYTHON_VERSION_ONELINER], + text=True, + encoding=encoding, ) except CalledProcessError as e: raise EnvCommandError(e) @@ -354,8 +363,9 @@ def remove(self, python: str) -> Env: if python_path.is_file(): # Validate env name if provided env is a full path to python try: + encoding = "locale" if sys.version_info >= (3, 10) else None env_dir = subprocess.check_output( - [python, "-c", GET_ENV_PATH_ONELINER], text=True + [python, "-c", GET_ENV_PATH_ONELINER], text=True, encoding=encoding ).strip("\n") env_name = Path(env_dir).name if not self.check_env_is_for_current_project( @@ -398,8 +408,11 @@ def remove(self, python: str) -> Env: pass try: + encoding = "locale" if sys.version_info >= (3, 10) else None python_version_string = subprocess.check_output( - [python, "-c", GET_PYTHON_VERSION_ONELINER], text=True + [python, "-c", GET_PYTHON_VERSION_ONELINER], + text=True, + encoding=encoding, ) except CalledProcessError as e: raise EnvCommandError(e) @@ -481,8 +494,11 @@ def create_venv( python_patch = ".".join([str(v) for v in sys.version_info[:3]]) python_minor = ".".join([str(v) for v in sys.version_info[:2]]) if executable: + encoding = "locale" if sys.version_info >= (3, 10) else None python_patch = subprocess.check_output( - [executable, "-c", GET_PYTHON_VERSION_ONELINER], text=True + [executable, "-c", GET_PYTHON_VERSION_ONELINER], + text=True, + encoding=encoding, ).strip() python_minor = ".".join(python_patch.split(".")[:2]) @@ -527,10 +543,12 @@ def create_venv( continue try: + encoding = "locale" if sys.version_info >= (3, 10) else None python_patch = subprocess.check_output( [python, "-c", GET_PYTHON_VERSION_ONELINER], stderr=subprocess.STDOUT, text=True, + encoding=encoding, ).strip() except CalledProcessError: continue @@ -645,7 +663,7 @@ def build_venv( args = [ "--no-download", "--no-periodic-update", - "--python", + "--try-first-with", executable_str or sys.executable, ] diff --git a/src/poetry/utils/env/site_packages.py b/src/poetry/utils/env/site_packages.py index b7f50dbcf63..a082419031c 100644 --- a/src/poetry/utils/env/site_packages.py +++ b/src/poetry/utils/env/site_packages.py @@ -6,6 +6,8 @@ from pathlib import Path from typing import TYPE_CHECKING from typing import Any +from typing import Literal +from typing import overload from poetry.utils._compat import metadata from poetry.utils.helpers import is_dir_writable @@ -153,6 +155,28 @@ def remove_distribution_files(self, distribution_name: str) -> list[Path]: return paths + @overload + def _path_method_wrapper( + self, + path: Path, + method: str, + *args: Any, + return_first: Literal[False], + writable_only: bool = False, + **kwargs: Any, + ) -> list[tuple[Path, Any]]: ... + + @overload + def _path_method_wrapper( + self, + path: Path, + method: str, + *args: Any, + return_first: bool = True, + writable_only: bool = False, + **kwargs: Any, + ) -> tuple[Path, Any]: ... + def _path_method_wrapper( self, path: Path, @@ -181,13 +205,15 @@ def _path_method_wrapper( raise OSError(f"Unable to access any of {paths_csv(candidates)}") def write_text(self, path: Path, *args: Any, **kwargs: Any) -> Path: - paths = self._path_method_wrapper(path, "write_text", *args, **kwargs) - assert isinstance(paths, tuple) + paths: tuple[Path, Any] = self._path_method_wrapper( + path, "write_text", *args, **kwargs + ) return paths[0] def mkdir(self, path: Path, *args: Any, **kwargs: Any) -> Path: - paths = self._path_method_wrapper(path, "mkdir", *args, **kwargs) - assert isinstance(paths, tuple) + paths: tuple[Path, Any] = self._path_method_wrapper( + path, "mkdir", *args, **kwargs + ) return paths[0] def exists(self, path: Path) -> bool: diff --git a/src/poetry/utils/env/virtual_env.py b/src/poetry/utils/env/virtual_env.py index 9a8680aaefa..22fd0f91415 100644 --- a/src/poetry/utils/env/virtual_env.py +++ b/src/poetry/utils/env/virtual_env.py @@ -136,7 +136,7 @@ def includes_system_site_packages(self) -> bool: return pyvenv_cfg.exists() and ( re.search( r"^\s*include-system-site-packages\s*=\s*true\s*$", - pyvenv_cfg.read_text(), + pyvenv_cfg.read_text(encoding="utf-8"), re.IGNORECASE | re.MULTILINE, ) is not None diff --git a/src/poetry/utils/helpers.py b/src/poetry/utils/helpers.py index 4dcbab6e17c..07e0ce41687 100644 --- a/src/poetry/utils/helpers.py +++ b/src/poetry/utils/helpers.py @@ -20,6 +20,8 @@ from typing import Any from typing import overload +from requests.exceptions import ChunkedEncodingError +from requests.exceptions import ConnectionError from requests.utils import atomic_open from poetry.utils.authenticator import get_default_authenticator @@ -33,6 +35,7 @@ from types import TracebackType from poetry.core.packages.package import Package + from requests import Response from requests import Session from poetry.utils.authenticator import Authenticator @@ -133,10 +136,11 @@ def download_file( session: Authenticator | Session | None = None, chunk_size: int = 1024, raise_accepts_ranges: bool = False, + max_retries: int = 0, ) -> None: from poetry.puzzle.provider import Indicator - downloader = Downloader(url, dest, session) + downloader = Downloader(url, dest, session, max_retries=max_retries) if raise_accepts_ranges and downloader.accepts_ranges: raise HTTPRangeRequestSupported(f"URL {url} supports range requests.") @@ -168,16 +172,13 @@ def __init__( url: str, dest: Path, session: Authenticator | Session | None = None, + max_retries: int = 0, ): self._dest = dest - - session = session or get_default_authenticator() - headers = {"Accept-Encoding": "Identity"} - - self._response = session.get( - url, stream=True, headers=headers, timeout=REQUESTS_TIMEOUT - ) - self._response.raise_for_status() + self._max_retries = max_retries + self._session = session or get_default_authenticator() + self._url = url + self._response = self._get() @cached_property def accepts_ranges(self) -> bool: @@ -191,10 +192,44 @@ def total_size(self) -> int: total_size = int(self._response.headers["Content-Length"]) return total_size + def _get(self, start: int = 0) -> Response: + headers = {"Accept-Encoding": "Identity"} + if start > 0: + headers["Range"] = f"bytes={start}-" + response = self._session.get( + self._url, stream=True, headers=headers, timeout=REQUESTS_TIMEOUT + ) + response.raise_for_status() + return response + + def _iter_content_with_resume(self, chunk_size: int) -> Iterator[bytes]: + fetched_size = 0 + retries = 0 + while True: + try: + for chunk in self._response.iter_content(chunk_size=chunk_size): + yield chunk + fetched_size += len(chunk) + except (ChunkedEncodingError, ConnectionError): + if ( + retries < self._max_retries + and self.accepts_ranges + and fetched_size > 0 + ): + # only retry if server supports byte ranges + # and we have fetched at least one chunk + # otherwise, we should just fail + retries += 1 + self._response = self._get(fetched_size) + continue + raise + else: + break + def download_with_progress(self, chunk_size: int = 1024) -> Iterator[int]: fetched_size = 0 with atomic_open(self._dest) as f: - for chunk in self._response.iter_content(chunk_size=chunk_size): + for chunk in self._iter_content_with_resume(chunk_size=chunk_size): if chunk: f.write(chunk) fetched_size += len(chunk) diff --git a/src/poetry/utils/isolated_build.py b/src/poetry/utils/isolated_build.py index e4ea88bda86..5879676c691 100644 --- a/src/poetry/utils/isolated_build.py +++ b/src/poetry/utils/isolated_build.py @@ -113,7 +113,7 @@ def isolated_builder( pool: RepositoryPool | None = None, ) -> Iterator[ProjectBuilder]: from build import ProjectBuilder - from pyproject_hooks import quiet_subprocess_runner # type: ignore[import-untyped] + from pyproject_hooks import quiet_subprocess_runner from poetry.factory import Factory diff --git a/src/poetry/utils/source.py b/src/poetry/utils/source.py deleted file mode 100644 index dc8e1c8c92f..00000000000 --- a/src/poetry/utils/source.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - - -if TYPE_CHECKING: - from tomlkit.items import Table - - from poetry.config.source import Source - - -def source_to_table(source: Source) -> Table: - from tomlkit import nl - from tomlkit import table - - source_table: Table = table() - for key, value in source.to_dict().items(): - source_table.add(key, value) - source_table.add(nl()) - return source_table diff --git a/src/poetry/vcs/git/system.py b/src/poetry/vcs/git/system.py index 366105107c4..27ab0330002 100644 --- a/src/poetry/vcs/git/system.py +++ b/src/poetry/vcs/git/system.py @@ -40,12 +40,13 @@ def run(*args: Any, **kwargs: Any) -> None: git_command = find_git_command() env = os.environ.copy() env["GIT_TERMINAL_PROMPT"] = "0" - subprocess.check_call( + subprocess.check_call( # type: ignore[call-arg] git_command + list(args), stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL, env=env, text=True, + encoding="utf-8", ) @staticmethod diff --git a/tests/config/test_config.py b/tests/config/test_config.py index 05788f3baf0..8afcd0e6596 100644 --- a/tests/config/test_config.py +++ b/tests/config/test_config.py @@ -34,7 +34,12 @@ def get_options_based_on_normalizer(normalizer: Normalizer) -> Iterator[str]: @pytest.mark.parametrize( - ("name", "value"), [("installer.parallel", True), ("virtualenvs.create", True)] + ("name", "value"), + [ + ("installer.parallel", True), + ("virtualenvs.create", True), + ("requests.max-retries", 0), + ], ) def test_config_get_default_value(config: Config, name: str, value: bool) -> None: assert config.get(name) is value diff --git a/tests/utils/test_source.py b/tests/config/test_source.py similarity index 95% rename from tests/utils/test_source.py rename to tests/config/test_source.py index 909af9be27a..2331dcb4339 100644 --- a/tests/utils/test_source.py +++ b/tests/config/test_source.py @@ -8,7 +8,6 @@ from poetry.config.source import Source from poetry.repositories.repository_pool import Priority -from poetry.utils.source import source_to_table @pytest.mark.parametrize( @@ -36,7 +35,7 @@ def test_source_to_table(source: Source, table_body: dict[str, str | bool]) -> N table = Table(Container(), Trivia(), False) table._value = table_body # type: ignore[assignment] - assert source_to_table(source) == table + assert source.to_toml_table() == table def test_source_default_is_primary() -> None: diff --git a/tests/conftest.py b/tests/conftest.py index 40bd0b97149..53641dcb1d7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -19,6 +19,7 @@ from jaraco.classes import properties from keyring.backend import KeyringBackend from keyring.backends.fail import Keyring as FailKeyring +from keyring.credentials import SimpleCredential from keyring.errors import KeyringError from keyring.errors import KeyringLocked @@ -51,6 +52,7 @@ from _pytest.config import Config as PyTestConfig from _pytest.config.argparsing import Parser from _pytest.tmpdir import TempPathFactory + from keyring.credentials import Credential from pytest_mock import MockerFixture from poetry.poetry import Poetry @@ -110,41 +112,63 @@ def all(self) -> dict[str, Any]: class DummyBackend(KeyringBackend): def __init__(self) -> None: - self._passwords: dict[str, dict[str | None, str | None]] = {} + self._passwords: dict[str, dict[str, str]] = {} + self._service_defaults: dict[str, Credential] = {} @properties.classproperty def priority(self) -> float: return 42 - def set_password(self, service: str, username: str | None, password: Any) -> None: + def set_password(self, service: str, username: str, password: str) -> None: self._passwords[service] = {username: password} - def get_password(self, service: str, username: str | None) -> Any: + def get_password(self, service: str, username: str) -> str | None: return self._passwords.get(service, {}).get(username) - def get_credential(self, service: str, username: str | None) -> Any: - return self._passwords.get(service, {}).get(username) + def get_credential( + self, + service: str, + username: str | None, + ) -> Credential | None: + if username is None: + credential = self._service_defaults.get(service) + return credential + + password = self.get_password(service, username) + if password is None: + return None - def delete_password(self, service: str, username: str | None) -> None: + return SimpleCredential(username, password) # type: ignore[no-untyped-call] + + def delete_password(self, service: str, username: str) -> None: if service in self._passwords and username in self._passwords[service]: del self._passwords[service][username] + def set_default_service_credential( + self, service: str, credential: Credential + ) -> None: + self._service_defaults[service] = credential + class LockedBackend(KeyringBackend): @properties.classproperty def priority(self) -> float: return 42 - def set_password(self, service: str, username: str | None, password: Any) -> None: + def set_password(self, service: str, username: str, password: str) -> None: raise KeyringLocked() - def get_password(self, service: str, username: str | None) -> Any: + def get_password(self, service: str, username: str) -> str | None: raise KeyringLocked() - def get_credential(self, service: str, username: str | None) -> Any: + def get_credential( + self, + service: str, + username: str | None, + ) -> Credential | None: raise KeyringLocked() - def delete_password(self, service: str, username: str | None) -> None: + def delete_password(self, service: str, username: str) -> None: raise KeyringLocked() @@ -153,7 +177,11 @@ class ErroneousBackend(FailKeyring): def priority(self) -> float: return 42 - def get_credential(self, service: str, username: str | None) -> Any: + def get_credential( + self, + service: str, + username: str | None, + ) -> Credential | None: raise KeyringError() diff --git a/tests/console/commands/env/test_remove.py b/tests/console/commands/env/test_remove.py index 8b2163369f3..04d839f235c 100644 --- a/tests/console/commands/env/test_remove.py +++ b/tests/console/commands/env/test_remove.py @@ -76,13 +76,18 @@ def test_remove_all( if envs_file == "empty": envs_file_path.touch() elif envs_file == "self": - envs_file_path.write_text(f'[{venv_name}]\nminor = "3.9"\npatch = "3.9.1"\n') + envs_file_path.write_text( + f'[{venv_name}]\nminor = "3.9"\npatch = "3.9.1"\n', encoding="utf-8" + ) elif envs_file == "other": - envs_file_path.write_text('[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n') + envs_file_path.write_text( + '[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n', encoding="utf-8" + ) elif envs_file == "self_and_other": envs_file_path.write_text( f'[{venv_name}]\nminor = "3.9"\npatch = "3.9.1"\n' - '[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n' + '[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n', + encoding="utf-8", ) else: # no envs file -> nothing to prepare @@ -97,7 +102,7 @@ def test_remove_all( if envs_file is not None: assert envs_file_path.exists() - envs_file_content = envs_file_path.read_text() + envs_file_content = envs_file_path.read_text(encoding="utf-8") assert venv_name not in envs_file_content if "other" in envs_file: assert "other-abcdefgh" in envs_file_content diff --git a/tests/console/commands/self/conftest.py b/tests/console/commands/self/conftest.py index 19a2242ea90..14554efe924 100644 --- a/tests/console/commands/self/conftest.py +++ b/tests/console/commands/self/conftest.py @@ -74,7 +74,6 @@ def setup_mocks( mocker.patch( "poetry.repositories.repository_pool.RepositoryPool.package", pool.package ) - mocker.patch("poetry.installation.executor.pip_install") mocker.patch( "poetry.installation.installer.Installer._get_installed", return_value=installed, diff --git a/tests/console/commands/self/test_install.py b/tests/console/commands/self/test_install.py new file mode 100644 index 00000000000..b9cbbb59dc4 --- /dev/null +++ b/tests/console/commands/self/test_install.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest + +from poetry.console.commands.self.install import SelfInstallCommand + + +if TYPE_CHECKING: + from cleo.testers.command_tester import CommandTester + + from tests.types import CommandTesterFactory + + +@pytest.fixture +def tester(command_tester_factory: CommandTesterFactory) -> CommandTester: + return command_tester_factory("self install") + + +@pytest.mark.parametrize( + "pyproject_content", + ( + None, + """\ +[tool.poetry] +name = "poetry-instance" +version = "1.2" +description = "" +authors = [] +license = "" +# no package-mode -> defaults to true + +[tool.poetry.dependencies] +python = "3.9" +poetry = "1.2" +""", + ), +) +def test_self_install( + tester: CommandTester, + pyproject_content: str | None, +) -> None: + command = tester.command + assert isinstance(command, SelfInstallCommand) + pyproject_path = command.system_pyproject + if pyproject_content: + pyproject_path.write_text(pyproject_content, encoding="utf-8") + else: + assert not pyproject_path.exists() + + tester.execute() + + expected_output = """\ +Updating dependencies +Resolving dependencies... + +Writing lock file +""" + + assert tester.io.fetch_output() == expected_output + assert tester.io.fetch_error() == "" diff --git a/tests/console/commands/self/test_remove_plugins.py b/tests/console/commands/self/test_remove_plugins.py index be5e44f6130..6e525e78906 100644 --- a/tests/console/commands/self/test_remove_plugins.py +++ b/tests/console/commands/self/test_remove_plugins.py @@ -48,14 +48,13 @@ def install_plugin(installed: Repository) -> None: "optional": False, "platform": "*", "python-versions": "*", - "checksum": [], + "files": [], }, ], "metadata": { + "lock-version": "2.0", "python-versions": "^3.6", - "platform": "*", "content-hash": "123456789", - "files": {"poetry-plugin": []}, }, } system_pyproject_file.parent.joinpath("poetry.lock").write_text( diff --git a/tests/console/commands/self/test_self_command.py b/tests/console/commands/self/test_self_command.py index 7abf266ed7e..e38cee61873 100644 --- a/tests/console/commands/self/test_self_command.py +++ b/tests/console/commands/self/test_self_command.py @@ -29,9 +29,11 @@ def test_generate_system_pyproject_trailing_newline( example_system_pyproject: str, ) -> None: cmd = SelfCommand() - cmd.system_pyproject.write_text(example_system_pyproject + "\n" * existing_newlines) + cmd.system_pyproject.write_text( + example_system_pyproject + "\n" * existing_newlines, encoding="utf-8" + ) cmd.generate_system_pyproject() - generated = cmd.system_pyproject.read_text() + generated = cmd.system_pyproject.read_text(encoding="utf-8") assert len(generated) - len(generated.rstrip("\n")) == existing_newlines @@ -40,10 +42,12 @@ def test_generate_system_pyproject_carriage_returns( example_system_pyproject: str, ) -> None: cmd = SelfCommand() - cmd.system_pyproject.write_text(example_system_pyproject + "\n") + cmd.system_pyproject.write_text(example_system_pyproject + "\n", encoding="utf-8") cmd.generate_system_pyproject() - with open(cmd.system_pyproject, newline="") as f: # do not translate newlines + with open( + cmd.system_pyproject, newline="", encoding="utf-8" + ) as f: # do not translate newlines generated = f.read() assert "\r\r" not in generated diff --git a/tests/console/commands/test_add.py b/tests/console/commands/test_add.py index da6467d2854..73ba0241018 100644 --- a/tests/console/commands/test_add.py +++ b/tests/console/commands/test_add.py @@ -103,6 +103,7 @@ def repo_add_default_packages(repo: TestRepository) -> None: repo.add_package(get_package("tomlkit", "0.5.5")) repo.add_package(get_package("pyyaml", "3.13")) repo.add_package(get_package("pyyaml", "4.2b2")) + repo.add_package(get_package("torch", "2.4.0+cpu")) def test_add_no_constraint(app: PoetryTestApplication, tester: CommandTester) -> None: @@ -133,6 +134,33 @@ def test_add_no_constraint(app: PoetryTestApplication, tester: CommandTester) -> assert content["dependencies"]["cachy"] == "^0.2.0" +def test_add_local_version(app: PoetryTestApplication, tester: CommandTester) -> None: + tester.execute("torch") + + expected = """\ +Using version ^2.4.0 for torch + +Updating dependencies +Resolving dependencies... + +Package operations: 1 install, 0 updates, 0 removals + + - Installing torch (2.4.0+cpu) + +Writing lock file +""" + + assert tester.io.fetch_output() == expected + assert isinstance(tester.command, InstallerCommand) + assert tester.command.installer.executor.installations_count == 1 + + pyproject: dict[str, Any] = app.poetry.file.read() + content = pyproject["tool"]["poetry"] + + assert "torch" in content["dependencies"] + assert content["dependencies"]["torch"] == "^2.4.0" + + def test_add_non_package_mode_no_name( project_factory: ProjectFactory, command_tester_factory: CommandTesterFactory, diff --git a/tests/console/commands/test_build.py b/tests/console/commands/test_build.py index 65768a34e4c..3d17d030b3a 100644 --- a/tests/console/commands/test_build.py +++ b/tests/console/commands/test_build.py @@ -7,8 +7,12 @@ import pytest +from cleo.testers.application_tester import ApplicationTester + +from poetry.console.application import Application from poetry.factory import Factory from poetry.utils.helpers import remove_directory +from tests.helpers import with_working_directory if TYPE_CHECKING: @@ -60,6 +64,7 @@ def test_build_format_is_not_valid(tmp_tester: CommandTester) -> None: def test_build_creates_packages_in_dist_directory_if_no_output_is_specified( tmp_tester: CommandTester, tmp_project_path: Path, tmp_poetry: Poetry, format: str ) -> None: + shutil.rmtree(tmp_project_path / "dist") tmp_tester.execute(f"--format {format}") build_artifacts = tuple( (tmp_project_path / "dist").glob(get_package_glob(tmp_poetry)) @@ -71,6 +76,7 @@ def test_build_creates_packages_in_dist_directory_if_no_output_is_specified( def test_build_with_local_version_label( tmp_tester: CommandTester, tmp_project_path: Path, tmp_poetry: Poetry ) -> None: + shutil.rmtree(tmp_project_path / "dist") local_version_label = "local-version" tmp_tester.execute(f"--local-version {local_version_label}") build_artifacts = tuple( @@ -169,6 +175,7 @@ def test_build_output_option( tmp_poetry: Poetry, output_dir: str, ) -> None: + shutil.rmtree(tmp_project_path / "dist") if output_dir is None: tmp_tester.execute() build_dir = tmp_project_path / "dist" @@ -182,3 +189,25 @@ def test_build_output_option( build_artifacts = tuple(build_dir.glob(get_package_glob(tmp_poetry))) assert len(build_artifacts) > 0 assert all(archive.exists() for archive in build_artifacts) + + +def test_build_relative_directory_src_layout( + tmp_path: Path, fixture_dir: FixtureDirGetter +) -> None: + tmp_project_path = tmp_path / "project" + with with_working_directory(fixture_dir("simple_project"), tmp_project_path): + shutil.rmtree(tmp_project_path / "dist") + (tmp_project_path / "src").mkdir() + (tmp_project_path / "simple_project").rename( + tmp_project_path / "src" / "simple_project" + ) + + # We have to use ApplicationTester because CommandTester + # initializes Poetry before passing the directory. + app = Application() + tester = ApplicationTester(app) + tester.execute("build --directory .") + + build_dir = tmp_project_path / "dist" + + assert len(list(build_dir.iterdir())) == 2 diff --git a/tests/console/commands/test_config.py b/tests/console/commands/test_config.py index 14e74776751..737ec373474 100644 --- a/tests/console/commands/test_config.py +++ b/tests/console/commands/test_config.py @@ -56,11 +56,11 @@ def test_list_displays_default_value_if_not_set( expected = f"""cache-dir = {cache_dir} experimental.system-git-client = false installer.max-workers = null -installer.modern-installation = true installer.no-binary = null installer.only-binary = null installer.parallel = true keyring.enabled = true +requests.max-retries = 0 solver.lazy-wheel = true virtualenvs.create = true virtualenvs.in-project = null @@ -88,11 +88,11 @@ def test_list_displays_set_get_setting( expected = f"""cache-dir = {cache_dir} experimental.system-git-client = false installer.max-workers = null -installer.modern-installation = true installer.no-binary = null installer.only-binary = null installer.parallel = true keyring.enabled = true +requests.max-retries = 0 solver.lazy-wheel = true virtualenvs.create = false virtualenvs.in-project = null @@ -141,11 +141,11 @@ def test_unset_setting( expected = f"""cache-dir = {cache_dir} experimental.system-git-client = false installer.max-workers = null -installer.modern-installation = true installer.no-binary = null installer.only-binary = null installer.parallel = true keyring.enabled = true +requests.max-retries = 0 solver.lazy-wheel = true virtualenvs.create = true virtualenvs.in-project = null @@ -172,11 +172,11 @@ def test_unset_repo_setting( expected = f"""cache-dir = {cache_dir} experimental.system-git-client = false installer.max-workers = null -installer.modern-installation = true installer.no-binary = null installer.only-binary = null installer.parallel = true keyring.enabled = true +requests.max-retries = 0 solver.lazy-wheel = true virtualenvs.create = true virtualenvs.in-project = null @@ -301,11 +301,11 @@ def test_list_displays_set_get_local_setting( expected = f"""cache-dir = {cache_dir} experimental.system-git-client = false installer.max-workers = null -installer.modern-installation = true installer.no-binary = null installer.only-binary = null installer.parallel = true keyring.enabled = true +requests.max-retries = 0 solver.lazy-wheel = true virtualenvs.create = false virtualenvs.in-project = null @@ -340,12 +340,12 @@ def test_list_must_not_display_sources_from_pyproject_toml( expected = f"""cache-dir = {cache_dir} experimental.system-git-client = false installer.max-workers = null -installer.modern-installation = true installer.no-binary = null installer.only-binary = null installer.parallel = true keyring.enabled = true repositories.foo.url = "https://foo.bar/simple/" +requests.max-retries = 0 solver.lazy-wheel = true virtualenvs.create = true virtualenvs.in-project = null diff --git a/tests/console/commands/test_init.py b/tests/console/commands/test_init.py index 2f8ddbce675..80aee46e048 100644 --- a/tests/console/commands/test_init.py +++ b/tests/console/commands/test_init.py @@ -91,7 +91,7 @@ def test_noninteractive( assert tester.io.fetch_output() == expected assert tester.io.fetch_error() == "" - toml_content = (tmp_path / "pyproject.toml").read_text() + toml_content = (tmp_path / "pyproject.toml").read_text(encoding="utf-8") assert 'name = "my-package"' in toml_content assert 'pytest = "^3.6.0"' in toml_content @@ -216,7 +216,7 @@ def test_empty_license(tester: CommandTester) -> None: readme = "README.md" [tool.poetry.dependencies] -python = "^{python}" +python = ">={python}" """ assert expected in tester.io.fetch_output() @@ -853,9 +853,11 @@ def test_init_existing_pyproject_simple( [tool.black] line-length = 88 """ - pyproject_file.write_text(existing_section) + pyproject_file.write_text(existing_section, encoding="utf-8") tester.execute(inputs=init_basic_inputs) - assert f"{existing_section}\n{init_basic_toml}" in pyproject_file.read_text() + assert f"{existing_section}\n{init_basic_toml}" in pyproject_file.read_text( + encoding="utf-8" + ) @pytest.mark.parametrize("linesep", ["\n", "\r\n"]) @@ -871,10 +873,10 @@ def test_init_existing_pyproject_consistent_linesep( [tool.black] line-length = 88 """.replace("\n", linesep) - with open(pyproject_file, "w", newline="") as f: + with open(pyproject_file, "w", newline="", encoding="utf-8") as f: f.write(existing_section) tester.execute(inputs=init_basic_inputs) - with open(pyproject_file, newline="") as f: + with open(pyproject_file, newline="", encoding="utf-8") as f: content = f.read() init_basic_toml = init_basic_toml.replace("\n", linesep) assert f"{existing_section}{linesep}{init_basic_toml}" in content @@ -891,7 +893,7 @@ def test_init_non_interactive_existing_pyproject_add_dependency( [tool.black] line-length = 88 """ - pyproject_file.write_text(existing_section) + pyproject_file.write_text(existing_section, encoding="utf-8") repo.add_package(get_package("foo", "1.19.2")) @@ -915,7 +917,9 @@ def test_init_non_interactive_existing_pyproject_add_dependency( python = "^3.6" foo = "^1.19.2" """ - assert f"{existing_section}\n{expected}" in pyproject_file.read_text() + assert f"{existing_section}\n{expected}" in pyproject_file.read_text( + encoding="utf-8" + ) def test_init_existing_pyproject_with_build_system_fails( @@ -927,13 +931,13 @@ def test_init_existing_pyproject_with_build_system_fails( requires = ["setuptools >= 40.6.0", "wheel"] build-backend = "setuptools.build_meta" """ - pyproject_file.write_text(existing_section) + pyproject_file.write_text(existing_section, encoding="utf-8") tester.execute(inputs=init_basic_inputs) assert ( tester.io.fetch_error().strip() == "A pyproject.toml file with a defined build-system already exists." ) - assert existing_section in pyproject_file.read_text() + assert existing_section in pyproject_file.read_text(encoding="utf-8") @pytest.mark.parametrize( @@ -1066,10 +1070,10 @@ def mock_check_output(cmd: str, *_: Any, **__: Any) -> str: expected = f"""\ [tool.poetry.dependencies] -python = "^{python}" +python = ">={python}" """ - assert expected in pyproject_file.read_text() + assert expected in pyproject_file.read_text(encoding="utf-8") def test_get_pool(mocker: MockerFixture, source_dir: Path) -> None: diff --git a/tests/console/commands/test_new.py b/tests/console/commands/test_new.py index 3bd1da82fa7..dba738f4e8c 100644 --- a/tests/console/commands/test_new.py +++ b/tests/console/commands/test_new.py @@ -225,10 +225,10 @@ def mock_check_output(cmd: str, *_: Any, **__: Any) -> str: expected = f"""\ [tool.poetry.dependencies] -python = "^{python}" +python = ">={python}" """ - assert expected in pyproject_file.read_text() + assert expected in pyproject_file.read_text(encoding="utf-8") def test_basic_interactive_new( diff --git a/tests/console/commands/test_run.py b/tests/console/commands/test_run.py index 53c5dbbb3d3..4f07205db6e 100644 --- a/tests/console/commands/test_run.py +++ b/tests/console/commands/test_run.py @@ -1,6 +1,7 @@ from __future__ import annotations import subprocess +import sys from typing import TYPE_CHECKING @@ -47,7 +48,7 @@ def poetry_with_scripts( def test_run_passes_all_args(app_tester: ApplicationTester, env: MockEnv) -> None: app_tester.execute("run python -V") - assert [["python", "-V"]] == env.executed + assert env.executed == [["python", "-V"]] def test_run_keeps_options_passed_before_command( @@ -59,7 +60,7 @@ def test_run_keeps_options_passed_before_command( assert app_tester.io.fetch_output() == app_tester.io.remove_format( app_tester.application.long_version + "\n" ) - assert [] == env.executed + assert env.executed == [] def test_run_has_helpful_error_when_command_not_found( @@ -116,7 +117,8 @@ def test_run_console_scripts_of_editable_dependencies_on_windows( cmd_script_file = tmp_venv._bin_dir / "quix.cmd" # `/b` ensures we only exit the script instead of any cmd.exe proc that called it - cmd_script_file.write_text("exit /b 123") + encoding = "locale" if sys.version_info >= (3, 10) else None + cmd_script_file.write_text("exit /b 123", encoding=encoding) # We prove that the CMD script executed successfully by verifying the exit code # matches what we wrote in the script assert tester.execute("quix") == 123 diff --git a/tests/console/commands/test_show.py b/tests/console/commands/test_show.py index 2bda20eca7d..75bb7792349 100644 --- a/tests/console/commands/test_show.py +++ b/tests/console/commands/test_show.py @@ -295,11 +295,11 @@ def test_show_basic_with_installed_packages_single( tester.execute("cachy") - assert [ + assert [line.strip() for line in tester.io.fetch_output().splitlines()] == [ "name : cachy", "version : 0.1.0", "description : Cachy package", - ] == [line.strip() for line in tester.io.fetch_output().splitlines()] + ] def test_show_basic_with_installed_packages_single_canonicalized( @@ -337,11 +337,11 @@ def test_show_basic_with_installed_packages_single_canonicalized( tester.execute("Foo_Bar") - assert [ + assert [line.strip() for line in tester.io.fetch_output().splitlines()] == [ "name : foo-bar", "version : 0.1.0", "description : Foobar package", - ] == [line.strip() for line in tester.io.fetch_output().splitlines()] + ] def test_show_basic_with_not_installed_packages_non_decorated( @@ -2169,7 +2169,7 @@ def test_show_top_level( assert tester.io.fetch_output() == expected -def test_show_top_level_with_explicitly_defined_depenancy( +def test_show_top_level_with_explicitly_defined_dependency( tester: CommandTester, poetry: Poetry, installed: Repository ) -> None: poetry.package.add_dependency(Factory.create_dependency("a", "^0.1.0")) diff --git a/tests/console/commands/test_version.py b/tests/console/commands/test_version.py index 4772a400be1..5741cf3d9f5 100644 --- a/tests/console/commands/test_version.py +++ b/tests/console/commands/test_version.py @@ -126,9 +126,9 @@ def test_phase_version_update(tester: CommandTester) -> None: def test_dry_run(tester: CommandTester) -> None: assert isinstance(tester.command, VersionCommand) - old_pyproject = tester.command.poetry.file.path.read_text() + old_pyproject = tester.command.poetry.file.path.read_text(encoding="utf-8") tester.execute("--dry-run major") - new_pyproject = tester.command.poetry.file.path.read_text() + new_pyproject = tester.command.poetry.file.path.read_text(encoding="utf-8") assert tester.io.fetch_output() == "Bumping version from 1.2.3 to 2.0.0\n" assert old_pyproject == new_pyproject diff --git a/tests/console/test_application.py b/tests/console/test_application.py index b7d057b687c..4629d87267f 100644 --- a/tests/console/test_application.py +++ b/tests/console/test_application.py @@ -116,6 +116,12 @@ def test_application_verify_cache_flag_at_install( disable_cache: bool, set_project_context: SetProjectContext, ) -> None: + import poetry.utils.authenticator + + # Set default authenticator to None so that it is recreated for each test + # and we get a consistent call_count. + poetry.utils.authenticator._authenticator = None + with set_project_context("sample_project"): app = Application() @@ -129,8 +135,9 @@ def test_application_verify_cache_flag_at_install( tester.execute(command) - assert spy.call_count == 2 - for call in spy.mock_calls: + # The third call is the default authenticator, which ignores the cache flag. + assert spy.call_count == 3 + for call in spy.mock_calls[:2]: (name, args, kwargs) = call assert "disable_cache" in kwargs assert disable_cache is kwargs["disable_cache"] diff --git a/tests/fixtures/complete.toml b/tests/fixtures/complete.toml index ced35cb46e3..74b89b9f3df 100644 --- a/tests/fixtures/complete.toml +++ b/tests/fixtures/complete.toml @@ -32,7 +32,7 @@ pendulum = { version = "^1.4", optional = true } [tool.poetry.extras] time = [ "pendulum" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^3.0" pytest-cov = "^2.4" diff --git a/tests/fixtures/directory/project_with_transitive_directory_dependencies/pyproject.toml b/tests/fixtures/directory/project_with_transitive_directory_dependencies/pyproject.toml index 28678e0d0ae..b7ea062a09c 100644 --- a/tests/fixtures/directory/project_with_transitive_directory_dependencies/pyproject.toml +++ b/tests/fixtures/directory/project_with_transitive_directory_dependencies/pyproject.toml @@ -10,4 +10,4 @@ python = "*" project-with-extras = {path = "../../project_with_extras/"} project-with-transitive-file-dependencies = {path = "../project_with_transitive_file_dependencies/"} -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/directory/project_with_transitive_file_dependencies/inner-directory-project/pyproject.toml b/tests/fixtures/directory/project_with_transitive_file_dependencies/inner-directory-project/pyproject.toml index a80113675e6..1b9e242ddff 100644 --- a/tests/fixtures/directory/project_with_transitive_file_dependencies/inner-directory-project/pyproject.toml +++ b/tests/fixtures/directory/project_with_transitive_file_dependencies/inner-directory-project/pyproject.toml @@ -8,4 +8,4 @@ license = "MIT" [tool.poetry.dependencies] python = "*" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/directory/project_with_transitive_file_dependencies/pyproject.toml b/tests/fixtures/directory/project_with_transitive_file_dependencies/pyproject.toml index 678e42f2fa5..abd77abe171 100644 --- a/tests/fixtures/directory/project_with_transitive_file_dependencies/pyproject.toml +++ b/tests/fixtures/directory/project_with_transitive_file_dependencies/pyproject.toml @@ -10,4 +10,4 @@ python = "*" demo = {path = "../../distributions/demo-0.1.0-py2.py3-none-any.whl"} inner-directory-project = {path = "./inner-directory-project"} -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/excluded_subpackage/pyproject.toml b/tests/fixtures/excluded_subpackage/pyproject.toml index 3852bb831fa..0c6018291a5 100644 --- a/tests/fixtures/excluded_subpackage/pyproject.toml +++ b/tests/fixtures/excluded_subpackage/pyproject.toml @@ -10,7 +10,7 @@ exclude = [ [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^3.0" [build-system] diff --git a/tests/fixtures/git/github.com/demo/poetry-plugin/pyproject.toml b/tests/fixtures/git/github.com/demo/poetry-plugin/pyproject.toml index b45d9d976eb..02891e025fd 100644 --- a/tests/fixtures/git/github.com/demo/poetry-plugin/pyproject.toml +++ b/tests/fixtures/git/github.com/demo/poetry-plugin/pyproject.toml @@ -15,4 +15,4 @@ tomlkit = {version = "^0.7.0", optional = true} [tool.poetry.extras] foo = ["tomlkit"] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/git/github.com/demo/poetry-plugin2/subdir/pyproject.toml b/tests/fixtures/git/github.com/demo/poetry-plugin2/subdir/pyproject.toml index b45d9d976eb..02891e025fd 100644 --- a/tests/fixtures/git/github.com/demo/poetry-plugin2/subdir/pyproject.toml +++ b/tests/fixtures/git/github.com/demo/poetry-plugin2/subdir/pyproject.toml @@ -15,4 +15,4 @@ tomlkit = {version = "^0.7.0", optional = true} [tool.poetry.extras] foo = ["tomlkit"] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/git/github.com/demo/prerelease/pyproject.toml b/tests/fixtures/git/github.com/demo/prerelease/pyproject.toml index b06aef85184..5fa09dd6570 100644 --- a/tests/fixtures/git/github.com/demo/prerelease/pyproject.toml +++ b/tests/fixtures/git/github.com/demo/prerelease/pyproject.toml @@ -11,4 +11,4 @@ license = "MIT" [tool.poetry.dependencies] python = "~2.7 || ^3.4" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/git/github.com/demo/pyproject-demo/pyproject.toml b/tests/fixtures/git/github.com/demo/pyproject-demo/pyproject.toml index 70e9f00cb2a..8d710f3786a 100644 --- a/tests/fixtures/git/github.com/demo/pyproject-demo/pyproject.toml +++ b/tests/fixtures/git/github.com/demo/pyproject-demo/pyproject.toml @@ -12,4 +12,4 @@ license = "MIT" python = "~2.7 || ^3.4" pendulum = '^1.4' -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/incompatible_lock/pyproject.toml b/tests/fixtures/incompatible_lock/pyproject.toml index 377aa676be9..d82fbdaa1c8 100644 --- a/tests/fixtures/incompatible_lock/pyproject.toml +++ b/tests/fixtures/incompatible_lock/pyproject.toml @@ -8,7 +8,7 @@ authors = ["Poetry Developer "] python = "^3.8" sampleproject = ">=1.3.1" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/fixtures/inspection/demo/pyproject.toml b/tests/fixtures/inspection/demo/pyproject.toml index 60c7dc52156..4fd63de9f66 100644 --- a/tests/fixtures/inspection/demo/pyproject.toml +++ b/tests/fixtures/inspection/demo/pyproject.toml @@ -14,5 +14,5 @@ tomlkit = {version = "*", optional = true} foo = ["cleo"] bar = ["tomlkit"] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^3.0" diff --git a/tests/fixtures/inspection/demo_poetry_package/pyproject.toml b/tests/fixtures/inspection/demo_poetry_package/pyproject.toml index 011338ea91a..8bda2638e6f 100644 --- a/tests/fixtures/inspection/demo_poetry_package/pyproject.toml +++ b/tests/fixtures/inspection/demo_poetry_package/pyproject.toml @@ -8,7 +8,7 @@ authors = ["John Doe "] python = "^3.10" pendulum = "*" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/fixtures/inspection/demo_with_obsolete_egg_info/pyproject.toml b/tests/fixtures/inspection/demo_with_obsolete_egg_info/pyproject.toml index 60c7dc52156..4fd63de9f66 100644 --- a/tests/fixtures/inspection/demo_with_obsolete_egg_info/pyproject.toml +++ b/tests/fixtures/inspection/demo_with_obsolete_egg_info/pyproject.toml @@ -14,5 +14,5 @@ tomlkit = {version = "*", optional = true} foo = ["cleo"] bar = ["tomlkit"] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^3.0" diff --git a/tests/fixtures/invalid_lock/pyproject.toml b/tests/fixtures/invalid_lock/pyproject.toml index 377aa676be9..d82fbdaa1c8 100644 --- a/tests/fixtures/invalid_lock/pyproject.toml +++ b/tests/fixtures/invalid_lock/pyproject.toml @@ -8,7 +8,7 @@ authors = ["Poetry Developer "] python = "^3.8" sampleproject = ">=1.3.1" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/fixtures/missing_directory_dependency/pyproject.toml b/tests/fixtures/missing_directory_dependency/pyproject.toml index 570ca5debc3..bf10934e9ea 100644 --- a/tests/fixtures/missing_directory_dependency/pyproject.toml +++ b/tests/fixtures/missing_directory_dependency/pyproject.toml @@ -9,5 +9,5 @@ packages = [] [tool.poetry.dependencies] python = "*" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] missing = { path = "./missing" } diff --git a/tests/fixtures/missing_file_dependency/pyproject.toml b/tests/fixtures/missing_file_dependency/pyproject.toml index 0be727e2104..44e93caa623 100644 --- a/tests/fixtures/missing_file_dependency/pyproject.toml +++ b/tests/fixtures/missing_file_dependency/pyproject.toml @@ -9,5 +9,5 @@ packages = [] [tool.poetry.dependencies] python = "*" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] missing = { file = "missing-0.1.0-py2.py3-none-any.whl" } diff --git a/tests/fixtures/old_lock/pyproject.toml b/tests/fixtures/old_lock/pyproject.toml index 377aa676be9..d82fbdaa1c8 100644 --- a/tests/fixtures/old_lock/pyproject.toml +++ b/tests/fixtures/old_lock/pyproject.toml @@ -8,7 +8,7 @@ authors = ["Poetry Developer "] python = "^3.8" sampleproject = ">=1.3.1" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/fixtures/old_lock_path_dependency/pyproject.toml b/tests/fixtures/old_lock_path_dependency/pyproject.toml index 00547cfee26..204f8efb24b 100644 --- a/tests/fixtures/old_lock_path_dependency/pyproject.toml +++ b/tests/fixtures/old_lock_path_dependency/pyproject.toml @@ -8,7 +8,7 @@ authors = ["Poetry Developer "] python = "^3.8" quix = { path = "./quix", develop = true} -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/fixtures/outdated_lock/pyproject.toml b/tests/fixtures/outdated_lock/pyproject.toml index 555147605ea..257fbe6ea74 100644 --- a/tests/fixtures/outdated_lock/pyproject.toml +++ b/tests/fixtures/outdated_lock/pyproject.toml @@ -8,7 +8,7 @@ authors = ["Poetry Developer "] python = "^3.8" docker = "4.3.1" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/fixtures/project_with_extras/pyproject.toml b/tests/fixtures/project_with_extras/pyproject.toml index e2ad7619069..230ab85dae9 100644 --- a/tests/fixtures/project_with_extras/pyproject.toml +++ b/tests/fixtures/project_with_extras/pyproject.toml @@ -13,5 +13,3 @@ cachy = { version = ">=0.2.0", optional = true } [tool.poetry.extras] extras_a = [ "pendulum" ] extras_b = [ "cachy" ] - -[tool.poetry.dev-dependencies] diff --git a/tests/fixtures/project_with_git_dev_dependency/pyproject.toml b/tests/fixtures/project_with_git_dev_dependency/pyproject.toml index 57009d822fd..dfee015fe6b 100644 --- a/tests/fixtures/project_with_git_dev_dependency/pyproject.toml +++ b/tests/fixtures/project_with_git_dev_dependency/pyproject.toml @@ -24,7 +24,7 @@ python = "~2.7 || ^3.4" cachy = "^0.1.0" pendulum = "^2.0.0" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" demo = { git = "https://github.com/demo/demo.git", rev = "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24" } diff --git a/tests/fixtures/project_with_multi_constraints_dependency/pyproject.toml b/tests/fixtures/project_with_multi_constraints_dependency/pyproject.toml index 69462a6ab44..4d609342caf 100644 --- a/tests/fixtures/project_with_multi_constraints_dependency/pyproject.toml +++ b/tests/fixtures/project_with_multi_constraints_dependency/pyproject.toml @@ -16,4 +16,4 @@ pendulum = [ { version = "^2.0", python = "^3.4" } ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] diff --git a/tests/fixtures/up_to_date_lock/poetry.lock b/tests/fixtures/up_to_date_lock/poetry.lock index 4155300cea5..ad184f3353c 100644 --- a/tests/fixtures/up_to_date_lock/poetry.lock +++ b/tests/fixtures/up_to_date_lock/poetry.lock @@ -140,4 +140,4 @@ six = "*" [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "67c4543fd4f299cfeeaf82c5846ce720aa576e49811fbf9ccd0463ac8d5b52e4" +content-hash = "ff2489c48d3c858a11c1ce7463ae5dc1524d9d457826c1bf16fd687a7bc1e819" diff --git a/tests/fixtures/up_to_date_lock/pyproject.toml b/tests/fixtures/up_to_date_lock/pyproject.toml index dd388ab9d00..adaafb9481a 100644 --- a/tests/fixtures/up_to_date_lock/pyproject.toml +++ b/tests/fixtures/up_to_date_lock/pyproject.toml @@ -8,7 +8,7 @@ authors = ["Poetry Developer "] python = "^3.8" docker = ">=4.3.1" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/fixtures/with-include/pyproject.toml b/tests/fixtures/with-include/pyproject.toml index 07f5f4cf24c..25ec2764d77 100644 --- a/tests/fixtures/with-include/pyproject.toml +++ b/tests/fixtures/with-include/pyproject.toml @@ -44,7 +44,7 @@ cachy = { version = "^0.2.0", extras = ["msgpack"] } pendulum = { version = "^1.4", optional = true } -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" [tool.poetry.extras] diff --git a/tests/fixtures/with_default_source/pyproject.toml b/tests/fixtures/with_default_source/pyproject.toml index ccda6306bd5..bc0c4ac42b1 100644 --- a/tests/fixtures/with_default_source/pyproject.toml +++ b/tests/fixtures/with_default_source/pyproject.toml @@ -43,7 +43,7 @@ simple-project = { path = "../simple_project/" } [tool.poetry.extras] db = [ "orator" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/fixtures/with_default_source_and_pypi/pyproject.toml b/tests/fixtures/with_default_source_and_pypi/pyproject.toml index eb949e6b607..cf7ec689a8f 100644 --- a/tests/fixtures/with_default_source_and_pypi/pyproject.toml +++ b/tests/fixtures/with_default_source_and_pypi/pyproject.toml @@ -43,7 +43,7 @@ simple-project = { path = "../simple_project/" } [tool.poetry.extras] db = [ "orator" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/fixtures/with_default_source_legacy/pyproject.toml b/tests/fixtures/with_default_source_legacy/pyproject.toml index ca27c0ce032..b30cc53bda6 100644 --- a/tests/fixtures/with_default_source_legacy/pyproject.toml +++ b/tests/fixtures/with_default_source_legacy/pyproject.toml @@ -43,7 +43,7 @@ simple-project = { path = "../simple_project/" } [tool.poetry.extras] db = [ "orator" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/fixtures/with_default_source_pypi/pyproject.toml b/tests/fixtures/with_default_source_pypi/pyproject.toml index 84fba4d7d26..c3fcb9380a6 100644 --- a/tests/fixtures/with_default_source_pypi/pyproject.toml +++ b/tests/fixtures/with_default_source_pypi/pyproject.toml @@ -43,7 +43,7 @@ simple-project = { path = "../simple_project/" } [tool.poetry.extras] db = [ "orator" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/fixtures/with_explicit_pypi_and_other/pyproject.toml b/tests/fixtures/with_explicit_pypi_and_other/pyproject.toml index ae588647a56..8605f8ec252 100644 --- a/tests/fixtures/with_explicit_pypi_and_other/pyproject.toml +++ b/tests/fixtures/with_explicit_pypi_and_other/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_explicit_pypi_and_other_explicit/pyproject.toml b/tests/fixtures/with_explicit_pypi_and_other_explicit/pyproject.toml index d7666f8836d..86747b64925 100644 --- a/tests/fixtures/with_explicit_pypi_and_other_explicit/pyproject.toml +++ b/tests/fixtures/with_explicit_pypi_and_other_explicit/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "explicit" diff --git a/tests/fixtures/with_explicit_pypi_no_other/pyproject.toml b/tests/fixtures/with_explicit_pypi_no_other/pyproject.toml index 19b38da7904..fed7d4a861e 100644 --- a/tests/fixtures/with_explicit_pypi_no_other/pyproject.toml +++ b/tests/fixtures/with_explicit_pypi_no_other/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "PyPI" diff --git a/tests/fixtures/with_explicit_source/pyproject.toml b/tests/fixtures/with_explicit_source/pyproject.toml index c1fde4fffdc..1cdbf537727 100644 --- a/tests/fixtures/with_explicit_source/pyproject.toml +++ b/tests/fixtures/with_explicit_source/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "explicit" diff --git a/tests/fixtures/with_local_config/pyproject.toml b/tests/fixtures/with_local_config/pyproject.toml index 4b814556799..0feb2bcaf00 100644 --- a/tests/fixtures/with_local_config/pyproject.toml +++ b/tests/fixtures/with_local_config/pyproject.toml @@ -43,7 +43,7 @@ simple-project = { path = "../simple_project/" } [tool.poetry.extras] db = [ "orator" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/fixtures/with_non_default_multiple_secondary_sources/pyproject.toml b/tests/fixtures/with_non_default_multiple_secondary_sources/pyproject.toml index 1ee7df9444e..517c37cc176 100644 --- a/tests/fixtures/with_non_default_multiple_secondary_sources/pyproject.toml +++ b/tests/fixtures/with_non_default_multiple_secondary_sources/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_multiple_secondary_sources_legacy/pyproject.toml b/tests/fixtures/with_non_default_multiple_secondary_sources_legacy/pyproject.toml index 35bcfd58126..366db7461a8 100644 --- a/tests/fixtures/with_non_default_multiple_secondary_sources_legacy/pyproject.toml +++ b/tests/fixtures/with_non_default_multiple_secondary_sources_legacy/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_multiple_sources/pyproject.toml b/tests/fixtures/with_non_default_multiple_sources/pyproject.toml index f83aeda2da4..b3063e47827 100644 --- a/tests/fixtures/with_non_default_multiple_sources/pyproject.toml +++ b/tests/fixtures/with_non_default_multiple_sources/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_multiple_sources_legacy/pyproject.toml b/tests/fixtures/with_non_default_multiple_sources_legacy/pyproject.toml index e2da526ef39..61f8e9bc59d 100644 --- a/tests/fixtures/with_non_default_multiple_sources_legacy/pyproject.toml +++ b/tests/fixtures/with_non_default_multiple_sources_legacy/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_multiple_sources_pypi/pyproject.toml b/tests/fixtures/with_non_default_multiple_sources_pypi/pyproject.toml index 66db604c4f1..9e71ff764c8 100644 --- a/tests/fixtures/with_non_default_multiple_sources_pypi/pyproject.toml +++ b/tests/fixtures/with_non_default_multiple_sources_pypi/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_secondary_source/pyproject.toml b/tests/fixtures/with_non_default_secondary_source/pyproject.toml index 8dbca2435b7..7a8004cac32 100644 --- a/tests/fixtures/with_non_default_secondary_source/pyproject.toml +++ b/tests/fixtures/with_non_default_secondary_source/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_secondary_source_legacy/pyproject.toml b/tests/fixtures/with_non_default_secondary_source_legacy/pyproject.toml index 2e997cefec7..980d78eecc9 100644 --- a/tests/fixtures/with_non_default_secondary_source_legacy/pyproject.toml +++ b/tests/fixtures/with_non_default_secondary_source_legacy/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_source_explicit/pyproject.toml b/tests/fixtures/with_non_default_source_explicit/pyproject.toml index 3a83099313b..3d6b43c9ca5 100644 --- a/tests/fixtures/with_non_default_source_explicit/pyproject.toml +++ b/tests/fixtures/with_non_default_source_explicit/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_non_default_source_implicit/pyproject.toml b/tests/fixtures/with_non_default_source_implicit/pyproject.toml index 73f95041e67..e341a006a89 100644 --- a/tests/fixtures/with_non_default_source_implicit/pyproject.toml +++ b/tests/fixtures/with_non_default_source_implicit/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "foo" diff --git a/tests/fixtures/with_supplemental_source/pyproject.toml b/tests/fixtures/with_supplemental_source/pyproject.toml index 00ae71beb1a..339de55c5e0 100644 --- a/tests/fixtures/with_supplemental_source/pyproject.toml +++ b/tests/fixtures/with_supplemental_source/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] [[tool.poetry.source]] name = "supplemental" diff --git a/tests/fixtures/with_two_default_sources/pyproject.toml b/tests/fixtures/with_two_default_sources/pyproject.toml index d7f5b258ae4..6f05f22eba1 100644 --- a/tests/fixtures/with_two_default_sources/pyproject.toml +++ b/tests/fixtures/with_two_default_sources/pyproject.toml @@ -43,7 +43,7 @@ simple-project = { path = "../simple_project/" } [tool.poetry.extras] db = [ "orator" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/fixtures/with_two_default_sources_legacy/pyproject.toml b/tests/fixtures/with_two_default_sources_legacy/pyproject.toml index ffbb22fc70a..0de036eb8c8 100644 --- a/tests/fixtures/with_two_default_sources_legacy/pyproject.toml +++ b/tests/fixtures/with_two_default_sources_legacy/pyproject.toml @@ -43,7 +43,7 @@ simple-project = { path = "../simple_project/" } [tool.poetry.extras] db = [ "orator" ] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/helpers.py b/tests/helpers.py index bf15904e979..431b52c5df9 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -333,16 +333,13 @@ def switch_working_directory(path: Path, remove: bool = False) -> Iterator[Path] original_cwd = Path.cwd() os.chdir(path) - with contextlib.suppress(Exception) as exception: + try: yield path + finally: + os.chdir(original_cwd) - os.chdir(original_cwd) - - if remove: - shutil.rmtree(path, ignore_errors=True) - - if exception is not None: - raise exception + if remove: + shutil.rmtree(path, ignore_errors=True) @contextlib.contextmanager diff --git a/tests/inspection/test_info.py b/tests/inspection/test_info.py index 704eeba7a21..d0e4ac14dec 100644 --- a/tests/inspection/test_info.py +++ b/tests/inspection/test_info.py @@ -12,6 +12,7 @@ from build import BuildBackendException from build import ProjectBuilder from packaging.metadata import parse_email +from pkginfo.distribution import NewMetadataVersion from poetry.inspection.info import PackageInfo from poetry.inspection.info import PackageInfoError @@ -59,7 +60,8 @@ def demo_setup(source_dir: Path) -> Path: "from setuptools import setup; " 'setup(name="demo", ' 'version="0.1.0", ' - 'install_requires=["package"])' + 'install_requires=["package"])', + encoding="utf-8", ) return source_dir @@ -76,7 +78,8 @@ def demo_setup_cfg(source_dir: Path) -> Path: "[options]", "install_requires = package", ] - ) + ), + encoding="utf-8", ) return source_dir @@ -88,7 +91,8 @@ def demo_setup_complex(source_dir: Path) -> Path: "from setuptools import setup; " 'setup(name="demo", ' 'version="0.1.0", ' - 'install_requires=[i for i in ["package"]])' + 'install_requires=[i for i in ["package"]])', + encoding="utf-8", ) return source_dir @@ -96,7 +100,9 @@ def demo_setup_complex(source_dir: Path) -> Path: @pytest.fixture def demo_setup_complex_pep517_legacy(demo_setup_complex: Path) -> Path: pyproject_toml = demo_setup_complex / "pyproject.toml" - pyproject_toml.write_text('[build-system]\nrequires = ["setuptools", "wheel"]') + pyproject_toml.write_text( + '[build-system]\nrequires = ["setuptools", "wheel"]', encoding="utf-8" + ) return demo_setup_complex @@ -114,7 +120,8 @@ def demo_setup_complex_calls_script( [build-system] requires = ["setuptools", "scripts @ {scripts_dir.as_uri()}"] build-backend = "setuptools.build_meta:__legacy__" -""" +""", + encoding="utf-8", ) setup_py = source_dir / "setup.py" @@ -125,7 +132,8 @@ def demo_setup_complex_calls_script( if subprocess.call(["exit-code"]) != 42: raise RuntimeError("Wrong exit code.") setup(name="demo", version="0.1.0", install_requires=[i for i in ["package"]]) -""" +""", + encoding="utf-8", ) return source_dir @@ -212,7 +220,7 @@ def test_info_from_wheel_metadata_version_unknown( / "demo_metadata_version_unknown-0.1.0-py2.py3-none-any.whl" ) - with pytest.raises(PackageInfoError) as e: + with pytest.warns(NewMetadataVersion), pytest.raises(PackageInfoError) as e: PackageInfo.from_wheel(path) assert "Unknown metadata version: 999.3" in str(e.value) @@ -358,7 +366,7 @@ def test_info_setup_missing_mandatory_should_trigger_pep517( setup += ")" setup_py = source_dir / "setup.py" - setup_py.write_text(setup) + setup_py.write_text(setup, encoding="utf-8") spy = mocker.spy(ProjectBuilder, "from_isolated_env") _ = PackageInfo.from_directory(source_dir) diff --git a/tests/installation/fixtures/old-lock.test b/tests/installation/fixtures/old-lock.test deleted file mode 100644 index c6b13e72f81..00000000000 --- a/tests/installation/fixtures/old-lock.test +++ /dev/null @@ -1,112 +0,0 @@ -[[package]] -name = "attrs" -version = "17.4.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = "*" - -[package.extras] -dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface", "sphinx", "zope.interface"] -docs = ["sphinx", "zope.interface"] -tests = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface"] - -[[package]] -name = "colorama" -version = "0.3.9" -description = "Cross-platform colored terminal text." -marker = "sys_platform == \"win32\"" -optional = false -python-versions = "*" - -[[package]] -name = "funcsigs" -version = "1.0.2" -description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" -marker = "python_version < \"3.0\"" -optional = false -python-versions = "*" - -[[package]] -name = "more-itertools" -version = "4.1.0" -description = "More routines for operating on iterables, beyond itertools" -optional = false -python-versions = "*" - -[package.dependencies] -six = ">=1.0.0,<2.0.0" - -[[package]] -name = "pluggy" -version = "0.6.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "py" -version = "1.5.3" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pytest" -version = "3.5.0" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -py = ">=1.5.0" -six = ">=1.10.0" -attrs = ">=17.4.0" -more-itertools = ">=4.0.0" -pluggy = ">=0.5,<0.7" -funcsigs = {"version" = "*", "python" = "<3.0"} -colorama = "*" - -[[package]] -name = "six" -version = "1.11.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = "*" - -[metadata] -python-versions = "*" -content-hash = "123456789" - -[metadata.files] -attrs = [ - {file = "attrs-17.4.0-py2.py3-none-any.whl", hash = "sha256:d38e57f381e891928357c68e300d28d3d4dcddc50486d5f8dfaf743d40477619"}, - {file = "attrs-17.4.0.tar.gz", hash = "sha256:eb7536a1e6928190b3008c5b350bdf9850d619fff212341cd096f87a27a5e564"}, -] -colorama = [ - {file = "colorama-0.3.9-py2.py3-none-any.whl", hash = "sha256:5b632359f1ed2b7676a869812ba0edaacb99be04679b29eb56c07a5e137ab5a2"}, - {file = "colorama-0.3.9.tar.gz", hash = "sha256:4c5a15209723ce1330a5c193465fe221098f761e9640d823a2ce7c03f983137f"}, -] -funcsigs = [ - {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:510ab97424949e726b4b44294018e90142c9aadf8e737cf3a125b4cffed42e79"}, - {file = "funcsigs-1.0.2.tar.gz", hash = "sha256:c55716fcd1228645c214b44568d1fb9af2e28668a9c58e72a17a89a75d24ecd6"}, -] -more-itertools = [ - {file = "more-itertools-4.1.0.tar.gz", hash = "sha256:bab2dc6f4be8f9a4a72177842c5283e2dff57c167439a03e3d8d901e854f0f2e"}, - {file = "more_itertools-4.1.0-py2-none-any.whl", hash = "sha256:5dd7dfd88d2fdaea446da478ffef8d7151fdf26ee92ac7ed7b14e8d71efe4b62"}, - {file = "more_itertools-4.1.0-py3-none-any.whl", hash = "sha256:29b1e1661aaa56875ce090fa219fa84dfc13daecb52cd4fae321f6f57b419ec4"}, -] -pluggy = [ - {file = "pluggy-0.6.0.tar.gz", hash = "sha256:a982e208d054867661d27c6d2a86b17ba05fbb6b1bdc01f42660732dd107f865"}, -] -py = [ - {file = "py-1.5.3-py2.py3-none-any.whl", hash = "sha256:43ee6c7f95e0ec6a906de49906b79d138d89728fff17109d49f086abc2fdd985"}, - {file = "py-1.5.3.tar.gz", hash = "sha256:2df2c513c3af11de15f58189ba5539ddc4768c6f33816dc5c03950c8bd6180fa"}, -] -pytest = [ - {file = "pytest-3.5.0-py2.py3-none-any.whl", hash = "sha256:28e4d9c2ae3196d74805c2eba24f350ae4c791a5b9b397c79b41506a48dc64ca"}, - {file = "pytest-3.5.0.tar.gz", hash = "sha256:677b1d6decd29c041fe64276f29f79fbe66e40c59e445eb251366b4a8ab8bf68"}, -] -six = [ - {file = "six-1.11.0-py2.py3-none-any.whl", hash = "sha256:112f5b46e6aa106db3e4e2494a03694c938f41c4c4535edbdfc816c2e0cb50f2"}, - {file = "six-1.11.0.tar.gz", hash = "sha256:268a4ccb159c1a2d2c79336b02e75058387b0cdbb4cea2f07846a758f48a356d"}, -] diff --git a/tests/installation/test_executor.py b/tests/installation/test_executor.py index e755a03e369..b54bcdaf022 100644 --- a/tests/installation/test_executor.py +++ b/tests/installation/test_executor.py @@ -1151,70 +1151,6 @@ def test_executor_should_be_initialized_with_correct_workers( assert executor._max_workers == expected_workers -def test_executor_fallback_on_poetry_create_error_without_wheel_installer( - mocker: MockerFixture, - config: Config, - pool: RepositoryPool, - io: BufferedIO, - tmp_path: Path, - env: MockEnv, - fixture_dir: FixtureDirGetter, -) -> None: - mock_pip_install = mocker.patch("poetry.installation.executor.pip_install") - mock_sdist_builder = mocker.patch("poetry.core.masonry.builders.sdist.SdistBuilder") - mock_editable_builder = mocker.patch( - "poetry.masonry.builders.editable.EditableBuilder" - ) - mock_create_poetry = mocker.patch( - "poetry.factory.Factory.create_poetry", side_effect=RuntimeError - ) - - config.merge( - { - "cache-dir": str(tmp_path), - "installer": {"modern-installation": False}, - } - ) - - executor = Executor(env, pool, config, io) - warning_lines = io.fetch_output().splitlines() - assert warning_lines == [ - "Warning: Setting `installer.modern-installation` to `false` is deprecated.", - "The pip-based installer will be removed in a future release.", - "See https://github.com/python-poetry/poetry/issues/8987.", - ] - - directory_package = Package( - "simple-project", - "1.2.3", - source_type="directory", - source_url=fixture_dir("simple_project").resolve().as_posix(), - ) - - return_code = executor.execute( - [ - Install(directory_package), - ] - ) - - expected = f""" -Package operations: 1 install, 0 updates, 0 removals - - - Installing simple-project (1.2.3 {directory_package.source_url}) -""" - - expected_lines = set(expected.splitlines()) - output_lines = set(io.fetch_output().splitlines()) - assert output_lines == expected_lines - assert return_code == 0 - assert mock_create_poetry.call_count == 1 - assert mock_sdist_builder.call_count == 0 - assert mock_editable_builder.call_count == 0 - assert mock_pip_install.call_count == 1 - assert mock_pip_install.call_args[1].get("upgrade") is True - assert mock_pip_install.call_args[1].get("editable") is False - - @pytest.mark.parametrize("failing_method", ["build", "get_requires_for_build"]) @pytest.mark.parametrize( "exception", diff --git a/tests/installation/test_installer.py b/tests/installation/test_installer.py index dd384e10217..681e882b19c 100644 --- a/tests/installation/test_installer.py +++ b/tests/installation/test_installer.py @@ -1089,7 +1089,7 @@ def test_run_installs_extras_with_deps_if_requested( expected_installations_count = 0 if is_installed else 2 # We only want to uninstall extras if we do a "poetry install" without extras, # not if we do a "poetry update" or "poetry add". - expected_removals_count = 2 if is_installed and is_locked else 0 + expected_removals_count = 2 if is_installed else 0 assert installer.executor.installations_count == expected_installations_count assert installer.executor.removals_count == expected_removals_count @@ -2234,80 +2234,6 @@ def test_installer_uses_prereleases_if_they_are_compatible( assert installer.executor.installations_count == 2 -def test_installer_can_handle_old_lock_files( - locker: Locker, - package: ProjectPackage, - repo: Repository, - installed: CustomInstalledRepository, - config: Config, - pypi_repository: PyPiRepository, -) -> None: - pool = RepositoryPool() - pool.add_repository(pypi_repository) - - package.add_dependency(Factory.create_dependency("pytest", "^3.5", groups=["dev"])) - - locker.locked() - locker.mock_lock_data(fixture("old-lock")) - - installer = Installer( - NullIO(), - MockEnv(), - package, - locker, - pool, - config, - installed=installed, - executor=Executor(MockEnv(), pool, config, NullIO()), - ) - result = installer.run() - assert result == 0 - - assert installer.executor.installations_count == 6 - - installer = Installer( - NullIO(), - MockEnv(version_info=(2, 7, 18)), - package, - locker, - pool, - config, - installed=installed, - executor=Executor( - MockEnv(version_info=(2, 7, 18)), - pool, - config, - NullIO(), - ), - ) - result = installer.run() - assert result == 0 - - # funcsigs will be added - assert installer.executor.installations_count == 7 - - installer = Installer( - NullIO(), - MockEnv(version_info=(2, 7, 18), platform="win32"), - package, - locker, - pool, - config, - installed=installed, - executor=Executor( - MockEnv(version_info=(2, 7, 18), platform="win32"), - pool, - config, - NullIO(), - ), - ) - result = installer.run() - assert result == 0 - - # colorama will be added - assert installer.executor.installations_count == 8 - - def test_installer_does_not_write_lock_file_when_installation_fails( installer: Installer, locker: Locker, diff --git a/tests/installation/test_wheel_installer.py b/tests/installation/test_wheel_installer.py index b7b3d7c7c93..f74166fdb8c 100644 --- a/tests/installation/test_wheel_installer.py +++ b/tests/installation/test_wheel_installer.py @@ -54,7 +54,7 @@ def test_default_installation_dist_info_dir_content(default_installation: Path) def test_installer_file_contains_valid_version(default_installation: Path) -> None: installer_file = default_installation / "demo-0.1.0.dist-info" / "INSTALLER" - with open(installer_file) as f: + with open(installer_file, encoding="utf-8") as f: installer_content = f.read() match = re.match(r"Poetry (?P.*)", installer_content) assert match diff --git a/tests/masonry/builders/fixtures/excluded_subpackage/pyproject.toml b/tests/masonry/builders/fixtures/excluded_subpackage/pyproject.toml index 3852bb831fa..0c6018291a5 100644 --- a/tests/masonry/builders/fixtures/excluded_subpackage/pyproject.toml +++ b/tests/masonry/builders/fixtures/excluded_subpackage/pyproject.toml @@ -10,7 +10,7 @@ exclude = [ [tool.poetry.dependencies] python = "^3.6" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^3.0" [build-system] diff --git a/tests/masonry/builders/test_editable_builder.py b/tests/masonry/builders/test_editable_builder.py index 1240201df59..a99459ff822 100644 --- a/tests/masonry/builders/test_editable_builder.py +++ b/tests/masonry/builders/test_editable_builder.py @@ -2,7 +2,6 @@ import csv import json -import locale import os import shutil @@ -21,6 +20,7 @@ from poetry.factory import Factory from poetry.masonry.builders.editable import EditableBuilder from poetry.repositories.installed_repository import InstalledRepository +from poetry.utils._compat import getencoding from poetry.utils.env import EnvCommandError from poetry.utils.env import EnvManager from poetry.utils.env import MockEnv @@ -30,9 +30,9 @@ if TYPE_CHECKING: from pytest_mock import MockerFixture - from tests.types import FixtureDirGetter from poetry.poetry import Poetry + from tests.types import FixtureDirGetter @pytest.fixture() @@ -120,7 +120,9 @@ def test_builder_installs_proper_files_for_standard_packages( assert tmp_venv.site_packages.exists(pth_file) assert ( simple_poetry.file.path.parent.resolve().as_posix() - == tmp_venv.site_packages.find(pth_file)[0].read_text().strip(os.linesep) + == tmp_venv.site_packages.find(pth_file)[0] + .read_text(encoding="utf-8") + .strip(os.linesep) ) dist_info = Path("simple_project-1.2.3.dist-info") @@ -139,12 +141,12 @@ def test_builder_installs_proper_files_for_standard_packages( "dir_info": {"editable": True}, "url": simple_poetry.file.path.parent.as_uri(), }, - json.loads(dist_info.joinpath("direct_url.json").read_text()), + json.loads(dist_info.joinpath("direct_url.json").read_text(encoding="utf-8")), ) - assert dist_info.joinpath("INSTALLER").read_text() == "poetry" + assert dist_info.joinpath("INSTALLER").read_text(encoding="utf-8") == "poetry" assert ( - dist_info.joinpath("entry_points.txt").read_text() + dist_info.joinpath("entry_points.txt").read_text(encoding="utf-8") == "[console_scripts]\nbaz=bar:baz.boom.bim\nfoo=foo:bar\n" "fox=fuz.foo:bar.baz\n\n" ) @@ -207,7 +209,7 @@ def test_builder_installs_proper_files_for_standard_packages( sys.exit(baz.boom.bim()) """ - assert baz_script == tmp_venv._bin_dir.joinpath("baz").read_text() + assert baz_script == tmp_venv._bin_dir.joinpath("baz").read_text(encoding="utf-8") foo_script = f"""\ #!{tmp_venv.python} @@ -218,7 +220,7 @@ def test_builder_installs_proper_files_for_standard_packages( sys.exit(bar()) """ - assert foo_script == tmp_venv._bin_dir.joinpath("foo").read_text() + assert foo_script == tmp_venv._bin_dir.joinpath("foo").read_text(encoding="utf-8") fox_script = f"""\ #!{tmp_venv.python} @@ -229,7 +231,7 @@ def test_builder_installs_proper_files_for_standard_packages( sys.exit(bar.baz()) """ - assert fox_script == tmp_venv._bin_dir.joinpath("fox").read_text() + assert fox_script == tmp_venv._bin_dir.joinpath("fox").read_text(encoding="utf-8") def test_builder_falls_back_on_setup_and_pip_for_packages_with_build_scripts( @@ -243,7 +245,7 @@ def test_builder_falls_back_on_setup_and_pip_for_packages_with_build_scripts( pip_install.assert_called_once_with( extended_poetry.pyproject.file.path.parent, env, upgrade=True, editable=True ) - assert [] == env.executed + assert env.executed == [] @pytest.mark.network @@ -297,7 +299,7 @@ def test_builder_installs_proper_files_when_packages_configured( pth_file = tmp_venv.site_packages.find(pth_file)[0] paths = set() - with pth_file.open(encoding=locale.getpreferredencoding()) as f: + with pth_file.open(encoding=getencoding()) as f: for line in f.readlines(): line = line.strip(os.linesep) if line: diff --git a/tests/packages/test_locker.py b/tests/packages/test_locker.py index dcf1122b190..0c3203b0b1d 100644 --- a/tests/packages/test_locker.py +++ b/tests/packages/test_locker.py @@ -745,6 +745,24 @@ def test_locker_should_raise_an_error_if_lock_version_is_newer_and_not_allowed( _ = locker.lock_data +def test_locker_should_raise_an_error_if_no_lock_version( + locker: Locker, caplog: LogCaptureFixture +) -> None: + """Lock file prior Poetry 1.1 have no lock file version.""" + content = """\ +[metadata] +python-versions = "~2.7 || ^3.4" +content-hash = "c3d07fca33fba542ef2b2a4d75bf5b48d892d21a830e2ad9c952ba5123a52f77" +""" + caplog.set_level(logging.WARNING, logger="poetry.packages.locker") + + with open(locker.lock, "w", encoding="utf-8") as f: + f.write(content) + + with pytest.raises(RuntimeError, match="^The lock file is not compatible"): + _ = locker.lock_data + + def test_root_extras_dependencies_are_ordered( locker: Locker, root: ProjectPackage, fixture_base: Path ) -> None: @@ -1213,3 +1231,20 @@ def test_lockfile_is_not_rewritten_if_only_poetry_version_changed( content = f.read() assert content == old_content + + +def test_lockfile_keep_eol(locker: Locker, root: ProjectPackage) -> None: + sep = "\n" if os.linesep == "\r\n" else "\r\n" + + with open(locker.lock, "wb") as f: + f.write((sep * 10).encode()) + + assert locker.set_lock_data(root, [Package("test", version="0.0.1")]) + + with locker.lock.open(encoding="utf-8", newline="") as f: + line, *_ = f.read().splitlines(keepends=True) + + if sep == "\r\n": + assert line.endswith("\r\n") + else: + assert not line.endswith("\r\n") diff --git a/tests/publishing/test_publisher.py b/tests/publishing/test_publisher.py index 3a773d05b10..a68885e9a91 100644 --- a/tests/publishing/test_publisher.py +++ b/tests/publishing/test_publisher.py @@ -36,11 +36,11 @@ def test_publish_publishes_to_pypi_by_default( publisher.publish(None, None, None) - assert [("foo", "bar")] == uploader_auth.call_args - assert [ + assert uploader_auth.call_args == [("foo", "bar")] + assert uploader_upload.call_args == [ ("https://upload.pypi.org/legacy/",), {"cert": True, "client_cert": None, "dry_run": False, "skip_existing": False}, - ] == uploader_upload.call_args + ] @pytest.mark.parametrize("fixture_name", ["sample_project", "with_default_source"]) @@ -68,11 +68,11 @@ def test_publish_can_publish_to_given_repository( publisher.publish("foo", None, None) - assert [("foo", "bar")] == uploader_auth.call_args - assert [ + assert uploader_auth.call_args == [("foo", "bar")] + assert uploader_upload.call_args == [ ("http://foo.bar",), {"cert": True, "client_cert": None, "dry_run": False, "skip_existing": False}, - ] == uploader_upload.call_args + ] project_name = canonicalize_name(fixture_name) assert f"Publishing {project_name} (1.2.3) to foo" in io.fetch_output() @@ -104,11 +104,11 @@ def assert_publish_uses_token_if_it_exists( publisher = Publisher(poetry, NullIO()) publisher.publish(None, None, None) - assert [("__token__", "my-token")] == uploader_auth.call_args - assert [ + assert uploader_auth.call_args == [("__token__", "my-token")] + assert uploader_upload.call_args == [ ("https://upload.pypi.org/legacy/",), {"cert": True, "client_cert": None, "dry_run": False, "skip_existing": False}, - ] == uploader_upload.call_args + ] def test_publish_uses_token_if_it_exists( @@ -144,8 +144,8 @@ def test_publish_uses_cert( publisher.publish("foo", None, None) - assert [("foo", "bar")] == uploader_auth.call_args - assert [ + assert uploader_auth.call_args == [("foo", "bar")] + assert uploader_upload.call_args == [ ("https://foo.bar",), { "cert": Path(cert), @@ -153,7 +153,7 @@ def test_publish_uses_cert( "dry_run": False, "skip_existing": False, }, - ] == uploader_upload.call_args + ] def test_publish_uses_client_cert( @@ -173,7 +173,7 @@ def test_publish_uses_client_cert( publisher.publish("foo", None, None) - assert [ + assert uploader_upload.call_args == [ ("https://foo.bar",), { "cert": True, @@ -181,7 +181,7 @@ def test_publish_uses_client_cert( "dry_run": False, "skip_existing": False, }, - ] == uploader_upload.call_args + ] def test_publish_read_from_environment_variable( @@ -200,8 +200,8 @@ def test_publish_read_from_environment_variable( publisher.publish("foo", None, None) - assert [("bar", "baz")] == uploader_auth.call_args - assert [ + assert uploader_auth.call_args == [("bar", "baz")] + assert uploader_upload.call_args == [ ("https://foo.bar",), {"cert": True, "client_cert": None, "dry_run": False, "skip_existing": False}, - ] == uploader_upload.call_args + ] diff --git a/tests/pyproject/conftest.py b/tests/pyproject/conftest.py index 82ff2198389..8aceff30d8c 100644 --- a/tests/pyproject/conftest.py +++ b/tests/pyproject/conftest.py @@ -12,7 +12,7 @@ @pytest.fixture def pyproject_toml(tmp_path: Path) -> Path: path = tmp_path / "pyproject.toml" - with path.open(mode="w"): + with path.open(mode="w", encoding="utf-8"): pass return path @@ -24,7 +24,7 @@ def build_system_section(pyproject_toml: Path) -> str: requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" """ - with pyproject_toml.open(mode="a") as f: + with pyproject_toml.open(mode="a", encoding="utf-8") as f: f.write(content) return content @@ -38,6 +38,6 @@ def poetry_section(pyproject_toml: Path) -> str: [tool.poetry.dependencies] python = "^3.5" """ - with pyproject_toml.open(mode="a") as f: + with pyproject_toml.open(mode="a", encoding="utf-8") as f: f.write(content) return content diff --git a/tests/pyproject/test_pyproject_toml_file.py b/tests/pyproject/test_pyproject_toml_file.py index 5cb1b8c4327..e8fea9000ec 100644 --- a/tests/pyproject/test_pyproject_toml_file.py +++ b/tests/pyproject/test_pyproject_toml_file.py @@ -14,7 +14,7 @@ def test_pyproject_toml_file_invalid(pyproject_toml: Path) -> None: - with pyproject_toml.open(mode="a") as f: + with pyproject_toml.open(mode="a", encoding="utf-8") as f: f.write("<<<<<<<<<<<") with pytest.raises(PoetryCoreException) as excval: diff --git a/tests/repositories/fixtures/legacy.py b/tests/repositories/fixtures/legacy.py index 58f431b0268..57c06aee1cb 100644 --- a/tests/repositories/fixtures/legacy.py +++ b/tests/repositories/fixtures/legacy.py @@ -22,7 +22,7 @@ from packaging.utils import NormalizedName from pytest_mock import MockerFixture - from poetry.repositories.link_sources.html import SimpleRepositoryPage + from poetry.repositories.link_sources.html import HTMLPage from tests.types import HTTPrettyRequestCallback from tests.types import NormalizedNameTransformer from tests.types import SpecializedLegacyRepositoryMocker @@ -129,7 +129,7 @@ def mock( ) original_get_page = specialized_repository._get_page - def _mocked_get_page(name: NormalizedName) -> SimpleRepositoryPage: + def _mocked_get_page(name: NormalizedName) -> HTMLPage: return original_get_page( canonicalize_name(f"{name}{transformer_or_suffix}") if isinstance(transformer_or_suffix, str) diff --git a/tests/repositories/fixtures/pypi.org/generate.py b/tests/repositories/fixtures/pypi.org/generate.py index 6ce6c72c1e3..ccc535dcc55 100644 --- a/tests/repositories/fixtures/pypi.org/generate.py +++ b/tests/repositories/fixtures/pypi.org/generate.py @@ -53,6 +53,8 @@ from packaging.metadata import parse_email from poetry.core.masonry.builders.sdist import SdistBuilder from poetry.core.packages.package import Package + +from poetry.repositories.pypi_repository import PyPiRepository from tests.helpers import FIXTURE_PATH from tests.helpers import FIXTURE_PATH_DISTRIBUTIONS from tests.helpers import FIXTURE_PATH_INSTALLATION @@ -60,8 +62,6 @@ from tests.helpers import FIXTURE_PATH_REPOSITORIES_LEGACY from tests.helpers import FIXTURE_PATH_REPOSITORIES_PYPI -from poetry.repositories.pypi_repository import PyPiRepository - if TYPE_CHECKING: import requests diff --git a/tests/repositories/fixtures/single-page/mmcv_torch_releases.html b/tests/repositories/fixtures/single-page/mmcv_torch_releases.html new file mode 100644 index 00000000000..dff3ab240c3 --- /dev/null +++ b/tests/repositories/fixtures/single-page/mmcv_torch_releases.html @@ -0,0 +1,104 @@ +../torch1.12.0/mmcv-2.0.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc2-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc3-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.0rc4-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.0.1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.0.1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv-2.1.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv-2.1.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.6.2-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.0-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.1-cp39-cp39-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp310-cp310-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp310-cp310-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp37-cp37m-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp37-cp37m-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp38-cp38-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp38-cp38-win_amd64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp39-cp39-manylinux1_x86_64.whl
+../torch1.12.0/mmcv_full-1.7.2-cp39-cp39-win_amd64.whl
diff --git a/tests/repositories/test_http_repository.py b/tests/repositories/test_http_repository.py index 6d7fd667b02..64a5ba6b176 100644 --- a/tests/repositories/test_http_repository.py +++ b/tests/repositories/test_http_repository.py @@ -80,7 +80,11 @@ def test_get_info_from_wheel( else: mock_metadata_from_wheel_url.assert_not_called() mock_download.assert_called_once_with( - url, mocker.ANY, session=repo.session, raise_accepts_ranges=lazy_wheel + url, + mocker.ANY, + session=repo.session, + raise_accepts_ranges=lazy_wheel, + max_retries=0, ) if lazy_wheel: assert repo._supports_range_requests[domain] is False diff --git a/tests/repositories/test_installed_repository.py b/tests/repositories/test_installed_repository.py index 88c9a373abf..0645f0256bf 100644 --- a/tests/repositories/test_installed_repository.py +++ b/tests/repositories/test_installed_repository.py @@ -12,6 +12,7 @@ import pytest from poetry.repositories.installed_repository import InstalledRepository +from poetry.utils._compat import getencoding from poetry.utils._compat import metadata from poetry.utils.env import EnvManager from poetry.utils.env import MockEnv @@ -62,7 +63,7 @@ def installed_results( metadata.PathDistribution(src_dir / "pendulum" / "pendulum.egg-info"), metadata.PathDistribution( zipfile.Path( # type: ignore[arg-type] - str(site_purelib / "foo-0.1.0-py3.8.egg"), + site_purelib / "foo-0.1.0-py3.8.egg", "EGG-INFO", ) ), @@ -168,7 +169,7 @@ def fix_editable_path_for_windows( # to give inconsistent results at different phases of the test suite execution; additionally # this represents a more realistic scenario editable_pth_file = site_purelib / "editable.pth" - editable_pth_file.write_text(editable_source_directory_path) + editable_pth_file.write_text(editable_source_directory_path, encoding=getencoding()) def test_load_successful( diff --git a/tests/repositories/test_legacy_repository.py b/tests/repositories/test_legacy_repository.py index 0d9f304f7c1..f4d955fbae6 100644 --- a/tests/repositories/test_legacy_repository.py +++ b/tests/repositories/test_legacy_repository.py @@ -592,7 +592,7 @@ def get_mock( monkeypatch.setattr(repo.session, "get", get_mock) page = repo.get_page("foo") assert page is not None - assert page._url == "http://legacy.redirect.bar/foo/" + assert page._url == "http://legacy.redirect.bar/foo" @pytest.mark.parametrize( diff --git a/tests/repositories/test_single_page_repository.py b/tests/repositories/test_single_page_repository.py index bbe3002c8e7..05789690874 100644 --- a/tests/repositories/test_single_page_repository.py +++ b/tests/repositories/test_single_page_repository.py @@ -8,7 +8,7 @@ from poetry.core.packages.dependency import Dependency from poetry.repositories.exceptions import PackageNotFound -from poetry.repositories.link_sources.html import SimpleRepositoryPage +from poetry.repositories.link_sources.html import HTMLPage from poetry.repositories.single_page_repository import SinglePageRepository @@ -22,18 +22,18 @@ class MockSinglePageRepository(SinglePageRepository): def __init__(self, page: str) -> None: super().__init__( "single-page", - url=f"http://single-page.foo.bar/{page}.html", + url=f"http://single-page.foo.bar/single/page/repo/{page}.html", disable_cache=True, ) self._lazy_wheel = False - def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage: + def _get_page(self, name: NormalizedName) -> HTMLPage: fixture = self.FIXTURES / self.url.rsplit("/", 1)[-1] if not fixture.exists(): raise PackageNotFound(f"Package [{name}] not found.") with fixture.open(encoding="utf-8") as f: - return SimpleRepositoryPage(self._url, f.read()) + return HTMLPage(self._url, f.read()) def _download( self, url: str, dest: Path, *, raise_accepts_ranges: bool = False @@ -67,3 +67,13 @@ def test_single_page_repository_find_packages() -> None: package = packages[0] assert package.name == dep.name assert package.to_dependency().to_pep_508() == dep.to_pep_508() + + +def test_single_page_repository_get_page_with_relative_links() -> None: + repo = MockSinglePageRepository("mmcv_torch_releases") + + base_path = Path("/single/page/torch1.12.0") + page = repo.get_page("mmcv") + for link in page.links: + path = Path(link.path) + assert path.parent == base_path diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 7db5580b460..42c56dfef32 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -1,6 +1,9 @@ from __future__ import annotations +import os + from tests.helpers import flatten_dict +from tests.helpers import isolated_environment def test_flatten_dict() -> None: @@ -21,3 +24,23 @@ def test_flatten_dict() -> None: } assert flattened_dict == flatten_dict(orig_dict, delimiter=":") + + +def test_isolated_environment_restores_original_environ() -> None: + original_environ = dict(os.environ) + with isolated_environment(): + os.environ["TEST_VAR"] = "test" + assert os.environ == original_environ + + +def test_isolated_environment_clears_environ() -> None: + os.environ["TEST_VAR"] = "test" + with isolated_environment(clear=True): + assert "TEST_VAR" not in os.environ + assert "TEST_VAR" in os.environ + + +def test_isolated_environment_updates_environ() -> None: + with isolated_environment(environ={"NEW_VAR": "new_value"}): + assert os.environ["NEW_VAR"] == "new_value" + assert "NEW_VAR" not in os.environ diff --git a/tests/utils/env/test_env.py b/tests/utils/env/test_env.py index 5761fd02115..745b33a091d 100644 --- a/tests/utils/env/test_env.py +++ b/tests/utils/env/test_env.py @@ -186,7 +186,8 @@ def test_call_does_not_block_on_full_pipe( import sys for i in range(10000): print('just print a lot of text to fill the buffer', file={out}) -""" +""", + encoding="utf-8", ) def target(result: list[int]) -> None: @@ -276,7 +277,7 @@ def test_env_system_packages( assert ( f"include-system-site-packages = {str(with_system_site_packages).lower()}" - in pyvenv_cfg.read_text() + in pyvenv_cfg.read_text(encoding="utf-8") ) assert env.includes_system_site_packages is with_system_site_packages @@ -510,7 +511,8 @@ def test_detect_active_python_with_bat(poetry: Poetry, tmp_path: Path) -> None: """On Windows pyenv uses batch files for python management.""" python_wrapper = tmp_path / "python.bat" wrapped_python = Path(r"C:\SpecialPython\python.exe") - with python_wrapper.open("w") as f: + encoding = "locale" if sys.version_info >= (3, 10) else None + with python_wrapper.open("w", encoding=encoding) as f: f.write(f"@echo {wrapped_python}") os.environ["PATH"] = str(python_wrapper.parent) + os.pathsep + os.environ["PATH"] diff --git a/tests/utils/env/test_env_manager.py b/tests/utils/env/test_env_manager.py index 891d0a4702c..bf36f78242c 100644 --- a/tests/utils/env/test_env_manager.py +++ b/tests/utils/env/test_env_manager.py @@ -923,17 +923,13 @@ def test_create_venv_finds_no_python_executable( manager: EnvManager, poetry: Poetry, config: Config, - mocker: MockerFixture, config_virtualenvs_path: Path, venv_name: str, ) -> None: if "VIRTUAL_ENV" in os.environ: del os.environ["VIRTUAL_ENV"] - poetry.package.python_versions = "^3.6" - - mocker.patch("sys.version_info", (3, 4, 5)) - mocker.patch("shutil.which", return_value=None) + poetry.package.python_versions = "^999" with pytest.raises(NoCompatiblePythonVersionFound) as e: manager.create_venv() diff --git a/tests/utils/fixtures/pyproject.toml b/tests/utils/fixtures/pyproject.toml index 09455111204..4a3245be771 100644 --- a/tests/utils/fixtures/pyproject.toml +++ b/tests/utils/fixtures/pyproject.toml @@ -24,5 +24,5 @@ toml = "^0.9" cachy = "^0.1.0" pip-tools = "^1.11" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "~3.4" diff --git a/tests/utils/test_authenticator.py b/tests/utils/test_authenticator.py index 844f761ae56..23df1f97922 100644 --- a/tests/utils/test_authenticator.py +++ b/tests/utils/test_authenticator.py @@ -5,7 +5,6 @@ import re import uuid -from dataclasses import dataclass from pathlib import Path from typing import TYPE_CHECKING from typing import Any @@ -15,6 +14,7 @@ import requests from cleo.io.null_io import NullIO +from keyring.credentials import SimpleCredential from poetry.utils.authenticator import Authenticator from poetry.utils.authenticator import RepositoryCertificateConfig @@ -29,12 +29,6 @@ from tests.conftest import DummyBackend -@dataclass -class SimpleCredential: - username: str - password: str - - @pytest.fixture() def mock_remote(http: type[httpretty.httpretty]) -> None: http.register_uri( @@ -194,8 +188,9 @@ def test_authenticator_falls_back_to_keyring_url( } ) - dummy_keyring.set_password( - "https://foo.bar/simple/", None, SimpleCredential("foo", "bar") + dummy_keyring.set_default_service_credential( + "https://foo.bar/simple/", + SimpleCredential("foo", "bar"), # type: ignore[no-untyped-call] ) authenticator = Authenticator(config, NullIO()) @@ -220,7 +215,10 @@ def test_authenticator_falls_back_to_keyring_netloc( } ) - dummy_keyring.set_password("foo.bar", None, SimpleCredential("foo", "bar")) + dummy_keyring.set_default_service_credential( + "foo.bar", + SimpleCredential("foo", "bar"), # type: ignore[no-untyped-call] + ) authenticator = Authenticator(config, NullIO()) authenticator.request("get", "https://foo.bar/files/foo-0.1.0.tar.gz") @@ -483,11 +481,13 @@ def test_authenticator_falls_back_to_keyring_url_matched_by_path( } ) - dummy_keyring.set_password( - "https://foo.bar/alpha/files/simple/", None, SimpleCredential("foo", "bar") + dummy_keyring.set_default_service_credential( + "https://foo.bar/alpha/files/simple/", + SimpleCredential("foo", "bar"), # type: ignore[no-untyped-call] ) - dummy_keyring.set_password( - "https://foo.bar/beta/files/simple/", None, SimpleCredential("foo", "baz") + dummy_keyring.set_default_service_credential( + "https://foo.bar/beta/files/simple/", + SimpleCredential("foo", "baz"), # type: ignore[no-untyped-call] ) authenticator = Authenticator(config, NullIO()) diff --git a/tests/utils/test_cache.py b/tests/utils/test_cache.py index 05e5e9b636a..09c5c98e75c 100644 --- a/tests/utils/test_cache.py +++ b/tests/utils/test_cache.py @@ -167,9 +167,12 @@ def test_detect_corrupted_cache_key_file( # original content: 9999999999"value" - write_modes = {str: "w", bytes: "wb"} - with open(key1_path, write_modes[type(corrupt_payload)]) as f: - f.write(corrupt_payload) # write corrupt data + if isinstance(corrupt_payload, str): + with open(key1_path, "w", encoding="utf-8") as f: + f.write(corrupt_payload) # write corrupt data + else: + with open(key1_path, "wb") as f: + f.write(corrupt_payload) # write corrupt data assert poetry_file_cache.get("key1") is None @@ -333,7 +336,7 @@ def test_get_cached_archive_for_link_no_race_condition( def replace_file(_: str, dest: Path) -> None: dest.unlink(missing_ok=True) # write some data (so it takes a while) to provoke possible race conditions - dest.write_text("a" * 2**20) + dest.write_text("a" * 2**20, encoding="utf-8") download_mock = mocker.Mock(side_effect=replace_file) diff --git a/tests/utils/test_helpers.py b/tests/utils/test_helpers.py index 884db33b903..a2aa909e936 100644 --- a/tests/utils/test_helpers.py +++ b/tests/utils/test_helpers.py @@ -9,6 +9,7 @@ import pytest from poetry.core.utils.helpers import parse_requires +from requests.exceptions import ChunkedEncodingError from poetry.utils.helpers import Downloader from poetry.utils.helpers import HTTPRangeRequestSupported @@ -150,6 +151,79 @@ def test_download_file( assert http.last_request().headers["Accept-Encoding"] == "Identity" +def test_download_file_recover_from_error( + http: type[httpretty], fixture_dir: FixtureDirGetter, tmp_path: Path +) -> None: + file_path = fixture_dir("distributions") / "demo-0.1.0.tar.gz" + file_body = file_path.read_bytes() + file_length = len(file_body) + url = "https://foo.com/demo-0.1.0.tar.gz" + + def handle_request( + request: HTTPrettyRequest, uri: str, response_headers: dict[str, Any] + ) -> tuple[int, dict[str, Any], bytes]: + if request.headers.get("Range") is None: + response_headers["Content-Length"] = str(file_length) + response_headers["Accept-Ranges"] = "bytes" + return 200, response_headers, file_body[: file_length // 2] + else: + start = int( + request.headers.get("Range", "bytes=0-").split("=")[1].split("-")[0] + ) + return 206, response_headers, file_body[start:] + + http.register_uri(http.GET, url, body=handle_request) + dest = tmp_path / "demo-0.1.0.tar.gz" + + download_file(url, dest, chunk_size=file_length // 2, max_retries=1) + + expect_sha_256 = "9fa123ad707a5c6c944743bf3e11a0e80d86cb518d3cf25320866ca3ef43e2ad" + assert get_file_hash(dest) == expect_sha_256 + assert http.last_request().headers["Accept-Encoding"] == "Identity" + assert http.last_request().headers["Range"] == f"bytes={file_length // 2}-" + + +def test_download_file_fail_when_no_range( + http: type[httpretty], fixture_dir: FixtureDirGetter, tmp_path: Path +) -> None: + file_path = fixture_dir("distributions") / "demo-0.1.0.tar.gz" + file_body = file_path.read_bytes() + file_length = len(file_body) + url = "https://foo.com/demo-0.1.0.tar.gz" + + def handle_request( + request: HTTPrettyRequest, uri: str, response_headers: dict[str, Any] + ) -> tuple[int, dict[str, Any], bytes]: + response_headers["Content-Length"] = str(file_length) + return 200, response_headers, file_body[: file_length // 2] + + http.register_uri(http.GET, url, body=handle_request) + dest = tmp_path / "demo-0.1.0.tar.gz" + with pytest.raises(ChunkedEncodingError): + download_file(url, dest, chunk_size=file_length // 2, max_retries=1) + + +def test_download_file_fail_when_first_chunk_failed( + http: type[httpretty], fixture_dir: FixtureDirGetter, tmp_path: Path +) -> None: + file_path = fixture_dir("distributions") / "demo-0.1.0.tar.gz" + file_body = file_path.read_bytes() + file_length = len(file_body) + url = "https://foo.com/demo-0.1.0.tar.gz" + + def handle_request( + request: HTTPrettyRequest, uri: str, response_headers: dict[str, Any] + ) -> tuple[int, dict[str, Any], bytes]: + response_headers["Content-Length"] = str(file_length) + response_headers["Accept-Ranges"] = "bytes" + return 200, response_headers, file_body[: file_length // 2] + + http.register_uri(http.GET, url, body=handle_request) + dest = tmp_path / "demo-0.1.0.tar.gz" + with pytest.raises(ChunkedEncodingError): + download_file(url, dest, chunk_size=file_length, max_retries=1) + + @pytest.mark.parametrize( "hash_types,expected", [ diff --git a/tests/vcs/git/test_backend.py b/tests/vcs/git/test_backend.py index dce587fd330..ac619de55ca 100644 --- a/tests/vcs/git/test_backend.py +++ b/tests/vcs/git/test_backend.py @@ -1,9 +1,15 @@ from __future__ import annotations +from unittest.mock import MagicMock + import pytest +from dulwich.repo import Repo + from poetry.vcs.git.backend import Git +from poetry.vcs.git.backend import annotated_tag from poetry.vcs.git.backend import is_revision_sha +from poetry.vcs.git.backend import urlpathjoin VALID_SHA = "c5c7624ef64f34d9f50c3b7e8118f7f652fddbbd" @@ -41,3 +47,31 @@ def test_invalid_revision_sha_max_len() -> None: def test_get_name_from_source_url(url: str) -> None: name = Git.get_name_from_source_url(url) assert name == "poetry" + + +@pytest.mark.parametrize(("tag"), ["my-tag", b"my-tag"]) +def test_annotated_tag(tag: str | bytes) -> None: + tag = annotated_tag("my-tag") + assert tag == b"my-tag^{}" + + +def test_get_remote_url() -> None: + repo = MagicMock(spec=Repo) + repo.get_config.return_value.get.return_value = ( + b"https://github.com/python-poetry/poetry.git" + ) + + assert Git.get_remote_url(repo) == "https://github.com/python-poetry/poetry.git" + + +@pytest.mark.parametrize( + "url, expected_result", + [ + ("ssh://git@github.com/org/repo", "ssh://git@github.com/other-repo"), + ("ssh://git@github.com/org/repo/", "ssh://git@github.com/org/other-repo"), + ], +) +def test_urlpathjoin(url: str, expected_result: str) -> None: + path = "../other-repo" + result = urlpathjoin(url, path) + assert result == expected_result diff --git a/tests/vcs/git/test_system.py b/tests/vcs/git/test_system.py index 2491939c64f..5763b3607da 100644 --- a/tests/vcs/git/test_system.py +++ b/tests/vcs/git/test_system.py @@ -23,6 +23,7 @@ def get_head_sha(cwd: Path) -> str: ["git", "rev-parse", "HEAD"], cwd=cwd, text=True, + encoding="utf-8", ).strip() @@ -39,7 +40,7 @@ def temp_repo(tmp_path: Path) -> TempRepoFixture: repo = dulwich.repo.Repo.init(str(tmp_path)) # init commit - (tmp_path / "foo").write_text("foo") + (tmp_path / "foo").write_text("foo", encoding="utf-8") repo.stage(["foo"]) init_commit = repo.do_commit( @@ -50,7 +51,7 @@ def temp_repo(tmp_path: Path) -> TempRepoFixture: ) # extra commit - (tmp_path / "foo").write_text("bar") + (tmp_path / "foo").write_text("bar", encoding="utf-8") repo.stage(["foo"]) head_commit = repo.do_commit(