uv/crates
Zanie Blue e1878c8359
Consider installed packages during resolution (#2596)
Previously, we did not consider installed distributions as candidates
while performing resolution. Here, we update the resolver to use
installed distributions that satisfy requirements instead of pulling new
distributions from the registry.

The implementation details are as follows:

- We now provide `SitePackages` to the `CandidateSelector`
- If an installed distribution satisfies the requirement, we prefer it
over remote distributions
- We do not want to allow installed distributions in some cases, i.e.,
upgrade and reinstall
- We address this by introducing an `Exclusions` type which tracks
installed packages to ignore during selection
- There's a new `ResolvedDist` wrapper with `Installed(InstalledDist)`
and `Installable(Dist)` variants
- This lets us pass already installed distributions throughout the
resolver

The user-facing behavior is thoroughly covered in the tests, but
briefly:

- Installing a package that depends on an already-installed package
prefers the local version over the index
- Installing a package with a name that matches an already-installed URL
package does not reinstall from the index
- Reinstalling (--reinstall) a package by name _will_ pull from the
index even if an already-installed URL package is present
- To reinstall the URL package, you must specify the URL in the request

Closes https://github.com/astral-sh/uv/issues/1661

Addresses:

- https://github.com/astral-sh/uv/issues/1476
- https://github.com/astral-sh/uv/issues/1856
- https://github.com/astral-sh/uv/issues/2093
- https://github.com/astral-sh/uv/issues/2282
- https://github.com/astral-sh/uv/issues/2383
- https://github.com/astral-sh/uv/issues/2560

## Test plan

- [x] Reproduction at `charlesnicholson/uv-pep420-bug` passes
- [x] Unit test for editable package
([#1476](https://github.com/astral-sh/uv/issues/1476))
- [x] Unit test for previously installed package with empty registry
- [x] Unit test for local non-editable package
- [x] Unit test for new version available locally but not in registry
([#2093](https://github.com/astral-sh/uv/issues/2093))
- ~[ ] Unit test for wheel not available in registry but already
installed locally
([#2282](https://github.com/astral-sh/uv/issues/2282))~ (seems
complicated and not worthwhile)
- [x] Unit test for install from URL dependency then with matching
version ([#2383](https://github.com/astral-sh/uv/issues/2383))
- [x] Unit test for install of new package that depends on installed
package does not change version
([#2560](https://github.com/astral-sh/uv/issues/2560))
- [x] Unit test that `pip compile` does _not_ consider installed
packages
2024-03-28 13:49:17 -05:00
..
bench Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
cache-key Avoid panicking on cannot-be-a-base URLs (#2461) 2024-03-14 17:47:16 +00:00
distribution-filename Update miette v7, pubgrub and small Cargo.toml cleanup (#2610) 2024-03-22 10:42:48 +00:00
distribution-types Consider installed packages during resolution (#2596) 2024-03-28 13:49:17 -05:00
install-wheel-rs Use Resolver in pip sync (#2696) 2024-03-27 17:36:38 -04:00
once-map Remove unused deps (#1273) 2024-02-11 18:53:58 +00:00
pep440-rs Update pubgrub to use a dependency provider (#2648) 2024-03-25 15:51:31 +01:00
pep508-rs Allow prereleases, locals, and URLs in non-editable path requirements (#2671) 2024-03-27 22:17:09 +00:00
platform-tags Drop macosx_10_0 from compatible wheel tags on aarch64 (#2496) 2024-03-18 14:52:54 +00:00
pypi-types Read package metadata from pyproject.toml when statically defined (#2676) 2024-03-27 14:34:18 +00:00
requirements-txt Update Rust to v1.77 (#2591) 2024-03-27 14:41:27 +00:00
uv Consider installed packages during resolution (#2596) 2024-03-28 13:49:17 -05:00
uv-auth Fix authentication with JFrog artifactories (#2592) 2024-03-21 12:10:43 -05:00
uv-build Read package metadata from pyproject.toml when statically defined (#2676) 2024-03-27 14:34:18 +00:00
uv-cache uv-cache: bump built-wheels cache version (#2715) 2024-03-28 13:24:47 -05:00
uv-client Respect --no-index with --find-links in pip sync (#2692) 2024-03-27 16:15:14 +00:00
uv-dev Consider installed packages during resolution (#2596) 2024-03-28 13:49:17 -05:00
uv-dispatch Consider installed packages during resolution (#2596) 2024-03-28 13:49:17 -05:00
uv-distribution Remove Tags from tracing (#2704) 2024-03-28 02:18:54 +00:00
uv-extract Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-fs Bring harmony to the test snapshot filtering situation (#2678) 2024-03-27 14:10:12 +00:00
uv-git Add an in-memory cache for Git references (#2682) 2024-03-27 01:39:01 +00:00
uv-installer Consider installed packages during resolution (#2596) 2024-03-28 13:49:17 -05:00
uv-interpreter fix: do not error when there are warnings on stderr (#2599) 2024-03-21 19:23:41 -04:00
uv-normalize Update miette v7, pubgrub and small Cargo.toml cleanup (#2610) 2024-03-22 10:42:48 +00:00
uv-requirements Allow prereleases, locals, and URLs in non-editable path requirements (#2671) 2024-03-27 22:17:09 +00:00
uv-resolver Consider installed packages during resolution (#2596) 2024-03-28 13:49:17 -05:00
uv-trampoline Use c-string literals and update trampolines (#2590) 2024-03-21 15:36:00 +00:00
uv-types Consider installed packages during resolution (#2596) 2024-03-28 13:49:17 -05:00
uv-version Bump version to 0.1.26 (#2713) 2024-03-28 12:55:36 -05:00
uv-virtualenv Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
uv-warnings Rename to uv (#1302) 2024-02-15 11:19:46 -06:00
README.md Rename uv-traits and split into separate modules (#2674) 2024-03-26 15:39:43 -05:00

Crates

bench

Functionality for benchmarking uv.

cache-key

Generic functionality for caching paths, URLs, and other resources across platforms.

distribution-filename

Parse built distribution (wheel) and source distribution (sdist) filenames to extract structured metadata.

distribution-types

Abstractions for representing built distributions (wheels) and source distributions (sdists), and the sources from which they can be downloaded.

install-wheel-rs

Install built distributions (wheels) into a virtual environment.]

once-map

A waitmap-like concurrent hash map for executing tasks exactly once.

pep440-rs

Utilities for interacting with Python version numbers and specifiers.

pep508-rs

Utilities for interacting with PEP 508 dependency specifiers.

platform-host

Functionality for detecting the current platform (operating system, architecture, etc.).

platform-tags

Functionality for parsing and inferring Python platform tags as per PEP 425.

uv

Command-line interface for the uv package manager.

uv-build

A PEP 517-compatible build frontend for uv.

uv-cache

Functionality for caching Python packages and associated metadata.

uv-client

Client for interacting with PyPI-compatible HTTP APIs.

uv-dev

Development utilities for uv.

uv-dispatch

A centralized struct for resolving and building source distributions in isolated environments. Implements the traits defined in uv-types.

uv-distribution

Client for interacting with built distributions (wheels) and source distributions (sdists). Capable of fetching metadata, distribution contents, etc.

uv-extract

Utilities for extracting files from archives.

uv-fs

Utilities for interacting with the filesystem.

uv-git

Functionality for interacting with Git repositories.

uv-installer

Functionality for installing Python packages into a virtual environment.

uv-interpreter

Functionality for detecting and leveraging the current Python interpreter.

uv-normalize

Normalize package and extra names as per Python specifications.

uv-package

Types and functionality for working with Python packages, e.g., parsing wheel files.

uv-requirements

Utilities for reading package requirements from pyproject.toml and requirements.txt files.

uv-resolver

Functionality for resolving Python packages and their dependencies.

uv-types

Shared traits for uv, to avoid circular dependencies.

pypi-types

General-purpose type definitions for types used in PyPI-compatible APIs.

uv-virtualenv

A venv replacement to create virtual environments in Rust.

uv-warnings

User-facing warnings for uv.

requirements-txt

Functionality for parsing requirements.txt files.