Skip to content

Commit ecfa386

Browse files
Error on unknown fields in dependency-metadata (astral-sh#14801)
## Summary Closes astral-sh#14800.
1 parent 036c9be commit ecfa386

File tree

4 files changed

+52
-15
lines changed

4 files changed

+52
-15
lines changed

crates/uv-distribution-types/src/dependency_metadata.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,20 @@ impl DependencyMetadata {
3030

3131
if let Some(version) = version {
3232
// If a specific version was requested, search for an exact match, then a global match.
33-
let metadata = versions
33+
let metadata = if let Some(metadata) = versions
3434
.iter()
35-
.find(|v| v.version.as_ref() == Some(version))
36-
.inspect(|_| {
37-
debug!("Found dependency metadata entry for `{package}=={version}`");
38-
})
39-
.or_else(|| versions.iter().find(|v| v.version.is_none()))
40-
.inspect(|_| {
41-
debug!("Found global metadata entry for `{package}`");
42-
});
43-
let Some(metadata) = metadata else {
35+
.find(|entry| entry.version.as_ref() == Some(version))
36+
{
37+
debug!("Found dependency metadata entry for `{package}=={version}`");
38+
metadata
39+
} else if let Some(metadata) = versions.iter().find(|entry| entry.version.is_none()) {
40+
debug!("Found global metadata entry for `{package}`");
41+
metadata
42+
} else {
4443
warn!("No dependency metadata entry found for `{package}=={version}`");
4544
return None;
4645
};
47-
debug!("Found dependency metadata entry for `{package}=={version}`");
46+
4847
Some(ResolutionMetadata {
4948
name: metadata.name.clone(),
5049
version: version.clone(),
@@ -65,6 +64,7 @@ impl DependencyMetadata {
6564
return None;
6665
};
6766
debug!("Found dependency metadata entry for `{package}` (assuming: `{version}`)");
67+
6868
Some(ResolutionMetadata {
6969
name: metadata.name.clone(),
7070
version,
@@ -86,7 +86,7 @@ impl DependencyMetadata {
8686
/// <https://packaging.python.org/specifications/core-metadata/>.
8787
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
8888
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
89-
#[serde(rename_all = "kebab-case")]
89+
#[serde(rename_all = "kebab-case", deny_unknown_fields)]
9090
pub struct StaticMetadata {
9191
// Mandatory fields
9292
pub name: PackageName,

crates/uv/tests/it/lock.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18597,6 +18597,42 @@ fn lock_dependency_metadata() -> Result<()> {
1859718597
Removed sniffio v1.3.1
1859818598
"###);
1859918599

18600+
// Update the static metadata.
18601+
pyproject_toml.write_str(
18602+
r#"
18603+
[project]
18604+
name = "project"
18605+
version = "0.1.0"
18606+
requires-python = ">=3.12"
18607+
dependencies = ["anyio==3.7.0"]
18608+
18609+
[[tool.uv.dependency-metadata]]
18610+
name = "anyio"
18611+
version = "3.7.0"
18612+
requires_dist = ["typing-extensions"]
18613+
"#,
18614+
)?;
18615+
18616+
// The operation should warn.
18617+
uv_snapshot!(context.filters(), context.lock(), @r#"
18618+
success: true
18619+
exit_code: 0
18620+
----- stdout -----
18621+
18622+
----- stderr -----
18623+
warning: Failed to parse `pyproject.toml` during settings discovery:
18624+
TOML parse error at line 11, column 9
18625+
|
18626+
11 | requires_dist = ["typing-extensions"]
18627+
| ^^^^^^^^^^^^^
18628+
unknown field `requires_dist`, expected one of `name`, `version`, `requires-dist`, `requires-python`, `provides-extras`
18629+
18630+
Resolved 4 packages in [TIME]
18631+
Added idna v3.6
18632+
Removed iniconfig v2.0.0
18633+
Added sniffio v1.3.1
18634+
"#);
18635+
1860018636
Ok(())
1860118637
}
1860218638

crates/uv/tests/it/sync.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7560,7 +7560,7 @@ fn sync_derivation_chain() -> Result<()> {
75607560
[[tool.uv.dependency-metadata]]
75617561
name = "wsgiref"
75627562
version = "0.1.2"
7563-
dependencies = []
7563+
requires-dist = []
75647564
"#,
75657565
)?;
75667566

@@ -7623,7 +7623,7 @@ fn sync_derivation_chain_extra() -> Result<()> {
76237623
[[tool.uv.dependency-metadata]]
76247624
name = "wsgiref"
76257625
version = "0.1.2"
7626-
dependencies = []
7626+
requires-dist = []
76277627
"#,
76287628
)?;
76297629

@@ -7688,7 +7688,7 @@ fn sync_derivation_chain_group() -> Result<()> {
76887688
[[tool.uv.dependency-metadata]]
76897689
name = "wsgiref"
76907690
version = "0.1.2"
7691-
dependencies = []
7691+
requires-dist = []
76927692
"#,
76937693
)?;
76947694

uv.schema.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)