Skip to content

Commit

Permalink
Ignore invalid extras from PyPI (#1731)
Browse files Browse the repository at this point in the history
## Summary

We don't control these, so it seems preferable _not_ to fail on them,
but rather, to just ignore them entirely. (I considered adding a long
allow-list, but then questioned the point of it? We'd end up having to
extend it if more invalid extras were published in the future.)

Closes #1633.
  • Loading branch information
charliermarsh authored Feb 20, 2024
1 parent 402edf1 commit a5372d4
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 37 deletions.
31 changes: 0 additions & 31 deletions crates/pypi-types/src/lenient_requirement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ use tracing::warn;

use pep440_rs::{VersionSpecifiers, VersionSpecifiersParseError};
use pep508_rs::{Pep508Error, Requirement};
use uv_normalize::{ExtraName, InvalidNameError};

/// Ex) `>=7.2.0<8.0.0`
static MISSING_COMMA: Lazy<Regex> = Lazy::new(|| Regex::new(r"(\d)([<>=~^!])").unwrap());
Expand Down Expand Up @@ -123,36 +122,6 @@ impl<'de> Deserialize<'de> for LenientVersionSpecifiers {
}
}

#[derive(Debug, Clone)]
pub struct LenientExtraName(ExtraName);

impl LenientExtraName {
/// Parse an [`ExtraName`] from a string, but return `None` if the name is `.none`.
///
/// Some versions of `flit` erroneously included `.none` as an extra name, which is not
/// allowed by PEP 508.
///
/// See: <https://github.com/pypa/flit/issues/228/>
pub fn try_parse(name: String) -> Option<Result<Self, InvalidNameError>> {
match ExtraName::new(name) {
Ok(name) => Some(Ok(Self(name))),
Err(err) => {
if err.as_str() == ".none" {
None
} else {
Some(Err(err))
}
}
}
}
}

impl From<LenientExtraName> for ExtraName {
fn from(name: LenientExtraName) -> Self {
name.0
}
}

#[cfg(test)]
mod tests {
use std::str::FromStr;
Expand Down
15 changes: 9 additions & 6 deletions crates/pypi-types/src/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@ use std::str::FromStr;
use mailparse::{MailHeaderMap, MailParseError};
use serde::{Deserialize, Serialize};
use thiserror::Error;
use tracing::warn;

use pep440_rs::{Version, VersionParseError, VersionSpecifiers, VersionSpecifiersParseError};
use pep508_rs::{Pep508Error, Requirement};
use uv_normalize::{ExtraName, InvalidNameError, PackageName};

use crate::lenient_requirement::LenientRequirement;
use crate::{LenientExtraName, LenientVersionSpecifiers};
use crate::LenientVersionSpecifiers;

/// Python Package Metadata 2.1 as specified in
/// <https://packaging.python.org/specifications/core-metadata/>.
Expand Down Expand Up @@ -119,12 +120,14 @@ impl Metadata21 {
})
.transpose()?;
let provides_extras = get_all_values("Provides-Extra")
.filter_map(LenientExtraName::try_parse)
.map(|result| match result {
Ok(extra_name) => Ok(ExtraName::from(extra_name)),
Err(err) => Err(err),
.filter_map(|provides_extra| match ExtraName::new(provides_extra) {
Ok(extra_name) => Some(extra_name),
Err(err) => {
warn!("Ignoring invalid extra: {err}");
None
}
})
.collect::<Result<Vec<_>, _>>()?;
.collect::<Vec<_>>();

Ok(Metadata21 {
metadata_version,
Expand Down

0 comments on commit a5372d4

Please sign in to comment.