uv/crates
konsti 76418f5bdf
Arc-wrap `PubGrubPackage` for cheap cloning in pubgrub (#3688)
Pubgrub stores incompatibilities as (package name, version range)
tuples, meaning it needs to clone the package name for each
incompatibility, and each non-borrowed operation on incompatibilities.
https://github.com/astral-sh/uv/pull/3673 made me realize that
`PubGrubPackage` has gotten large (expensive to copy), so like `Version`
and other structs, i've added an `Arc` wrapper around it.

It's a pity clippy forbids `.deref()`, it's less opaque than `&**` and
has IDE support (clicking on `.deref()` jumps to the right impl).

## Benchmarks

It looks like this matters most for complex resolutions which, i assume
because they carry larger `PubGrubPackageInner::Package` and
`PubGrubPackageInner::Extra` types.

```bash
hyperfine --warmup 5 "./uv-main pip compile -q ./scripts/requirements/jupyter.in" "./uv-branch pip compile -q ./scripts/requirements/jupyter.in"
hyperfine --warmup 5 "./uv-main pip compile -q ./scripts/requirements/airflow.in" "./uv-branch pip compile -q ./scripts/requirements/airflow.in"
hyperfine --warmup 5 "./uv-main pip compile -q ./scripts/requirements/boto3.in" "./uv-branch pip compile -q ./scripts/requirements/boto3.in"
```

```
Benchmark 1: ./uv-main pip compile -q ./scripts/requirements/jupyter.in
  Time (mean ± σ):      18.2 ms ±   1.6 ms    [User: 14.4 ms, System: 26.0 ms]
  Range (min … max):    15.8 ms …  22.5 ms    181 runs

Benchmark 2: ./uv-branch pip compile -q ./scripts/requirements/jupyter.in
  Time (mean ± σ):      17.8 ms ±   1.4 ms    [User: 14.4 ms, System: 25.3 ms]
  Range (min … max):    15.4 ms …  23.1 ms    159 runs

Summary
  ./uv-branch pip compile -q ./scripts/requirements/jupyter.in ran
    1.02 ± 0.12 times faster than ./uv-main pip compile -q ./scripts/requirements/jupyter.in
```

```
Benchmark 1: ./uv-main pip compile -q ./scripts/requirements/airflow.in
  Time (mean ± σ):     153.7 ms ±   3.5 ms    [User: 165.2 ms, System: 157.6 ms]
  Range (min … max):   150.4 ms … 163.0 ms    19 runs

Benchmark 2: ./uv-branch pip compile -q ./scripts/requirements/airflow.in
  Time (mean ± σ):     123.9 ms ±   4.6 ms    [User: 152.4 ms, System: 133.8 ms]
  Range (min … max):   118.4 ms … 138.1 ms    24 runs

Summary
  ./uv-branch pip compile -q ./scripts/requirements/airflow.in ran
    1.24 ± 0.05 times faster than ./uv-main pip compile -q ./scripts/requirements/airflow.in
```

```
Benchmark 1: ./uv-main pip compile -q ./scripts/requirements/boto3.in
  Time (mean ± σ):     327.0 ms ±   3.8 ms    [User: 344.5 ms, System: 71.6 ms]
  Range (min … max):   322.7 ms … 334.6 ms    10 runs

Benchmark 2: ./uv-branch pip compile -q ./scripts/requirements/boto3.in
  Time (mean ± σ):     311.2 ms ±   3.1 ms    [User: 339.3 ms, System: 63.1 ms]
  Range (min … max):   307.8 ms … 317.0 ms    10 runs

Summary
  ./uv-branch pip compile -q ./scripts/requirements/boto3.in ran
    1.05 ± 0.02 times faster than ./uv-main pip compile -q ./scripts/requirements/boto3.in
```

<!--
Thank you for contributing to uv! To help us out with reviewing, please
consider the following:

- Does this pull request include a summary of the change? (See below.)
- Does this pull request include a descriptive title?
- Does this pull request include references to any relevant issues?
-->
2024-05-21 13:49:35 +02:00
..
bench Parallelize resolver (#3627) 2024-05-17 11:47:30 -04:00
cache-key Avoid panic for file url (#3306) 2024-04-29 16:39:16 +02:00
distribution-filename require serde and rkyv everywhere; remove optional serde and rkyv features (#3345) 2024-05-03 10:21:03 -04:00
distribution-types uv-resolver: make PubGrubPackage orderable 2024-05-20 19:56:24 -04:00
install-wheel-rs Pin the zip crate to 0.6 (#3645) 2024-05-18 17:31:53 +00:00
once-map Use `FxHasher` in resolver (#3641) 2024-05-17 15:04:22 -04:00
pep440-rs pep508: add `PartialOrd` and `Ord` implementations to `MarkerTree` 2024-05-20 19:56:24 -04:00
pep508-rs Evaluate arbitrary markers to `false` (#3681) 2024-05-21 01:01:11 +00:00
platform-tags Update Rust to v1.78 (#3361) 2024-05-03 20:07:13 +00:00
pypi-types Use Metadata10 to parse PKG-INFO of legacy editable (#3450) 2024-05-08 10:58:18 +02:00
requirements-txt Update Rust crate itertools to 0.13.0 (#3664) 2024-05-20 00:49:42 +00:00
uv Support editables in `uv sync` (#3692) 2024-05-21 11:30:15 +00:00
uv-auth Increase verbosity of credential fetch logs (#3550) 2024-05-13 15:55:57 +00:00
uv-build Avoid keyword arguments for PEP 517 build hooks (#3517) 2024-05-10 17:15:08 -04:00
uv-cache Separate cache construction from initialization (#3607) 2024-05-15 12:29:39 -04:00
uv-client Remove subdirectory from direct wheel URL type (#3667) 2024-05-20 02:01:57 +00:00
uv-configuration Add `UV_CONCURRENT_INSTALLS` variable in favor of `RAYON_NUM_THREADS` (#3646) 2024-05-17 23:12:37 -04:00
uv-dev Remove subdirectory from direct wheel URL type (#3667) 2024-05-20 02:01:57 +00:00
uv-dispatch Parallelize resolver (#3627) 2024-05-17 11:47:30 -04:00
uv-distribution Improve `DirWithoutEntrypoint` error message (#3690) 2024-05-21 11:21:20 +00:00
uv-extract Remove unused `seek` methods (#3526) 2024-05-11 17:31:32 +00:00
uv-fs Get `cargo shear` passing (#3533) 2024-05-13 01:43:45 +00:00
uv-git uv-resolver: make PubGrubPackage orderable 2024-05-20 19:56:24 -04:00
uv-installer Refactor editables for supporting them in bluejay commands (#3639) 2024-05-20 16:22:12 +00:00
uv-interpreter Update Rust crate itertools to 0.13.0 (#3664) 2024-05-20 00:49:42 +00:00
uv-normalize Improve JSON Schema and add export script (#3461) 2024-05-08 16:15:16 +00:00
uv-requirements Refactor editables for supporting them in bluejay commands (#3639) 2024-05-20 16:22:12 +00:00
uv-resolver Arc-wrap `PubGrubPackage` for cheap cloning in pubgrub (#3688) 2024-05-21 13:49:35 +02:00
uv-trampoline Use c-string literals and update trampolines (#2590) 2024-03-21 15:36:00 +00:00
uv-types Refactor editables for supporting them in bluejay commands (#3639) 2024-05-20 16:22:12 +00:00
uv-version Bump version to v0.1.45 (#3674) 2024-05-20 16:34:05 -04:00
uv-virtualenv Remove binary from `uv-virtualenv` crate (#3605) 2024-05-15 16:02:44 +00:00
uv-warnings Rename to `uv` (#1302) 2024-02-15 11:19:46 -06:00
uv-workspace Add `UV_CONCURRENT_INSTALLS` variable in favor of `RAYON_NUM_THREADS` (#3646) 2024-05-17 23:12:37 -04:00
README.md Rename `uv-traits` and split into separate modules (#2674) 2024-03-26 15:39:43 -05:00

README.md

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.