Move OnceMap into its own crate (#946)

## Summary

This is extremely generic (like `WaitMap`), and I want to use it in the
cache.
This commit is contained in:
Charlie Marsh 2024-01-16 23:09:15 -05:00 committed by GitHub
parent 5051b2c004
commit b8fbd529a1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 39 additions and 11 deletions

12
Cargo.lock generated
View file

@ -1922,6 +1922,14 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "once-map"
version = "0.0.1"
dependencies = [
"rustc-hash",
"waitmap",
]
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.19.0" version = "1.19.0"
@ -2680,6 +2688,7 @@ dependencies = [
"insta", "insta",
"install-wheel-rs", "install-wheel-rs",
"itertools 0.12.0", "itertools 0.12.0",
"once-map",
"once_cell", "once_cell",
"owo-colors", "owo-colors",
"pep440_rs 0.3.12", "pep440_rs 0.3.12",
@ -2718,12 +2727,11 @@ version = "0.0.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"distribution-types", "distribution-types",
"once-map",
"pep508_rs", "pep508_rs",
"puffin-cache", "puffin-cache",
"puffin-interpreter", "puffin-interpreter",
"rustc-hash",
"tokio", "tokio",
"waitmap",
] ]
[[package]] [[package]]

View file

@ -26,6 +26,11 @@ A `venv` replacement to create virtual environments in Rust.
Install built distributions (wheels) into a virtual environment.] Install built distributions (wheels) into a virtual environment.]
## [once-map](./once-map)
A [`waitmap`](https://github.com/withoutboats/waitmap)-like concurrent hash map for executing tasks
exactly once.
## [pep440-rs](./pep440-rs) ## [pep440-rs](./pep440-rs)
Utilities for interacting with Python version numbers and specifiers. Utilities for interacting with Python version numbers and specifiers.

View file

@ -0,0 +1,17 @@
[package]
name = "once-map"
version = "0.0.1"
edition = { workspace = true }
rust-version = { workspace = true }
homepage = { workspace = true }
documentation = { workspace = true }
repository = { workspace = true }
authors = { workspace = true }
license = { workspace = true }
[lints]
workspace = true
[dependencies]
rustc-hash = { workspace = true }
waitmap = { workspace = true }

View file

@ -17,6 +17,7 @@ cache-key = { path = "../cache-key" }
distribution-filename = { path = "../distribution-filename", features = ["serde"] } distribution-filename = { path = "../distribution-filename", features = ["serde"] }
distribution-types = { path = "../distribution-types" } distribution-types = { path = "../distribution-types" }
install-wheel-rs = { path = "../install-wheel-rs" } install-wheel-rs = { path = "../install-wheel-rs" }
once-map = { path = "../once-map" }
pep440_rs = { path = "../pep440-rs", features = ["pubgrub"] } pep440_rs = { path = "../pep440-rs", features = ["pubgrub"] }
pep508_rs = { path = "../pep508-rs" } pep508_rs = { path = "../pep508-rs" }
platform-host = { path = "../platform-host" } platform-host = { path = "../platform-host" }
@ -26,9 +27,9 @@ puffin-client = { path = "../puffin-client" }
puffin-distribution = { path = "../puffin-distribution" } puffin-distribution = { path = "../puffin-distribution" }
puffin-git = { path = "../puffin-git" } puffin-git = { path = "../puffin-git" }
puffin-interpreter = { path = "../puffin-interpreter" } puffin-interpreter = { path = "../puffin-interpreter" }
puffin-warnings = { path = "../puffin-warnings" }
puffin-normalize = { path = "../puffin-normalize" } puffin-normalize = { path = "../puffin-normalize" }
puffin-traits = { path = "../puffin-traits" } puffin-traits = { path = "../puffin-traits" }
puffin-warnings = { path = "../puffin-warnings" }
pypi-types = { path = "../pypi-types" } pypi-types = { path = "../pypi-types" }
requirements-txt = { path = "../requirements-txt" } requirements-txt = { path = "../requirements-txt" }

View file

@ -8,11 +8,11 @@ use thiserror::Error;
use url::Url; use url::Url;
use distribution_types::{BuiltDist, PathBuiltDist, PathSourceDist, SourceDist}; use distribution_types::{BuiltDist, PathBuiltDist, PathSourceDist, SourceDist};
use once_map::OnceMap;
use pep440_rs::Version; use pep440_rs::Version;
use pep508_rs::Requirement; use pep508_rs::Requirement;
use puffin_distribution::DistributionDatabaseError; use puffin_distribution::DistributionDatabaseError;
use puffin_normalize::PackageName; use puffin_normalize::PackageName;
use puffin_traits::OnceMap;
use crate::candidate_selector::CandidateSelector; use crate::candidate_selector::CandidateSelector;
use crate::pubgrub::{PubGrubPackage, PubGrubPython, PubGrubReportFormatter}; use crate::pubgrub::{PubGrubPackage, PubGrubPython, PubGrubReportFormatter};

View file

@ -12,10 +12,10 @@ use rustc_hash::FxHashMap;
use url::Url; use url::Url;
use distribution_types::{Dist, DistributionMetadata, LocalEditable, Name, PackageId, Verbatim}; use distribution_types::{Dist, DistributionMetadata, LocalEditable, Name, PackageId, Verbatim};
use once_map::OnceMap;
use pep440_rs::Version; use pep440_rs::Version;
use pep508_rs::VerbatimUrl; use pep508_rs::VerbatimUrl;
use puffin_normalize::{ExtraName, PackageName}; use puffin_normalize::{ExtraName, PackageName};
use puffin_traits::OnceMap;
use pypi_types::{Hashes, Metadata21}; use pypi_types::{Hashes, Metadata21};
use crate::pins::FilePins; use crate::pins::FilePins;

View file

@ -2,8 +2,8 @@ use dashmap::DashMap;
use url::Url; use url::Url;
use distribution_types::PackageId; use distribution_types::PackageId;
use once_map::OnceMap;
use puffin_normalize::PackageName; use puffin_normalize::PackageName;
use puffin_traits::OnceMap;
use pypi_types::Metadata21; use pypi_types::Metadata21;
use crate::version_map::VersionMap; use crate::version_map::VersionMap;

View file

@ -14,11 +14,10 @@ workspace = true
[dependencies] [dependencies]
distribution-types = { path = "../distribution-types" } distribution-types = { path = "../distribution-types" }
once-map = { path = "../once-map" }
pep508_rs = { path = "../pep508-rs" } pep508_rs = { path = "../pep508-rs" }
puffin-cache = { path = "../puffin-cache" } puffin-cache = { path = "../puffin-cache" }
puffin-interpreter = { path = "../puffin-interpreter" } puffin-interpreter = { path = "../puffin-interpreter" }
anyhow = { workspace = true } anyhow = { workspace = true }
rustc-hash = { workspace = true }
tokio = { workspace = true, features = ["sync"] } tokio = { workspace = true, features = ["sync"] }
waitmap = { workspace = true }

View file

@ -7,13 +7,11 @@ use std::path::{Path, PathBuf};
use anyhow::Result; use anyhow::Result;
use distribution_types::{CachedDist, DistributionId, Resolution}; use distribution_types::{CachedDist, DistributionId, Resolution};
pub use once_map::OnceMap; use once_map::OnceMap;
use pep508_rs::Requirement; use pep508_rs::Requirement;
use puffin_cache::Cache; use puffin_cache::Cache;
use puffin_interpreter::{Interpreter, Virtualenv}; use puffin_interpreter::{Interpreter, Virtualenv};
mod once_map;
/// Avoid cyclic crate dependencies between resolver, installer and builder. /// Avoid cyclic crate dependencies between resolver, installer and builder.
/// ///
/// To resolve the dependencies of a packages, we may need to build one or more source /// To resolve the dependencies of a packages, we may need to build one or more source