Make more informative warning message when failed to parse pyproject.toml (#6009)

## Summary

Added the actual error message to the warning when uv fails to parse
`pyproject.toml`.

Resolves https://github.com/astral-sh/uv/issues/5934

## Test Plan

Took the case from the issue:
- have `pyproject.toml` which contains
```
[tool.uv]
foobar = false
```
- 
```
$ uv venv --preview -v
```
- Expect the message that contains the actual problem in the
`pyproject.toml` like:
```
warning: Failed to parse `pyproject.toml` during settings discovery: unknown field `foobar`; skipping...
```
This commit is contained in:
Alexander Gherm 2024-08-11 23:13:14 +02:00 committed by GitHub
parent 5c44937742
commit 798cc7bf3c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 24 additions and 4 deletions

1
Cargo.lock generated
View file

@ -5127,6 +5127,7 @@ dependencies = [
"pypi-types", "pypi-types",
"schemars", "schemars",
"serde", "serde",
"textwrap",
"thiserror", "thiserror",
"toml", "toml",
"tracing", "tracing",

View file

@ -31,6 +31,7 @@ dirs-sys = { workspace = true }
fs-err = { workspace = true } fs-err = { workspace = true }
schemars = { workspace = true, optional = true } schemars = { workspace = true, optional = true }
serde = { workspace = true } serde = { workspace = true }
textwrap = { workspace = true }
thiserror = { workspace = true } thiserror = { workspace = true }
toml = { workspace = true } toml = { workspace = true }
tracing = { workspace = true } tracing = { workspace = true }

View file

@ -72,9 +72,13 @@ impl FilesystemOptions {
Ok(None) => { Ok(None) => {
// Continue traversing the directory tree. // Continue traversing the directory tree.
} }
Err(Error::PyprojectToml(file, _err)) => { Err(Error::PyprojectToml(file, err)) => {
// If we see an invalid `pyproject.toml`, warn but continue. // If we see an invalid `pyproject.toml`, warn but continue.
warn_user!("Failed to parse `{file}` during settings discovery; skipping..."); warn_user!(
"Failed to parse `{}` during settings discovery:\n{}",
file.cyan(),
textwrap::indent(&err.to_string(), " ")
);
} }
Err(err) => { Err(err) => {
// Otherwise, warn and stop. // Otherwise, warn and stop.

View file

@ -3263,7 +3263,15 @@ fn override_dependency_from_workspace_invalid_syntax() -> Result<()> {
----- stdout ----- ----- stdout -----
----- stderr ----- ----- stderr -----
warning: Failed to parse `pyproject.toml` during settings discovery; skipping... warning: Failed to parse `pyproject.toml` during settings discovery:
TOML parse error at line 9, column 29
|
9 | override-dependencies = [
| ^
no such comparison operator "=", must be one of ~= == != <= >= < > ===
werkzeug=2.3.0
^^^^^^
error: Failed to parse: `pyproject.toml` error: Failed to parse: `pyproject.toml`
Caused by: TOML parse error at line 9, column 29 Caused by: TOML parse error at line 9, column 29
| |

View file

@ -125,7 +125,13 @@ fn invalid_pyproject_toml_syntax() -> Result<()> {
----- stdout ----- ----- stdout -----
----- stderr ----- ----- stderr -----
warning: Failed to parse `pyproject.toml` during settings discovery; skipping... warning: Failed to parse `pyproject.toml` during settings discovery:
TOML parse error at line 1, column 5
|
1 | 123 - 456
| ^
expected `.`, `=`
error: Failed to parse: `pyproject.toml` error: Failed to parse: `pyproject.toml`
Caused by: TOML parse error at line 1, column 5 Caused by: TOML parse error at line 1, column 5
| |