Rename MetadataResolver to ResolutionMetadata (#7661)

This commit is contained in:
konsti 2024-09-24 18:25:19 +02:00 committed by GitHub
parent 16a6fd2c42
commit 5da73a24cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 78 additions and 73 deletions

View file

@ -21,7 +21,7 @@ use crate::{metadata, LenientVersionSpecifiers, MetadataError, VerbatimParsedUrl
/// Core Metadata 2.3 is specified in <https://packaging.python.org/specifications/core-metadata/>.
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "kebab-case")]
pub struct MetadataResolver {
pub struct ResolutionMetadata {
// Mandatory fields
pub name: PackageName,
pub version: Version,
@ -32,8 +32,8 @@ pub struct MetadataResolver {
}
/// From <https://github.com/PyO3/python-pkginfo-rs/blob/d719988323a0cfea86d4737116d7917f30e819e2/src/metadata.rs#LL78C2-L91C26>
impl MetadataResolver {
/// Parse the [`MetadataResolver`] from a `METADATA` file, as included in a built distribution (wheel).
impl ResolutionMetadata {
/// Parse the [`ResolutionMetadata`] from a `METADATA` file, as included in a built distribution (wheel).
pub fn parse_metadata(content: &[u8]) -> Result<Self, MetadataError> {
let headers = Headers::parse(content)?;
@ -78,7 +78,7 @@ impl MetadataResolver {
})
}
/// Read the [`MetadataResolver`] from a source distribution's `PKG-INFO` file, if it uses Metadata 2.2
/// Read the [`ResolutionMetadata`] from a source distribution's `PKG-INFO` file, if it uses Metadata 2.2
/// or later _and_ none of the required fields (`Requires-Python`, `Requires-Dist`, and
/// `Provides-Extra`) are marked as dynamic.
pub fn parse_pkg_info(content: &[u8]) -> Result<Self, MetadataError> {
@ -167,61 +167,61 @@ mod tests {
#[test]
fn test_parse_metadata() {
let s = "Metadata-Version: 1.0";
let meta = MetadataResolver::parse_metadata(s.as_bytes());
let meta = ResolutionMetadata::parse_metadata(s.as_bytes());
assert!(matches!(meta, Err(MetadataError::FieldNotFound("Name"))));
let s = "Metadata-Version: 1.0\nName: asdf";
let meta = MetadataResolver::parse_metadata(s.as_bytes());
let meta = ResolutionMetadata::parse_metadata(s.as_bytes());
assert!(matches!(meta, Err(MetadataError::FieldNotFound("Version"))));
let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0";
let meta = MetadataResolver::parse_metadata(s.as_bytes()).unwrap();
let meta = ResolutionMetadata::parse_metadata(s.as_bytes()).unwrap();
assert_eq!(meta.name, PackageName::from_str("asdf").unwrap());
assert_eq!(meta.version, Version::new([1, 0]));
let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0\nAuthor: 中文\n\n一个 Python 包";
let meta = MetadataResolver::parse_metadata(s.as_bytes()).unwrap();
let meta = ResolutionMetadata::parse_metadata(s.as_bytes()).unwrap();
assert_eq!(meta.name, PackageName::from_str("asdf").unwrap());
assert_eq!(meta.version, Version::new([1, 0]));
let s = "Metadata-Version: 1.0\nName: =?utf-8?q?foobar?=\nVersion: 1.0";
let meta = MetadataResolver::parse_metadata(s.as_bytes()).unwrap();
let meta = ResolutionMetadata::parse_metadata(s.as_bytes()).unwrap();
assert_eq!(meta.name, PackageName::from_str("foobar").unwrap());
assert_eq!(meta.version, Version::new([1, 0]));
let s = "Metadata-Version: 1.0\nName: =?utf-8?q?=C3=A4_space?= <x@y.org>\nVersion: 1.0";
let meta = MetadataResolver::parse_metadata(s.as_bytes());
let meta = ResolutionMetadata::parse_metadata(s.as_bytes());
assert!(matches!(meta, Err(MetadataError::InvalidName(_))));
}
#[test]
fn test_parse_pkg_info() {
let s = "Metadata-Version: 2.1";
let meta = MetadataResolver::parse_pkg_info(s.as_bytes());
let meta = ResolutionMetadata::parse_pkg_info(s.as_bytes());
assert!(matches!(
meta,
Err(MetadataError::UnsupportedMetadataVersion(_))
));
let s = "Metadata-Version: 2.2\nName: asdf";
let meta = MetadataResolver::parse_pkg_info(s.as_bytes());
let meta = ResolutionMetadata::parse_pkg_info(s.as_bytes());
assert!(matches!(meta, Err(MetadataError::FieldNotFound("Version"))));
let s = "Metadata-Version: 2.3\nName: asdf";
let meta = MetadataResolver::parse_pkg_info(s.as_bytes());
let meta = ResolutionMetadata::parse_pkg_info(s.as_bytes());
assert!(matches!(meta, Err(MetadataError::FieldNotFound("Version"))));
let s = "Metadata-Version: 2.3\nName: asdf\nVersion: 1.0";
let meta = MetadataResolver::parse_pkg_info(s.as_bytes()).unwrap();
let meta = ResolutionMetadata::parse_pkg_info(s.as_bytes()).unwrap();
assert_eq!(meta.name, PackageName::from_str("asdf").unwrap());
assert_eq!(meta.version, Version::new([1, 0]));
let s = "Metadata-Version: 2.3\nName: asdf\nVersion: 1.0\nDynamic: Requires-Dist";
let meta = MetadataResolver::parse_pkg_info(s.as_bytes()).unwrap_err();
let meta = ResolutionMetadata::parse_pkg_info(s.as_bytes()).unwrap_err();
assert!(matches!(meta, MetadataError::DynamicField("Requires-Dist")));
let s = "Metadata-Version: 2.3\nName: asdf\nVersion: 1.0\nRequires-Dist: foo";
let meta = MetadataResolver::parse_pkg_info(s.as_bytes()).unwrap();
let meta = ResolutionMetadata::parse_pkg_info(s.as_bytes()).unwrap();
assert_eq!(meta.name, PackageName::from_str("asdf").unwrap());
assert_eq!(meta.version, Version::new([1, 0]));
assert_eq!(meta.requires_dist, vec!["foo".parse().unwrap()]);

View file

@ -16,7 +16,7 @@ use uv_normalize::InvalidNameError;
pub use metadata10::Metadata10;
pub use metadata12::Metadata12;
pub use metadata23::Metadata23;
pub use metadata_resolver::MetadataResolver;
pub use metadata_resolver::ResolutionMetadata;
pub use pyproject_toml::RequiresDist;
pub use requires_txt::RequiresTxt;

View file

@ -1,5 +1,5 @@
use crate::{
LenientRequirement, LenientVersionSpecifiers, MetadataError, MetadataResolver,
LenientRequirement, LenientVersionSpecifiers, MetadataError, ResolutionMetadata,
VerbatimParsedUrl,
};
use indexmap::IndexMap;
@ -12,7 +12,7 @@ use std::str::FromStr;
use uv_normalize::{ExtraName, PackageName};
/// Extract the metadata from a `pyproject.toml` file, as specified in PEP 621.
pub(crate) fn parse_pyproject_toml(contents: &str) -> Result<MetadataResolver, MetadataError> {
pub(crate) fn parse_pyproject_toml(contents: &str) -> Result<ResolutionMetadata, MetadataError> {
let pyproject_toml = PyProjectToml::from_toml(contents)?;
let project = pyproject_toml
@ -77,7 +77,7 @@ pub(crate) fn parse_pyproject_toml(contents: &str) -> Result<MetadataResolver, M
provides_extras.push(extra);
}
Ok(MetadataResolver {
Ok(ResolutionMetadata {
name,
version,
requires_dist,
@ -149,7 +149,7 @@ struct ToolPoetry {}
/// Python Package Metadata 2.3 as specified in
/// <https://packaging.python.org/specifications/core-metadata/>.
///
/// This is a subset of [`MetadataResolver`]; specifically, it omits the `version` and `requires-python`
/// This is a subset of [`ResolutionMetadata`]; specifically, it omits the `version` and `requires-python`
/// fields, which aren't necessary when extracting the requirements of a package without installing
/// the package itself.
#[derive(Serialize, Deserialize, Debug, Clone)]