mirror of
https://github.com/astral-sh/uv.git
synced 2025-08-04 19:08:04 +00:00
Consider editable dependencies to be 'direct' (#2114)
Closes https://github.com/astral-sh/uv/issues/2112.
This commit is contained in:
parent
c9ffe976f9
commit
72dc72496f
4 changed files with 82 additions and 28 deletions
|
@ -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()),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(),
|
||||
),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue