uv/crates
Charlie Marsh 5d7d7dce24
Enable PEP 517 builds for unnamed requirements (#2600)
## Summary

This PR enables the source distribution database to be used with unnamed
requirements (i.e., URLs without a package name). The (significant)
upside here is that we can now use PEP 517 hooks to resolve unnamed
requirement metadata _and_ reuse any computation in the cache.

The changes to `crates/uv-distribution/src/source/mod.rs` are quite
extensive, but mostly mechanical. The core idea is that we introduce a
new `BuildableSource` abstraction, which can either be a distribution,
or an unnamed URL:

```rust
/// A reference to a source that can be built into a built distribution.
///
/// This can either be a distribution (e.g., a package on a registry) or a direct URL.
///
/// Distributions can _also_ point to URLs in lieu of a registry; however, the primary distinction
/// here is that a distribution will always include a package name, while a URL will not.
#[derive(Debug, Clone, Copy)]
pub enum BuildableSource<'a> {
    Dist(&'a SourceDist),
    Url(SourceUrl<'a>),
}
```

All the methods on the source distribution database now accept
`BuildableSource`. `BuildableSource` has a `name()` method, but it
returns `Option<&PackageName>`, and everything is required to work with
and without a package name.

The main drawback of this approach (which isn't a terrible one) is that
we can no longer include the package name in the cache. (We do continue
to use the package name for registry-based distributions, since those
always have a name.). The package name was included in the cache route
for two reasons: (1) it's nice for debugging; and (2) we use it to power
`uv cache clean flask`, to identify the entries that are relevant for
Flask.

To solve this, I changed the `uv cache clean` code to look one level
deeper. So, when we want to determine whether to remove the cache entry
for a given URL, we now look into the directory to see if there are any
wheels that match the package name. This isn't as nice, but it does work
(and we have test coverage for it -- all passing).

I also considered removing the package name from the cache routes for
non-registry _wheels_, for consistency... But, it would require a cache
bump, and it didn't feel important enough to merit that.
2024-03-21 22:46:39 -04: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 Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
distribution-types Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
install-wheel-rs Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
once-map Remove unused deps (#1273) 2024-02-11 18:53:58 +00:00
pep440-rs Fast lint CI job: Rustfmt, Prettier, Ruff (#2406) 2024-03-20 00:16:46 +00:00
pep508-rs Enable install audits without resolving named requirements (#2575) 2024-03-20 23:54:45 -04:00
platform-tags Drop macosx_10_0 from compatible wheel tags on aarch64 (#2496) 2024-03-18 14:52:54 +00:00
pypi-types Add support for unnamed local directory requirements (#2571) 2024-03-21 03:46:11 +00:00
requirements-txt Respect HTTP client options when reading remote requirements files (#2434) 2024-03-21 13:48:57 -05:00
uv Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
uv-auth Fix authentication with JFrog artifactories (#2592) 2024-03-21 12:10:43 -05:00
uv-build Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
uv-cache Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
uv-client Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
uv-dev Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
uv-dispatch Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
uv-distribution Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
uv-extract Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-fs Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
uv-git chore: fix some typos (#2581) 2024-03-21 04:09:37 +00:00
uv-installer Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
uv-interpreter fix: do not error when there are warnings on stderr (#2599) 2024-03-21 19:23:41 -04:00
uv-normalize Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
uv-requirements Respect HTTP client options when reading remote requirements files (#2434) 2024-03-21 13:48:57 -05:00
uv-resolver Enable PEP 517 builds for unnamed requirements (#2600) 2024-03-21 22:46:39 -04:00
uv-traits Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
uv-trampoline Use c-string literals and update trampolines (#2590) 2024-03-21 15:36:00 +00:00
uv-version Bump version to v0.1.23 (#2580) 2024-03-21 02:51:21 +00: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 Move requirements resolution into its own crate (#2579) 2024-03-21 13:52:47 +00: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-traits.

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-traits

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.