Implement PEP 440-compliant local version semantics (#8797)

Implement a full working version of local version semantics. The (AFAIA)
major move towards this was implemented in #2430. This added support
such that the version specifier `torch==2.1.0+cpu` would install
`torch@2.1.0+cpu` and consider `torch@2.1.0+cpu` a valid way to satisfy
the requirement `torch==2.1.0` in further dependency resolution.

In this feature, we more fully support local version semantics. Namely,
we now allow `torch==2.1.0` to install `torch@2.1.0+cpu` regardless of
whether `torch@2.1.0` (no local tag) actually exists.

We do this by adding an internal-only `Max` value to local versions that
compare greater to all other local versions. Then we can translate
`torch==2.1.0` into bounds: greater than 2.1.0 with no local tag and
less than 2.1.0 with the `Max` local tag.

Depends on https://github.com/astral-sh/packse/pull/227.
This commit is contained in:
Eric Mark Martin 2024-11-05 22:18:43 -05:00 committed by Zanie Blue
parent 8ef5949294
commit c49c7bdf97
15 changed files with 631 additions and 840 deletions

View file

@ -152,18 +152,6 @@ def main(scenarios: list[Path], snapshot_update: bool = True):
else:
scenario["python_patch"] = False
# We don't yet support local versions that aren't expressed as direct dependencies.
for scenario in data["scenarios"]:
expected = scenario["expected"]
if scenario["name"] in (
"local-less-than-or-equal",
"local-simple",
"local-transitive-confounding",
"local-used-without-sdist",
):
expected["satisfiable"] = False
# Split scenarios into `install`, `compile` and `lock` cases
install_scenarios = []
compile_scenarios = []