Consider editable dependencies to be 'direct' (#2114)

Closes https://github.com/astral-sh/uv/issues/2112.
This commit is contained in:
Charlie Marsh 2024-03-01 11:00:45 -05:00 committed by GitHub
parent c9ffe976f9
commit 72dc72496f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 82 additions and 28 deletions

View file

@ -1,5 +1,4 @@
use pubgrub::range::Range;
use rustc_hash::FxHashMap;
use distribution_types::CompatibleDist;
@ -9,7 +8,6 @@ use pep508_rs::{Requirement, VersionOrUrl};
use uv_normalize::PackageName;
use crate::prerelease_mode::PreReleaseStrategy;
use crate::resolution_mode::ResolutionStrategy;
use crate::version_map::{VersionMap, VersionMapDistHandle};
use crate::{Manifest, Options};
@ -25,16 +23,8 @@ impl CandidateSelector {
/// Return a [`CandidateSelector`] for the given [`Manifest`].
pub(crate) fn for_resolution(manifest: &Manifest, options: Options) -> Self {
Self {
resolution_strategy: ResolutionStrategy::from_mode(
options.resolution_mode,
manifest.requirements.as_slice(),
),
prerelease_strategy: PreReleaseStrategy::from_mode(
options.prerelease_mode,
manifest.requirements.as_slice(),
manifest.constraints.as_slice(),
manifest.overrides.as_slice(),
),
resolution_strategy: ResolutionStrategy::from_mode(options.resolution_mode, manifest),
prerelease_strategy: PreReleaseStrategy::from_mode(options.prerelease_mode, manifest),
preferences: Preferences::from(manifest.preferences.as_slice()),
}
}

View file

@ -1,8 +1,10 @@
use rustc_hash::FxHashSet;
use pep508_rs::{Requirement, VersionOrUrl};
use pep508_rs::VersionOrUrl;
use uv_normalize::PackageName;
use crate::Manifest;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum PreReleaseMode {
@ -48,21 +50,23 @@ pub(crate) enum PreReleaseStrategy {
}
impl PreReleaseStrategy {
pub(crate) fn from_mode(
mode: PreReleaseMode,
requirements: &[Requirement],
constraints: &[Requirement],
overrides: &[Requirement],
) -> Self {
pub(crate) fn from_mode(mode: PreReleaseMode, manifest: &Manifest) -> Self {
match mode {
PreReleaseMode::Disallow => Self::Disallow,
PreReleaseMode::Allow => Self::Allow,
PreReleaseMode::IfNecessary => Self::IfNecessary,
PreReleaseMode::Explicit => Self::Explicit(
requirements
manifest
.requirements
.iter()
.chain(constraints.iter())
.chain(overrides.iter())
.chain(manifest.constraints.iter())
.chain(manifest.overrides.iter())
.chain(
manifest
.editables
.iter()
.flat_map(|(_editable, metadata)| metadata.requires_dist.iter()),
)
.filter(|requirement| {
let Some(version_or_url) = &requirement.version_or_url else {
return false;
@ -81,10 +85,17 @@ impl PreReleaseStrategy {
.collect(),
),
PreReleaseMode::IfNecessaryOrExplicit => Self::IfNecessaryOrExplicit(
requirements
manifest
.requirements
.iter()
.chain(constraints.iter())
.chain(overrides.iter())
.chain(manifest.constraints.iter())
.chain(manifest.overrides.iter())
.chain(
manifest
.editables
.iter()
.flat_map(|(_editable, metadata)| metadata.requires_dist.iter()),
)
.filter(|requirement| {
let Some(version_or_url) = &requirement.version_or_url else {
return false;

View file

@ -1,8 +1,9 @@
use rustc_hash::FxHashSet;
use pep508_rs::Requirement;
use uv_normalize::PackageName;
use crate::Manifest;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum ResolutionMode {
@ -30,13 +31,21 @@ pub(crate) enum ResolutionStrategy {
}
impl ResolutionStrategy {
pub(crate) fn from_mode(mode: ResolutionMode, direct_dependencies: &[Requirement]) -> Self {
pub(crate) fn from_mode(mode: ResolutionMode, manifest: &Manifest) -> Self {
match mode {
ResolutionMode::Highest => Self::Highest,
ResolutionMode::Lowest => Self::Lowest,
ResolutionMode::LowestDirect => Self::LowestDirect(
direct_dependencies
// Consider `requirements` and dependencies of `editables` to be "direct" dependencies.
manifest
.requirements
.iter()
.chain(
manifest
.editables
.iter()
.flat_map(|(_editable, metadata)| metadata.requires_dist.iter()),
)
.map(|requirement| requirement.name.clone())
.collect(),
),