Respect build constraints for uv run --with dependencies (#12882)

## Summary

Closes #12505 

## Test Plan

`cargo test`
This commit is contained in:
Ahmed Ilyas 2025-04-14 18:53:17 +02:00 committed by GitHub
parent cb9499c210
commit c979d15e96
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 81 additions and 2 deletions

View file

@ -894,13 +894,17 @@ hint: If you are running a script with `{}` in the shebang, you may need to incl
Some(spec) => {
debug!("Syncing ephemeral requirements");
// Read the build constraints from the lock file.
let build_constraints = lock
.as_ref()
.map(|(lock, path)| lock.build_constraints(path));
let result = CachedEnvironment::from_spec(
EnvironmentSpecification::from(spec).with_lock(
lock.as_ref()
.map(|(lock, install_path)| (lock, install_path.as_ref())),
),
// TODO(bluefact): Respect build constraints for `uv run --with` dependencies.
Constraints::default(),
build_constraints.unwrap_or_default(),
&base_interpreter,
&settings,
&network_settings,

View file

@ -1266,6 +1266,81 @@ fn run_with() -> Result<()> {
Ok(())
}
#[test]
fn run_with_build_constraints() -> Result<()> {
let context = TestContext::new("3.8");
let pyproject_toml = context.temp_dir.child("pyproject.toml");
pyproject_toml.write_str(indoc! { r#"
[project]
name = "foo"
version = "1.0.0"
requires-python = ">=3.8"
dependencies = ["anyio"]
[tool.uv]
build-constraint-dependencies = ["setuptools==1"]
"#
})?;
let test_script = context.temp_dir.child("main.py");
test_script.write_str(indoc! { r"
import os
"
})?;
// Installing requests with incompatible build constraints should fail.
uv_snapshot!(context.filters(), context.run().arg("--with").arg("requests==1.2").arg("main.py"), @r###"
success: false
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 6 packages in [TIME]
Prepared 5 packages in [TIME]
Installed 5 packages in [TIME]
+ anyio==4.3.0
+ exceptiongroup==1.2.0
+ idna==3.6
+ sniffio==1.3.1
+ typing-extensions==4.10.0
Resolved 1 package in [TIME]
× Failed to download and build `requests==1.2.0`
Failed to resolve requirements from `setup.py` build
No solution found when resolving: `setuptools>=40.8.0`
Because you require setuptools>=40.8.0 and setuptools==1, we can conclude that your requirements are unsatisfiable.
"###);
// Change the build constraint to be compatible with `requests==1.2`.
pyproject_toml.write_str(indoc! { r#"
[project]
name = "foo"
version = "1.0.0"
requires-python = ">=3.8"
dependencies = ["anyio"]
[tool.uv]
build-constraint-dependencies = ["setuptools>=42"]
"#
})?;
uv_snapshot!(context.filters(), context.run().arg("--with").arg("requests==1.2").arg("main.py"), @r###"
success: true
exit_code: 0
----- stdout -----
----- stderr -----
Resolved 6 packages in [TIME]
Audited 5 packages in [TIME]
Resolved 1 package in [TIME]
Prepared 1 package in [TIME]
Installed 1 package in [TIME]
+ requests==1.2.0
"###);
Ok(())
}
/// Sync all members in a workspace.
#[test]
fn run_in_workspace() -> Result<()> {