diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index e23a214a..facf21d0 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -92,7 +92,7 @@ jobs: - name: Install packages if: steps.check_last_run.outcome == 'skipped' || steps.check_last_run.outputs.conclusion == 'failure' run: | - poetry install --with index + poetry install --extras index - name: Collect scenarios if: steps.check_last_run.outcome == 'skipped' || steps.check_last_run.outputs.conclusion == 'failure' @@ -124,7 +124,7 @@ jobs: if: github.ref != 'refs/heads/main' run: | # Start the local index server, do not allow packages from PyPI - index_url=$(poetry run packse index up --bg --offline) + index_url=$(poetry run packse index up --bg --offline --dist-dir "./published") # Publish the packages poetry run packse publish --anonymous --index-url "$index_url" dist/* diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2f61b77a..f36bb066 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -53,7 +53,7 @@ jobs: - name: Install packages run: | - poetry install + poetry install --all-extras - name: Run tests run: | diff --git a/README.md b/README.md index 1394e83f..730ab33e 100644 --- a/README.md +++ b/README.md @@ -132,23 +132,6 @@ Credentials must be provided via the `PACKSE_PYPI_PASSWORD` environment variable used to set a username if not using an API token. If using a server which does not require authentication, the `--anonymous` flag can be passed. -### Developing scenarios - -_Requires installation with the `serve` extra, e.g. `poetry install --with serve`_ - -The `serve` command can be used to build and publish scenarios to a local package index. - -```bash -packse serve scenarios -``` - -Packse will watch for changes to scenarios, and publish new versions on each change. - -Note when developing, it is often useful to use the `--no-hash` flag to avoid having to determine the latest -hash for the scenario. - -By default, the `serve` index will fallback to PyPI for missing packages. To test in isolation, use the `--offline` flag. - ### Running a package index _Requires installation with the `index` extra, e.g. `poetry install --with index`_ @@ -160,37 +143,45 @@ packse index up ``` The `--bg` flag can be passed to run the index in the background. -When running an index in the background, state will be stored in the `~/.packse` directory. The `PACKSE_STORAGE_PATH` -environment variable or the `--storage-path` option can be used to change the storage path. +When running an index in the background, state will be stored in the `~/.packse` directory. The `PACKSE_STATE_PATH` +environment variable can be used to change the state path. -The following package indexes are available: +Packages can be installed by passing the `--index-url` flag to the installer e.g. with `pip`: -- `packages/local`: which only allows locally published packages to be installed -- `packages/pypi`: which mirrors the production PyPI index -- `packages/test-pypi`: which mirrors the test PyPI index -- `packages/all`: which includes all of the listed indexes, with priority following the list order above +```bash +pip install --index-url http://127.0.0.1:3141 example-0611cb74 +``` -When installing packages, you can choose the index to use by passing the `--index-url` flag to the installer -e.g. with `pip`: +Packages can be published to the index by providing the `--index-url` and `--anonymous` flags to the `publish` command: ```bash -pip install --index-url http://127.0.0.1:3141/packages/local/+simple example-0611cb74 +packse publish dist/example-cd797223 --index-url http://localhost:3141 --anonymous ``` -To stop the index, use `packse index down`: +Packages can also be published to the index by placing their distributions in the configured `--dist-dir`. This defaults +to `./dist` which is also the default location used in `packse build`. + +By default, the index will fallback to PyPI for missing packages. To test in isolation, use the `--offline` flag. + +To stop an index running in the background use `packse index down`: ``` packse index down ``` -Packages can be published to the local index by providing the `--index-url` flag to the `publish` command: +### Serving scenarios + +_Requires installation with the `serve` extra, e.g. `poetry install --with serve`_ + +The `serve` command can be used to host, build, and publish scenarios in one step. ```bash -packse publish dist/example-cd797223 --index-url http://localhost:3141/packages/local --anonymous +packse serve scenarios ``` -When publishing scenario packages, you should always use the `packages/local` package index; or they will not be -available when installing from `packages/all`. +Packse will watch for changes to the `scenarios` directory, and publish new versions on each change. +Note when developing, it is often useful to use the `--no-hash` flag to avoid having to determine the latest +hash for the scenario. ### Testing scenarios @@ -202,17 +193,6 @@ For example, with `pip`: pip install -i https://test.pypi.org/simple/ example-cd797223 ``` -### Registry backends - -Packse supports hosting a local index with two Python package registry backends: - -- `devpi`: Using `packse index up` -- `pypiserver`: Using `packse serve` - -At some point, these commands may be unified to use a configurable, consistent backend. The reason for using multiple -backends is historical, although the backends provide different behavior. Notably, `devpi` supports the JSON Simple -API while `pypiserver` only supports the HTML Simple API. - ### Exporting scenarios Scenario information can be exported with the `packse inspect`. This creates a JSON representation of the scenarios diff --git a/poetry.lock b/poetry.lock index 37288abe..aaef05eb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4,7 +4,7 @@ name = "anyio" version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, @@ -20,125 +20,6 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] -[[package]] -name = "argon2-cffi" -version = "23.1.0" -description = "Argon2 for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, - {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, -] - -[package.dependencies] -argon2-cffi-bindings = "*" - -[package.extras] -dev = ["argon2-cffi[tests,typing]", "tox (>4)"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] -tests = ["hypothesis", "pytest"] -typing = ["mypy"] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, -] - -[package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] - -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - -[[package]] -name = "beautifulsoup4" -version = "4.12.3" -description = "Screen-scraping library" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -cchardet = ["cchardet"] -chardet = ["chardet"] -charset-normalizer = ["charset-normalizer"] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "build" -version = "1.0.3" -description = "A simple, correct Python build frontend" -optional = false -python-versions = ">= 3.7" -files = [ - {file = "build-1.0.3-py3-none-any.whl", hash = "sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f"}, - {file = "build-1.0.3.tar.gz", hash = "sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "os_name == \"nt\""} -packaging = ">=19.0" -pyproject_hooks = "*" - -[package.extras] -docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] -test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] -typing = ["importlib-metadata (>=5.1)", "mypy (>=1.5.0,<1.6.0)", "tomli", "typing-extensions (>=3.7.4.3)"] -virtualenv = ["virtualenv (>=20.0.35)"] - [[package]] name = "certifi" version = "2024.2.2" @@ -214,20 +95,6 @@ files = [ [package.dependencies] pycparser = "*" -[[package]] -name = "chameleon" -version = "4.5.2" -description = "Fast HTML/XML Template Compiler." -optional = false -python-versions = ">=3.9" -files = [ - {file = "Chameleon-4.5.2-py3-none-any.whl", hash = "sha256:4c39144282b9fa37046ce04012178650f3b5b5ae3219e142b6c799c89932403f"}, - {file = "Chameleon-4.5.2.tar.gz", hash = "sha256:8fc0e5ae67c68a589c0ab3fe230d473950204e36e926ffeecf878c4717382616"}, -] - -[package.extras] -docs = ["Sphinx", "sphinx-rtd-theme"] - [[package]] name = "charset-normalizer" version = "3.3.2" @@ -327,24 +194,6 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] -[[package]] -name = "check-manifest" -version = "0.49" -description = "Check MANIFEST.in in a Python source package for completeness" -optional = false -python-versions = ">=3.7" -files = [ - {file = "check-manifest-0.49.tar.gz", hash = "sha256:64a640445542cf226919657c7b78d02d9c1ca5b1c25d7e66e0e1ff325060f416"}, - {file = "check_manifest-0.49-py3-none-any.whl", hash = "sha256:058cd30057714c39b96ce4d83f254fc770e3145c7b1932b5940b4e3efb5521ef"}, -] - -[package.dependencies] -build = ">=0.1" -setuptools = "*" - -[package.extras] -test = ["mock (>=3.0.0)", "pytest"] - [[package]] name = "chevron-blue" version = "0.2.1" @@ -356,77 +205,6 @@ files = [ {file = "chevron_blue-0.2.1.tar.gz", hash = "sha256:fec5d54f2a71883c74a6e8266936aeaf2b2427c91dd32dc77e5cc64cdbf1c7d2"}, ] -[[package]] -name = "cmarkgfm" -version = "2024.1.14" -description = "Minimal bindings to GitHub's fork of cmark" -optional = false -python-versions = "*" -files = [ - {file = "cmarkgfm-2024.1.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b676300ff04629c07c02687e5dc017fb7d1edf38a5dc1ab2ec28078a71195ce6"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7ccd6689108673be5bb19f3a3b02cf897fab9b04290a0548e4c6deec5a1fec9a"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8d68eb075d2eb48e864d9c031b0117900e25a3c1c7ab8ce4f80c25b6ae7f346"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b62dbc7f546c43d99964914133b7e4d7ef7ce4f411cd0acc95b382853aa47f"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3fe7e5357233649030f22dd816354e51c99f90857cff904a173bbd602733aca"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4310b7d5cc534c27454406963319a16c7f3f05ff75b7cd24a1091884c04248ad"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4ecb19b2fb24fe055bbaf0d38e8262642f27123b4339f1f10e7fabb726e57ee8"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d3f497cbbaeb540a741a6516673045abcc11b41029bc3dbc95b3b5ea2cc2182"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-win32.whl", hash = "sha256:d399545833ff3f25f8f6d9b559be5878987f3e34cfc4fe79cefc1d33fd3da852"}, - {file = "cmarkgfm-2024.1.14-cp310-cp310-win_amd64.whl", hash = "sha256:bcd059584161491a2848e55ec73c28f17d8e89faec9ad860afa05246a6ee695f"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6565d5659d80d119733a407af70e5de7c04e0822fabb91db83688e0e280cc174"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43db622d57e81dce30dcbea3a0198588080559473e5bafb68e10959dbf0a3d0f"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26d39c10b816392a3b54a9a7ba7ce894c40fee2813ac71554c424d6762c28ee6"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bba56ccec5b980c9da003ac7449c0cbe8045e4e046d4ce51273a47d3a9b84b1a"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c552ef80fe8c29d647c86ab49b8f66aa7626e7de9009e4005bd2120698667fa2"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ce0f76ea3d47d206913db8f7933076191be4d8871019095a4880885531586ab5"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b0b5a3be0b76f2802f8f16c40d33f74ff68c0bca8860bd4b5252395181077534"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:70db301d140d1f0cabe58770aad8506a4bd7fa0e5b0fae78c8f9a80712d14857"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-win32.whl", hash = "sha256:3cdc34d749601ff74209580fb7c80b3cbf1112d2832af52c14387cb04831ff2b"}, - {file = "cmarkgfm-2024.1.14-cp311-cp311-win_amd64.whl", hash = "sha256:8b8fd26ff27b9895f48459b8e556b9d6c4d255ac3735b3b2f8b14b9787ff6b89"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3340c8867ee9a3d2590eb020f22cdc4e101d3d4d9f4a8cc95964f45666ed58f0"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc6fb79ef6f93dd497fd2b85be032636bb955a762c42f52ed65fefe32525fc2b"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890a235fc0cf5c821ed4dd81a5405a526e9cc616761345aee54840a575b7f969"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa2e85a1e0f3929015d5fe023bd3664d8c744d3f898bdd05df99ed905782376"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:283de0cf88c784f71e8416cf40fffc133d6ffd9686dbf094c4b5c522e1283343"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:2bc2dc101dd6b27aaa264f4c3e8eb444b850b06c60dc4cd278ea743fb085c35b"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:494daf9790dd1a5440bbe3f5c70e01afbeeb3b7565d373b05b3bfa311a0ac3e3"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-win32.whl", hash = "sha256:e51707471196d199f03aff1c5e12860d12a44e7bf29302e7bb485074f8e62ff0"}, - {file = "cmarkgfm-2024.1.14-cp36-cp36m-win_amd64.whl", hash = "sha256:bee28a3cc0abae18a46119ff1cde0db991f5ebe235d24c95bbaa672a63b5d695"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e601ed6c9a44c5f86b392afef2f66711da07924825a4ff695eec9a3cfc905732"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f8205bed32be4226f8e344d4e4be001a57929059c3303107485dacc145df5a8"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d14d928ad46974098979358ca456a056b8df91d5e6fa6e9294bd1173dfdfa10"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56d68fcf5e71879c327f0889b1127ce58e85e1ac44a624f24933430d726381f3"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:57545dfbd9f26fd3b07909d1bac3dacba4cb493fe872da2f4237b4c3597d7a3a"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:17b61950e32b6f1d6f93a28beaa5870a2b30e44ce846529ff301c986b817f036"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f223e606b57eebfc81e95839cf22cbe5eaec0da9ecd42326cc46568e0029188c"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-win32.whl", hash = "sha256:ff0bc7dbb86d1a6877b771ed715dbe0ab071872e8c6f5beb782528b70ac7eedc"}, - {file = "cmarkgfm-2024.1.14-cp37-cp37m-win_amd64.whl", hash = "sha256:a4b20a59dc14a074bae0bd04306e504512c1883b0c9b6e0e0c5b217797571363"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4808af8c8c2c0a39dca8cc27406416d8254aec635f409dc5beb5cb5ed3af564a"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c71d6b44ffdd9a03e246a35c8a2b2454eb2a319fcfe5736ff62660259f9f4683"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7973812317ef672c5a1c59065294c4b280aaffb7fe1071b8c661de82021d4f1b"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:966bd27336736b2950551348b1bfc71863ea26b76b245e9966ee80cc9cde04ee"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02ba52518469ce85448e99beb20b1808c51f5a6cfee12554e5e810bfe774b791"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9659715d79cbc5c030d36709fe443a47b5c6dbb77bd05e5531feedbe5ad00ac5"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ff20857ccded325e11323540d0506fc1bd9ceea9746f81f08fe3d7e52f0a6bc"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7eff0e618704c49ab3f77680a0722aced6c99d2fe590b8f8d655fa29ed17270e"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-win32.whl", hash = "sha256:93364f7ec9de71285f0a27552f9cfa30aa4d311d37c820daa65dc27ab211a746"}, - {file = "cmarkgfm-2024.1.14-cp38-cp38-win_amd64.whl", hash = "sha256:ca9e5388c88f907c9ef1cf588947ea00a1c60f3462fe1f213b591bbd27ceb8c1"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1444f396fc18115065c66bb6f8a523167fa3bd153423d6fea272c4b486b473cf"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fdecbdad66b7738c711db33471d510c6279a01196920c43294d8071e51192807"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29b95d267ee1c61fd41d1f8634052a77b554517b18e8ffcdf0181e5e93a7af88"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56ec68a68164bf2ac0fd448d7fcb90d360a42072a6abd62be3e0d222240b7304"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:491d72e0dcc21ff9f3c9a905f785d4268170964500db498dc5b0f2f390fb340b"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0f7845837b0c4dbb3a1a7bbfffed264f011f86ea1cd0ce7823b533bcce0e1fe3"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0c66d0fecfdee9f2ffe34f640e346c653a951bddba79d192629c60958933aa51"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ec6eb4929bd231d7e5c0cf1154581be0a13b8d2b7aee2c30410066f363c765b9"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-win32.whl", hash = "sha256:d55795968751e1a8ddd2172c1d03d0107b9dd20445dbcd23dc9e0a80d95a0c5b"}, - {file = "cmarkgfm-2024.1.14-cp39-cp39-win_amd64.whl", hash = "sha256:b79662ab458c910c9785abacb8315d6f46487659d44398bd894f577bb6b9d04e"}, - {file = "cmarkgfm-2024.1.14.tar.gz", hash = "sha256:a208c1726e12ba385125cef2c6d375c41c5dea4cc2673a77af712b1dbf074e90"}, -] - -[package.dependencies] -cffi = ">=1.15.0" - [[package]] name = "colorama" version = "0.4.6" @@ -492,126 +270,6 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] - -[[package]] -name = "devpi" -version = "2.2.0" -description = "(deprecated, install devpi-server, devpi-client, devpi-web instead)" -optional = false -python-versions = "*" -files = [ - {file = "devpi-2.2.0.tar.gz", hash = "sha256:1595e5f095022ce7b569326ddceef5d638d936cfb79578d7fc472d46c556cd30"}, -] - -[package.dependencies] -devpi-client = "*" -devpi-server = "*" -devpi-web = "*" - -[[package]] -name = "devpi-client" -version = "7.0.2" -description = "devpi upload/install/... workflow commands for Python developers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "devpi-client-7.0.2.tar.gz", hash = "sha256:a0e5f967c59780d258b205ea1c4d82b177439c0dd798317a6b10f50f7d7c6cf4"}, - {file = "devpi_client-7.0.2-py3-none-any.whl", hash = "sha256:fb63fd088dce1ddd7cbe9879f6cc95bf464eb3d48cbdf51fc9c7bdef5e4d1ba0"}, -] - -[package.dependencies] -build = "*" -check-manifest = ">=0.28" -colorama = {version = "*", markers = "platform_system == \"Windows\""} -devpi-common = "==4.*" -iniconfig = "*" -pkginfo = ">=1.4.2" -platformdirs = "*" -pluggy = ">=0.6.0,<2.0" - -[[package]] -name = "devpi-common" -version = "4.0.3" -description = "Utilities jointly used by devpi-server, devpi-client and others." -optional = false -python-versions = ">=3.7" -files = [ - {file = "devpi-common-4.0.3.tar.gz", hash = "sha256:f8e01b4f6df080f62284cce58c5bb1ce1e869b0c234aac7ad135609745fc173d"}, - {file = "devpi_common-4.0.3-py3-none-any.whl", hash = "sha256:d96be2e842fa76d7c67c185ec037e80e250b323271edaa716ccb31eecd0d73eb"}, -] - -[package.dependencies] -lazy = "*" -packaging = ">=22" -requests = ">=2.3.0" - -[[package]] -name = "devpi-server" -version = "6.10.0" -description = "devpi-server: reliable private and pypi.org caching server" -optional = false -python-versions = ">=3.7" -files = [] -develop = false - -[package.dependencies] -argon2-cffi = "*" -attrs = ">=21.3.0" -defusedxml = "*" -devpi_common = ">3.6.0,<5" -httpx = "*" -itsdangerous = ">=0.24" -lazy = "*" -passlib = {version = "*", extras = ["argon2"]} -platformdirs = "*" -pluggy = ">=0.6.0,<2.0" -py = ">=1.4.23" -pyramid = ">=2" -"repoze.lru" = ">=0.6" -"ruamel.yaml" = "*" -strictyaml = "*" -waitress = ">=1.0.1" - -[package.source] -type = "git" -url = "https://github.com/zanieb/devpi" -reference = "22f71acb8f08a59a098e7ad434cf388a1193fc24" -resolved_reference = "22f71acb8f08a59a098e7ad434cf388a1193fc24" -subdirectory = "server" - -[[package]] -name = "devpi-web" -version = "4.2.1" -description = "devpi-web: a web view for devpi-server" -optional = false -python-versions = ">=3.4" -files = [ - {file = "devpi-web-4.2.1.tar.gz", hash = "sha256:4787012821355fecd51244741f6cd188f5c965b7f845cb21eaf87e2ff0536b80"}, - {file = "devpi_web-4.2.1-py3-none-any.whl", hash = "sha256:aefa99440f31a101cb3ecc38906cd49db1facd9c425d1c1263f4d032d604b039"}, -] - -[package.dependencies] -beautifulsoup4 = ">=4.3.2,<4.12.1 || >4.12.1" -defusedxml = "*" -devpi-common = ">=3.2.0" -devpi-server = ">=5.2.0" -docutils = ">=0.11" -pygments = ">=1.6" -pyramid = "!=1.10a1" -pyramid-chameleon = "*" -readme-renderer = {version = ">=23.0", extras = ["md"]} -Whoosh = "<3" - [[package]] name = "docutils" version = "0.20.1" @@ -634,17 +292,6 @@ files = [ {file = "editables-0.5.tar.gz", hash = "sha256:309627d9b5c4adc0e668d8c6fa7bac1ba7c8c5d415c2d27f60f081f8e80d1de2"}, ] -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - [[package]] name = "hatchling" version = "1.21.1" @@ -663,66 +310,6 @@ pathspec = ">=0.10.1" pluggy = ">=1.0.0" trove-classifiers = "*" -[[package]] -name = "httpcore" -version = "1.0.4" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, - {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.25.0)"] - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "hupper" -version = "1.12.1" -description = "Integrated process monitor for developing and reloading daemons." -optional = false -python-versions = ">=3.7" -files = [ - {file = "hupper-1.12.1-py3-none-any.whl", hash = "sha256:e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19"}, - {file = "hupper-1.12.1.tar.gz", hash = "sha256:06bf54170ff4ecf4c84ad5f188dee3901173ab449c2608ad05b9bfd6b13e32eb"}, -] - -[package.extras] -docs = ["Sphinx", "pylons-sphinx-themes", "setuptools", "watchdog"] -testing = ["mock", "pytest", "pytest-cov", "watchdog"] - [[package]] name = "idna" version = "3.6" @@ -764,17 +351,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "itsdangerous" -version = "2.1.2" -description = "Safely pass data to untrusted environments and back." -optional = false -python-versions = ">=3.7" -files = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, -] - [[package]] name = "jaraco-classes" version = "3.3.1" @@ -830,21 +406,6 @@ 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-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] -[[package]] -name = "lazy" -version = "1.6" -description = "Lazy attributes for Python objects" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "lazy-1.6-py2.py3-none-any.whl", hash = "sha256:449375c125c7acac6b7a93f71b8e7ccb06546c37b161613f92d2d3981f793244"}, - {file = "lazy-1.6.tar.gz", hash = "sha256:7127324ec709e8324f08cb4611c1abe01776bda53bb9ce68dc5dfa46ca0ed3e9"}, -] - -[package.extras] -docs = ["sphinx (==5.3.0)", "sphinx-rtd-theme (==1.0.0)"] -mypy = ["mypy"] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -979,42 +540,6 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -[[package]] -name = "passlib" -version = "1.7.4" -description = "comprehensive password hashing framework supporting over 30 schemes" -optional = false -python-versions = "*" -files = [ - {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, - {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, -] - -[package.dependencies] -argon2-cffi = {version = ">=18.2.0", optional = true, markers = "extra == \"argon2\""} - -[package.extras] -argon2 = ["argon2-cffi (>=18.2.0)"] -bcrypt = ["bcrypt (>=3.1.0)"] -build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] -totp = ["cryptography"] - -[[package]] -name = "pastedeploy" -version = "3.1.0" -description = "Load, configure, and compose WSGI applications and servers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PasteDeploy-3.1.0-py3-none-any.whl", hash = "sha256:76388ad53a661448d436df28c798063108f70e994ddc749540d733cdbd1b38cf"}, - {file = "PasteDeploy-3.1.0.tar.gz", hash = "sha256:9ddbaf152f8095438a9fe81f82c78a6714b92ae8e066bed418b6a7ff6a095a95"}, -] - -[package.extras] -docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] -paste = ["Paste"] -testing = ["Paste", "pytest", "pytest-cov"] - [[package]] name = "pathspec" version = "0.12.1" @@ -1030,7 +555,7 @@ files = [ name = "pip" version = "24.0" description = "The PyPA recommended tool for installing Python packages." -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "pip-24.0-py3-none-any.whl", hash = "sha256:ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc"}, @@ -1051,54 +576,6 @@ files = [ [package.extras] testing = ["pytest", "pytest-cov"] -[[package]] -name = "plaster" -version = "1.1.2" -description = "A loader interface around multiple config file formats." -optional = false -python-versions = ">=3.7" -files = [ - {file = "plaster-1.1.2-py2.py3-none-any.whl", hash = "sha256:42992ab1f4865f1278e2ad740e8ad145683bb4022e03534265528f0c23c0df2d"}, - {file = "plaster-1.1.2.tar.gz", hash = "sha256:f8befc54bf8c1147c10ab40297ec84c2676fa2d4ea5d6f524d9436a80074ef98"}, -] - -[package.extras] -docs = ["Sphinx", "pylons-sphinx-themes"] -testing = ["pytest", "pytest-cov"] - -[[package]] -name = "plaster-pastedeploy" -version = "1.0.1" -description = "A loader implementing the PasteDeploy syntax to be used by plaster." -optional = false -python-versions = ">=3.7" -files = [ - {file = "plaster_pastedeploy-1.0.1-py2.py3-none-any.whl", hash = "sha256:ad3550cc744648969ed3b810f33c9344f515ee8d8a8cec18e8f2c4a643c2181f"}, - {file = "plaster_pastedeploy-1.0.1.tar.gz", hash = "sha256:be262e6d2e41a7264875daa2fe2850cbb0615728bcdc92828fdc72736e381412"}, -] - -[package.dependencies] -PasteDeploy = ">=2.0" -plaster = ">=0.5" - -[package.extras] -testing = ["pytest", "pytest-cov"] - -[[package]] -name = "platformdirs" -version = "4.2.0" -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"}, -] - -[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)"] - [[package]] name = "pluggy" version = "1.4.0" @@ -1142,17 +619,6 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] -[[package]] -name = "py" -version = "1.11.0" -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.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pycparser" version = "2.21" @@ -1183,7 +649,7 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pypiserver" version = "2.0.1" description = "A minimal PyPI server for use with pip/easy_install." -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "pypiserver-2.0.1-py2.py3-none-any.whl", hash = "sha256:1dd98fb99d2da4199fb44c7284e57d69a9f7fda2c6c8dc01975c151c592677bf"}, @@ -1197,61 +663,6 @@ pip = ">=7" cache = ["watchdog"] passlib = ["passlib (>=1.6)"] -[[package]] -name = "pyproject-hooks" -version = "1.0.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"}, -] - -[[package]] -name = "pyramid" -version = "2.0.2" -description = "The Pyramid Web Framework, a Pylons project" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyramid-2.0.2-py3-none-any.whl", hash = "sha256:2e6585ac55c147f0a51bc00dadf72075b3bdd9a871b332ff9e5e04117ccd76fa"}, - {file = "pyramid-2.0.2.tar.gz", hash = "sha256:372138a738e4216535cc76dcce6eddd5a1aaca95130f2354fb834264c06f18de"}, -] - -[package.dependencies] -hupper = ">=1.5" -plaster = "*" -plaster-pastedeploy = "*" -setuptools = "*" -translationstring = ">=0.4" -venusian = ">=1.0" -webob = ">=1.8.3" -"zope.deprecation" = ">=3.5.0" -"zope.interface" = ">=3.8.0" - -[package.extras] -docs = ["Sphinx (>=3.0.0)", "docutils", "pylons-sphinx-latesturl", "pylons-sphinx-themes (>=1.0.8)", "repoze.sphinx.autointerface", "sphinx-copybutton", "sphinxcontrib-autoprogram"] -testing = ["coverage", "pytest (>=5.4.2)", "pytest-cov", "webtest (>=1.3.1)", "zope.component (>=4.0)"] - -[[package]] -name = "pyramid-chameleon" -version = "0.3" -description = "pyramid_chameleon" -optional = false -python-versions = "*" -files = [ - {file = "pyramid_chameleon-0.3.tar.gz", hash = "sha256:d176792a50eb015d7865b44bd9b24a7bd0489fa9a5cebbd17b9e05048cef9017"}, -] - -[package.dependencies] -Chameleon = "*" -pyramid = "*" - -[package.extras] -docs = ["Sphinx", "docutils", "repoze.sphinx.autointerface"] -testing = ["coverage", "nose", "virtualenv"] - [[package]] name = "pytest" version = "7.4.4" @@ -1272,20 +683,6 @@ pluggy = ">=0.12,<2.0" [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - [[package]] name = "pywin32-ctypes" version = "0.2.2" @@ -1309,7 +706,6 @@ files = [ ] [package.dependencies] -cmarkgfm = {version = ">=0.8.0", optional = true, markers = "extra == \"md\""} docutils = ">=0.13.1" nh3 = ">=0.2.14" Pygments = ">=2.5.1" @@ -1317,21 +713,6 @@ Pygments = ">=2.5.1" [package.extras] md = ["cmarkgfm (>=0.8.0)"] -[[package]] -name = "repoze-lru" -version = "0.7" -description = "A tiny LRU cache implementation and decorator" -optional = false -python-versions = "*" -files = [ - {file = "repoze.lru-0.7-py3-none-any.whl", hash = "sha256:f77bf0e1096ea445beadd35f3479c5cff2aa1efe604a133e67150bc8630a62ea"}, - {file = "repoze.lru-0.7.tar.gz", hash = "sha256:0429a75e19380e4ed50c0694e26ac8819b4ea7851ee1fc7583c8572db80aff77"}, -] - -[package.extras] -docs = ["Sphinx"] -testing = ["coverage", "nose"] - [[package]] name = "requests" version = "2.31.0" @@ -1399,83 +780,6 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] -[[package]] -name = "ruamel-yaml" -version = "0.18.6" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, - {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} - -[package.extras] -docs = ["mercurial (>5.7)", "ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.8" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, - {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, - {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, -] - [[package]] name = "ruff" version = "0.1.15" @@ -1533,53 +837,17 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments 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)", "packaging (>=23.2)", "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.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - [[package]] name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, ] -[[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." -optional = false -python-versions = ">=3.8" -files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, -] - -[[package]] -name = "strictyaml" -version = "1.7.3" -description = "Strict, typed YAML parser" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "strictyaml-1.7.3-py3-none-any.whl", hash = "sha256:fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7"}, - {file = "strictyaml-1.7.3.tar.gz", hash = "sha256:22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407"}, -] - -[package.dependencies] -python-dateutil = ">=2.6.0" - [[package]] name = "syrupy" version = "4.6.1" @@ -1594,20 +862,6 @@ files = [ [package.dependencies] pytest = ">=7.0.0,<9.0.0" -[[package]] -name = "translationstring" -version = "1.4" -description = "Utility library for i18n relied on by various Repoze and Pyramid packages" -optional = false -python-versions = "*" -files = [ - {file = "translationstring-1.4-py2.py3-none-any.whl", hash = "sha256:5f4dc4d939573db851c8d840551e1a0fb27b946afe3b95aafc22577eed2d6262"}, - {file = "translationstring-1.4.tar.gz", hash = "sha256:bf947538d76e69ba12ab17283b10355a9ecfbc078e6123443f43f2107f6376f3"}, -] - -[package.extras] -docs = ["Sphinx (>=1.3.1)", "docutils", "pylons-sphinx-themes"] - [[package]] name = "trove-classifiers" version = "2024.2.23" @@ -1658,41 +912,11 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] -[[package]] -name = "venusian" -version = "3.1.0" -description = "A library for deferring decorator actions" -optional = false -python-versions = ">=3.7" -files = [ - {file = "venusian-3.1.0-py3-none-any.whl", hash = "sha256:d1fb1e49927f42573f6c9b7c4fcf61c892af8fdcaa2314daa01d9a560b23488d"}, - {file = "venusian-3.1.0.tar.gz", hash = "sha256:eb72cdca6f3139a15dc80f9c95d3c10f8a54a0ba881eeef8e2ec5b42d3ee3a95"}, -] - -[package.extras] -docs = ["Sphinx (>=4.3.2)", "pylons-sphinx-themes", "repoze.sphinx.autointerface", "sphinx-copybutton"] -testing = ["coverage", "pytest", "pytest-cov"] - -[[package]] -name = "waitress" -version = "3.0.0" -description = "Waitress WSGI server" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "waitress-3.0.0-py3-none-any.whl", hash = "sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669"}, - {file = "waitress-3.0.0.tar.gz", hash = "sha256:005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1"}, -] - -[package.extras] -docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] -testing = ["coverage (>=5.0)", "pytest", "pytest-cov"] - [[package]] name = "watchfiles" version = "0.21.0" description = "Simple, modern and high performance file watching and code reload in python." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, @@ -1775,33 +999,6 @@ files = [ [package.dependencies] anyio = ">=3.0.0" -[[package]] -name = "webob" -version = "1.8.7" -description = "WSGI request and response object" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" -files = [ - {file = "WebOb-1.8.7-py2.py3-none-any.whl", hash = "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b"}, - {file = "WebOb-1.8.7.tar.gz", hash = "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323"}, -] - -[package.extras] -docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] -testing = ["coverage", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist"] - -[[package]] -name = "whoosh" -version = "2.7.4" -description = "Fast, pure-Python full text indexing, search, and spell checking library." -optional = false -python-versions = "*" -files = [ - {file = "Whoosh-2.7.4-py2.py3-none-any.whl", hash = "sha256:aa39c3c3426e3fd107dcb4bde64ca1e276a65a889d9085a6e4b54ba82420a852"}, - {file = "Whoosh-2.7.4.tar.gz", hash = "sha256:7ca5633dbfa9e0e0fa400d3151a8a0c4bec53bd2ecedc0a67705b17565c31a83"}, - {file = "Whoosh-2.7.4.zip", hash = "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"}, -] - [[package]] name = "zipp" version = "3.17.0" @@ -1817,78 +1014,11 @@ files = [ 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"] -[[package]] -name = "zope-deprecation" -version = "5.0" -description = "Zope Deprecation Infrastructure" -optional = false -python-versions = ">= 3.7" -files = [ - {file = "zope.deprecation-5.0-py3-none-any.whl", hash = "sha256:28c2ee983812efb4676d33c7a8c6ade0df191c1c6d652bbbfe6e2eeee067b2d4"}, - {file = "zope.deprecation-5.0.tar.gz", hash = "sha256:b7c32d3392036b2145c40b3103e7322db68662ab09b7267afe1532a9d93f640f"}, -] - -[package.dependencies] -setuptools = "*" - -[package.extras] -docs = ["Sphinx"] -test = ["zope.testrunner"] - -[[package]] -name = "zope-interface" -version = "6.2" -description = "Interfaces for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zope.interface-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:506f5410b36e5ba494136d9fa04c548eaf1a0d9c442b0b0e7a0944db7620e0ab"}, - {file = "zope.interface-6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b386b8b9d2b6a5e1e4eadd4e62335571244cb9193b7328c2b6e38b64cfda4f0e"}, - {file = "zope.interface-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb0b3f2cb606981c7432f690db23506b1db5899620ad274e29dbbbdd740e797"}, - {file = "zope.interface-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7916380abaef4bb4891740879b1afcba2045aee51799dfd6d6ca9bdc71f35f"}, - {file = "zope.interface-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b240883fb43160574f8f738e6d09ddbdbf8fa3e8cea051603d9edfd947d9328"}, - {file = "zope.interface-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:8af82afc5998e1f307d5e72712526dba07403c73a9e287d906a8aa2b1f2e33dd"}, - {file = "zope.interface-6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d45d2ba8195850e3e829f1f0016066a122bfa362cc9dc212527fc3d51369037"}, - {file = "zope.interface-6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76e0531d86523be7a46e15d379b0e975a9db84316617c0efe4af8338dc45b80c"}, - {file = "zope.interface-6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59f7374769b326a217d0b2366f1c176a45a4ff21e8f7cebb3b4a3537077eff85"}, - {file = "zope.interface-6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25e0af9663eeac6b61b231b43c52293c2cb7f0c232d914bdcbfd3e3bd5c182ad"}, - {file = "zope.interface-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e02a6fc1772b458ebb6be1c276528b362041217b9ca37e52ecea2cbdce9fac"}, - {file = "zope.interface-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:02adbab560683c4eca3789cc0ac487dcc5f5a81cc48695ec247f00803cafe2fe"}, - {file = "zope.interface-6.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8f5d2c39f3283e461de3655e03faf10e4742bb87387113f787a7724f32db1e48"}, - {file = "zope.interface-6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:75d2ec3d9b401df759b87bc9e19d1b24db73083147089b43ae748aefa63067ef"}, - {file = "zope.interface-6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa994e8937e8ccc7e87395b7b35092818905cf27c651e3ff3e7f29729f5ce3ce"}, - {file = "zope.interface-6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ede888382882f07b9e4cd942255921ffd9f2901684198b88e247c7eabd27a000"}, - {file = "zope.interface-6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2606955a06c6852a6cff4abeca38346ed01e83f11e960caa9a821b3626a4467b"}, - {file = "zope.interface-6.2-cp312-cp312-win_amd64.whl", hash = "sha256:ac7c2046d907e3b4e2605a130d162b1b783c170292a11216479bb1deb7cadebe"}, - {file = "zope.interface-6.2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:febceb04ee7dd2aef08c2ff3d6f8a07de3052fc90137c507b0ede3ea80c21440"}, - {file = "zope.interface-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fc711acc4a1c702ca931fdbf7bf7c86f2a27d564c85c4964772dadf0e3c52f5"}, - {file = "zope.interface-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:396f5c94654301819a7f3a702c5830f0ea7468d7b154d124ceac823e2419d000"}, - {file = "zope.interface-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd374927c00764fcd6fe1046bea243ebdf403fba97a937493ae4be2c8912c2b"}, - {file = "zope.interface-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a3046e8ab29b590d723821d0785598e0b2e32b636a0272a38409be43e3ae0550"}, - {file = "zope.interface-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de125151a53ecdb39df3cb3deb9951ed834dd6a110a9e795d985b10bb6db4532"}, - {file = "zope.interface-6.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f444de0565db46d26c9fa931ca14f497900a295bd5eba480fc3fad25af8c763e"}, - {file = "zope.interface-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2fefad268ff5c5b314794e27e359e48aeb9c8bb2cbb5748a071757a56f6bb8f"}, - {file = "zope.interface-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97785604824981ec8c81850dd25c8071d5ce04717a34296eeac771231fbdd5cd"}, - {file = "zope.interface-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7b2bed4eea047a949296e618552d3fed00632dc1b795ee430289bdd0e3717f3"}, - {file = "zope.interface-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:d54f66c511ea01b9ef1d1a57420a93fbb9d48a08ec239f7d9c581092033156d0"}, - {file = "zope.interface-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5ee9789a20b0081dc469f65ff6c5007e67a940d5541419ca03ef20c6213dd099"}, - {file = "zope.interface-6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af27b3fe5b6bf9cd01b8e1c5ddea0a0d0a1b8c37dc1c7452f1e90bf817539c6d"}, - {file = "zope.interface-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bce517b85f5debe07b186fc7102b332676760f2e0c92b7185dd49c138734b70"}, - {file = "zope.interface-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ae9793f114cee5c464cc0b821ae4d36e1eba961542c6086f391a61aee167b6f"}, - {file = "zope.interface-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87698e2fea5ca2f0a99dff0a64ce8110ea857b640de536c76d92aaa2a91ff3a"}, - {file = "zope.interface-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:b66335bbdbb4c004c25ae01cc4a54fd199afbc1fd164233813c6d3c2293bb7e1"}, - {file = "zope.interface-6.2.tar.gz", hash = "sha256:3b6c62813c63c543a06394a636978b22dffa8c5410affc9331ce6cdb5bfa8565"}, -] - -[package.dependencies] -setuptools = "*" - -[package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx_rtd_theme"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +[extras] +index = ["pypiserver"] +serve = ["pypiserver", "watchfiles"] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "5ae5fc91166aedbadd6c63760115c86d5464e6e119b470910cb60b22aaed0fff" +content-hash = "4596665ba9919a9b9d4133a93e3ae674198d7d52103c97846ecac4a1419fc013" diff --git a/pyproject.toml b/pyproject.toml index b7dbe894..2e81056a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,15 +32,13 @@ msgspec = "^0.18.4" twine = "^4.0.2" hatchling = "^1.20.0" chevron-blue = "^0.2.1" +setuptools = "^69.1.1" +pypiserver = { version ="^2.0.1", optional = true} +watchfiles = { version = "^0.21.0", optional = true} -[tool.poetry.group.serve.dependencies] -pypiserver = "^2.0.1" -watchfiles = "^0.21.0" - -[tool.poetry.group.index.dependencies] -devpi = "^2.2.0" -devpi-server = {git = "https://github.com/zanieb/devpi", rev = "22f71acb8f08a59a098e7ad434cf388a1193fc24", subdirectory = "server"} -waitress = "^3.0.0" +[tool.poetry.extras] +index = ["pypiserver"] +serve = ["pypiserver", "watchfiles"] [tool.poetry.group.dev.dependencies] syrupy = "^4.6.0" diff --git a/scenarios/requires-python.json b/scenarios/requires-python.json index aa5b9180..887a3122 100644 --- a/scenarios/requires-python.json +++ b/scenarios/requires-python.json @@ -11,7 +11,7 @@ "a": { "versions": { "1.0.0": { - "requires_python": ">=4.0" + "requires_python": ">=3.30" } } } @@ -460,4 +460,4 @@ } } } -] \ No newline at end of file +] diff --git a/src/packse/build.py b/src/packse/build.py index 0549b97e..16dd859f 100644 --- a/src/packse/build.py +++ b/src/packse/build.py @@ -38,11 +38,15 @@ def build( short_names: bool, no_hash: bool, skip_root: bool, - work_dir: Path | None = None, + dist_dir: Path | None = None, + build_dir: Path | None = None, ): + start_time = time.time() + # Validate and collect all targets first scenarios = [] - work_dir = work_dir or Path.cwd() + dist_dir = dist_dir or (Path.cwd() / "dist") + build_dir = build_dir or (Path.cwd() / "build") for target in targets: if not target.exists(): @@ -73,7 +77,8 @@ def build( short_names, no_hash, skip_root, - work_dir, + build_dir, + dist_dir, ) for scenario in scenarios ] @@ -84,6 +89,12 @@ def build( for result in sorted(results): print(result) + logger.info( + "Built %s scenarios in %.2fs", + len(results), + time.time() - start_time, + ) + def build_scenario( scenario: Scenario, @@ -91,7 +102,8 @@ def build_scenario( short_names: bool, no_hash: bool, skip_root: bool, - work_dir: Path, + build_dir: Path, + dist_dir: Path, ) -> str: """ Build the scenario defined at the given path. @@ -104,14 +116,14 @@ def build_scenario( if not no_hash: name = f"{name}-{hash}" - build_destination = work_dir / "build" / name - dist_destination = work_dir / "dist" / name + build_destination = build_dir / name + dist_destination = dist_dir / name start_time = time.time() logger.info( "Building '%s' in directory '%s'", name, - build_destination.relative_to(work_dir), + build_destination, ) if build_destination.exists(): @@ -138,7 +150,6 @@ def build_scenario( scenario_version=hash, name=name, package=package, - work_dir=work_dir, build_destination=build_destination, dist_destination=dist_destination, short_names=short_names, @@ -155,7 +166,6 @@ def build_scenario( scenario_version=hash, name=scenario.name, package=make_root_package(scenario), - work_dir=work_dir, build_destination=build_destination, dist_destination=dist_destination, short_names=short_names, @@ -199,7 +209,6 @@ def build_scenario_package( scenario_version: str, name: str, package: Package, - work_dir: Path, build_destination: Path, dist_destination: Path, short_names: bool, @@ -262,7 +271,7 @@ def build_scenario_package( template_config, package_version, package_destination ): shared_path = dist_destination / dist.name - logger.debug("Linked distribution to %s", shared_path.relative_to(work_dir)) + logger.debug("Linked distribution to %s", shared_path) shared_path.hardlink_to(dist) if package_version.yanked: diff --git a/src/packse/cli.py b/src/packse/cli.py index 270fcdcd..15784846 100644 --- a/src/packse/cli.py +++ b/src/packse/cli.py @@ -9,6 +9,7 @@ BuildError, DestinationAlreadyExists, PublishError, + ServeCommandError, ServeError, UserError, ) @@ -51,6 +52,9 @@ def entrypoint(): except PublishError as exc: print(f"{exc}.", file=sys.stderr) exit(1) + except ServeCommandError as exc: + print(f"{exc}", file=sys.stderr) + exit(1) except ServeError as exc: print(f"{exc}.", file=sys.stderr) exit(1) @@ -97,7 +101,8 @@ def _call_serve(args): args.targets, host=args.host, port=args.port, - storage_path=args.storage_path, + dist_dir=args.dist_dir, + build_dir=args.build_dir, short_names=args.short_names, no_hash=args.no_hash, offline=args.offline, @@ -109,15 +114,14 @@ def _call_index_up(args): host=args.host, port=args.port, reset=args.reset, - storage_path=args.storage_path, + dist_dir=args.dist_dir, background=args.bg, offline=args.offline, - all=args.all, ) def _call_index_down(args): - success = index_down(storage_path=args.storage_path) + success = index_down() if not success: exit(1) @@ -128,7 +132,6 @@ def _call_publish(args): index_url=args.index_url, dry_run=args.dry_run, skip_existing=args.skip_existing, - retry_on_rate_limit=args.retry, anonymous=args.anonymous, workers=args.workers, ) @@ -279,11 +282,6 @@ def _add_publish_parser(subparsers): action="store_true", help="Skip existing distributions instead of failing.", ) - parser.add_argument( - "--retry", - action="store_true", - help="Retry when rate limits are encountered instead of failing. Note retries must be very long to succeed.", - ) parser.add_argument( "--workers", type=int, @@ -349,10 +347,16 @@ def _add_serve_parser(subparsers): help="The port to bind the package index to.", ) parser.add_argument( - "--storage-path", + "--dist-dir", + type=Path, + default="./dist", + help="The directory to store and serve builds from.", + ) + parser.add_argument( + "--build-dir", type=Path, - default=".", - help="The path to store served builds at.", + default="./build", + help="The direcotry to store intermediate build artifacts in.", ) parser.add_argument( "--short-names", @@ -397,10 +401,10 @@ def _add_index_parser(subparsers): help="Reset the server's state on start.", ) up.add_argument( - "--storage-path", + "--dist-dir", type=Path, - default=None, - help="The path to store server data at. Defaults to '~/.packse' if in the background, otherwise a temporary directory is used.", + default="./dist", + help="The directory to serve builds from.", ) up.add_argument( "--bg", @@ -410,22 +414,11 @@ def _add_index_parser(subparsers): up.add_argument( "--offline", action="store_true", - help="Run the all index servers without acccess to the real PyPI.", - ) - up.add_argument( - "--all", - action="store_true", - help="Output the index server URL that allows fallback to the real PyPI.", + help="Run the index server without acccess to the real PyPI.", ) up.set_defaults(call=_call_index_up) down = subparsers.add_parser("down", help="Stop a running package index server.") - down.add_argument( - "--storage-path", - type=Path, - default=None, - help="The path used to store server data.", - ) down.set_defaults(call=_call_index_down) _add_shared_arguments(parser) diff --git a/src/packse/error.py b/src/packse/error.py index f8b4b543..92d360e2 100644 --- a/src/packse/error.py +++ b/src/packse/error.py @@ -79,6 +79,12 @@ def __init__(self, package: str) -> None: super().__init__(message) +class PublishConnectionError(PublishError): + def __init__(self, package: str) -> None: + message = f"Publish of '{package}' failed due to a connection error" + super().__init__(message) + + class InvalidPublishTarget(UserError): def __init__(self, path: Path, reason: str) -> None: message = f"Publish target at '{path}' is not a valid: {reason}" @@ -90,6 +96,18 @@ def __init__(self, message: str) -> None: super().__init__(message) +class ServeThreadError(ServeError): + def __init__(self, message: str) -> None: + super().__init__(message) + + +class ServeCommandError(ServeError): + def __init__(self, message: str, stderr: str) -> None: + if stderr.strip(): + message += f":\n\n{stderr}" + super().__init__(message) + + class ServeAddressInUse(ServeError): def __init__(self, url: str) -> None: message = f"Address '{url}' already in use" @@ -98,5 +116,5 @@ def __init__(self, url: str) -> None: class ServeAlreadyRunning(ServeError): def __init__(self) -> None: - message = "Server is already running." + message = "Server is already running" super().__init__(message) diff --git a/src/packse/index.py b/src/packse/index.py index d59f8bbb..37ac300d 100644 --- a/src/packse/index.py +++ b/src/packse/index.py @@ -1,17 +1,23 @@ import errno +import importlib import logging import os -import secrets import shutil import signal import subprocess +import sys import time from contextlib import contextmanager, nullcontext from pathlib import Path -from tempfile import TemporaryDirectory +from typing import Generator from packse import __development_base_path__ -from packse.error import RequiresExtra, ServeAddressInUse, ServeAlreadyRunning +from packse.error import ( + RequiresExtra, + ServeAddressInUse, + ServeAlreadyRunning, + ServeCommandError, +) logger = logging.getLogger(__name__) @@ -20,144 +26,77 @@ def index_up( host: str = "localhost", port: int = 3141, background: bool = False, - storage_path: Path | None = None, + dist_dir: Path | None = None, reset: bool = False, offline: bool = False, - all: bool = False, ): - if not shutil.which("devpi"): + try: + importlib.import_module("pypiserver") + except ImportError: raise RequiresExtra("index commands", "index") - server_url = f"http://{host}:{port}" + if not dist_dir: + dist_dir = Path.cwd() / "dist" + else: + dist_dir = Path(dist_dir).resolve() if background: - if pid := get_server_pid(storage_path): + if pid := get_server_pid(): if is_running(pid): raise ServeAlreadyRunning() - storage_context = ( - nullcontext(storage_path) - if storage_path is not None - else ( - get_storage_directory(storage_path) - if background - else TemporaryDirectory(prefix="packse-serve-") - ) - ) - - exists_ok = (background or storage_path is not None) and not reset - - with storage_context as storage_path: - # Ensure we have the right type, tmpdir returns a string - storage_path = Path(storage_path) - server_storage = storage_path / "server" - client_storage = storage_path / "client" - - if reset: - logger.info("Clearing existing server data...") - if server_storage.exists(): - shutil.rmtree(server_storage) - if client_storage.exists(): - shutil.rmtree(client_storage) - - logger.debug("Storing data at %s", storage_path) - - if not server_storage.exists(): - init_server(server_storage) - - server_log_path = storage_path / "server.log" if background else None - - logger.info("Starting server at %s...", server_url) - with start_index_server( - storage_path, - server_storage, - host, - port, - server_log_path, - offline=offline, - ) as server_process: - init_client(client_storage, server_url) - - password = create_or_read_password(storage_path) - - username = "packages" - create_user( - username, - client_storage, - password, - exists_ok=exists_ok, - ) - - logger.debug("Logging in...") - login_user(username, password, client_storage) - - all_index = "packages/all" - local_index = "packages/local" - pypi_index = "packages/pypi" - test_pypi_index = "packages/test-pypi" + if reset: + logger.info("Clearing existing server data...") + if dist_dir.exists(): + shutil.rmtree(dist_dir) - # First, create the "local" index which does not allow fallback to PyPI - create_index(local_index, client_storage, exists_ok=exists_ok, bases=[]) - - # Crate mirror indexes for PyPI - create_mirror_index( - test_pypi_index, client_storage, "https://test.pypi.org/simple/" - ) - create_mirror_index(pypi_index, client_storage, "https://pypi.org/simple/") - - # Then, create the "all" index which pulls from the "local" index or PyPI - create_index( - all_index, - client_storage, - exists_ok=exists_ok, - bases=[local_index, pypi_index, test_pypi_index], - ) - - logger.info("Uploading build dependencies to local index...") - add_build_requirements(local_index, client_storage) - - all_index_url = f"{server_url}/{all_index}" - local_index_url = f"{server_url}/{local_index}" - logger.info("Indexes available at %s//+simple", server_url) - - logger.debug( - "To use `devpi` commands, include `--clientdir %s`", client_storage - ) + state_path = get_packse_state_path() - if background: - logger.info("Running in background with pid %s", server_process.pid) - logger.info("Stop index server with `packse index down`.") - - if all: - print(all_index_url) - else: - print(local_index_url) + logger.debug("Storing server metadata at %s", state_path) + server_log_path = state_path / "server.log" if background else None + index_url = f"http://{host}:{port}" + index_note = "offline index" if offline else "local index with PyPI fallback" + logger.info("Starting %s at %s", index_note, index_url) + with start_index_server( + dist_dir, + host, + port, + server_log_path, + offline=offline, + ) as server_process: + # Copy build dependencies over + add_vendored_build_deps(dist_dir, offline) + + if background: + logger.info("Running in background with pid %s", server_process.pid) + logger.info("Stop index server with `packse index down`.") + print(index_url) - else: - logger.info("Ready! [Stop with Ctrl-C]") + else: + debug = logger.getEffectiveLevel() <= logging.DEBUG + if not debug: + logger.info("Hiding server output, use `-v` to stream server logs") - line = "" - debug = logger.getEffectiveLevel() <= logging.DEBUG - while True: - line = server_process.stdout.readline().decode() - if debug: - print(line, end="") + logger.info("Ready! [Stop with Ctrl-C]") + line = "" + while True: + line = server_process.stdout.readline().decode() + if debug: + print(line, end="") -def index_down(storage_path: Path | None) -> bool: - if not shutil.which("devpi"): - raise RequiresExtra("index commands", "index") - storage_path = get_storage_directory(storage_path, create=False) +def index_down() -> bool: + state_path = get_packse_state_path(create=False) - if not storage_path.exists(): + if not state_path.exists(): logger.warning("No server detected!") return False - if pid := get_server_pid(storage_path): + if pid := get_server_pid(): if not is_running(pid): logger.info("Server looks shutdown already.") - reset_pidfile(storage_path) + reset_pidfile() return logger.info("Stopping server with pid %s...", pid) @@ -182,7 +121,7 @@ def index_down(storage_path: Path | None) -> bool: while is_running(pid): time.sleep(0.1) - reset_pidfile(storage_path) + reset_pidfile() logger.info("Stopped server!") return True else: @@ -192,36 +131,35 @@ def index_down(storage_path: Path | None) -> bool: @contextmanager def start_index_server( - storage_path: Path, - server_storage: Path, + dist_dir: Path, host: str, port: int, - server_log_path: Path, + server_log_path: Path | None, offline: bool, -) -> subprocess.Popen: +) -> Generator[subprocess.Popen, None, None]: server_url = f"http://{host}:{port}" + dist_dir.mkdir(parents=True, exist_ok=True) + command = [ - "devpi-server", - "--serverdir", - str(server_storage), + sys.executable, + "-m", + "pypiserver", + "run", "--host", host, "--port", str(port), - # Do not spawn a background thread crawling PyPI - "--requests-only", - # Future default behavior - "--absolute-urls", - # Lots of threads for lots of parallel requests (default of 50) - "--threads", - "200", - # Increase the PyPI request timeout (default of 5) - "--request-timeout", - "30", + "-v", + # Disable auth + "-P", + ".", + "-a", + ".", + str(dist_dir), ] if offline: - command.append("--offline") + command.append("--disable-fallback") logger.debug("Running: %s", " ".join(command)) @@ -237,15 +175,48 @@ def start_index_server( server_process.stdout ) as server_output: line = "" - while "Serving on" not in line: + lines = [] + + # Watch for startup + # TODO: Use a healthceck instead? + while "Serving on" not in line and "Listening on" not in line: + try: + server_process.wait(0) + except subprocess.TimeoutExpired: + pass + else: + # The process stopped already + if ( + logger.getEffectiveLevel() > logging.DEBUG + and server_output.seekable() + ): + server_output.seek(0) + err_output = ( + "\n".join(lines) + server_output.read().decode().strip() + ) + raise ServeCommandError("Failed to start server!", err_output) + line = server_output.readline().decode() if logger.getEffectiveLevel() <= logging.DEBUG: print(line, end="") + elif not server_output.seekable(): + # Track the lines if we'll never be able to get them back + lines.append(line) if "Address already in use" in line: raise ServeAddressInUse(server_url) # Server started! - write_server_pid(storage_path, server_process.pid) + write_server_pid(server_process.pid) + + if server_log_path: + logger.info("Writing server logs to %s", server_log_path) + + try: + display_path = f"./{dist_dir.relative_to(Path.cwd())}" + except Exception: + display_path = dist_dir + + logger.info(f"Serving distributions from {display_path}") yield server_process @@ -264,193 +235,51 @@ def start_index_server( # Do not reset the pidfile when a server was already running! if not isinstance(exc, ServeAddressInUse): - reset_pidfile(storage_path) + reset_pidfile() raise -def create_or_read_password(storage_path: Path) -> str: - password_path = storage_path / "password" - if password_path.exists(): - logger.debug("Using previously generated password...") - password = password_path.read_text() - else: - logger.debug("Generating password...") - password = secrets.token_urlsafe() - password_path.write_text(password) - return password - - -def init_server(server_storage: Path): - logger.info("Initializing server...") - subprocess.check_output( - ["devpi-init", "--serverdir", str(server_storage)], - stderr=subprocess.STDOUT, - ) - - -def init_client(client_storage: Path, server_url: str): - logger.info("Configuring client...") - subprocess.check_output( - ["devpi", "use", "--clientdir", str(client_storage), server_url], - stderr=subprocess.STDOUT, - ) - - -def add_build_requirements( - to_index: str, - client_storage: Path, -): - """ - Pushes package build requirements to an index that does not allow fallback to PyPI. - """ +def add_vendored_build_deps(dist_dir: Path, offline: bool): build_directory = __development_base_path__ / "vendor" / "build" if build_directory.exists(): - logger.debug("Uploading build packages to index %s", to_index) - subprocess.check_output( - [ - "devpi", - "upload", - "--clientdir", - str(client_storage), - "--from-dir", - str(build_directory.resolve()), - "--index", - to_index, - ] - ) + logger.debug("Copying vendored build dependencies...") + shutil.copytree(build_directory, dist_dir / "build", dirs_exist_ok=True) else: logger.warning("No vendored build dependencies found at %s" % build_directory) + if offline: + logger.error( + "Server has no fallback PyPI access and source distribution builds are likely to fail" + ) -def create_mirror_index( - name: str, - client_storage: Path, - url: str, - exists_ok: bool = False, -): - logger.info("Creating mirror package index %r for %s...", name, url) - command = [ - "devpi", - "index", - "--clientdir", - str(client_storage), - "-c", - name, - "type=mirror", - f"mirror_url={url}", - ] - try: - subprocess.check_output( - command, - stderr=subprocess.STDOUT, - ) - except subprocess.CalledProcessError as exc: - # TODO(zanieb): Improve these error handling cases - if not exists_ok and "409 Conflict" not in exc.stdout.decode(): - raise - - -def create_index( - name: str, - client_storage: Path, - bases: list[str], - exists_ok: bool = False, -): - logger.info("Creating package index %r...", name) - command = [ - "devpi", - "index", - "--clientdir", - str(client_storage), - "-c", - name, - "volatile=False", - "acl_upload=:ANONYMOUS:", # Do not require auth to upload packages - ] - if bases: - command.append("bases={}".format(",".join(bases))) - try: - subprocess.check_output( - command, - stderr=subprocess.STDOUT, - ) - except subprocess.CalledProcessError as exc: - # TODO(zanieb): Improve these error handling cases - if not exists_ok and "409 Conflict" not in exc.stdout.decode(): - raise - - -def create_user( - username: str, client_storage: Path, password: str, exists_ok: bool = False -): - logger.debug("Creating user %r...", username) - try: - subprocess.check_output( - [ - "devpi", - "user", - "--clientdir", - str(client_storage), - "-c", - username, - "email=null", - f"password={password}", - ], - stderr=subprocess.STDOUT, - ) - except subprocess.CalledProcessError as exc: - if ( - not exists_ok - and "409 Conflict: user already exists" not in exc.stdout.decode() - ): - raise - - -def login_user(username: str, password: str, client_storage: Path): - subprocess.check_output( - [ - "devpi", - "login", - "--clientdir", - str(client_storage), - username, - f"--password={password}", - ], - stderr=subprocess.STDOUT, - ) - - -def get_storage_directory(storage_path: Path | None, create: bool = True) -> Path: - path = ( - storage_path - or os.environ.get("PACKSE_STORAGE_PATH") - or (Path.home() / ".packse") - ) +def get_packse_state_path(create: bool = True) -> Path: + path = Path(os.environ.get("PACKSE_STATE_PATH") or (Path.home() / ".packse")) if create: path.mkdir(exist_ok=True) return path -def get_pidfile_path(storage_path: Path | None) -> Path: - return get_storage_directory(storage_path) / "server.pid" +def get_pidfile_path() -> Path: + return get_packse_state_path() / "server.pid" -def get_server_pid(storage_path: Path | None) -> int | None: - pidfile = get_pidfile_path(storage_path) +def get_server_pid() -> int | None: + pidfile = get_pidfile_path() if not pidfile.exists(): return None else: + logger.debug("Found existing pid at %s", pidfile) return int(pidfile.read_text()) -def write_server_pid(storage_path: Path | None, pid: int) -> None: - pidfile = get_pidfile_path(storage_path) +def write_server_pid(pid: int) -> None: + pidfile = get_pidfile_path() pidfile.write_text(str(pid)) -def reset_pidfile(storage_path: Path | None): - pidfile = get_pidfile_path(storage_path) +def reset_pidfile(): + pidfile = get_pidfile_path() pidfile.unlink(missing_ok=True) diff --git a/src/packse/publish.py b/src/packse/publish.py index c833de63..e61db417 100644 --- a/src/packse/publish.py +++ b/src/packse/publish.py @@ -14,6 +14,7 @@ from packse.error import ( InvalidPublishTarget, PublishAlreadyExists, + PublishConnectionError, PublishError, PublishNoCredentials, PublishRateLimit, @@ -27,7 +28,7 @@ # At the time of writing, rate limits enforce a maximum of 20 new projects / hour. # Generally, retries aren't going to help. MAX_ATTEMPTS = 3 -RETRY_TIME = 60 * 2 # Start with two minutes +RETRY_TIME = 1 # Start with one second RETRY_BACKOFF_FACTOR = 1.5 @@ -36,10 +37,11 @@ def publish( index_url: str, skip_existing: bool, dry_run: bool, - retry_on_rate_limit: bool, workers: int, anonymous: bool, ): + start_time = time.time() + if not anonymous and not ( "TWINE_PASSWORD" in os.environ or "PACKSE_PUBLISH_PASSWORD" in os.environ ): @@ -68,7 +70,6 @@ def publish( index_url, skip_existing=skip_existing, dry_run=dry_run, - retry_on_rate_limit=retry_on_rate_limit, anonymous=anonymous, ) for target in targets @@ -88,8 +89,10 @@ def publish( s = "" if targets == 1 else "s" raise PublishError(f"Failed to publish {incomplete}/{len(targets)} target{s}") - for result in sorted(future.result() for future in futures): - print(result) + total_files = 0 + for name, files in sorted(future.result() for future in futures): + print(name) + total_files += files for target in targets: yankfile = target.with_suffix(".yanked") @@ -104,6 +107,13 @@ def publish( ) print(f"\t{package_version}: {url}") + logger.info( + "Published %s targets (%s new files) in %.2fs", + len(futures), + total_files, + time.time() - start_time, + ) + def publish_package_distributions( target: Path, @@ -111,22 +121,23 @@ def publish_package_distributions( skip_existing: bool, dry_run: bool, anonymous: bool, - retry_on_rate_limit: bool, -) -> str: +) -> tuple[str, int]: """ Publish a directory of package distribution files. """ + files = 0 for distfile in sorted(target.iterdir()): - publish_package_distribution_with_retries( + if publish_package_distribution_with_retries( distfile, index_url, skip_existing=skip_existing, dry_run=dry_run, anonymous=anonymous, - max_attempts=MAX_ATTEMPTS if retry_on_rate_limit else 1, - ) + max_attempts=MAX_ATTEMPTS, + ): + files += 1 - return target.name + return (target.name, files) def publish_package_distribution_with_retries( @@ -136,7 +147,7 @@ def publish_package_distribution_with_retries( dry_run: bool, anonymous: bool, max_attempts: int, -): +) -> bool: """ Publish a package distribution file with retries and error handling. """ @@ -153,19 +164,22 @@ def publish_package_distribution_with_retries( if not skip_existing: raise logger.info("Skipped '%s': already published.", target.name) - except PublishRateLimit: + return False + except PublishConnectionError: if attempts >= max_attempts: raise logger.warning( - "Encountered rate limit publishing '%s', retrying in ~%d minutes", + "Encountered connection error publishing '%s', retrying in %ds", target.name, - retry_time // 60, + retry_time, ) time.sleep(retry_time) else: logger.info("Published '%s'", target.name) break + return True + def publish_package_distribution( target: Path, index_url: str, anonymous: bool, dry_run: bool @@ -211,6 +225,8 @@ def publish_package_distribution( raise PublishAlreadyExists(target.name) if "HTTPError: 429 Too Many Requests" in output: raise PublishRateLimit(target.name) + if "ConnectionError" in output: + raise PublishConnectionError(target.name) raise PublishToolError( f"Publishing {target.name} with twine failed", output, diff --git a/src/packse/serve.py b/src/packse/serve.py index 5d3b8d5d..548eb2c9 100644 --- a/src/packse/serve.py +++ b/src/packse/serve.py @@ -1,13 +1,11 @@ +import importlib import logging -import shutil -import subprocess -import sys import threading from pathlib import Path -from packse import __development_base_path__ from packse.build import build -from packse.error import RequiresExtra +from packse.error import RequiresExtra, ServeThreadError +from packse.index import add_vendored_build_deps, start_index_server try: import watchfiles @@ -21,61 +19,75 @@ def serve( targets: list[Path], - storage_path: Path, + build_dir: Path, + dist_dir: Path, host: str = "localhost", port: int = 3141, short_names: bool = False, no_hash: bool = False, offline: bool = False, ): - if not shutil.which("pypi-server"): - raise RequiresExtra("serve command", "serve") - + try: + importlib.import_module("pypiserver") + except ImportError: + raise RequiresExtra("index commands", "index") if watchfiles is None: raise RequiresExtra("serve command", "serve") - if not targets: - print("Warning: No targets provided, automatic rebuilds not enabled.") - - else: - print("Performing initial build...") - build( - targets, - rm_destination=True, - skip_root=False, - short_names=short_names, - no_hash=no_hash, - work_dir=storage_path, - ) - - build_directory = __development_base_path__ / "vendor" / "build" - if build_directory.exists(): - logger.debug("Copying vendored build dependencies...") - shutil.copytree( - build_directory, storage_path / "dist" / "build", dirs_exist_ok=True - ) - else: - logger.warning("No vendored build dependencies found at %s" % build_directory) + dist_dir = Path(dist_dir) + build_dir = Path(build_dir) + build_ready = threading.Event() rebuild = threading.Thread( - target=rebuild_on_change, - args=(targets, short_names, no_hash, storage_path), + target=build_scenarios, + args=(targets, short_names, no_hash, dist_dir, build_dir, build_ready), + name="serve-build-scenarios", daemon=True, ) serve = threading.Thread( - target=serve_packages, args=(host, port, storage_path, offline) + target=serve_packages, + args=(host, port, dist_dir, offline), + name="serve-package-index", ) rebuild.start() + # Wait up to 60 seconds for the build to complete + for _ in range(60): + if build_ready.wait(1): + break + if not rebuild.is_alive(): + raise ServeThreadError("Build thread failed.") + try: serve.start() finally: serve.join() -def rebuild_on_change( - targets: list[Path], short_names: bool, no_hash: bool, storage_path: Path +def build_scenarios( + targets: list[Path], + short_names: bool, + no_hash: bool, + dist_dir: Path, + build_dir: Path, + ready: threading.Event, ) -> None: + if not targets: + print("Warning: No targets provided, automatic rebuilds not enabled.") + else: + print("Performing initial build...") + build( + targets, + rm_destination=True, + skip_root=False, + short_names=short_names, + no_hash=no_hash, + dist_dir=dist_dir, + build_dir=build_dir, + ) + + ready.set() + for changes in watchfiles.watch(*targets): targets = [path for kind, path in changes if kind != watchfiles.Change.deleted] targets = [Path(target) for target in targets if Path(target).is_file()] @@ -86,26 +98,28 @@ def rebuild_on_change( skip_root=False, short_names=short_names, no_hash=no_hash, - work_dir=storage_path, + dist_dir=dist_dir, + build_dir=build_dir, ) -def serve_packages(host: str, port: int, storage_path: Path, offline: bool): - command = [ - "pypi-server", - "run", - "--host", - host, - "--port", - str(port), - str(storage_path / "dist"), - "-v", - ] - if offline: - command.append("--disable-fallback") - - subprocess.run( - command, - stdout=sys.stdout, - stderr=sys.stderr, - ) +def serve_packages(host: str, port: int, dist_dir: Path, offline: bool): + index_url = f"http://{host}:{port}" + index_note = "offline index" if offline else "local index with PyPI fallback" + + logger.info("Starting %s at %s", index_note, index_url) + with start_index_server( + dist_dir=dist_dir, host=host, port=port, offline=offline, server_log_path=None + ) as process: + debug = logger.getEffectiveLevel() <= logging.DEBUG + if not debug: + logger.info("Hiding server output, use `-v` to stream server logs") + + add_vendored_build_deps(dist_dir, offline) + + logger.info("Ready! [Stop with Ctrl-C]") + line = "" + while True: + line = process.stdout.readline().decode() + if debug: + print(line, end="") diff --git a/tests/__snapshots__/test_build.ambr b/tests/__snapshots__/test_build.ambr index f2275def..4b512a53 100644 --- a/tests/__snapshots__/test_build.ambr +++ b/tests/__snapshots__/test_build.ambr @@ -209,7 +209,7 @@ ''', }), 'stderr': ''' - Building 'example-8597e52a' in directory 'build/example-8597e52a' + Building 'example-8597e52a' in directory '[PWD]/build/example-8597e52a' Destination directory '[PWD]/build/example-8597e52a' already exists. Pass `--rm` to allow removal. ''', diff --git a/tests/__snapshots__/test_index.ambr b/tests/__snapshots__/test_index.ambr index 21fa4dac..678d8d1c 100644 --- a/tests/__snapshots__/test_index.ambr +++ b/tests/__snapshots__/test_index.ambr @@ -30,36 +30,19 @@ 'stdout': '', }) # --- -# name: test_index_down_with_storage_path - dict({ - 'exit_code': 0, - 'stderr': ''' - Stopping server with pid [PID]... - Stopped server! - - ''', - 'stdout': '', - }) -# --- # name: test_index_up_background dict({ 'exit_code': 0, 'stderr': ''' - Initializing server... - Starting server at http://localhost:3141... - Configuring client... - Creating package index 'packages/local'... - Creating mirror package index 'packages/test-pypi' for https://test.pypi.org/simple/... - Creating mirror package index 'packages/pypi' for https://pypi.org/simple/... - Creating package index 'packages/all'... - Uploading build dependencies to local index... - Indexes available at http://localhost:3141//+simple + Starting local index with PyPI fallback at http://localhost:3141 + Writing server logs to [PWD]/.packse/server.log + Serving distributions from ./dist Running in background with pid [PID] Stop index server with `packse index down`. ''', 'stdout': ''' - http://localhost:3141/packages/local + http://localhost:3141 ''', }) @@ -68,15 +51,9 @@ dict({ 'exit_code': '', 'stderr': ''' - Initializing server... - Starting server at http://localhost:3141... - Configuring client... - Creating package index 'packages/local'... - Creating mirror package index 'packages/test-pypi' for https://test.pypi.org/simple/... - Creating mirror package index 'packages/pypi' for https://pypi.org/simple/... - Creating package index 'packages/all'... - Uploading build dependencies to local index... - Indexes available at http://localhost:3141//+simple + Starting local index with PyPI fallback at http://localhost:3141 + Serving distributions from ./dist + Hiding server output, use `-v` to stream server logs Ready! [Stop with Ctrl-C] Interrupted! @@ -84,26 +61,3 @@ 'stdout': '', }) # --- -# name: test_index_up_with_storage_path - dict({ - 'exit_code': 0, - 'stderr': ''' - Initializing server... - Starting server at http://localhost:3141... - Configuring client... - Creating package index 'packages/local'... - Creating mirror package index 'packages/test-pypi' for https://test.pypi.org/simple/... - Creating mirror package index 'packages/pypi' for https://pypi.org/simple/... - Creating package index 'packages/all'... - Uploading build dependencies to local index... - Indexes available at http://localhost:3141//+simple - Running in background with pid [PID] - Stop index server with `packse index down`. - - ''', - 'stdout': ''' - http://localhost:3141/packages/local - - ''', - }) -# --- diff --git a/tests/__snapshots__/test_inspect.ambr b/tests/__snapshots__/test_inspect.ambr index 68c90a80..1efeb0fd 100644 --- a/tests/__snapshots__/test_inspect.ambr +++ b/tests/__snapshots__/test_inspect.ambr @@ -282,7515 +282,8 @@ # name: test_inspect_no_target_finds_all_valid_scenarios dict({ 'exit_code': 0, - 'stderr': '', - 'stdout': ''' - { - "scenarios": [ - { - "name": "requires-package-does-not-exist", - "packages": [], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-package-does-not-exist-a-5a1a4a35", - "name": "requires-package-does-not-exist-a-5a1a4a35", - "module_name": "requires_package_does_not_exist_a_5a1a4a35" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of package `a` which does not exist.", - "source": "[PWD]/scenarios/does-not-exist.json", - "version": "5a1a4a35", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u2514\u2500\u2500 root", - " \u2514\u2500\u2500 requires a", - " \u2514\u2500\u2500 unsatisfied: no versions for package" - ], - "module_name": "requires_package_does_not_exist" - }, - { - "name": "requires-exact-version-does-not-exist", - "packages": [ - { - "name": "requires-exact-version-does-not-exist-a-7cff23d9", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-exact-version-does-not-exist-a-7cff23d9==2.0.0", - "name": "requires-exact-version-does-not-exist-a-7cff23d9", - "module_name": "requires_exact_version_does_not_exist_a_7cff23d9" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires an exact version of package `a` but only other versions exist", - "source": "[PWD]/scenarios/does-not-exist.json", - "version": "7cff23d9", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==2.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "requires_exact_version_does_not_exist" - }, - { - "name": "requires-greater-version-does-not-exist", - "packages": [ - { - "name": "requires-greater-version-does-not-exist-a-63569c9e", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-greater-version-does-not-exist-a-63569c9e>1.0.0", - "name": "requires-greater-version-does-not-exist-a-63569c9e", - "module_name": "requires_greater_version_does_not_exist_a_63569c9e" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of `a` greater than `1.0.0` but only smaller or equal versions exist", - "source": "[PWD]/scenarios/does-not-exist.json", - "version": "63569c9e", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>1.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "requires_greater_version_does_not_exist" - }, - { - "name": "requires-less-version-does-not-exist", - "packages": [ - { - "name": "requires-less-version-does-not-exist-a-2af6fa02", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "4.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-less-version-does-not-exist-a-2af6fa02<2.0.0", - "name": "requires-less-version-does-not-exist-a-2af6fa02", - "module_name": "requires_less_version_does_not_exist_a_2af6fa02" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of `a` less than `1.0.0` but only larger versions exist", - "source": "[PWD]/scenarios/does-not-exist.json", - "version": "2af6fa02", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a<2.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-2.0.0", - " \u251c\u2500\u2500 a-3.0.0", - " \u2514\u2500\u2500 a-4.0.0" - ], - "module_name": "requires_less_version_does_not_exist" - }, - { - "name": "transitive-requires-package-does-not-exist", - "packages": [ - { - "name": "transitive-requires-package-does-not-exist-a-64b04b2b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-requires-package-does-not-exist-b-64b04b2b" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-requires-package-does-not-exist-a-64b04b2b", - "name": "transitive-requires-package-does-not-exist-a-64b04b2b", - "module_name": "transitive_requires_package_does_not_exist_a_64b04b2b" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires package `a` but `a` requires package `b` which does not exist", - "source": "[PWD]/scenarios/does-not-exist.json", - "version": "64b04b2b", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires b", - " \u2514\u2500\u2500 unsatisfied: no versions for package" - ], - "module_name": "transitive_requires_package_does_not_exist" - }, - { - "name": "example", - "packages": [ - { - "name": "example-a-8597e52a", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "example-b-8597e52a>1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "example-b-8597e52a", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "example-c-8597e52a" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "example-a-8597e52a", - "name": "example-a-8597e52a", - "module_name": "example_a_8597e52a" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "example-a-8597e52a", - "version": "1.0.0", - "module_name": "example_a_8597e52a" - }, - { - "name": "example-b-8597e52a", - "version": "3.0.0", - "module_name": "example_b_8597e52a" - } - ], - "explanation": "The latest valid version of `b` should be installed. `b==3.0.0` is not valid because it requires `c` which does not exist." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "This is an example scenario, in which the user depends on a single package `a` which requires `b`.", - "source": "[PWD]/scenarios/example.json", - "version": "8597e52a", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b>1.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-3.0.0", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-1.0.0", - " \u251c\u2500\u2500 b-2.0.0", - " \u2514\u2500\u2500 b-3.0.0", - " \u2514\u2500\u2500 requires c", - " \u2514\u2500\u2500 unsatisfied: no versions for package" - ], - "module_name": "example" - }, - { - "name": "excluded-only-version", - "packages": [ - { - "name": "excluded-only-version-a-72f0d052", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "excluded-only-version-a-72f0d052!=1.0.0", - "name": "excluded-only-version-a-72f0d052", - "module_name": "excluded_only_version_a_72f0d052" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Only `a==1.0.0` is available but the user excluded it." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Only one version of the requested package is available, but the user has banned that version.", - "source": "[PWD]/scenarios/excluded.json", - "version": "72f0d052", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a!=1.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "excluded_only_version" - }, - { - "name": "excluded-only-compatible-version", - "packages": [ - { - "name": "excluded-only-compatible-version-a-d6ce69da", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "excluded-only-compatible-version-b-d6ce69da==1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "excluded-only-compatible-version-b-d6ce69da==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "excluded-only-compatible-version-b-d6ce69da==3.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - }, - { - "name": "excluded-only-compatible-version-b-d6ce69da", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "excluded-only-compatible-version-a-d6ce69da!=2.0.0", - "name": "excluded-only-compatible-version-a-d6ce69da", - "module_name": "excluded_only_compatible_version_a_d6ce69da" - }, - { - "requirement": "excluded-only-compatible-version-b-d6ce69da<3.0.0,>=2.0.0", - "name": "excluded-only-compatible-version-b-d6ce69da", - "module_name": "excluded_only_compatible_version_b_d6ce69da" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Only `a==1.2.0` is available since `a==1.0.0` and `a==3.0.0` require incompatible versions of `b`. The user has excluded that version of `a` so resolution fails." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Only one version of the requested package `a` is compatible, but the user has banned that version.", - "source": "[PWD]/scenarios/excluded.json", - "version": "d6ce69da", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a!=2.0.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-3.0.0", - "\u2502 \u2514\u2500\u2500 requires b<3.0.0,>=2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u251c\u2500\u2500 a-2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2514\u2500\u2500 a-3.0.0", - "\u2502 \u2514\u2500\u2500 requires b==3.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-3.0.0", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-1.0.0", - " \u251c\u2500\u2500 b-2.0.0", - " \u2514\u2500\u2500 b-3.0.0" - ], - "module_name": "excluded_only_compatible_version" - }, - { - "name": "dependency-excludes-range-of-compatible-versions", - "packages": [ - { - "name": "dependency-excludes-range-of-compatible-versions-a-5824fb81", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-b-5824fb81==1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-b-5824fb81==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-b-5824fb81==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-b-5824fb81==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.2.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-b-5824fb81==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.3.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-b-5824fb81==3.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - }, - { - "name": "dependency-excludes-range-of-compatible-versions-b-5824fb81", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - }, - { - "name": "dependency-excludes-range-of-compatible-versions-c-5824fb81", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-a-5824fb81<2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-range-of-compatible-versions-a-5824fb81>=3.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "dependency-excludes-range-of-compatible-versions-a-5824fb81", - "name": "dependency-excludes-range-of-compatible-versions-a-5824fb81", - "module_name": "dependency_excludes_range_of_compatible_versions_a_5824fb81" - }, - { - "requirement": "dependency-excludes-range-of-compatible-versions-b-5824fb81<3.0.0,>=2.0.0", - "name": "dependency-excludes-range-of-compatible-versions-b-5824fb81", - "module_name": "dependency_excludes_range_of_compatible_versions_b_5824fb81" - }, - { - "requirement": "dependency-excludes-range-of-compatible-versions-c-5824fb81", - "name": "dependency-excludes-range-of-compatible-versions-c-5824fb81", - "module_name": "dependency_excludes_range_of_compatible_versions_c_5824fb81" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Only the `2.x` versions of `a` are available since `a==1.0.0` and `a==3.0.0` require incompatible versions of `b`, but all available versions of `c` exclude that range of `a` so resolution fails." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "There is a range of compatible versions for the requested package `a`, but another dependency `c` excludes that range.", - "source": "[PWD]/scenarios/excluded.json", - "version": "5824fb81", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.0.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.1.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.2.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.3.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-3.0.0", - "\u2502 \u251c\u2500\u2500 requires b<3.0.0,>=2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2514\u2500\u2500 requires c", - "\u2502 \u251c\u2500\u2500 satisfied by c-1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-2.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u251c\u2500\u2500 a-2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u251c\u2500\u2500 a-2.1.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u251c\u2500\u2500 a-2.2.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u251c\u2500\u2500 a-2.3.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2514\u2500\u2500 a-3.0.0", - "\u2502 \u2514\u2500\u2500 requires b==3.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-3.0.0", - "\u251c\u2500\u2500 b", - "\u2502 \u251c\u2500\u2500 b-1.0.0", - "\u2502 \u251c\u2500\u2500 b-2.0.0", - "\u2502 \u2514\u2500\u2500 b-3.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u2502 \u2514\u2500\u2500 requires a<2.0.0", - " \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - " \u2514\u2500\u2500 c-2.0.0", - " \u2514\u2500\u2500 requires a>=3.0.0", - " \u2514\u2500\u2500 satisfied by a-3.0.0" - ], - "module_name": "dependency_excludes_range_of_compatible_versions" - }, - { - "name": "dependency-excludes-non-contiguous-range-of-compatible-versions", - "packages": [ - { - "name": "dependency-excludes-non-contiguous-range-of-compatible-versions-a-119f929b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b==1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b==2.0.0", - "dependency-excludes-non-contiguous-range-of-compatible-versions-d-119f929b" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.2.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b==2.0.0", - "dependency-excludes-non-contiguous-range-of-compatible-versions-d-119f929b" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.3.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.4.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b==3.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - }, - { - "name": "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - }, - { - "name": "dependency-excludes-non-contiguous-range-of-compatible-versions-c-119f929b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-a-119f929b<2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [ - "dependency-excludes-non-contiguous-range-of-compatible-versions-a-119f929b>=3.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "dependency-excludes-non-contiguous-range-of-compatible-versions-a-119f929b", - "name": "dependency-excludes-non-contiguous-range-of-compatible-versions-a-119f929b", - "module_name": "dependency_excludes_non_contiguous_range_of_compatible_versions_a_119f929b" - }, - { - "requirement": "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b<3.0.0,>=2.0.0", - "name": "dependency-excludes-non-contiguous-range-of-compatible-versions-b-119f929b", - "module_name": "dependency_excludes_non_contiguous_range_of_compatible_versions_b_119f929b" - }, - { - "requirement": "dependency-excludes-non-contiguous-range-of-compatible-versions-c-119f929b", - "name": "dependency-excludes-non-contiguous-range-of-compatible-versions-c-119f929b", - "module_name": "dependency_excludes_non_contiguous_range_of_compatible_versions_c_119f929b" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Only the `2.x` versions of `a` are available since `a==1.0.0` and `a==3.0.0` require incompatible versions of `b`, but all available versions of `c` exclude that range of `a` so resolution fails." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "There is a non-contiguous range of compatible versions for the requested package `a`, but another dependency `c` excludes the range. This is the same as `dependency-excludes-range-of-compatible-versions` but some of the versions of `a` are incompatible for another reason e.g. dependency on non-existant package `d`.", - "source": "[PWD]/scenarios/excluded.json", - "version": "119f929b", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.0.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.1.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.2.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.3.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-2.4.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-3.0.0", - "\u2502 \u251c\u2500\u2500 requires b<3.0.0,>=2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2514\u2500\u2500 requires c", - "\u2502 \u251c\u2500\u2500 satisfied by c-1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-2.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u251c\u2500\u2500 a-2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u251c\u2500\u2500 a-2.1.0", - "\u2502 \u2502 \u251c\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires d", - "\u2502 \u2502 \u2514\u2500\u2500 unsatisfied: no versions for package", - "\u2502 \u251c\u2500\u2500 a-2.2.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u251c\u2500\u2500 a-2.3.0", - "\u2502 \u2502 \u251c\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires d", - "\u2502 \u2502 \u2514\u2500\u2500 unsatisfied: no versions for package", - "\u2502 \u251c\u2500\u2500 a-2.4.0", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2502 \u2514\u2500\u2500 a-3.0.0", - "\u2502 \u2514\u2500\u2500 requires b==3.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-3.0.0", - "\u251c\u2500\u2500 b", - "\u2502 \u251c\u2500\u2500 b-1.0.0", - "\u2502 \u251c\u2500\u2500 b-2.0.0", - "\u2502 \u2514\u2500\u2500 b-3.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u2502 \u2514\u2500\u2500 requires a<2.0.0", - " \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - " \u2514\u2500\u2500 c-2.0.0", - " \u2514\u2500\u2500 requires a>=3.0.0", - " \u2514\u2500\u2500 satisfied by a-3.0.0" - ], - "module_name": "dependency_excludes_non_contiguous_range_of_compatible_versions" - }, - { - "name": "extra-required", - "packages": [ - { - "name": "extra-required-a-c1e0ed38", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [ - { - "name": "extra", - "requires": [ - "extra-required-b-c1e0ed38" - ] - } - ], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "extra-required-b-c1e0ed38", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "extra-required-a-c1e0ed38[extra]", - "name": "extra-required-a-c1e0ed38", - "module_name": "extra_required_a_c1e0ed38" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "extra-required-a-c1e0ed38", - "version": "1.0.0", - "module_name": "extra_required_a_c1e0ed38" - }, - { - "name": "extra-required-b-c1e0ed38", - "version": "1.0.0", - "module_name": "extra_required_b_c1e0ed38" - } - ], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Optional dependencies are requested for the package.", - "source": "[PWD]/scenarios/extras.json", - "version": "c1e0ed38", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a[extra]", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra]", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 a-1.0.0[extra]", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2514\u2500\u2500 b", - " \u2514\u2500\u2500 b-1.0.0" - ], - "module_name": "extra_required" - }, - { - "name": "missing-extra", - "packages": [ - { - "name": "missing-extra-a-de25a6db", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "missing-extra-a-de25a6db[extra]", - "name": "missing-extra-a-de25a6db", - "module_name": "missing_extra_a_de25a6db" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "missing-extra-a-de25a6db", - "version": "1.0.0", - "module_name": "missing_extra_a_de25a6db" - } - ], - "explanation": "Missing extras are ignored during resolution." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Optional dependencies are requested for the package, but the extra does not exist.", - "source": "[PWD]/scenarios/extras.json", - "version": "de25a6db", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a[extra]", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "missing_extra" - }, - { - "name": "multiple-extras-required", - "packages": [ - { - "name": "multiple-extras-required-a-502cbb59", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [ - { - "name": "extra_b", - "requires": [ - "multiple-extras-required-b-502cbb59" - ] - }, - { - "name": "extra_c", - "requires": [ - "multiple-extras-required-c-502cbb59" - ] - } - ], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "multiple-extras-required-b-502cbb59", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "multiple-extras-required-c-502cbb59", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "multiple-extras-required-a-502cbb59[extra_b,extra_c]", - "name": "multiple-extras-required-a-502cbb59", - "module_name": "multiple_extras_required_a_502cbb59" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "multiple-extras-required-a-502cbb59", - "version": "1.0.0", - "module_name": "multiple_extras_required_a_502cbb59" - }, - { - "name": "multiple-extras-required-b-502cbb59", - "version": "1.0.0", - "module_name": "multiple_extras_required_b_502cbb59" - }, - { - "name": "multiple-extras-required-c-502cbb59", - "version": "1.0.0", - "module_name": "multiple_extras_required_c_502cbb59" - } - ], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Multiple optional dependencies are requested for the package.", - "source": "[PWD]/scenarios/extras.json", - "version": "502cbb59", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a[extra_b,extra_c]", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[extra_b]", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra_c]", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u251c\u2500\u2500 a-1.0.0[extra_b]", - "\u2502 \u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u2514\u2500\u2500 a-1.0.0[extra_c]", - "\u2502 \u2514\u2500\u2500 requires c", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2514\u2500\u2500 c", - " \u2514\u2500\u2500 c-1.0.0" - ], - "module_name": "multiple_extras_required" - }, - { - "name": "all-extras-required", - "packages": [ - { - "name": "all-extras-required-a-4cf56e90", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [ - { - "name": "all", - "requires": [ - "all-extras-required-a-4cf56e90[extra_b]", - "all-extras-required-a-4cf56e90[extra_c]" - ] - }, - { - "name": "extra_b", - "requires": [ - "all-extras-required-b-4cf56e90" - ] - }, - { - "name": "extra_c", - "requires": [ - "all-extras-required-c-4cf56e90" - ] - } - ], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "all-extras-required-b-4cf56e90", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "all-extras-required-c-4cf56e90", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "all-extras-required-a-4cf56e90[all]", - "name": "all-extras-required-a-4cf56e90", - "module_name": "all_extras_required_a_4cf56e90" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "all-extras-required-a-4cf56e90", - "version": "1.0.0", - "module_name": "all_extras_required_a_4cf56e90" - }, - { - "name": "all-extras-required-b-4cf56e90", - "version": "1.0.0", - "module_name": "all_extras_required_b_4cf56e90" - }, - { - "name": "all-extras-required-c-4cf56e90", - "version": "1.0.0", - "module_name": "all_extras_required_c_4cf56e90" - } - ], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Multiple optional dependencies are requested for the package via an 'all' extra.", - "source": "[PWD]/scenarios/extras.json", - "version": "4cf56e90", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a[all]", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[all]", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[extra_b]", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra_c]", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u251c\u2500\u2500 a-1.0.0[all]", - "\u2502 \u2502 \u251c\u2500\u2500 requires a[extra_b]", - "\u2502 \u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[all]", - "\u2502 \u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[extra_b]", - "\u2502 \u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra_c]", - "\u2502 \u2502 \u2514\u2500\u2500 requires a[extra_c]", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[all]", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[extra_b]", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra_c]", - "\u2502 \u251c\u2500\u2500 a-1.0.0[extra_b]", - "\u2502 \u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u2514\u2500\u2500 a-1.0.0[extra_c]", - "\u2502 \u2514\u2500\u2500 requires c", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2514\u2500\u2500 c", - " \u2514\u2500\u2500 c-1.0.0" - ], - "module_name": "all_extras_required" - }, - { - "name": "extra-incompatible-with-extra", - "packages": [ - { - "name": "extra-incompatible-with-extra-a-a5547b80", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [ - { - "name": "extra_b", - "requires": [ - "extra-incompatible-with-extra-b-a5547b80==1.0.0" - ] - }, - { - "name": "extra_c", - "requires": [ - "extra-incompatible-with-extra-b-a5547b80==2.0.0" - ] - } - ], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "extra-incompatible-with-extra-b-a5547b80", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "extra-incompatible-with-extra-a-a5547b80[extra_b,extra_c]", - "name": "extra-incompatible-with-extra-a-a5547b80", - "module_name": "extra_incompatible_with_extra_a_a5547b80" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Because both `extra_b` and `extra_c` are requested and they require incompatible versions of `b`, `a` cannot be installed." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Multiple optional dependencies are requested for the package, but they have conflicting requirements with each other.", - "source": "[PWD]/scenarios/extras.json", - "version": "a5547b80", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a[extra_b,extra_c]", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[extra_b]", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra_c]", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u251c\u2500\u2500 a-1.0.0[extra_b]", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u2514\u2500\u2500 a-1.0.0[extra_c]", - "\u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-1.0.0", - " \u2514\u2500\u2500 b-2.0.0" - ], - "module_name": "extra_incompatible_with_extra" - }, - { - "name": "extra-incompatible-with-extra-not-requested", - "packages": [ - { - "name": "extra-incompatible-with-extra-not-requested-a-8bb31c23", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [ - { - "name": "extra_b", - "requires": [ - "extra-incompatible-with-extra-not-requested-b-8bb31c23==1.0.0" - ] - }, - { - "name": "extra_c", - "requires": [ - "extra-incompatible-with-extra-not-requested-b-8bb31c23==2.0.0" - ] - } - ], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "extra-incompatible-with-extra-not-requested-b-8bb31c23", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "extra-incompatible-with-extra-not-requested-a-8bb31c23[extra_c]", - "name": "extra-incompatible-with-extra-not-requested-a-8bb31c23", - "module_name": "extra_incompatible_with_extra_not_requested_a_8bb31c23" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "extra-incompatible-with-extra-not-requested-a-8bb31c23", - "version": "1.0.0", - "module_name": "extra_incompatible_with_extra_not_requested_a_8bb31c23" - }, - { - "name": "extra-incompatible-with-extra-not-requested-b-8bb31c23", - "version": "2.0.0", - "module_name": "extra_incompatible_with_extra_not_requested_b_8bb31c23" - } - ], - "explanation": "Because the user does not request both extras, it is okay that one is incompatible with the other." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "One of two incompatible optional dependencies are requested for the package.", - "source": "[PWD]/scenarios/extras.json", - "version": "8bb31c23", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a[extra_c]", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[extra_b]", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra_c]", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u251c\u2500\u2500 a-1.0.0[extra_b]", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u2514\u2500\u2500 a-1.0.0[extra_c]", - "\u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-1.0.0", - " \u2514\u2500\u2500 b-2.0.0" - ], - "module_name": "extra_incompatible_with_extra_not_requested" - }, - { - "name": "extra-incompatible-with-root", - "packages": [ - { - "name": "extra-incompatible-with-root-a-aca6971b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [ - { - "name": "extra", - "requires": [ - "extra-incompatible-with-root-b-aca6971b==1.0.0" - ] - } - ], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "extra-incompatible-with-root-b-aca6971b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "extra-incompatible-with-root-a-aca6971b[extra]", - "name": "extra-incompatible-with-root-a-aca6971b", - "module_name": "extra_incompatible_with_root_a_aca6971b" - }, - { - "requirement": "extra-incompatible-with-root-b-aca6971b==2.0.0", - "name": "extra-incompatible-with-root-b-aca6971b", - "module_name": "extra_incompatible_with_root_b_aca6971b" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Because the user requested `b==2.0.0` but the requested extra requires `b==1.0.0`, the dependencies cannot be satisfied." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Optional dependencies are requested for the package, but the extra is not compatible with other requested versions.", - "source": "[PWD]/scenarios/extras.json", - "version": "aca6971b", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a[extra]", - "\u2502 \u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0[extra]", - "\u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 a-1.0.0[extra]", - "\u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-1.0.0", - " \u2514\u2500\u2500 b-2.0.0" - ], - "module_name": "extra_incompatible_with_root" - }, - { - "name": "extra-does-not-exist-backtrack", - "packages": [ - { - "name": "extra-does-not-exist-backtrack-a-c4307e58", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [ - { - "name": "extra", - "requires": [ - "extra-does-not-exist-backtrack-b-c4307e58==1.0.0" - ] - } - ], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - } - ] - }, - { - "name": "extra-does-not-exist-backtrack-b-c4307e58", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "extra-does-not-exist-backtrack-a-c4307e58[extra]", - "name": "extra-does-not-exist-backtrack-a-c4307e58", - "module_name": "extra_does_not_exist_backtrack_a_c4307e58" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "extra-does-not-exist-backtrack-a-c4307e58", - "version": "3.0.0", - "module_name": "extra_does_not_exist_backtrack_a_c4307e58" - } - ], - "explanation": "The resolver should not backtrack to `a==1.0.0` because missing extras are allowed during resolution. `b` should not be installed." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "Optional dependencies are requested for the package, the extra is only available on an older version.", - "source": "[PWD]/scenarios/extras.json", - "version": "c4307e58", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a[extra]", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0[extra]", - "\u2502 \u251c\u2500\u2500 satisfied by a-2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-3.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u251c\u2500\u2500 a-1.0.0", - "\u2502 \u251c\u2500\u2500 a-1.0.0[extra]", - "\u2502 \u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u251c\u2500\u2500 a-2.0.0", - "\u2502 \u2514\u2500\u2500 a-3.0.0", - "\u2514\u2500\u2500 b", - " \u2514\u2500\u2500 b-1.0.0" - ], - "module_name": "extra_does_not_exist_backtrack" - }, - { - "name": "direct-incompatible-versions", - "packages": [ - { - "name": "direct-incompatible-versions-a-c0e7adfa", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "direct-incompatible-versions-a-c0e7adfa==1.0.0", - "name": "direct-incompatible-versions-a-c0e7adfa", - "module_name": "direct_incompatible_versions_a_c0e7adfa" - }, - { - "requirement": "direct-incompatible-versions-a-c0e7adfa==2.0.0", - "name": "direct-incompatible-versions-a-c0e7adfa", - "module_name": "direct_incompatible_versions_a_c0e7adfa" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires two incompatible, existing versions of package `a`", - "source": "[PWD]/scenarios/incompatible-versions.json", - "version": "c0e7adfa", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a==1.0.0", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires a==2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-2.0.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 a-2.0.0" - ], - "module_name": "direct_incompatible_versions" - }, - { - "name": "transitive-incompatible-with-root-version", - "packages": [ - { - "name": "transitive-incompatible-with-root-version-a-a13da883", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-incompatible-with-root-version-b-a13da883==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-incompatible-with-root-version-b-a13da883", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-incompatible-with-root-version-a-a13da883", - "name": "transitive-incompatible-with-root-version-a-a13da883", - "module_name": "transitive_incompatible_with_root_version_a_a13da883" - }, - { - "requirement": "transitive-incompatible-with-root-version-b-a13da883==1.0.0", - "name": "transitive-incompatible-with-root-version-b-a13da883", - "module_name": "transitive_incompatible_with_root_version_b_a13da883" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires packages `a` and `b` but `a` requires a different version of `b`", - "source": "[PWD]/scenarios/incompatible-versions.json", - "version": "a13da883", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b==2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by b-2.0.0", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-1.0.0", - " \u2514\u2500\u2500 b-2.0.0" - ], - "module_name": "transitive_incompatible_with_root_version" - }, - { - "name": "transitive-incompatible-with-transitive", - "packages": [ - { - "name": "transitive-incompatible-with-transitive-a-ec82e315", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-incompatible-with-transitive-c-ec82e315==1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-incompatible-with-transitive-b-ec82e315", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-incompatible-with-transitive-c-ec82e315==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-incompatible-with-transitive-c-ec82e315", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-incompatible-with-transitive-a-ec82e315", - "name": "transitive-incompatible-with-transitive-a-ec82e315", - "module_name": "transitive_incompatible_with_transitive_a_ec82e315" - }, - { - "requirement": "transitive-incompatible-with-transitive-b-ec82e315", - "name": "transitive-incompatible-with-transitive-b-ec82e315", - "module_name": "transitive_incompatible_with_transitive_b_ec82e315" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires package `a` and `b`; `a` and `b` require different versions of `c`", - "source": "[PWD]/scenarios/incompatible-versions.json", - "version": "ec82e315", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c==2.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-2.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u2514\u2500\u2500 c-2.0.0" - ], - "module_name": "transitive_incompatible_with_transitive" - }, - { - "name": "package-only-prereleases", - "packages": [ - { - "name": "package-only-prereleases-a-472fcc7e", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-only-prereleases-a-472fcc7e", - "name": "package-only-prereleases-a-472fcc7e", - "module_name": "package_only_prereleases_a_472fcc7e" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-only-prereleases-a-472fcc7e", - "version": "1.0.0a1", - "module_name": "package_only_prereleases_a_472fcc7e" - } - ], - "explanation": "Since there are only prerelease versions of `a` available, it should be installed even though the user did not include a prerelease specifier." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of package `a` which only has prerelease versions available.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "472fcc7e", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0a1" - ], - "module_name": "package_only_prereleases" - }, - { - "name": "package-only-prereleases-in-range", - "packages": [ - { - "name": "package-only-prereleases-in-range-a-1017748b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-only-prereleases-in-range-a-1017748b>0.1.0", - "name": "package-only-prereleases-in-range-a-1017748b", - "module_name": "package_only_prereleases_in_range_a_1017748b" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since there are stable versions of `a` available, prerelease versions should not be selected without explicit opt-in." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of package `a` which only matches prerelease versions but they did not include a prerelease specifier.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "1017748b", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>0.1.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u2514\u2500\u2500 a-1.0.0a1" - ], - "module_name": "package_only_prereleases_in_range" - }, - { - "name": "requires-package-only-prereleases-in-range-global-opt-in", - "packages": [ - { - "name": "requires-package-only-prereleases-in-range-global-opt-in-a-95140069", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-package-only-prereleases-in-range-global-opt-in-a-95140069>0.1.0", - "name": "requires-package-only-prereleases-in-range-global-opt-in-a-95140069", - "module_name": "requires_package_only_prereleases_in_range_global_opt_in_a_95140069" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "requires-package-only-prereleases-in-range-global-opt-in-a-95140069", - "version": "1.0.0a1", - "module_name": "requires_package_only_prereleases_in_range_global_opt_in_a_95140069" - } - ], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": true, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of package `a` which only matches prerelease versions. They did not include a prerelease specifier for the package, but they opted into prereleases globally.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "95140069", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>0.1.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u2514\u2500\u2500 a-1.0.0a1" - ], - "module_name": "requires_package_only_prereleases_in_range_global_opt_in" - }, - { - "name": "requires-package-prerelease-and-final-any", - "packages": [ - { - "name": "requires-package-prerelease-and-final-any-a-909975d8", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-package-prerelease-and-final-any-a-909975d8", - "name": "requires-package-prerelease-and-final-any-a-909975d8", - "module_name": "requires_package_prerelease_and_final_any_a_909975d8" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "requires-package-prerelease-and-final-any-a-909975d8", - "version": "0.1.0", - "module_name": "requires_package_prerelease_and_final_any_a_909975d8" - } - ], - "explanation": "Since the user did not provide a prerelease specifier, the older stable version should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of package `a` has a prerelease version available and an older non-prerelease version.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "909975d8", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u2514\u2500\u2500 a-1.0.0a1" - ], - "module_name": "requires_package_prerelease_and_final_any" - }, - { - "name": "package-prerelease-specified-only-final-available", - "packages": [ - { - "name": "package-prerelease-specified-only-final-available-a-6f8bea9f", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-prerelease-specified-only-final-available-a-6f8bea9f>=0.1.0a1", - "name": "package-prerelease-specified-only-final-available-a-6f8bea9f", - "module_name": "package_prerelease_specified_only_final_available_a_6f8bea9f" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-prerelease-specified-only-final-available-a-6f8bea9f", - "version": "0.3.0", - "module_name": "package_prerelease_specified_only_final_available_a_6f8bea9f" - } - ], - "explanation": "The latest stable version should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of `a` with a prerelease specifier and only stable releases are available.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "6f8bea9f", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>=0.1.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.1.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.2.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.3.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u251c\u2500\u2500 a-0.2.0", - " \u2514\u2500\u2500 a-0.3.0" - ], - "module_name": "package_prerelease_specified_only_final_available" - }, - { - "name": "package-prerelease-specified-only-prerelease-available", - "packages": [ - { - "name": "package-prerelease-specified-only-prerelease-available-a-48d4bba0", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-prerelease-specified-only-prerelease-available-a-48d4bba0>=0.1.0a1", - "name": "package-prerelease-specified-only-prerelease-available-a-48d4bba0", - "module_name": "package_prerelease_specified_only_prerelease_available_a_48d4bba0" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-prerelease-specified-only-prerelease-available-a-48d4bba0", - "version": "0.3.0a1", - "module_name": "package_prerelease_specified_only_prerelease_available_a_48d4bba0" - } - ], - "explanation": "The latest prerelease version should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of `a` with a prerelease specifier and only prerelease releases are available.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "48d4bba0", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>=0.1.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.1.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.2.0a1", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.3.0a1", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0a1", - " \u251c\u2500\u2500 a-0.2.0a1", - " \u2514\u2500\u2500 a-0.3.0a1" - ], - "module_name": "package_prerelease_specified_only_prerelease_available" - }, - { - "name": "package-prerelease-specified-mixed-available", - "packages": [ - { - "name": "package-prerelease-specified-mixed-available-a-2b1193a7", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-prerelease-specified-mixed-available-a-2b1193a7>=0.1.0a1", - "name": "package-prerelease-specified-mixed-available-a-2b1193a7", - "module_name": "package_prerelease_specified_mixed_available_a_2b1193a7" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-prerelease-specified-mixed-available-a-2b1193a7", - "version": "1.0.0a1", - "module_name": "package_prerelease_specified_mixed_available_a_2b1193a7" - } - ], - "explanation": "Since the user provided a prerelease specifier, the latest prerelease version should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of `a` with a prerelease specifier and both prerelease and stable releases are available.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "2b1193a7", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>=0.1.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.1.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.2.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.3.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0a1", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u251c\u2500\u2500 a-0.2.0a1", - " \u251c\u2500\u2500 a-0.3.0", - " \u2514\u2500\u2500 a-1.0.0a1" - ], - "module_name": "package_prerelease_specified_mixed_available" - }, - { - "name": "package-multiple-prereleases-kinds", - "packages": [ - { - "name": "package-multiple-prereleases-kinds-a-72919cf7", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0b1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0rc1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-multiple-prereleases-kinds-a-72919cf7>=1.0.0a1", - "name": "package-multiple-prereleases-kinds-a-72919cf7", - "module_name": "package_multiple_prereleases_kinds_a_72919cf7" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-multiple-prereleases-kinds-a-72919cf7", - "version": "1.0.0rc1", - "module_name": "package_multiple_prereleases_kinds_a_72919cf7" - } - ], - "explanation": "Release candidates should be the highest precedence prerelease kind." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires `a` which has multiple prereleases available with different labels.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "72919cf7", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>=1.0.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0b1", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0rc1", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-1.0.0a1", - " \u251c\u2500\u2500 a-1.0.0b1", - " \u2514\u2500\u2500 a-1.0.0rc1" - ], - "module_name": "package_multiple_prereleases_kinds" - }, - { - "name": "package-multiple-prereleases-numbers", - "packages": [ - { - "name": "package-multiple-prereleases-numbers-a-cecdb92d", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a2" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a3" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-multiple-prereleases-numbers-a-cecdb92d>=1.0.0a1", - "name": "package-multiple-prereleases-numbers-a-cecdb92d", - "module_name": "package_multiple_prereleases_numbers_a_cecdb92d" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-multiple-prereleases-numbers-a-cecdb92d", - "version": "1.0.0a3", - "module_name": "package_multiple_prereleases_numbers_a_cecdb92d" - } - ], - "explanation": "The latest alpha version should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires `a` which has multiple alphas available.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "cecdb92d", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>=1.0.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0a2", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0a3", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-1.0.0a1", - " \u251c\u2500\u2500 a-1.0.0a2", - " \u2514\u2500\u2500 a-1.0.0a3" - ], - "module_name": "package_multiple_prereleases_numbers" - }, - { - "name": "transitive-package-only-prereleases", - "packages": [ - { - "name": "transitive-package-only-prereleases-a-e3c94488", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-package-only-prereleases-b-e3c94488" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - } - ] - }, - { - "name": "transitive-package-only-prereleases-b-e3c94488", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-package-only-prereleases-a-e3c94488", - "name": "transitive-package-only-prereleases-a-e3c94488", - "module_name": "transitive_package_only_prereleases_a_e3c94488" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "transitive-package-only-prereleases-a-e3c94488", - "version": "0.1.0", - "module_name": "transitive_package_only_prereleases_a_e3c94488" - }, - { - "name": "transitive-package-only-prereleases-b-e3c94488", - "version": "1.0.0a1", - "module_name": "transitive_package_only_prereleases_b_e3c94488" - } - ], - "explanation": "Since there are only prerelease versions of `b` available, it should be selected even though the user did not opt-in to prereleases." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of package `a` which requires `b` which only has prerelease versions available.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "e3c94488", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 b", - " \u2514\u2500\u2500 b-1.0.0a1" - ], - "module_name": "transitive_package_only_prereleases" - }, - { - "name": "transitive-package-only-prereleases-in-range", - "packages": [ - { - "name": "transitive-package-only-prereleases-in-range-a-20238f1b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-package-only-prereleases-in-range-b-20238f1b>0.1" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - } - ] - }, - { - "name": "transitive-package-only-prereleases-in-range-b-20238f1b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-package-only-prereleases-in-range-a-20238f1b", - "name": "transitive-package-only-prereleases-in-range-a-20238f1b", - "module_name": "transitive_package_only_prereleases_in_range_a_20238f1b" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since there are stable versions of `b` available, the prerelease version should not be selected without explicit opt-in. The available version is excluded by the range requested by the user." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires package `a` which has a dependency on a package which only matches prerelease versions but they did not include a prerelease specifier.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "20238f1b", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b>0.1", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-0.1.0", - " \u2514\u2500\u2500 b-1.0.0a1" - ], - "module_name": "transitive_package_only_prereleases_in_range" - }, - { - "name": "transitive-package-only-prereleases-in-range-opt-in", - "packages": [ - { - "name": "transitive-package-only-prereleases-in-range-opt-in-a-d65d5fdf", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-package-only-prereleases-in-range-opt-in-b-d65d5fdf>0.1" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - } - ] - }, - { - "name": "transitive-package-only-prereleases-in-range-opt-in-b-d65d5fdf", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-package-only-prereleases-in-range-opt-in-a-d65d5fdf", - "name": "transitive-package-only-prereleases-in-range-opt-in-a-d65d5fdf", - "module_name": "transitive_package_only_prereleases_in_range_opt_in_a_d65d5fdf" - }, - { - "requirement": "transitive-package-only-prereleases-in-range-opt-in-b-d65d5fdf>0.0.0a1", - "name": "transitive-package-only-prereleases-in-range-opt-in-b-d65d5fdf", - "module_name": "transitive_package_only_prereleases_in_range_opt_in_b_d65d5fdf" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "transitive-package-only-prereleases-in-range-opt-in-a-d65d5fdf", - "version": "0.1.0", - "module_name": "transitive_package_only_prereleases_in_range_opt_in_a_d65d5fdf" - }, - { - "name": "transitive-package-only-prereleases-in-range-opt-in-b-d65d5fdf", - "version": "1.0.0a1", - "module_name": "transitive_package_only_prereleases_in_range_opt_in_b_d65d5fdf" - } - ], - "explanation": "Since the user included a dependency on `b` with a prerelease specifier, a prerelease version can be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires package `a` which has a dependency on a package which only matches prerelease versions; the user has opted into allowing prereleases in `b` explicitly.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "d65d5fdf", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b>0.0.0a1", - "\u2502 \u2514\u2500\u2500 satisfied by b-0.1.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b>0.1", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-0.1.0", - " \u2514\u2500\u2500 b-1.0.0a1" - ], - "module_name": "transitive_package_only_prereleases_in_range_opt_in" - }, - { - "name": "transitive-prerelease-and-stable-dependency", - "packages": [ - { - "name": "transitive-prerelease-and-stable-dependency-a-d62255d0", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-c-d62255d0==2.0.0b1" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-b-d62255d0", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-c-d62255d0<=3.0.0,>=1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-c-d62255d0", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-prerelease-and-stable-dependency-a-d62255d0", - "name": "transitive-prerelease-and-stable-dependency-a-d62255d0", - "module_name": "transitive_prerelease_and_stable_dependency_a_d62255d0" - }, - { - "requirement": "transitive-prerelease-and-stable-dependency-b-d62255d0", - "name": "transitive-prerelease-and-stable-dependency-b-d62255d0", - "module_name": "transitive_prerelease_and_stable_dependency_b_d62255d0" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since the user did not explicitly opt-in to a prerelease, it cannot be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "A transitive dependency has both a prerelease and a stable selector, but can only be satisfied by a prerelease", - "source": "[PWD]/scenarios/prereleases.json", - "version": "d62255d0", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c==2.0.0b1", - "\u2502 \u2514\u2500\u2500 satisfied by c-2.0.0b1", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c<=3.0.0,>=1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u2514\u2500\u2500 c-2.0.0b1" - ], - "module_name": "transitive_prerelease_and_stable_dependency" - }, - { - "name": "transitive-prerelease-and-stable-dependency-opt-in", - "packages": [ - { - "name": "transitive-prerelease-and-stable-dependency-opt-in-a-0778b0eb", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-opt-in-c-0778b0eb==2.0.0b1" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-opt-in-b-0778b0eb", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-opt-in-c-0778b0eb<=3.0.0,>=1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-opt-in-c-0778b0eb", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-prerelease-and-stable-dependency-opt-in-a-0778b0eb", - "name": "transitive-prerelease-and-stable-dependency-opt-in-a-0778b0eb", - "module_name": "transitive_prerelease_and_stable_dependency_opt_in_a_0778b0eb" - }, - { - "requirement": "transitive-prerelease-and-stable-dependency-opt-in-b-0778b0eb", - "name": "transitive-prerelease-and-stable-dependency-opt-in-b-0778b0eb", - "module_name": "transitive_prerelease_and_stable_dependency_opt_in_b_0778b0eb" - }, - { - "requirement": "transitive-prerelease-and-stable-dependency-opt-in-c-0778b0eb>=0.0.0a1", - "name": "transitive-prerelease-and-stable-dependency-opt-in-c-0778b0eb", - "module_name": "transitive_prerelease_and_stable_dependency_opt_in_c_0778b0eb" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "transitive-prerelease-and-stable-dependency-opt-in-a-0778b0eb", - "version": "1.0.0", - "module_name": "transitive_prerelease_and_stable_dependency_opt_in_a_0778b0eb" - }, - { - "name": "transitive-prerelease-and-stable-dependency-opt-in-b-0778b0eb", - "version": "1.0.0", - "module_name": "transitive_prerelease_and_stable_dependency_opt_in_b_0778b0eb" - }, - { - "name": "transitive-prerelease-and-stable-dependency-opt-in-c-0778b0eb", - "version": "2.0.0b1", - "module_name": "transitive_prerelease_and_stable_dependency_opt_in_c_0778b0eb" - } - ], - "explanation": "Since the user explicitly opted-in to a prerelease for `c`, it can be installed." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "A transitive dependency has both a prerelease and a stable selector, but can only be satisfied by a prerelease. The user includes an opt-in to prereleases of the transitive dependency.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "0778b0eb", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 requires b", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c>=0.0.0a1", - "\u2502 \u251c\u2500\u2500 satisfied by c-1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-2.0.0b1", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c==2.0.0b1", - "\u2502 \u2514\u2500\u2500 satisfied by c-2.0.0b1", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c<=3.0.0,>=1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u2514\u2500\u2500 c-2.0.0b1" - ], - "module_name": "transitive_prerelease_and_stable_dependency_opt_in" - }, - { - "name": "transitive-prerelease-and-stable-dependency-many-versions", - "packages": [ - { - "name": "transitive-prerelease-and-stable-dependency-many-versions-a-cc6a6eac", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-many-versions-c-cc6a6eac>=2.0.0b1" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-many-versions-b-cc6a6eac", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-many-versions-c-cc6a6eac<=3.0.0,>=1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-many-versions-c-cc6a6eac", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a2" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a3" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a4" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a5" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a6" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a7" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a8" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a9" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b2" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b3" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b4" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b5" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b6" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b7" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b8" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b9" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-prerelease-and-stable-dependency-many-versions-a-cc6a6eac", - "name": "transitive-prerelease-and-stable-dependency-many-versions-a-cc6a6eac", - "module_name": "transitive_prerelease_and_stable_dependency_many_versions_a_cc6a6eac" - }, - { - "requirement": "transitive-prerelease-and-stable-dependency-many-versions-b-cc6a6eac", - "name": "transitive-prerelease-and-stable-dependency-many-versions-b-cc6a6eac", - "module_name": "transitive_prerelease_and_stable_dependency_many_versions_b_cc6a6eac" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since the user did not explicitly opt-in to a prerelease, it cannot be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "A transitive dependency has both a prerelease and a stable selector, but can only be satisfied by a prerelease. There are many prerelease versions.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "cc6a6eac", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c>=2.0.0b1", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b1", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b2", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b3", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b4", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b5", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b6", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b7", - "\u2502 \u251c\u2500\u2500 satisfied by c-2.0.0b8", - "\u2502 \u2514\u2500\u2500 satisfied by c-2.0.0b9", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c<=3.0.0,>=1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u251c\u2500\u2500 c-2.0.0a1", - " \u251c\u2500\u2500 c-2.0.0a2", - " \u251c\u2500\u2500 c-2.0.0a3", - " \u251c\u2500\u2500 c-2.0.0a4", - " \u251c\u2500\u2500 c-2.0.0a5", - " \u251c\u2500\u2500 c-2.0.0a6", - " \u251c\u2500\u2500 c-2.0.0a7", - " \u251c\u2500\u2500 c-2.0.0a8", - " \u251c\u2500\u2500 c-2.0.0a9", - " \u251c\u2500\u2500 c-2.0.0b1", - " \u251c\u2500\u2500 c-2.0.0b2", - " \u251c\u2500\u2500 c-2.0.0b3", - " \u251c\u2500\u2500 c-2.0.0b4", - " \u251c\u2500\u2500 c-2.0.0b5", - " \u251c\u2500\u2500 c-2.0.0b6", - " \u251c\u2500\u2500 c-2.0.0b7", - " \u251c\u2500\u2500 c-2.0.0b8", - " \u2514\u2500\u2500 c-2.0.0b9" - ], - "module_name": "transitive_prerelease_and_stable_dependency_many_versions" - }, - { - "name": "transitive-prerelease-and-stable-dependency-many-versions-holes", - "packages": [ - { - "name": "transitive-prerelease-and-stable-dependency-many-versions-holes-a-041e36bc", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-many-versions-holes-c-041e36bc!=2.0.0a5,!=2.0.0a6,!=2.0.0a7,!=2.0.0b1,<2.0.0b5,>1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-many-versions-holes-b-041e36bc", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-prerelease-and-stable-dependency-many-versions-holes-c-041e36bc<=3.0.0,>=1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-prerelease-and-stable-dependency-many-versions-holes-c-041e36bc", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a2" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a3" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a4" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a5" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a6" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a7" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a8" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0a9" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b2" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b3" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b4" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b5" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b6" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b7" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b8" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0b9" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-prerelease-and-stable-dependency-many-versions-holes-a-041e36bc", - "name": "transitive-prerelease-and-stable-dependency-many-versions-holes-a-041e36bc", - "module_name": "transitive_prerelease_and_stable_dependency_many_versions_holes_a_041e36bc" - }, - { - "requirement": "transitive-prerelease-and-stable-dependency-many-versions-holes-b-041e36bc", - "name": "transitive-prerelease-and-stable-dependency-many-versions-holes-b-041e36bc", - "module_name": "transitive_prerelease_and_stable_dependency_many_versions_holes_b_041e36bc" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since the user did not explicitly opt-in to a prerelease, it cannot be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "A transitive dependency has both a prerelease and a stable selector, but can only be satisfied by a prerelease. There are many prerelease versions and some are excluded.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "041e36bc", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c!=2.0.0a5,!=2.0.0a6,!=2.0.0a7,!=2.0.0b1,<2.0.0b5,>1.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c<=3.0.0,>=1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u251c\u2500\u2500 c-2.0.0a1", - " \u251c\u2500\u2500 c-2.0.0a2", - " \u251c\u2500\u2500 c-2.0.0a3", - " \u251c\u2500\u2500 c-2.0.0a4", - " \u251c\u2500\u2500 c-2.0.0a5", - " \u251c\u2500\u2500 c-2.0.0a6", - " \u251c\u2500\u2500 c-2.0.0a7", - " \u251c\u2500\u2500 c-2.0.0a8", - " \u251c\u2500\u2500 c-2.0.0a9", - " \u251c\u2500\u2500 c-2.0.0b1", - " \u251c\u2500\u2500 c-2.0.0b2", - " \u251c\u2500\u2500 c-2.0.0b3", - " \u251c\u2500\u2500 c-2.0.0b4", - " \u251c\u2500\u2500 c-2.0.0b5", - " \u251c\u2500\u2500 c-2.0.0b6", - " \u251c\u2500\u2500 c-2.0.0b7", - " \u251c\u2500\u2500 c-2.0.0b8", - " \u2514\u2500\u2500 c-2.0.0b9" - ], - "module_name": "transitive_prerelease_and_stable_dependency_many_versions_holes" - }, - { - "name": "package-only-prereleases-boundary", - "packages": [ - { - "name": "package-only-prereleases-boundary-a-edcef999", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0a1" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-only-prereleases-boundary-a-edcef999<0.2.0", - "name": "package-only-prereleases-boundary-a-edcef999", - "module_name": "package_only_prereleases_boundary_a_edcef999" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-only-prereleases-boundary-a-edcef999", - "version": "0.1.0a1", - "module_name": "package_only_prereleases_boundary_a_edcef999" - } - ], - "explanation": "Since there are only prerelease versions of `a` available, a prerelease is allowed. Since the user did not explictly request a pre-release, pre-releases at the boundary should not be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a non-prerelease version of `a` which only has prerelease versions available. There are pre-releases on the boundary of their range.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "edcef999", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a<0.2.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0a1", - " \u251c\u2500\u2500 a-0.2.0a1", - " \u2514\u2500\u2500 a-0.3.0a1" - ], - "module_name": "package_only_prereleases_boundary" - }, - { - "name": "package-prereleases-boundary", - "packages": [ - { - "name": "package-prereleases-boundary-a-6d600873", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-prereleases-boundary-a-6d600873<0.2.0", - "name": "package-prereleases-boundary-a-6d600873", - "module_name": "package_prereleases_boundary_a_6d600873" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-prereleases-boundary-a-6d600873", - "version": "0.1.0", - "module_name": "package_prereleases_boundary_a_6d600873" - } - ], - "explanation": "Since the user did not use a pre-release specifier, pre-releases at the boundary should not be selected even though pre-releases are allowed." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": true, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a non-prerelease version of `a` but has enabled pre-releases. There are pre-releases on the boundary of their range.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "6d600873", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a<0.2.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u251c\u2500\u2500 a-0.2.0a1", - " \u2514\u2500\u2500 a-0.3.0" - ], - "module_name": "package_prereleases_boundary" - }, - { - "name": "package-prereleases-global-boundary", - "packages": [ - { - "name": "package-prereleases-global-boundary-a-cf1b8081", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-prereleases-global-boundary-a-cf1b8081<0.2.0", - "name": "package-prereleases-global-boundary-a-cf1b8081", - "module_name": "package_prereleases_global_boundary_a_cf1b8081" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-prereleases-global-boundary-a-cf1b8081", - "version": "0.1.0", - "module_name": "package_prereleases_global_boundary_a_cf1b8081" - } - ], - "explanation": "Since the user did not use a pre-release specifier, pre-releases at the boundary should not be selected even though pre-releases are allowed." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": true, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a non-prerelease version of `a` but has enabled pre-releases. There are pre-releases on the boundary of their range.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "cf1b8081", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a<0.2.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u251c\u2500\u2500 a-0.2.0a1", - " \u2514\u2500\u2500 a-0.3.0" - ], - "module_name": "package_prereleases_global_boundary" - }, - { - "name": "package-prereleases-specifier-boundary", - "packages": [ - { - "name": "package-prereleases-specifier-boundary-a-357b9636", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a1" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a2" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.2.0a3" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-prereleases-specifier-boundary-a-357b9636<0.2.0a2", - "name": "package-prereleases-specifier-boundary-a-357b9636", - "module_name": "package_prereleases_specifier_boundary_a_357b9636" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-prereleases-specifier-boundary-a-357b9636", - "version": "0.2.0a1", - "module_name": "package_prereleases_specifier_boundary_a_357b9636" - } - ], - "explanation": "Since the user used a pre-release specifier, pre-releases at the boundary should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a prerelease version of `a`. There are pre-releases on the boundary of their range.", - "source": "[PWD]/scenarios/prereleases.json", - "version": "357b9636", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a<0.2.0a2", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u251c\u2500\u2500 a-0.2.0", - " \u251c\u2500\u2500 a-0.2.0a1", - " \u251c\u2500\u2500 a-0.2.0a2", - " \u251c\u2500\u2500 a-0.2.0a3", - " \u2514\u2500\u2500 a-0.3.0" - ], - "module_name": "package_prereleases_specifier_boundary" - }, - { - "name": "requires-python-version-does-not-exist", - "packages": [ - { - "name": "requires-python-version-does-not-exist-a-4486c0e5", - "versions": [ - { - "requires_python": ">=4.0", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-version-does-not-exist-a-4486c0e5==1.0.0", - "name": "requires-python-version-does-not-exist-a-4486c0e5", - "module_name": "requires_python_version_does_not_exist_a_4486c0e5" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a Python version that does not exist", - "source": "[PWD]/scenarios/requires-python.json", - "version": "4486c0e5", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=4.0 (incompatible with environment)" - ], - "module_name": "requires_python_version_does_not_exist" - }, - { - "name": "requires-python-version-less-than-current", - "packages": [ - { - "name": "requires-python-version-less-than-current-a-d4ea58de", - "versions": [ - { - "requires_python": "<=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-version-less-than-current-a-d4ea58de==1.0.0", - "name": "requires-python-version-less-than-current-a-d4ea58de", - "module_name": "requires_python_version_less_than_current_a_d4ea58de" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a Python version less than the current version", - "source": "[PWD]/scenarios/requires-python.json", - "version": "d4ea58de", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python<=3.8 (incompatible with environment)" - ], - "module_name": "requires_python_version_less_than_current" - }, - { - "name": "requires-python-version-greater-than-current", - "packages": [ - { - "name": "requires-python-version-greater-than-current-a-741c8854", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-version-greater-than-current-a-741c8854==1.0.0", - "name": "requires-python-version-greater-than-current-a-741c8854", - "module_name": "requires_python_version_greater_than_current_a_741c8854" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a Python version greater than the current version", - "source": "[PWD]/scenarios/requires-python.json", - "version": "741c8854", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)" - ], - "module_name": "requires_python_version_greater_than_current" - }, - { - "name": "requires-python-version-greater-than-current-patch", - "packages": [ - { - "name": "requires-python-version-greater-than-current-patch-a-0044ac94", - "versions": [ - { - "requires_python": ">=3.8.14", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-version-greater-than-current-patch-a-0044ac94==1.0.0", - "name": "requires-python-version-greater-than-current-patch-a-0044ac94", - "module_name": "requires_python_version_greater_than_current_patch_a_0044ac94" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8.12", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a Python version with a patch version greater than the current patch version", - "source": "[PWD]/scenarios/requires-python.json", - "version": "0044ac94", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8.12", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.8.14 (incompatible with environment)" - ], - "module_name": "requires_python_version_greater_than_current_patch" - }, - { - "name": "requires-python-version-greater-than-current-many", - "packages": [ - { - "name": "requires-python-version-greater-than-current-many-a-da5bd150", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.1.0" - }, - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.2.0" - }, - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.3.0" - }, - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.4.0" - }, - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.5.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.1.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.2.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.3.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.4.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.5.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-version-greater-than-current-many-a-da5bd150==1.0.0", - "name": "requires-python-version-greater-than-current-many-a-da5bd150", - "module_name": "requires_python_version_greater_than_current_many_a_da5bd150" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which has many versions which all require a Python version greater than the current version", - "source": "[PWD]/scenarios/requires-python.json", - "version": "da5bd150", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-2.0.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-2.1.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-2.2.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-2.3.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-2.4.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-2.5.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-3.0.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)", - " \u251c\u2500\u2500 a-3.1.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)", - " \u251c\u2500\u2500 a-3.2.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)", - " \u251c\u2500\u2500 a-3.3.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)", - " \u251c\u2500\u2500 a-3.4.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)", - " \u2514\u2500\u2500 a-3.5.0", - " \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)" - ], - "module_name": "requires_python_version_greater_than_current_many" - }, - { - "name": "requires-python-version-greater-than-current-backtrack", - "packages": [ - { - "name": "requires-python-version-greater-than-current-backtrack-a-3204bc0a", - "versions": [ - { - "requires_python": ">=3.9", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - }, - { - "requires_python": ">=3.12", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "4.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-version-greater-than-current-backtrack-a-3204bc0a", - "name": "requires-python-version-greater-than-current-backtrack-a-3204bc0a", - "module_name": "requires_python_version_greater_than_current_backtrack_a_3204bc0a" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "requires-python-version-greater-than-current-backtrack-a-3204bc0a", - "version": "1.0.0", - "module_name": "requires_python_version_greater_than_current_backtrack_a_3204bc0a" - } - ], - "explanation": null - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package where recent versions require a Python version greater than the current version, but an older version is compatible.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "3204bc0a", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-2.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-3.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-4.0.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-1.0.0", - " \u251c\u2500\u2500 a-2.0.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-3.0.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)", - " \u2514\u2500\u2500 a-4.0.0", - " \u2514\u2500\u2500 requires python>=3.12 (incompatible with environment)" - ], - "module_name": "requires_python_version_greater_than_current_backtrack" - }, - { - "name": "requires-python-version-greater-than-current-excluded", - "packages": [ - { - "name": "requires-python-version-greater-than-current-excluded-a-874cae6d", - "versions": [ - { - "requires_python": ">=3.9", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - }, - { - "requires_python": ">=3.11", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "3.0.0" - }, - { - "requires_python": ">=3.12", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "4.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-version-greater-than-current-excluded-a-874cae6d>=2.0.0", - "name": "requires-python-version-greater-than-current-excluded-a-874cae6d", - "module_name": "requires_python_version_greater_than_current_excluded_a_874cae6d" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package where recent versions require a Python version greater than the current version, but an excluded older version is compatible.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "874cae6d", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>=2.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-2.0.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-3.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-4.0.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-1.0.0", - " \u251c\u2500\u2500 a-2.0.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u251c\u2500\u2500 a-3.0.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.11 (incompatible with environment)", - " \u2514\u2500\u2500 a-4.0.0", - " \u2514\u2500\u2500 requires python>=3.12 (incompatible with environment)" - ], - "module_name": "requires_python_version_greater_than_current_excluded" - }, - { - "name": "requires-incompatible-python-version-compatible-override", - "packages": [ - { - "name": "requires-incompatible-python-version-compatible-override-a-3f4ac9b2", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-incompatible-python-version-compatible-override-a-3f4ac9b2==1.0.0", - "name": "requires-incompatible-python-version-compatible-override-a-3f4ac9b2", - "module_name": "requires_incompatible_python_version_compatible_override_a_3f4ac9b2" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "requires-incompatible-python-version-compatible-override-a-3f4ac9b2", - "version": "1.0.0", - "module_name": "requires_incompatible_python_version_compatible_override_a_3f4ac9b2" - } - ], - "explanation": null - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": "3.11", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a Python version greater than the current version, but they use an alternative Python version for package resolution.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "3f4ac9b2", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)" - ], - "module_name": "requires_incompatible_python_version_compatible_override" - }, - { - "name": "requires-compatible-python-version-incompatible-override", - "packages": [ - { - "name": "requires-compatible-python-version-incompatible-override-a-fd6db412", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-compatible-python-version-incompatible-override-a-fd6db412==1.0.0", - "name": "requires-compatible-python-version-incompatible-override-a-fd6db412", - "module_name": "requires_compatible_python_version_incompatible_override_a_fd6db412" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.11", - "additional_python": [] - }, - "resolver_options": { - "python": "3.9", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a compatible Python version, but they request an incompatible Python version for package resolution.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "fd6db412", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.11", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.10" - ], - "module_name": "requires_compatible_python_version_incompatible_override" - }, - { - "name": "requires-incompatible-python-version-compatible-override-no-wheels", - "packages": [ - { - "name": "requires-incompatible-python-version-compatible-override-no-wheels-a-3521037f", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": false, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-incompatible-python-version-compatible-override-no-wheels-a-3521037f==1.0.0", - "name": "requires-incompatible-python-version-compatible-override-no-wheels-a-3521037f", - "module_name": "requires_incompatible_python_version_compatible_override_no_wheels_a_3521037f" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since there are no wheels for the package and it is not compatible with the local installation, we cannot build the source distribution to determine its dependencies." - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": "3.11", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a incompatible Python version, but they request a compatible Python version for package resolution. There are only source distributions available for the package.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "3521037f", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)" - ], - "module_name": "requires_incompatible_python_version_compatible_override_no_wheels" - }, - { - "name": "requires-incompatible-python-version-compatible-override-no-wheels-available-system", - "packages": [ - { - "name": "requires-incompatible-python-version-compatible-override-no-wheels-available-system-a-c68bcf5c", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": false, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-incompatible-python-version-compatible-override-no-wheels-available-system-a-c68bcf5c==1.0.0", - "name": "requires-incompatible-python-version-compatible-override-no-wheels-available-system-a-c68bcf5c", - "module_name": "requires_incompatible_python_version_compatible_override_no_wheels_available_system_a_c68bcf5c" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "requires-incompatible-python-version-compatible-override-no-wheels-available-system-a-c68bcf5c", - "version": "1.0.0", - "module_name": "requires_incompatible_python_version_compatible_override_no_wheels_available_system_a_c68bcf5c" - } - ], - "explanation": "Since there is a compatible Python version available on the system, it should be used to build the source distributions." - }, - "environment": { - "python": "3.9", - "additional_python": [ - "3.11" - ] - }, - "resolver_options": { - "python": "3.11", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a incompatible Python version, but they request a compatible Python version for package resolution. There are only source distributions available for the package. The user has a compatible Python version installed elsewhere on their system.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "c68bcf5c", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u251c\u2500\u2500 python3.11", - "\u2502 \u2514\u2500\u2500 python3.9 (active)", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)" - ], - "module_name": "requires_incompatible_python_version_compatible_override_no_wheels_available_system" - }, - { - "name": "requires-incompatible-python-version-compatible-override-no-compatible-wheels", - "packages": [ - { - "name": "requires-incompatible-python-version-compatible-override-no-compatible-wheels-a-d7b25a2d", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [ - "foo-none-any" - ], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-incompatible-python-version-compatible-override-no-compatible-wheels-a-d7b25a2d==1.0.0", - "name": "requires-incompatible-python-version-compatible-override-no-compatible-wheels-a-d7b25a2d", - "module_name": "requires_incompatible_python_version_compatible_override_no_compatible_wheels_a_d7b25a2d" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since there are no compatible wheels for the package and it is not compatible with the local installation, we cannot build the source distribution to determine its dependencies." - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": "3.11", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a incompatible Python version, but they request a compatible Python version for package resolution. There is a wheel available for the package, but it does not have a compatible tag.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "d7b25a2d", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)" - ], - "module_name": "requires_incompatible_python_version_compatible_override_no_compatible_wheels" - }, - { - "name": "requires-incompatible-python-version-compatible-override-other-wheel", - "packages": [ - { - "name": "requires-incompatible-python-version-compatible-override-other-wheel-a-a9179f0c", - "versions": [ - { - "requires_python": ">=3.10", - "requires": [], - "extras": [], - "sdist": true, - "wheel": false, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.12", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-incompatible-python-version-compatible-override-other-wheel-a-a9179f0c", - "name": "requires-incompatible-python-version-compatible-override-other-wheel-a-a9179f0c", - "module_name": "requires_incompatible_python_version_compatible_override_other_wheel_a_a9179f0c" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since there are no wheels for the version of the package compatible with the target and it is not compatible with the local installation, we cannot build the source distribution to determine its dependencies. The other version has wheels available, but is not compatible with the target version and cannot be used." - }, - "environment": { - "python": "3.9", - "additional_python": [] - }, - "resolver_options": { - "python": "3.11", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a incompatible Python version, but they request a compatible Python version for package resolution. There are only source distributions available for the compatible version of the package, but there is an incompatible version with a wheel available.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "a9179f0c", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.9", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u251c\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-2.0.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-1.0.0", - " \u2502 \u2514\u2500\u2500 requires python>=3.10 (incompatible with environment)", - " \u2514\u2500\u2500 a-2.0.0", - " \u2514\u2500\u2500 requires python>=3.12 (incompatible with environment)" - ], - "module_name": "requires_incompatible_python_version_compatible_override_other_wheel" - }, - { - "name": "requires-python-patch-version-override-no-patch", - "packages": [ - { - "name": "requires-python-patch-version-override-no-patch-a-e1884826", - "versions": [ - { - "requires_python": ">=3.8.4", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-patch-version-override-no-patch-a-e1884826==1.0.0", - "name": "requires-python-patch-version-override-no-patch-a-e1884826", - "module_name": "requires_python_patch_version_override_no_patch_a_e1884826" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since the resolver is asked to solve with 3.8, the minimum compatible Python requirement is treated as 3.8.0." - }, - "environment": { - "python": "3.8.18", - "additional_python": [] - }, - "resolver_options": { - "python": "3.8", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a Python version with a patch version and the user provides a target version without a patch version.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "e1884826", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8.18", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.8.4" - ], - "module_name": "requires_python_patch_version_override_no_patch" - }, - { - "name": "requires-python-patch-version-override-patch-compatible", - "packages": [ - { - "name": "requires-python-patch-version-override-patch-compatible-a-91b4bcfc", - "versions": [ - { - "requires_python": ">=3.8.0", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-python-patch-version-override-patch-compatible-a-91b4bcfc==1.0.0", - "name": "requires-python-patch-version-override-patch-compatible-a-91b4bcfc", - "module_name": "requires_python_patch_version_override_patch_compatible_a_91b4bcfc" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "requires-python-patch-version-override-patch-compatible-a-91b4bcfc", - "version": "1.0.0", - "module_name": "requires_python_patch_version_override_patch_compatible_a_91b4bcfc" - } - ], - "explanation": null - }, - "environment": { - "python": "3.8.18", - "additional_python": [] - }, - "resolver_options": { - "python": "3.8.0", - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a package which requires a Python version with a patch version and the user provides a target version with a compatible patch version.", - "source": "[PWD]/scenarios/requires-python.json", - "version": "91b4bcfc", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8.18", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a==1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0", - " \u2514\u2500\u2500 requires python>=3.8.0" - ], - "module_name": "requires_python_patch_version_override_patch_compatible" - }, - { - "name": "specific-tag-and-default", - "packages": [ - { - "name": "specific-tag-and-default-a-8f7a81f1", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [ - "cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64", - "py3-none-any" - ], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "specific-tag-and-default-a-8f7a81f1", - "name": "specific-tag-and-default-a-8f7a81f1", - "module_name": "specific_tag_and_default_a_8f7a81f1" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "A wheel for a specific platform is available alongside the default.", - "source": "[PWD]/scenarios/wheels.json", - "version": "8f7a81f1", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "specific_tag_and_default" - }, - { - "name": "only-wheels", - "packages": [ - { - "name": "only-wheels-a-a874f41e", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": false, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "only-wheels-a-a874f41e", - "name": "only-wheels-a-a874f41e", - "module_name": "only_wheels_a_a874f41e" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "No source distributions are available, only wheels.", - "source": "[PWD]/scenarios/wheels.json", - "version": "a874f41e", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "only_wheels" - }, - { - "name": "no-wheels", - "packages": [ - { - "name": "no-wheels-a-0278f343", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": false, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-wheels-a-0278f343", - "name": "no-wheels-a-0278f343", - "module_name": "no_wheels_a_0278f343" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "No wheels are available, only source distributions.", - "source": "[PWD]/scenarios/wheels.json", - "version": "0278f343", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_wheels" - }, - { - "name": "no-wheels-with-matching-platform", - "packages": [ - { - "name": "no-wheels-with-matching-platform-a-f1a1f15c", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [ - "py3-any-macosx_10_0_ppc64" - ], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-wheels-with-matching-platform-a-f1a1f15c", - "name": "no-wheels-with-matching-platform-a-f1a1f15c", - "module_name": "no_wheels_with_matching_platform_a_f1a1f15c" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "No wheels with matching platform tags are available, just source distributions.", - "source": "[PWD]/scenarios/wheels.json", - "version": "f1a1f15c", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_wheels_with_matching_platform" - }, - { - "name": "no-sdist-no-wheels-with-matching-platform", - "packages": [ - { - "name": "no-sdist-no-wheels-with-matching-platform-a-94e293e5", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": false, - "wheel": true, - "yanked": false, - "wheel_tags": [ - "py3-none-macosx_10_0_ppc64" - ], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-sdist-no-wheels-with-matching-platform-a-94e293e5", - "name": "no-sdist-no-wheels-with-matching-platform-a-94e293e5", - "module_name": "no_sdist_no_wheels_with_matching_platform_a_94e293e5" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "No wheels with matching platform tags are available, nor are any source distributions available", - "source": "[PWD]/scenarios/wheels.json", - "version": "94e293e5", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_sdist_no_wheels_with_matching_platform" - }, - { - "name": "no-sdist-no-wheels-with-matching-python", - "packages": [ - { - "name": "no-sdist-no-wheels-with-matching-python-a-40fe677d", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": false, - "wheel": true, - "yanked": false, - "wheel_tags": [ - "jy27-none-any" - ], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-sdist-no-wheels-with-matching-python-a-40fe677d", - "name": "no-sdist-no-wheels-with-matching-python-a-40fe677d", - "module_name": "no_sdist_no_wheels_with_matching_python_a_40fe677d" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "No wheels with matching Python tags are available, nor are any source distributions available", - "source": "[PWD]/scenarios/wheels.json", - "version": "40fe677d", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_sdist_no_wheels_with_matching_python" - }, - { - "name": "no-sdist-no-wheels-with-matching-abi", - "packages": [ - { - "name": "no-sdist-no-wheels-with-matching-abi-a-8727a9b9", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": false, - "wheel": true, - "yanked": false, - "wheel_tags": [ - "py3-MMMMMM-any" - ], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-sdist-no-wheels-with-matching-abi-a-8727a9b9", - "name": "no-sdist-no-wheels-with-matching-abi-a-8727a9b9", - "module_name": "no_sdist_no_wheels_with_matching_abi_a_8727a9b9" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "No wheels with matching ABI tags are available, nor are any source distributions available", - "source": "[PWD]/scenarios/wheels.json", - "version": "8727a9b9", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_sdist_no_wheels_with_matching_abi" - }, - { - "name": "no-wheels-no-build", - "packages": [ - { - "name": "no-wheels-no-build-a-662cbd94", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": false, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-wheels-no-build-a-662cbd94", - "name": "no-wheels-no-build-a-662cbd94", - "module_name": "no_wheels_no_build_a_662cbd94" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [ - "a" - ], - "no_binary": [] - }, - "template": "simple", - "description": "No wheels are available, only source distributions but the user has disabled builds.", - "source": "[PWD]/scenarios/wheels.json", - "version": "662cbd94", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_wheels_no_build" - }, - { - "name": "only-wheels-no-binary", - "packages": [ - { - "name": "only-wheels-no-binary-a-dd137625", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": false, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "only-wheels-no-binary-a-dd137625", - "name": "only-wheels-no-binary-a-dd137625", - "module_name": "only_wheels_no_binary_a_dd137625" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": null - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [ - "a" - ] - }, - "template": "simple", - "description": "No source distributions are available, only wheels but the user has disabled using pre-built binaries.", - "source": "[PWD]/scenarios/wheels.json", - "version": "dd137625", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "only_wheels_no_binary" - }, - { - "name": "no-build", - "packages": [ - { - "name": "no-build-a-9ff1e173", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-build-a-9ff1e173", - "name": "no-build-a-9ff1e173", - "module_name": "no_build_a_9ff1e173" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [], - "explanation": "The wheel should be used for install" - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [ - "a" - ], - "no_binary": [] - }, - "template": "simple", - "description": "Both wheels and source distributions are available, and the user has disabled builds.", - "source": "[PWD]/scenarios/wheels.json", - "version": "9ff1e173", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_build" - }, - { - "name": "no-binary", - "packages": [ - { - "name": "no-binary-a-10e961b8", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "no-binary-a-10e961b8", - "name": "no-binary-a-10e961b8", - "module_name": "no_binary_a_10e961b8" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [], - "explanation": "The source distribution should be used for install" - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [ - "a" - ] - }, - "template": "simple", - "description": "Both wheels and source distributions are available, and the user has disabled binaries.", - "source": "[PWD]/scenarios/wheels.json", - "version": "10e961b8", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0" - ], - "module_name": "no_binary" - }, - { - "name": "package-only-yanked", - "packages": [ - { - "name": "package-only-yanked-a-e3de7eb4", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-only-yanked-a-e3de7eb4", - "name": "package-only-yanked-a-e3de7eb4", - "module_name": "package_only_yanked_a_e3de7eb4" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Yanked versions should not be installed, even if they are the only one available." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of package `a` which only has yanked versions available.", - "source": "[PWD]/scenarios/yanked.json", - "version": "e3de7eb4", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u2514\u2500\u2500 a-1.0.0 (yanked)" - ], - "module_name": "package_only_yanked" - }, - { - "name": "package-only-yanked-in-range", - "packages": [ - { - "name": "package-only-yanked-in-range-a-84b3720e", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-only-yanked-in-range-a-84b3720e>0.1.0", - "name": "package-only-yanked-in-range-a-84b3720e", - "module_name": "package_only_yanked_in_range_a_84b3720e" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since there are other versions of `a` available, yanked versions should not be selected without explicit opt-in." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires a version of package `a` which only matches yanked versions.", - "source": "[PWD]/scenarios/yanked.json", - "version": "84b3720e", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>0.1.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u2514\u2500\u2500 a-1.0.0 (yanked)" - ], - "module_name": "package_only_yanked_in_range" - }, - { - "name": "requires-package-yanked-and-unyanked-any", - "packages": [ - { - "name": "requires-package-yanked-and-unyanked-any-a-93eac6d7", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "requires-package-yanked-and-unyanked-any-a-93eac6d7", - "name": "requires-package-yanked-and-unyanked-any-a-93eac6d7", - "module_name": "requires_package_yanked_and_unyanked_any_a_93eac6d7" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "requires-package-yanked-and-unyanked-any-a-93eac6d7", - "version": "0.1.0", - "module_name": "requires_package_yanked_and_unyanked_any_a_93eac6d7" - } - ], - "explanation": "The unyanked version should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of package `a` has a yanked version available and an older unyanked version.", - "source": "[PWD]/scenarios/yanked.json", - "version": "93eac6d7", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u2514\u2500\u2500 a-1.0.0 (yanked)" - ], - "module_name": "requires_package_yanked_and_unyanked_any" - }, - { - "name": "package-yanked-specified-mixed-available", - "packages": [ - { - "name": "package-yanked-specified-mixed-available-a-3325916e", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "0.2.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.3.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "package-yanked-specified-mixed-available-a-3325916e>=0.1.0", - "name": "package-yanked-specified-mixed-available-a-3325916e", - "module_name": "package_yanked_specified_mixed_available_a_3325916e" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "package-yanked-specified-mixed-available-a-3325916e", - "version": "0.3.0", - "module_name": "package_yanked_specified_mixed_available_a_3325916e" - } - ], - "explanation": "The latest unyanked version should be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of `a` and both yanked and unyanked releases are available.", - "source": "[PWD]/scenarios/yanked.json", - "version": "3325916e", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a>=0.1.0", - "\u2502 \u251c\u2500\u2500 satisfied by a-0.1.0", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.3.0", - "\u2514\u2500\u2500 a", - " \u251c\u2500\u2500 a-0.1.0", - " \u251c\u2500\u2500 a-0.2.0 (yanked)", - " \u251c\u2500\u2500 a-0.3.0", - " \u2514\u2500\u2500 a-1.0.0 (yanked)" - ], - "module_name": "package_yanked_specified_mixed_available" - }, - { - "name": "transitive-package-only-yanked", - "packages": [ - { - "name": "transitive-package-only-yanked-a-9ec30fe2", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-package-only-yanked-b-9ec30fe2" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - } - ] - }, - { - "name": "transitive-package-only-yanked-b-9ec30fe2", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-package-only-yanked-a-9ec30fe2", - "name": "transitive-package-only-yanked-a-9ec30fe2", - "module_name": "transitive_package_only_yanked_a_9ec30fe2" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Yanked versions should not be installed, even if they are the only one available." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires any version of package `a` which requires `b` which only has yanked versions available.", - "source": "[PWD]/scenarios/yanked.json", - "version": "9ec30fe2", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 b", - " \u2514\u2500\u2500 b-1.0.0 (yanked)" - ], - "module_name": "transitive_package_only_yanked" - }, - { - "name": "transitive-package-only-yanked-in-range", - "packages": [ - { - "name": "transitive-package-only-yanked-in-range-a-872d714e", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-package-only-yanked-in-range-b-872d714e>0.1" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - } - ] - }, - { - "name": "transitive-package-only-yanked-in-range-b-872d714e", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-package-only-yanked-in-range-a-872d714e", - "name": "transitive-package-only-yanked-in-range-a-872d714e", - "module_name": "transitive_package_only_yanked_in_range_a_872d714e" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Yanked versions should not be installed, even if they are the only valid version in a range." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires package `a` which has a dependency on a package which only matches yanked versions.", - "source": "[PWD]/scenarios/yanked.json", - "version": "872d714e", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u2514\u2500\u2500 requires a", - "\u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b>0.1", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-0.1.0", - " \u2514\u2500\u2500 b-1.0.0 (yanked)" - ], - "module_name": "transitive_package_only_yanked_in_range" - }, - { - "name": "transitive-package-only-yanked-in-range-opt-in", - "packages": [ - { - "name": "transitive-package-only-yanked-in-range-opt-in-a-1bbd5d1b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-package-only-yanked-in-range-opt-in-b-1bbd5d1b>0.1" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - } - ] - }, - { - "name": "transitive-package-only-yanked-in-range-opt-in-b-1bbd5d1b", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "0.1.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-package-only-yanked-in-range-opt-in-a-1bbd5d1b", - "name": "transitive-package-only-yanked-in-range-opt-in-a-1bbd5d1b", - "module_name": "transitive_package_only_yanked_in_range_opt_in_a_1bbd5d1b" - }, - { - "requirement": "transitive-package-only-yanked-in-range-opt-in-b-1bbd5d1b==1.0.0", - "name": "transitive-package-only-yanked-in-range-opt-in-b-1bbd5d1b", - "module_name": "transitive_package_only_yanked_in_range_opt_in_b_1bbd5d1b" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "transitive-package-only-yanked-in-range-opt-in-a-1bbd5d1b", - "version": "0.1.0", - "module_name": "transitive_package_only_yanked_in_range_opt_in_a_1bbd5d1b" - }, - { - "name": "transitive-package-only-yanked-in-range-opt-in-b-1bbd5d1b", - "version": "1.0.0", - "module_name": "transitive_package_only_yanked_in_range_opt_in_b_1bbd5d1b" - } - ], - "explanation": "Since the user included a dependency on `b` with an exact specifier, the yanked version can be selected." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "The user requires package `a` which has a dependency on a package which only matches yanked versions; the user has opted into allowing the yanked version of `b` explicitly.", - "source": "[PWD]/scenarios/yanked.json", - "version": "1bbd5d1b", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b==1.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-0.1.0", - "\u2502 \u2514\u2500\u2500 requires b>0.1", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u2514\u2500\u2500 b", - " \u251c\u2500\u2500 b-0.1.0", - " \u2514\u2500\u2500 b-1.0.0 (yanked)" - ], - "module_name": "transitive_package_only_yanked_in_range_opt_in" - }, - { - "name": "transitive-yanked-and-unyanked-dependency", - "packages": [ - { - "name": "transitive-yanked-and-unyanked-dependency-a-eb1ba5f5", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-yanked-and-unyanked-dependency-c-eb1ba5f5==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-yanked-and-unyanked-dependency-b-eb1ba5f5", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-yanked-and-unyanked-dependency-c-eb1ba5f5<=3.0.0,>=1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-yanked-and-unyanked-dependency-c-eb1ba5f5", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-yanked-and-unyanked-dependency-a-eb1ba5f5", - "name": "transitive-yanked-and-unyanked-dependency-a-eb1ba5f5", - "module_name": "transitive_yanked_and_unyanked_dependency_a_eb1ba5f5" - }, - { - "requirement": "transitive-yanked-and-unyanked-dependency-b-eb1ba5f5", - "name": "transitive-yanked-and-unyanked-dependency-b-eb1ba5f5", - "module_name": "transitive_yanked_and_unyanked_dependency_b_eb1ba5f5" - } - ] - }, - "expected": { - "satisfiable": false, - "packages": [], - "explanation": "Since the user did not explicitly select the yanked version, it cannot be used." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "A transitive dependency has both a yanked and an unyanked version, but can only be satisfied by a yanked version", - "source": "[PWD]/scenarios/yanked.json", - "version": "eb1ba5f5", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires b", - "\u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c==2.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c<=3.0.0,>=1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u2514\u2500\u2500 c-2.0.0 (yanked)" - ], - "module_name": "transitive_yanked_and_unyanked_dependency" - }, - { - "name": "transitive-yanked-and-unyanked-dependency-opt-in", - "packages": [ - { - "name": "transitive-yanked-and-unyanked-dependency-opt-in-a-f0760ee9", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-yanked-and-unyanked-dependency-opt-in-c-f0760ee9==2.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-yanked-and-unyanked-dependency-opt-in-b-f0760ee9", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [ - "transitive-yanked-and-unyanked-dependency-opt-in-c-f0760ee9<=3.0.0,>=1.0.0" - ], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - } - ] - }, - { - "name": "transitive-yanked-and-unyanked-dependency-opt-in-c-f0760ee9", - "versions": [ - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": false, - "wheel_tags": [], - "description": "", - "version": "1.0.0" - }, - { - "requires_python": ">=3.8", - "requires": [], - "extras": [], - "sdist": true, - "wheel": true, - "yanked": true, - "wheel_tags": [], - "description": "", - "version": "2.0.0" - } - ] - } - ], - "root": { - "requires_python": ">=3.8", - "requires": [ - { - "requirement": "transitive-yanked-and-unyanked-dependency-opt-in-a-f0760ee9", - "name": "transitive-yanked-and-unyanked-dependency-opt-in-a-f0760ee9", - "module_name": "transitive_yanked_and_unyanked_dependency_opt_in_a_f0760ee9" - }, - { - "requirement": "transitive-yanked-and-unyanked-dependency-opt-in-b-f0760ee9", - "name": "transitive-yanked-and-unyanked-dependency-opt-in-b-f0760ee9", - "module_name": "transitive_yanked_and_unyanked_dependency_opt_in_b_f0760ee9" - }, - { - "requirement": "transitive-yanked-and-unyanked-dependency-opt-in-c-f0760ee9==2.0.0", - "name": "transitive-yanked-and-unyanked-dependency-opt-in-c-f0760ee9", - "module_name": "transitive_yanked_and_unyanked_dependency_opt_in_c_f0760ee9" - } - ] - }, - "expected": { - "satisfiable": true, - "packages": [ - { - "name": "transitive-yanked-and-unyanked-dependency-opt-in-a-f0760ee9", - "version": "1.0.0", - "module_name": "transitive_yanked_and_unyanked_dependency_opt_in_a_f0760ee9" - }, - { - "name": "transitive-yanked-and-unyanked-dependency-opt-in-b-f0760ee9", - "version": "1.0.0", - "module_name": "transitive_yanked_and_unyanked_dependency_opt_in_b_f0760ee9" - }, - { - "name": "transitive-yanked-and-unyanked-dependency-opt-in-c-f0760ee9", - "version": "2.0.0", - "module_name": "transitive_yanked_and_unyanked_dependency_opt_in_c_f0760ee9" - } - ], - "explanation": "Since the user explicitly selected the yanked version of `c`, it can be installed." - }, - "environment": { - "python": "3.8", - "additional_python": [] - }, - "resolver_options": { - "python": null, - "prereleases": false, - "no_build": [], - "no_binary": [] - }, - "template": "simple", - "description": "A transitive dependency has both a yanked and an unyanked version, but can only be satisfied by a yanked. The user includes an opt-in to the yanked version of the transitive dependency.", - "source": "[PWD]/scenarios/yanked.json", - "version": "f0760ee9", - "tree": [ - "\u251c\u2500\u2500 environment", - "\u2502 \u2514\u2500\u2500 python3.8", - "\u251c\u2500\u2500 root", - "\u2502 \u251c\u2500\u2500 requires a", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by a-1.0.0", - "\u2502 \u251c\u2500\u2500 requires b", - "\u2502 \u2502 \u2514\u2500\u2500 satisfied by b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c==2.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u251c\u2500\u2500 a", - "\u2502 \u2514\u2500\u2500 a-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c==2.0.0", - "\u2502 \u2514\u2500\u2500 unsatisfied: no matching version", - "\u251c\u2500\u2500 b", - "\u2502 \u2514\u2500\u2500 b-1.0.0", - "\u2502 \u2514\u2500\u2500 requires c<=3.0.0,>=1.0.0", - "\u2502 \u2514\u2500\u2500 satisfied by c-1.0.0", - "\u2514\u2500\u2500 c", - " \u251c\u2500\u2500 c-1.0.0", - " \u2514\u2500\u2500 c-2.0.0 (yanked)" - ], - "module_name": "transitive_yanked_and_unyanked_dependency_opt_in" - } - ] - } - - ''', + 'stderr': '', + 'stdout': '', }) # --- # name: test_inspect_one_target_does_not_exist diff --git a/tests/__snapshots__/test_list.ambr b/tests/__snapshots__/test_list.ambr index be704cbe..aba9750f 100644 --- a/tests/__snapshots__/test_list.ambr +++ b/tests/__snapshots__/test_list.ambr @@ -77,7 +77,7 @@ package-prereleases-boundary-6d600873 package-prereleases-global-boundary-cf1b8081 package-prereleases-specifier-boundary-357b9636 - requires-python-version-does-not-exist-4486c0e5 + requires-python-version-does-not-exist-1601081f requires-python-version-less-than-current-d4ea58de requires-python-version-greater-than-current-741c8854 requires-python-version-greater-than-current-patch-0044ac94 @@ -169,7 +169,7 @@ package-prereleases-global-boundary-cf1b8081 package-prereleases-specifier-boundary-357b9636 scenarios/requires-python.json - requires-python-version-does-not-exist-4486c0e5 + requires-python-version-does-not-exist-1601081f requires-python-version-less-than-current-d4ea58de requires-python-version-greater-than-current-741c8854 requires-python-version-greater-than-current-patch-0044ac94 @@ -367,7 +367,7 @@ cf1b8081 357b9636 scenarios/requires-python.json - 4486c0e5 + 1601081f d4ea58de 741c8854 0044ac94 diff --git a/tests/__snapshots__/test_publish.ambr b/tests/__snapshots__/test_publish.ambr index 7bc214c4..6e0a1ff1 100644 --- a/tests/__snapshots__/test_publish.ambr +++ b/tests/__snapshots__/test_publish.ambr @@ -14,6 +14,7 @@ Published 'example_b_8597e52a-2.0.0.tar.gz' Published 'example_b_8597e52a-3.0.0-py3-none-any.whl' Published 'example_b_8597e52a-3.0.0.tar.gz' + Published 1 targets (9 new files) in [TIME] ''', 'stdout': ''' @@ -93,6 +94,7 @@ Published 'example_b_8597e52a-3.0.0.tar.gz' + Published 1 targets (9 new files) in [TIME] ''', 'stdout': ''' @@ -193,6 +195,7 @@ Published 'example_b_8597e52a-3.0.0.tar.gz' + Published 1 targets (9 new files) in [TIME] ''', 'stdout': ''' diff --git a/tests/common.py b/tests/common.py index be62df7b..e4ec58f3 100644 --- a/tests/common.py +++ b/tests/common.py @@ -28,7 +28,9 @@ def snapshot_command( snapshot_stdout: bool = True, extra_filters: list[tuple[str, str]] | None = None, interrupt_after: float = None, + env: dict[str, str] = None, ) -> dict: + env = env or {} # By default, filter out absolute references to the working directory filters = [ (re.escape(str(Path(sys.executable).parent)), "[PYTHON_BINDIR]"), @@ -43,12 +45,13 @@ def snapshot_command( filters += extra_filters killed = False + env = {**os.environ, **env} process = subprocess.Popen( ["packse"] + command, cwd=working_directory, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - env=os.environ, + env=env, ) try: stdout, stderr = process.communicate(timeout=interrupt_after) diff --git a/tests/test_index.py b/tests/test_index.py index 2b4c3f76..b18f0133 100644 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -1,8 +1,6 @@ import os import subprocess -import psutil -import pytest from packse.index import write_server_pid from .common import snapshot_command @@ -14,25 +12,6 @@ ] -@pytest.fixture(autouse=True) -def check_for_leaked_servers(): - yield - - leak = False - for p in psutil.process_iter(): - try: - if "devpi" in p.name() or "devpi" in " ".join(p.cmdline()): - print("Killing devpi server with pid", p.pid) - p.terminate() - p.wait() - leak = True - except (psutil.AccessDenied, psutil.NoSuchProcess): - pass - - if leak: - raise RuntimeError("Leaked package index server(s)") - - def test_index_up_background(snapshot, tmpcwd, tmpenviron): tmpenviron["HOME"] = str(tmpcwd) @@ -74,48 +53,26 @@ def test_index_down(snapshot, tmpcwd, tmpenviron): ) -def test_index_up_with_storage_path(snapshot, tmpcwd): - try: - assert ( - snapshot_command( - ["index", "up", "--storage-path", str(tmpcwd), "--bg"], - extra_filters=FILTERS, - ) - == snapshot - ) - finally: - subprocess.call(["packse", "index", "down", "--storage-path", str(tmpcwd)]) - - -def test_index_down_with_storage_path(snapshot, tmpcwd): - subprocess.check_call( - ["packse", "index", "up", "--storage-path", str(tmpcwd), "--bg"] - ) - assert ( - snapshot_command( - ["index", "down", "--storage-path", str(tmpcwd)], - extra_filters=FILTERS, - ) - == snapshot - ) - - def test_index_down_no_server_found(snapshot, tmpcwd): assert ( snapshot_command( - ["index", "down", "--storage-path", str(tmpcwd)], + ["index", "down"], extra_filters=FILTERS, + env={"PACKSE_STATE_PATH": str(tmpcwd)}, ) == snapshot ) -def test_index_down_server_stopped(snapshot, tmpcwd): - write_server_pid(tmpcwd, 99999) +def test_index_down_server_stopped(snapshot, tmpcwd, tmpenviron): + tmpenviron["PACKSE_STATE_PATH"] = str(tmpcwd) + write_server_pid(99999) + assert ( snapshot_command( - ["index", "down", "--storage-path", str(tmpcwd)], + ["index", "down"], extra_filters=FILTERS, + env={"PACKSE_STATE_PATH": str(tmpcwd)}, ) == snapshot ) diff --git a/tests/test_inspect.py b/tests/test_inspect.py index aff81637..70938d12 100644 --- a/tests/test_inspect.py +++ b/tests/test_inspect.py @@ -5,7 +5,11 @@ def test_inspect_no_target_finds_all_valid_scenarios(snapshot): - assert snapshot_command(["inspect"]) == snapshot + assert ( + # Just assert it succeeds, we don't want to include all these targets in the snap + snapshot_command(["inspect"], snapshot_stdout=False, snapshot_stderr=False) + == snapshot + ) def test_inspect_target_does_not_exist(snapshot):