Skip to content

Commit b770639

Browse files
Rename provides_extras to provides_extra (#15825)
## Summary This is now consistent with `requires_dist` (singular).
1 parent 312084f commit b770639

32 files changed

+94
-96
lines changed

crates/uv-build-backend/src/metadata.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ impl PyProjectToml {
547547
license_files,
548548
classifiers: self.project.classifiers.clone().unwrap_or_default(),
549549
requires_dist: requires_dist.iter().map(ToString::to_string).collect(),
550-
provides_extras: extras.iter().map(ToString::to_string).collect(),
550+
provides_extra: extras.iter().map(ToString::to_string).collect(),
551551
// Not commonly set.
552552
provides_dist: vec![],
553553
// Not supported.

crates/uv-cache/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ impl CacheBucket {
10021002
Self::Interpreter => "interpreter-v4",
10031003
// Note that when bumping this, you'll also need to bump it
10041004
// in `crates/uv/tests/it/cache_clean.rs`.
1005-
Self::Simple => "simple-v17",
1005+
Self::Simple => "simple-v18",
10061006
// Note that when bumping this, you'll also need to bump it
10071007
// in `crates/uv/tests/it/cache_prune.rs`.
10081008
Self::Wheels => "wheels-v5",

crates/uv-client/src/registry_client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ impl SimpleMetadata {
12451245
version: version.clone(),
12461246
requires_dist: metadata.requires_dist,
12471247
requires_python: metadata.requires_python,
1248-
provides_extras: metadata.provides_extras,
1248+
provides_extra: metadata.provides_extra,
12491249
dynamic: false,
12501250
});
12511251
SimpleMetadatum {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl DependencyMetadata {
4949
version: version.clone(),
5050
requires_dist: metadata.requires_dist.clone(),
5151
requires_python: metadata.requires_python.clone(),
52-
provides_extras: metadata.provides_extras.clone(),
52+
provides_extra: metadata.provides_extra.clone(),
5353
dynamic: false,
5454
})
5555
} else {
@@ -70,7 +70,7 @@ impl DependencyMetadata {
7070
version,
7171
requires_dist: metadata.requires_dist.clone(),
7272
requires_python: metadata.requires_python.clone(),
73-
provides_extras: metadata.provides_extras.clone(),
73+
provides_extra: metadata.provides_extra.clone(),
7474
dynamic: false,
7575
})
7676
}
@@ -109,6 +109,6 @@ pub struct StaticMetadata {
109109
)
110110
)]
111111
pub requires_python: Option<VersionSpecifiers>,
112-
#[serde(default)]
113-
pub provides_extras: Box<[ExtraName]>,
112+
#[serde(default, alias = "provides-extras")]
113+
pub provides_extra: Box<[ExtraName]>,
114114
}

