From 563c636aa0b94ab451bba579a5643c07f9115273 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Sat, 17 Feb 2024 06:40:13 -0600 Subject: [PATCH] Improve tracing when encountering invalid `requires-python` values (#1568) Unsure what the easiest way to test this is, it is hard to publish invalid requires-python specifiers with hatchling --- crates/distribution-types/src/file.rs | 9 ++++++--- crates/pep440-rs/src/version_specifier.rs | 7 +++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/crates/distribution-types/src/file.rs b/crates/distribution-types/src/file.rs index a5b4e0571..765fa0dc4 100644 --- a/crates/distribution-types/src/file.rs +++ b/crates/distribution-types/src/file.rs @@ -10,8 +10,8 @@ use pypi_types::{DistInfoMetadata, Hashes, Yanked}; /// Error converting [`pypi_types::File`] to [`distribution_type::File`]. #[derive(Debug, Error)] pub enum FileConversionError { - #[error("Invalid 'requires-python' value")] - VersionSpecifiersParseError(#[from] VersionSpecifiersParseError), + #[error("Failed to parse 'requires-python': {0}")] + RequiresPython(String, #[source] VersionSpecifiersParseError), #[error("Failed to parse URL: {0}")] Url(String, #[source] url::ParseError), } @@ -44,7 +44,10 @@ impl File { dist_info_metadata: file.dist_info_metadata, filename: file.filename, hashes: file.hashes, - requires_python: file.requires_python.transpose()?, + requires_python: file + .requires_python + .transpose() + .map_err(|err| FileConversionError::RequiresPython(err.line().clone(), err))?, size: file.size, upload_time_utc_ms: file.upload_time.map(|dt| dt.timestamp_millis()), url: if file.url.contains("://") { diff --git a/crates/pep440-rs/src/version_specifier.rs b/crates/pep440-rs/src/version_specifier.rs index 5eef7c148..f3e1693a2 100644 --- a/crates/pep440-rs/src/version_specifier.rs +++ b/crates/pep440-rs/src/version_specifier.rs @@ -232,6 +232,13 @@ impl std::fmt::Display for VersionSpecifiersParseError { } } +impl VersionSpecifiersParseError { + /// The string that failed to parse + pub fn line(&self) -> &String { + &self.inner.line + } +} + impl std::error::Error for VersionSpecifiersParseError {} /// A version range such such as `>1.2.3`, `<=4!5.6.7-a8.post9.dev0` or `== 4.1.*`. Parse with