From 709e45f34b8def97d1da8db7bdb7d1d68bbcc2aa Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 13 Nov 2024 11:20:41 -0500 Subject: [PATCH] Split after specifiers in `--with` requirements (#9089) ## Summary Part of me wants to revert support for `--with "flask, requests"`, but the multiple specifiers case actually isn't ambiguous, and handling it is better than shipping a breaking change in a patch release. Closes https://github.com/astral-sh/uv/issues/9081. --- crates/uv-cli/src/comma.rs | 11 +++++++++++ crates/uv-cli/src/comma/tests.rs | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/crates/uv-cli/src/comma.rs b/crates/uv-cli/src/comma.rs index ecb8bb8c45c0..8c5d97b89a1e 100644 --- a/crates/uv-cli/src/comma.rs +++ b/crates/uv-cli/src/comma.rs @@ -31,6 +31,17 @@ impl FromStr for CommaSeparatedRequirements { depth = depth.saturating_sub(1); } ',' if depth == 0 => { + // If the next character is a version identifier, skip the comma, as in: + // `requests>=2.1,<3`. + if let Some(c) = input + .get(i + ','.len_utf8()..) + .and_then(|s| s.chars().find(|c| !c.is_whitespace())) + { + if matches!(c, '!' | '=' | '<' | '>' | '~') { + continue; + } + } + let requirement = input[start..i].trim().to_string(); if !requirement.is_empty() { requirements.push(requirement); diff --git a/crates/uv-cli/src/comma/tests.rs b/crates/uv-cli/src/comma/tests.rs index 135d454eaac7..4a98d73e07b3 100644 --- a/crates/uv-cli/src/comma/tests.rs +++ b/crates/uv-cli/src/comma/tests.rs @@ -43,3 +43,19 @@ fn double_extras() { ]) ); } + +#[test] +fn single_specifiers() { + assert_eq!( + CommaSeparatedRequirements::from_str("requests>=2.1,<3").unwrap(), + CommaSeparatedRequirements(vec!["requests>=2.1,<3".to_string(),]) + ); +} + +#[test] +fn double_specifiers() { + assert_eq!( + CommaSeparatedRequirements::from_str("requests>=2.1,<3, flask").unwrap(), + CommaSeparatedRequirements(vec!["requests>=2.1,<3".to_string(), "flask".to_string()]) + ); +}