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()]) + ); +}