crates/uv-distribution/src/metadata/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ pub struct Metadata {
5858
// Optional fields
5959
pub requires_dist: Box<[Requirement]>,
6060
pub requires_python: Option<VersionSpecifiers>,
61-
pub provides_extras: Box<[ExtraName]>,
61+
pub provides_extra: Box<[ExtraName]>,
6262
pub dependency_groups: BTreeMap<GroupName, Box<[Requirement]>>,
6363
pub dynamic: bool,
6464
}
@@ -74,7 +74,7 @@ impl Metadata {
7474
.map(Requirement::from)
7575
.collect(),
7676
requires_python: metadata.requires_python,
77-
provides_extras: metadata.provides_extras,
77+
provides_extra: metadata.provides_extra,
7878
dependency_groups: BTreeMap::default(),
7979
dynamic: metadata.dynamic,
8080
}
@@ -94,13 +94,13 @@ impl Metadata {
9494
let requires_dist = uv_pypi_types::RequiresDist {
9595
name: metadata.name,
9696
requires_dist: metadata.requires_dist,
97-
provides_extras: metadata.provides_extras,
97+
provides_extra: metadata.provides_extra,
9898
dynamic: metadata.dynamic,
9999
};
100100
let RequiresDist {
101101
name,
102102
requires_dist,
103-
provides_extras,
103+
provides_extra,
104104
dependency_groups,
105105
dynamic,
106106
} = RequiresDist::from_project_maybe_workspace(
@@ -119,7 +119,7 @@ impl Metadata {
119119
version: metadata.version,
120120
requires_dist,
121121
requires_python: metadata.requires_python,
122-
provides_extras,
122+
provides_extra,
123123
dependency_groups,
124124
dynamic,
125125
})

crates/uv-distribution/src/metadata/requires_dist.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::metadata::{GitWorkspaceMember, LoweredRequirement, MetadataError};
1919
pub struct RequiresDist {
2020
pub name: PackageName,
2121
pub requires_dist: Box<[Requirement]>,
22-
pub provides_extras: Box<[ExtraName]>,
22+
pub provides_extra: Box<[ExtraName]>,
2323
pub dependency_groups: BTreeMap<GroupName, Box<[Requirement]>>,
2424
pub dynamic: bool,
2525
}
@@ -33,7 +33,7 @@ impl RequiresDist {
3333
requires_dist: Box::into_iter(metadata.requires_dist)
3434
.map(Requirement::from)
3535
.collect(),
36-
provides_extras: metadata.provides_extras,
36+
provides_extra: metadata.provides_extra,
3737
dependency_groups: BTreeMap::default(),
3838
dynamic: metadata.dynamic,
3939
}
@@ -198,7 +198,7 @@ impl RequiresDist {
198198
name: metadata.name,
199199
requires_dist,
200200
dependency_groups,
201-
provides_extras: metadata.provides_extras,
201+
provides_extra: metadata.provides_extra,
202202
dynamic: metadata.dynamic,
203203
})
204204
}
@@ -216,7 +216,7 @@ impl RequiresDist {
216216
for source in sources.iter() {
217217
if let Some(extra) = source.extra() {
218218
// If the extra doesn't exist at all, error.
219-
if !metadata.provides_extras.contains(extra) {
219+
if !metadata.provides_extra.contains(extra) {
220220
return Err(MetadataError::MissingSourceExtra(
221221
name.clone(),
222222
extra.clone(),
@@ -268,7 +268,7 @@ impl From<Metadata> for RequiresDist {
268268
Self {
269269
name: metadata.name,
270270
requires_dist: metadata.requires_dist,
271-
provides_extras: metadata.provides_extras,
271+
provides_extra: metadata.provides_extra,
272272
dependency_groups: metadata.dependency_groups,
273273
dynamic: metadata.dynamic,
274274
}

crates/uv-publish/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ impl FormMetadata {
746746
requires_python,
747747
requires_external,
748748
project_urls,
749-
provides_extras,
749+
provides_extra,
750750
dynamic,
751751
} = metadata(file, filename).await?;
752752

@@ -808,7 +808,7 @@ impl FormMetadata {
808808
add_vec("platform", platforms);
809809
add_vec("project_urls", project_urls);
810810
add_vec("provides_dist", provides_dist);
811-
add_vec("provides_extra", provides_extras);
811+
add_vec("provides_extra", provides_extra);
812812
add_vec("requires_dist", requires_dist);
813813
add_vec("requires_external", requires_external);
814814

crates/uv-pypi-types/src/metadata/metadata23.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ pub struct Metadata23 {
9999
/// A string containing the name of an optional feature. Must be a valid Python identifier.
100100
/// May be used to make a dependency conditional on whether the optional feature has been
101101
/// requested.
102-
pub provides_extras: Vec<String>,
102+
pub provides_extra: Vec<String>,
103103
/// A string containing the name of another core metadata field.
104104
pub dynamic: Vec<String>,
105105
}
@@ -145,7 +145,7 @@ impl Metadata23 {
145145
let requires_python = headers.get_first_value("Requires-Python");
146146
let requires_external = headers.get_all_values("Requires-External").collect();
147147
let project_urls = headers.get_all_values("Project-URL").collect();
148-
let provides_extras = headers.get_all_values("Provides-Extra").collect();
148+
let provides_extra = headers.get_all_values("Provides-Extra").collect();
149149
let description_content_type = headers.get_first_value("Description-Content-Type");
150150
let dynamic = headers.get_all_values("Dynamic").collect();
151151
Ok(Self {
@@ -174,7 +174,7 @@ impl Metadata23 {
174174
requires_python,
175175
requires_external,
176176
project_urls,
177-
provides_extras,
177+
provides_extra,
178178
dynamic,
179179
})
180180
}
@@ -264,7 +264,7 @@ impl Metadata23 {
264264
);
265265
write_all(&mut writer, "Requires-External", &self.requires_external);
266266
write_all(&mut writer, "Project-URL", &self.project_urls);
267-
write_all(&mut writer, "Provides-Extra", &self.provides_extras);
267+
write_all(&mut writer, "Provides-Extra", &self.provides_extra);
268268
write_opt_str(
269269
&mut writer,
270270
"Description-Content-Type",

crates/uv-pypi-types/src/metadata/metadata_resolver.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ pub struct ResolutionMetadata {
3131
// Optional fields
3232
pub requires_dist: Box<[Requirement<VerbatimParsedUrl>]>,
3333
pub requires_python: Option<VersionSpecifiers>,
34-
pub provides_extras: Box<[ExtraName]>,
34+
#[serde(alias = "provides-extras")]
35+
pub provides_extra: Box<[ExtraName]>,
3536
/// Whether the version field is dynamic.
3637
#[serde(default)]
3738
pub dynamic: bool,
@@ -64,7 +65,7 @@ impl ResolutionMetadata {
6465
.map(|requires_python| LenientVersionSpecifiers::from_str(&requires_python))
6566
.transpose()?
6667
.map(VersionSpecifiers::from);
67-
let provides_extras = headers
68+
let provides_extra = headers
6869
.get_all_values("Provides-Extra")
6970
.filter_map(
7071
|provides_extra| match ExtraName::from_owned(provides_extra) {
@@ -85,7 +86,7 @@ impl ResolutionMetadata {
8586
version,
8687
requires_dist,
8788
requires_python,
88-
provides_extras,
89+
provides_extra,
8990
dynamic,
9091
})
9192
}
@@ -144,7 +145,7 @@ impl ResolutionMetadata {
144145
.map(|requires_python| LenientVersionSpecifiers::from_str(&requires_python))
145146
.transpose()?
146147
.map(VersionSpecifiers::from);
147-
let provides_extras = headers
148+
let provides_extra = headers
148149
.get_all_values("Provides-Extra")
149150
.filter_map(
150151
|provides_extra| match ExtraName::from_owned(provides_extra) {
@@ -162,7 +163,7 @@ impl ResolutionMetadata {
162163
version,
163164
requires_dist,
164165
requires_python,
165-
provides_extras,
166+
provides_extra,
166167
dynamic,
167168
})
168169
}
@@ -250,7 +251,7 @@ impl ResolutionMetadata {
250251
.collect::<Result<Box<_>, _>>()?;
251252

252253
// Extract the optional dependencies.
253-
let provides_extras = project
254+
let provides_extra = project
254255
.optional_dependencies
255256
.unwrap_or_default()
256257
.into_keys()
@@ -261,7 +262,7 @@ impl ResolutionMetadata {
261262
version,
262263
requires_dist,
263264
requires_python,
264-
provides_extras,
265+
provides_extra,
265266
dynamic,
266267
})
267268
}
@@ -370,7 +371,7 @@ mod tests {
370371
assert_eq!(meta.version, Version::new([1, 0]));
371372
assert!(meta.requires_python.is_none());
372373
assert!(meta.requires_dist.is_empty());
373-
assert!(meta.provides_extras.is_empty());
374+
assert!(meta.provides_extra.is_empty());
374375

375376
let s = r#"
376377
[project]
@@ -384,7 +385,7 @@ mod tests {
384385
assert_eq!(meta.version, Version::new([1, 0]));
385386
assert_eq!(meta.requires_python, Some(">=3.6".parse().unwrap()));
386387
assert!(meta.requires_dist.is_empty());
387-
assert!(meta.provides_extras.is_empty());
388+
assert!(meta.provides_extra.is_empty());
388389

389390
let s = r#"
390391
[project]
@@ -399,7 +400,7 @@ mod tests {
399400
assert_eq!(meta.version, Version::new([1, 0]));
400401
assert_eq!(meta.requires_python, Some(">=3.6".parse().unwrap()));
401402
assert_eq!(*meta.requires_dist, ["foo".parse().unwrap()]);
402-
assert!(meta.provides_extras.is_empty());
403+
assert!(meta.provides_extra.is_empty());
403404

404405
let s = r#"
405406
[project]
@@ -423,6 +424,6 @@ mod tests {
423424
"bar; extra == \"dotenv\"".parse().unwrap()
424425
]
425426
);
426-
assert_eq!(*meta.provides_extras, ["dotenv".parse().unwrap()]);
427+
assert_eq!(*meta.provides_extra, ["dotenv".parse().unwrap()]);
427428
}
428429
}

crates/uv-pypi-types/src/metadata/requires_dist.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::str::FromStr;
22

33
use itertools::Itertools;
4-
use serde::{Deserialize, Serialize};
54

65
use uv_normalize::{ExtraName, PackageName};
76
use uv_pep508::Requirement;
@@ -15,13 +14,11 @@ use crate::{LenientRequirement, MetadataError, VerbatimParsedUrl};
1514
/// This is a subset of [`ResolutionMetadata`]; specifically, it omits the `version` and `requires-python`
1615
/// fields, which aren't necessary when extracting the requirements of a package without installing
1716
/// the package itself.
18-
#[derive(Serialize, Deserialize, Debug, Clone)]
19-
#[serde(rename_all = "kebab-case")]
17+
#[derive(Debug, Clone)]
2018
pub struct RequiresDist {
2119
pub name: PackageName,
2220
pub requires_dist: Box<[Requirement<VerbatimParsedUrl>]>,
23-
pub provides_extras: Box<[ExtraName]>,
24-
#[serde(default)]
21+
pub provides_extra: Box<[ExtraName]>,
2522
pub dynamic: bool,
2623
}
2724

@@ -86,7 +83,7 @@ impl RequiresDist {
8683
.collect::<Result<Box<_>, _>>()?;
8784

8885
// Extract the optional dependencies.
89-
let provides_extras = project
86+
let provides_extra = project
9087
.optional_dependencies
9188
.unwrap_or_default()
9289
.into_keys()
@@ -95,7 +92,7 @@ impl RequiresDist {
9592
Ok(Self {
9693
name,
9794
requires_dist,
98-
provides_extras,
95+
provides_extra,
9996
dynamic,
10097
})
10198
}

0 commit comments

Comments
 (0)