From 604be9ed718704279c318cb049d49e576ba1410f Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 25 Jun 2024 02:28:55 +0300 Subject: [PATCH] Use `Preferences` struct in Manifest API (#4496) ## Summary This is just a bit more consistent with `Overrides` and `Constraints`. --- crates/uv-resolver/src/lib.rs | 2 +- crates/uv-resolver/src/manifest.rs | 9 +++++---- crates/uv-resolver/src/preferences.rs | 11 ++++++++--- crates/uv-resolver/src/resolver/mod.rs | 2 +- crates/uv-resolver/src/yanks.rs | 6 +++--- crates/uv/src/commands/pip/operations.rs | 3 ++- 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/crates/uv-resolver/src/lib.rs b/crates/uv-resolver/src/lib.rs index 65a4223d3..445d21f19 100644 --- a/crates/uv-resolver/src/lib.rs +++ b/crates/uv-resolver/src/lib.rs @@ -6,7 +6,7 @@ pub use flat_index::FlatIndex; pub use lock::{Lock, LockError}; pub use manifest::Manifest; pub use options::{Options, OptionsBuilder}; -pub use preferences::{Preference, PreferenceError}; +pub use preferences::{Preference, PreferenceError, Preferences}; pub use prerelease_mode::PreReleaseMode; pub use pubgrub::{PubGrubSpecifier, PubGrubSpecifierError}; pub use python_requirement::PythonRequirement; diff --git a/crates/uv-resolver/src/manifest.rs b/crates/uv-resolver/src/manifest.rs index 22ae0df8b..e124a9a6d 100644 --- a/crates/uv-resolver/src/manifest.rs +++ b/crates/uv-resolver/src/manifest.rs @@ -6,7 +6,8 @@ use uv_configuration::{Constraints, Overrides}; use uv_normalize::{GroupName, PackageName}; use uv_types::RequestedRequirements; -use crate::{preferences::Preference, DependencyMode, Exclusions}; +use crate::preferences::Preferences; +use crate::{DependencyMode, Exclusions}; /// A manifest of requirements, constraints, and preferences. #[derive(Clone, Debug)] @@ -29,7 +30,7 @@ pub struct Manifest { /// These represent "preferred" versions of a given package. For example, they may be the /// versions that are already installed in the environment, or already pinned in an existing /// lockfile. - pub(crate) preferences: Vec, + pub(crate) preferences: Preferences, /// The name of the project. pub(crate) project: Option, @@ -55,7 +56,7 @@ impl Manifest { constraints: Constraints, overrides: Overrides, dev: Vec, - preferences: Vec, + preferences: Preferences, project: Option, exclusions: Exclusions, lookaheads: Vec, @@ -78,7 +79,7 @@ impl Manifest { constraints: Constraints::default(), overrides: Overrides::default(), dev: Vec::new(), - preferences: Vec::new(), + preferences: Preferences::default(), project: None, exclusions: Exclusions::default(), lookaheads: Vec::new(), diff --git a/crates/uv-resolver/src/preferences.rs b/crates/uv-resolver/src/preferences.rs index 8d5c991fc..f10aa14e7 100644 --- a/crates/uv-resolver/src/preferences.rs +++ b/crates/uv-resolver/src/preferences.rs @@ -98,8 +98,8 @@ impl Preference { } /// A set of pinned packages that should be preserved during resolution, if possible. -#[derive(Debug, Clone)] -pub(crate) struct Preferences(Arc>); +#[derive(Debug, Clone, Default)] +pub struct Preferences(Arc>); impl Preferences { /// Create a map of pinned packages from an iterator of [`Preference`] entries. @@ -107,7 +107,7 @@ impl Preferences { /// /// The provided [`MarkerEnvironment`] will be used to filter the preferences /// to an applicable subset. - pub(crate) fn from_iter>( + pub fn from_iter>( preferences: PreferenceIterator, markers: Option<&MarkerEnvironment>, ) -> Self { @@ -137,6 +137,11 @@ impl Preferences { Self(Arc::new(preferences)) } + /// Returns an iterator over the preferences. + pub fn iter(&self) -> impl Iterator { + self.0.iter().map(|(name, pin)| (name, pin.version())) + } + /// Return the pinned version for a package, if any. pub(crate) fn version(&self, package_name: &PackageName) -> Option<&Version> { self.0.get(package_name).map(Pin::version) diff --git a/crates/uv-resolver/src/resolver/mod.rs b/crates/uv-resolver/src/resolver/mod.rs index fb10679ea..7b5d88be4 100644 --- a/crates/uv-resolver/src/resolver/mod.rs +++ b/crates/uv-resolver/src/resolver/mod.rs @@ -213,7 +213,7 @@ impl constraints: manifest.constraints, overrides: manifest.overrides, dev: manifest.dev, - preferences: Preferences::from_iter(manifest.preferences, markers), + preferences: manifest.preferences, exclusions: manifest.exclusions, hasher: hasher.clone(), markers: markers.cloned(), diff --git a/crates/uv-resolver/src/yanks.rs b/crates/uv-resolver/src/yanks.rs index 7d22aa3e4..96215263a 100644 --- a/crates/uv-resolver/src/yanks.rs +++ b/crates/uv-resolver/src/yanks.rs @@ -40,11 +40,11 @@ impl AllowedYanks { } // Allow yanks for any packages that are already pinned in the lockfile. - for preference in &manifest.preferences { + for (name, version) in manifest.preferences.iter() { allowed_yanks - .entry(preference.name().clone()) + .entry(name.clone()) .or_default() - .insert(preference.version().clone()); + .insert(version.clone()); } Self(allowed_yanks) diff --git a/crates/uv/src/commands/pip/operations.rs b/crates/uv/src/commands/pip/operations.rs index a9a2a63bd..e7f0a32c2 100644 --- a/crates/uv/src/commands/pip/operations.rs +++ b/crates/uv/src/commands/pip/operations.rs @@ -35,7 +35,7 @@ use uv_requirements::{ }; use uv_resolver::{ DependencyMode, Exclusions, FlatIndex, InMemoryIndex, Manifest, Options, Preference, - PythonRequirement, ResolutionGraph, Resolver, + Preferences, PythonRequirement, ResolutionGraph, Resolver, }; use uv_toolchain::{Interpreter, PythonEnvironment}; use uv_types::{HashStrategy, InFlight, InstalledPackagesProvider}; @@ -184,6 +184,7 @@ pub(crate) async fn resolve( // Collect constraints and overrides. let constraints = Constraints::from_requirements(constraints); let overrides = Overrides::from_requirements(overrides); + let preferences = Preferences::from_iter(preferences, markers); // Determine the Python requirement, defaulting to that of the interpreter. let python_requirement =