mirror of
https://github.com/astral-sh/uv.git
synced 2025-11-25 21:37:51 +00:00
## Summary This PR adds support for relative URLs in the simple JSON responses. We already support relative URLs for HTML responses, but the handling has been consolidated between the two. Similar to index URLs, we now store the base alongside the metadata, and use the base when resolving the URL. Closes #455. ## Test Plan `cargo test` (to test HTML indexes). Separately, I also ran `cargo run -p puffin-cli -- pip-compile requirements.in -n --index-url=http://localhost:3141/packages/pypi/+simple` on the `zb/relative` branch with `packse` running, and forced both HTML and JSON by limiting the `accept` header.
39 lines
1.2 KiB
Rust
39 lines
1.2 KiB
Rust
use rustc_hash::FxHashMap;
|
|
|
|
use distribution_types::{File, IndexUrl};
|
|
use puffin_normalize::PackageName;
|
|
use pypi_types::BaseUrl;
|
|
|
|
use crate::candidate_selector::Candidate;
|
|
|
|
/// A set of package versions pinned to specific files.
|
|
///
|
|
/// For example, given `Flask==3.0.0`, the [`FilePins`] would contain a mapping from `Flask` to
|
|
/// `3.0.0` to the specific wheel or source distribution archive that was pinned for that version.
|
|
#[derive(Debug, Default)]
|
|
pub(crate) struct FilePins(
|
|
FxHashMap<PackageName, FxHashMap<pep440_rs::Version, (IndexUrl, BaseUrl, File)>>,
|
|
);
|
|
|
|
impl FilePins {
|
|
/// Pin a candidate package.
|
|
pub(crate) fn insert(&mut self, candidate: &Candidate, index: &IndexUrl, base: &BaseUrl) {
|
|
self.0.entry(candidate.name().clone()).or_default().insert(
|
|
candidate.version().clone().into(),
|
|
(
|
|
index.clone(),
|
|
base.clone(),
|
|
candidate.install().clone().into(),
|
|
),
|
|
);
|
|
}
|
|
|
|
/// Return the pinned file for the given package name and version, if it exists.
|
|
pub(crate) fn get(
|
|
&self,
|
|
name: &PackageName,
|
|
version: &pep440_rs::Version,
|
|
) -> Option<&(IndexUrl, BaseUrl, File)> {
|
|
self.0.get(name)?.get(version)
|
|
}
|
|
}
|