mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 21:35:00 +00:00
Use Preferences
struct in Manifest API (#4496)
## Summary This is just a bit more consistent with `Overrides` and `Constraints`.
This commit is contained in:
parent
10ec9c9d0b
commit
604be9ed71
6 changed files with 20 additions and 13 deletions
|
@ -6,7 +6,7 @@ pub use flat_index::FlatIndex;
|
||||||
pub use lock::{Lock, LockError};
|
pub use lock::{Lock, LockError};
|
||||||
pub use manifest::Manifest;
|
pub use manifest::Manifest;
|
||||||
pub use options::{Options, OptionsBuilder};
|
pub use options::{Options, OptionsBuilder};
|
||||||
pub use preferences::{Preference, PreferenceError};
|
pub use preferences::{Preference, PreferenceError, Preferences};
|
||||||
pub use prerelease_mode::PreReleaseMode;
|
pub use prerelease_mode::PreReleaseMode;
|
||||||
pub use pubgrub::{PubGrubSpecifier, PubGrubSpecifierError};
|
pub use pubgrub::{PubGrubSpecifier, PubGrubSpecifierError};
|
||||||
pub use python_requirement::PythonRequirement;
|
pub use python_requirement::PythonRequirement;
|
||||||
|
|
|
@ -6,7 +6,8 @@ use uv_configuration::{Constraints, Overrides};
|
||||||
use uv_normalize::{GroupName, PackageName};
|
use uv_normalize::{GroupName, PackageName};
|
||||||
use uv_types::RequestedRequirements;
|
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.
|
/// A manifest of requirements, constraints, and preferences.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
@ -29,7 +30,7 @@ pub struct Manifest {
|
||||||
/// These represent "preferred" versions of a given package. For example, they may be the
|
/// 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
|
/// versions that are already installed in the environment, or already pinned in an existing
|
||||||
/// lockfile.
|
/// lockfile.
|
||||||
pub(crate) preferences: Vec<Preference>,
|
pub(crate) preferences: Preferences,
|
||||||
|
|
||||||
/// The name of the project.
|
/// The name of the project.
|
||||||
pub(crate) project: Option<PackageName>,
|
pub(crate) project: Option<PackageName>,
|
||||||
|
@ -55,7 +56,7 @@ impl Manifest {
|
||||||
constraints: Constraints,
|
constraints: Constraints,
|
||||||
overrides: Overrides,
|
overrides: Overrides,
|
||||||
dev: Vec<GroupName>,
|
dev: Vec<GroupName>,
|
||||||
preferences: Vec<Preference>,
|
preferences: Preferences,
|
||||||
project: Option<PackageName>,
|
project: Option<PackageName>,
|
||||||
exclusions: Exclusions,
|
exclusions: Exclusions,
|
||||||
lookaheads: Vec<RequestedRequirements>,
|
lookaheads: Vec<RequestedRequirements>,
|
||||||
|
@ -78,7 +79,7 @@ impl Manifest {
|
||||||
constraints: Constraints::default(),
|
constraints: Constraints::default(),
|
||||||
overrides: Overrides::default(),
|
overrides: Overrides::default(),
|
||||||
dev: Vec::new(),
|
dev: Vec::new(),
|
||||||
preferences: Vec::new(),
|
preferences: Preferences::default(),
|
||||||
project: None,
|
project: None,
|
||||||
exclusions: Exclusions::default(),
|
exclusions: Exclusions::default(),
|
||||||
lookaheads: Vec::new(),
|
lookaheads: Vec::new(),
|
||||||
|
|
|
@ -98,8 +98,8 @@ impl Preference {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A set of pinned packages that should be preserved during resolution, if possible.
|
/// A set of pinned packages that should be preserved during resolution, if possible.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Default)]
|
||||||
pub(crate) struct Preferences(Arc<FxHashMap<PackageName, Pin>>);
|
pub struct Preferences(Arc<FxHashMap<PackageName, Pin>>);
|
||||||
|
|
||||||
impl Preferences {
|
impl Preferences {
|
||||||
/// Create a map of pinned packages from an iterator of [`Preference`] entries.
|
/// 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
|
/// The provided [`MarkerEnvironment`] will be used to filter the preferences
|
||||||
/// to an applicable subset.
|
/// to an applicable subset.
|
||||||
pub(crate) fn from_iter<PreferenceIterator: IntoIterator<Item = Preference>>(
|
pub fn from_iter<PreferenceIterator: IntoIterator<Item = Preference>>(
|
||||||
preferences: PreferenceIterator,
|
preferences: PreferenceIterator,
|
||||||
markers: Option<&MarkerEnvironment>,
|
markers: Option<&MarkerEnvironment>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
|
@ -137,6 +137,11 @@ impl Preferences {
|
||||||
Self(Arc::new(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.
|
/// Return the pinned version for a package, if any.
|
||||||
pub(crate) fn version(&self, package_name: &PackageName) -> Option<&Version> {
|
pub(crate) fn version(&self, package_name: &PackageName) -> Option<&Version> {
|
||||||
self.0.get(package_name).map(Pin::version)
|
self.0.get(package_name).map(Pin::version)
|
||||||
|
|
|
@ -213,7 +213,7 @@ impl<Provider: ResolverProvider, InstalledPackages: InstalledPackagesProvider>
|
||||||
constraints: manifest.constraints,
|
constraints: manifest.constraints,
|
||||||
overrides: manifest.overrides,
|
overrides: manifest.overrides,
|
||||||
dev: manifest.dev,
|
dev: manifest.dev,
|
||||||
preferences: Preferences::from_iter(manifest.preferences, markers),
|
preferences: manifest.preferences,
|
||||||
exclusions: manifest.exclusions,
|
exclusions: manifest.exclusions,
|
||||||
hasher: hasher.clone(),
|
hasher: hasher.clone(),
|
||||||
markers: markers.cloned(),
|
markers: markers.cloned(),
|
||||||
|
|
|
@ -40,11 +40,11 @@ impl AllowedYanks {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow yanks for any packages that are already pinned in the lockfile.
|
// 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
|
allowed_yanks
|
||||||
.entry(preference.name().clone())
|
.entry(name.clone())
|
||||||
.or_default()
|
.or_default()
|
||||||
.insert(preference.version().clone());
|
.insert(version.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
Self(allowed_yanks)
|
Self(allowed_yanks)
|
||||||
|
|
|
@ -35,7 +35,7 @@ use uv_requirements::{
|
||||||
};
|
};
|
||||||
use uv_resolver::{
|
use uv_resolver::{
|
||||||
DependencyMode, Exclusions, FlatIndex, InMemoryIndex, Manifest, Options, Preference,
|
DependencyMode, Exclusions, FlatIndex, InMemoryIndex, Manifest, Options, Preference,
|
||||||
PythonRequirement, ResolutionGraph, Resolver,
|
Preferences, PythonRequirement, ResolutionGraph, Resolver,
|
||||||
};
|
};
|
||||||
use uv_toolchain::{Interpreter, PythonEnvironment};
|
use uv_toolchain::{Interpreter, PythonEnvironment};
|
||||||
use uv_types::{HashStrategy, InFlight, InstalledPackagesProvider};
|
use uv_types::{HashStrategy, InFlight, InstalledPackagesProvider};
|
||||||
|
@ -184,6 +184,7 @@ pub(crate) async fn resolve<InstalledPackages: InstalledPackagesProvider>(
|
||||||
// Collect constraints and overrides.
|
// Collect constraints and overrides.
|
||||||
let constraints = Constraints::from_requirements(constraints);
|
let constraints = Constraints::from_requirements(constraints);
|
||||||
let overrides = Overrides::from_requirements(overrides);
|
let overrides = Overrides::from_requirements(overrides);
|
||||||
|
let preferences = Preferences::from_iter(preferences, markers);
|
||||||
|
|
||||||
// Determine the Python requirement, defaulting to that of the interpreter.
|
// Determine the Python requirement, defaulting to that of the interpreter.
|
||||||
let python_requirement =
|
let python_requirement =
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue