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(