From 7ef21a9905aaa94f7910e6e621ebae25b88aa5bb Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 16 May 2024 16:08:54 -0400 Subject: [PATCH] Allow space in extras --- crates/requirements-txt/src/lib.rs | 10 +++++-- ..._txt__test__line-endings-editable.txt.snap | 30 ++++++++++++++----- ...rements_txt__test__parse-editable.txt.snap | 30 ++++++++++++++----- .../test-data/requirements-txt/editable.txt | 6 ++-- 4 files changed, 55 insertions(+), 21 deletions(-) diff --git a/crates/requirements-txt/src/lib.rs b/crates/requirements-txt/src/lib.rs index d7ef5b69e47fd..602e1148be9ea 100644 --- a/crates/requirements-txt/src/lib.rs +++ b/crates/requirements-txt/src/lib.rs @@ -308,14 +308,20 @@ impl EditableRequirement { /// Identify the markers in an editable URL (e.g., `../editable ; python_version > "3.8"`). pub fn split_markers(given: &str) -> Option<(&str, &str)> { - // Take until we see whitespace, unless it's escaped with a backslash. + // Take until we see whitespace, unless it's escaped with a backslash, or within brackets + // (which would indicate an extra). let mut backslash = false; + let mut depth = 0; for (index, c) in given.char_indices() { if backslash { backslash = false; } else if c == '\\' { backslash = true; - } else if c.is_whitespace() { + } else if c == '[' { + depth += 1; + } else if c == ']' { + depth -= 1; + } else if depth == 0 && c.is_whitespace() { return Some(given.split_at(index)); } } diff --git a/crates/requirements-txt/src/snapshots/requirements_txt__test__line-endings-editable.txt.snap b/crates/requirements-txt/src/snapshots/requirements_txt__test__line-endings-editable.txt.snap index 6cf63a71a5fe4..0b6372f5028a7 100644 --- a/crates/requirements-txt/src/snapshots/requirements_txt__test__line-endings-editable.txt.snap +++ b/crates/requirements-txt/src/snapshots/requirements_txt__test__line-endings-editable.txt.snap @@ -47,16 +47,23 @@ RequirementsTxt { password: None, host: None, port: None, - path: "/editable[d,", + path: "/editable", query: None, fragment: None, }, given: Some( - "/editable[d,", + "/editable", ), }, - extras: [], - path: "/editable[d,", + extras: [ + ExtraName( + "d", + ), + ExtraName( + "dev", + ), + ], + path: "/editable", origin: Some( File( "/editable.txt", @@ -104,16 +111,23 @@ RequirementsTxt { password: None, host: None, port: None, - path: "/editable[d,", + path: "/editable", query: None, fragment: None, }, given: Some( - "/editable[d,", + "/editable", ), }, - extras: [], - path: "/editable[d,", + extras: [ + ExtraName( + "d", + ), + ExtraName( + "dev", + ), + ], + path: "/editable", origin: Some( File( "/editable.txt", diff --git a/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-editable.txt.snap b/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-editable.txt.snap index 6cf63a71a5fe4..0b6372f5028a7 100644 --- a/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-editable.txt.snap +++ b/crates/requirements-txt/src/snapshots/requirements_txt__test__parse-editable.txt.snap @@ -47,16 +47,23 @@ RequirementsTxt { password: None, host: None, port: None, - path: "/editable[d,", + path: "/editable", query: None, fragment: None, }, given: Some( - "/editable[d,", + "/editable", ), }, - extras: [], - path: "/editable[d,", + extras: [ + ExtraName( + "d", + ), + ExtraName( + "dev", + ), + ], + path: "/editable", origin: Some( File( "/editable.txt", @@ -104,16 +111,23 @@ RequirementsTxt { password: None, host: None, port: None, - path: "/editable[d,", + path: "/editable", query: None, fragment: None, }, given: Some( - "/editable[d,", + "/editable", ), }, - extras: [], - path: "/editable[d,", + extras: [ + ExtraName( + "d", + ), + ExtraName( + "dev", + ), + ], + path: "/editable", origin: Some( File( "/editable.txt", diff --git a/crates/requirements-txt/test-data/requirements-txt/editable.txt b/crates/requirements-txt/test-data/requirements-txt/editable.txt index fe6ea620f64cb..bb3c0de2f8f81 100644 --- a/crates/requirements-txt/test-data/requirements-txt/editable.txt +++ b/crates/requirements-txt/test-data/requirements-txt/editable.txt @@ -1,13 +1,13 @@ -# OK +# OK (standard) -e /editable[d,dev] -# Disallowed (whitespace between extras) +# OK (whitespace between extras; disallowed by pip) -e /editable[d, dev] # OK -e /editable[d,dev] ; python_version >= "3.9" and python_ver -# Disallowed (whitespace between extras) +# OK (whitespace between extras; disallowed by pip) -e /editable[d, dev] ; python_version >= "3.9" and python_ver # OK