mirror of
https://github.com/astral-sh/uv.git
synced 2025-12-11 20:39:50 +00:00
Respect --no-sources for uv pip install workspace discovery (#11003)
This commit is contained in:
parent
bbba2c7bce
commit
c1a2ef12d2
3 changed files with 128 additions and 16 deletions
|
|
@ -5,7 +5,7 @@ use uv_configuration::{LowerBound, SourceStrategy};
|
||||||
use uv_distribution_types::IndexLocations;
|
use uv_distribution_types::IndexLocations;
|
||||||
use uv_normalize::PackageName;
|
use uv_normalize::PackageName;
|
||||||
use uv_workspace::pyproject::ToolUvSources;
|
use uv_workspace::pyproject::ToolUvSources;
|
||||||
use uv_workspace::{DiscoveryOptions, ProjectWorkspace, Workspace};
|
use uv_workspace::{DiscoveryOptions, MemberDiscovery, ProjectWorkspace, Workspace};
|
||||||
|
|
||||||
use crate::metadata::{LoweredRequirement, MetadataError};
|
use crate::metadata::{LoweredRequirement, MetadataError};
|
||||||
|
|
||||||
|
|
@ -39,10 +39,17 @@ impl BuildRequires {
|
||||||
sources: SourceStrategy,
|
sources: SourceStrategy,
|
||||||
lower_bound: LowerBound,
|
lower_bound: LowerBound,
|
||||||
) -> Result<Self, MetadataError> {
|
) -> Result<Self, MetadataError> {
|
||||||
|
let discovery = match sources {
|
||||||
|
SourceStrategy::Enabled => DiscoveryOptions::default(),
|
||||||
|
SourceStrategy::Disabled => DiscoveryOptions {
|
||||||
|
members: MemberDiscovery::None,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
// TODO(konsti): Cache workspace discovery.
|
// TODO(konsti): Cache workspace discovery.
|
||||||
let Some(project_workspace) =
|
let Some(project_workspace) =
|
||||||
ProjectWorkspace::from_maybe_project_root(install_path, &DiscoveryOptions::default())
|
ProjectWorkspace::from_maybe_project_root(install_path, &discovery).await?
|
||||||
.await?
|
|
||||||
else {
|
else {
|
||||||
return Ok(Self::from_metadata23(metadata));
|
return Ok(Self::from_metadata23(metadata));
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ use uv_normalize::{ExtraName, GroupName, PackageName, DEV_DEPENDENCIES};
|
||||||
use uv_pep508::MarkerTree;
|
use uv_pep508::MarkerTree;
|
||||||
use uv_workspace::dependency_groups::FlatDependencyGroups;
|
use uv_workspace::dependency_groups::FlatDependencyGroups;
|
||||||
use uv_workspace::pyproject::{Sources, ToolUvSources};
|
use uv_workspace::pyproject::{Sources, ToolUvSources};
|
||||||
use uv_workspace::{DiscoveryOptions, ProjectWorkspace};
|
use uv_workspace::{DiscoveryOptions, MemberDiscovery, ProjectWorkspace};
|
||||||
|
|
||||||
use crate::metadata::{GitWorkspaceMember, LoweredRequirement, MetadataError};
|
use crate::metadata::{GitWorkspaceMember, LoweredRequirement, MetadataError};
|
||||||
use crate::Metadata;
|
use crate::Metadata;
|
||||||
|
|
@ -52,18 +52,17 @@ impl RequiresDist {
|
||||||
lower_bound: LowerBound,
|
lower_bound: LowerBound,
|
||||||
) -> Result<Self, MetadataError> {
|
) -> Result<Self, MetadataError> {
|
||||||
// TODO(konsti): Cache workspace discovery.
|
// TODO(konsti): Cache workspace discovery.
|
||||||
let discovery_options = if let Some(git_member) = &git_member {
|
let discovery_options = DiscoveryOptions {
|
||||||
DiscoveryOptions {
|
stop_discovery_at: git_member.map(|git_member| {
|
||||||
stop_discovery_at: Some(
|
|
||||||
git_member
|
git_member
|
||||||
.fetch_root
|
.fetch_root
|
||||||
.parent()
|
.parent()
|
||||||
.expect("git checkout has a parent"),
|
.expect("git checkout has a parent")
|
||||||
),
|
}),
|
||||||
..Default::default()
|
members: match sources {
|
||||||
}
|
SourceStrategy::Enabled => MemberDiscovery::default(),
|
||||||
} else {
|
SourceStrategy::Disabled => MemberDiscovery::None,
|
||||||
DiscoveryOptions::default()
|
},
|
||||||
};
|
};
|
||||||
let Some(project_workspace) =
|
let Some(project_workspace) =
|
||||||
ProjectWorkspace::from_maybe_project_root(install_path, &discovery_options).await?
|
ProjectWorkspace::from_maybe_project_root(install_path, &discovery_options).await?
|
||||||
|
|
|
||||||
|
|
@ -8428,3 +8428,109 @@ fn direct_url_json_direct_url() -> Result<()> {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Regression test that we don't discover workspaces with `--no-sources`.
|
||||||
|
///
|
||||||
|
/// We have a workspace dependency shadowing a PyPI package and using this package's version to
|
||||||
|
/// check that by default we respect workspace package, but with `--no-sources`, we ignore them.
|
||||||
|
#[test]
|
||||||
|
fn no_sources_workspace_discovery() -> Result<()> {
|
||||||
|
let context = TestContext::new("3.12");
|
||||||
|
context.temp_dir.child("pyproject.toml").write_str(indoc! {
|
||||||
|
r#"
|
||||||
|
[project]
|
||||||
|
name = "foo"
|
||||||
|
version = "1.0.0"
|
||||||
|
dependencies = ["anyio"]
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["hatchling"]
|
||||||
|
build-backend = "hatchling.build"
|
||||||
|
|
||||||
|
[tool.uv.sources]
|
||||||
|
anyio = { workspace = true }
|
||||||
|
|
||||||
|
[tool.uv.workspace]
|
||||||
|
members = ["anyio"]
|
||||||
|
"#
|
||||||
|
})?;
|
||||||
|
context
|
||||||
|
.temp_dir
|
||||||
|
.child("src")
|
||||||
|
.child("foo")
|
||||||
|
.child("__init__.py")
|
||||||
|
.touch()?;
|
||||||
|
|
||||||
|
let anyio = context.temp_dir.child("anyio");
|
||||||
|
anyio.child("pyproject.toml").write_str(indoc! {
|
||||||
|
r#"
|
||||||
|
[project]
|
||||||
|
name = "anyio"
|
||||||
|
version = "2.0.0"
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["hatchling"]
|
||||||
|
build-backend = "hatchling.build"
|
||||||
|
"#
|
||||||
|
})?;
|
||||||
|
anyio
|
||||||
|
.child("src")
|
||||||
|
.child("anyio")
|
||||||
|
.child("__init__.py")
|
||||||
|
.touch()?;
|
||||||
|
|
||||||
|
uv_snapshot!(context.filters(), context.pip_install()
|
||||||
|
.arg("."), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 2 packages in [TIME]
|
||||||
|
Prepared 2 packages in [TIME]
|
||||||
|
Installed 2 packages in [TIME]
|
||||||
|
+ anyio==2.0.0 (from file://[TEMP_DIR]/anyio)
|
||||||
|
+ foo==1.0.0 (from file://[TEMP_DIR]/)
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
|
||||||
|
uv_snapshot!(context.filters(), context.pip_install()
|
||||||
|
.arg("--upgrade")
|
||||||
|
.arg("--no-sources")
|
||||||
|
.arg("."), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 4 packages in [TIME]
|
||||||
|
Prepared 3 packages in [TIME]
|
||||||
|
Uninstalled 1 package in [TIME]
|
||||||
|
Installed 3 packages in [TIME]
|
||||||
|
- anyio==2.0.0 (from file://[TEMP_DIR]/anyio)
|
||||||
|
+ anyio==4.3.0
|
||||||
|
+ idna==3.6
|
||||||
|
+ sniffio==1.3.1
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
|
||||||
|
// Reverse direction: Check that we switch back to the workspace package with `--upgrade`.
|
||||||
|
uv_snapshot!(context.filters(), context.pip_install()
|
||||||
|
.arg("--upgrade")
|
||||||
|
.arg("."), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 2 packages in [TIME]
|
||||||
|
Prepared 1 package in [TIME]
|
||||||
|
Uninstalled 1 package in [TIME]
|
||||||
|
Installed 1 package in [TIME]
|
||||||
|
- anyio==4.3.0
|
||||||
|
+ anyio==2.0.0 (from file://[TEMP_DIR]/anyio)
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue