Use Preferences struct in Manifest API (#4496)

## Summary

This is just a bit more consistent with `Overrides` and `Constraints`.
This commit is contained in:
Charlie Marsh 2024-06-25 02:28:55 +03:00 committed by GitHub
parent 10ec9c9d0b
commit 604be9ed71
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 20 additions and 13 deletions

View file

@ -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;

View file

@ -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<Preference>,
pub(crate) preferences: Preferences,
/// The name of the project.
pub(crate) project: Option<PackageName>,
@ -55,7 +56,7 @@ impl Manifest {
constraints: Constraints,
overrides: Overrides,
dev: Vec<GroupName>,
preferences: Vec<Preference>,
preferences: Preferences,
project: Option<PackageName>,
exclusions: Exclusions,
lookaheads: Vec<RequestedRequirements>,
@ -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(),

View file

@ -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<FxHashMap<PackageName, Pin>>);
#[derive(Debug, Clone, Default)]
pub struct Preferences(Arc<FxHashMap<PackageName, Pin>>);
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<PreferenceIterator: IntoIterator<Item = Preference>>(
pub fn from_iter<PreferenceIterator: IntoIterator<Item = Preference>>(
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<Item = (&PackageName, &Version)> {
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)

View file

@ -213,7 +213,7 @@ impl<Provider: ResolverProvider, InstalledPackages: InstalledPackagesProvider>
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(),

View file

@ -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)

View file

@ -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<InstalledPackages: InstalledPackagesProvider>(
// 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 =