mirror of https://github.com/astral-sh/uv
Improve error messages for `uv pip install` with `--extra` or `--all-extras` and invalid sources (#11193)
Closes https://github.com/astral-sh/uv/issues/11190 Closes https://github.com/astral-sh/uv/issues/7845 This error message was copied over from `uv pip compile` (presumably) but makes way more sense there than here.
This commit is contained in:
parent
dd7cd2e86a
commit
bb3ffcfe52
|
|
@ -60,8 +60,18 @@ pub(crate) async fn read_requirements(
|
||||||
// If the user requests `extras` but does not provide a valid source (e.g., a `pyproject.toml`),
|
// If the user requests `extras` but does not provide a valid source (e.g., a `pyproject.toml`),
|
||||||
// return an error.
|
// return an error.
|
||||||
if !extras.is_empty() && !requirements.iter().any(RequirementsSource::allows_extras) {
|
if !extras.is_empty() && !requirements.iter().any(RequirementsSource::allows_extras) {
|
||||||
|
let hint = if requirements.iter().any(|source| {
|
||||||
|
matches!(
|
||||||
|
source,
|
||||||
|
RequirementsSource::Editable(_) | RequirementsSource::SourceTree(_)
|
||||||
|
)
|
||||||
|
}) {
|
||||||
|
"Use `<dir>[extra]` syntax or `-r <file>` instead."
|
||||||
|
} else {
|
||||||
|
"Use `package[extra]` syntax instead."
|
||||||
|
};
|
||||||
return Err(anyhow!(
|
return Err(anyhow!(
|
||||||
"Requesting extras requires a `pyproject.toml`, `setup.cfg`, or `setup.py` file."
|
"Requesting extras requires a `pyproject.toml`, `setup.cfg`, or `setup.py` file. {hint}"
|
||||||
)
|
)
|
||||||
.into());
|
.into());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1031,6 +1031,83 @@ fn allow_incompatibilities() -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn install_extras() -> Result<()> {
|
||||||
|
let context = TestContext::new("3.12");
|
||||||
|
|
||||||
|
// Request extras for an editable path
|
||||||
|
uv_snapshot!(context.filters(), context.pip_install()
|
||||||
|
.arg("--all-extras")
|
||||||
|
.arg("-e")
|
||||||
|
.arg(context.workspace_root.join("scripts/packages/poetry_editable")), @r###"
|
||||||
|
success: false
|
||||||
|
exit_code: 2
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
error: Requesting extras requires a `pyproject.toml`, `setup.cfg`, or `setup.py` file. Use `<dir>[extra]` syntax or `-r <file>` instead.
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
|
||||||
|
// Request extras for a source tree
|
||||||
|
uv_snapshot!(context.filters(), context.pip_install()
|
||||||
|
.arg("--all-extras")
|
||||||
|
.arg(context.workspace_root.join("scripts/packages/poetry_editable")), @r###"
|
||||||
|
success: false
|
||||||
|
exit_code: 2
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
error: Requesting extras requires a `pyproject.toml`, `setup.cfg`, or `setup.py` file. Use `package[extra]` syntax instead.
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
|
||||||
|
let requirements_txt = context.temp_dir.child("requirements.txt");
|
||||||
|
requirements_txt.write_str("anyio==3.7.0")?;
|
||||||
|
|
||||||
|
// Request extras for a requirements file
|
||||||
|
uv_snapshot!(context.filters(), context.pip_install()
|
||||||
|
.arg("--all-extras")
|
||||||
|
.arg("-r").arg("requirements.txt"), @r###"
|
||||||
|
success: false
|
||||||
|
exit_code: 2
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
error: Requesting extras requires a `pyproject.toml`, `setup.cfg`, or `setup.py` file. Use `package[extra]` syntax instead.
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
|
||||||
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
||||||
|
pyproject_toml.write_str(
|
||||||
|
r#"
|
||||||
|
[project]
|
||||||
|
name = "project"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = ["anyio==3.7.0"]
|
||||||
|
"#,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
uv_snapshot!(context.filters(), context.pip_install()
|
||||||
|
.arg("--all-extras")
|
||||||
|
.arg("-r").arg("pyproject.toml"), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 3 packages in [TIME]
|
||||||
|
Prepared 3 packages in [TIME]
|
||||||
|
Installed 3 packages in [TIME]
|
||||||
|
+ anyio==3.7.0
|
||||||
|
+ idna==3.6
|
||||||
|
+ sniffio==1.3.1
|
||||||
|
"###
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn install_editable() {
|
fn install_editable() {
|
||||||
let context = TestContext::new("3.12");
|
let context = TestContext::new("3.12");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue