Skip to content

Commit ddf54e1

Browse files
committed
Correctly handle trailing whitespace on URL requirements
The input is permitted to end, after trailing whitespace.
1 parent 150c9a6 commit ddf54e1

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

src/packaging/_parser.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def _parse_requirement_details(
8989
tokenizer: Tokenizer,
9090
) -> Tuple[str, str, Optional[MarkerList]]:
9191
"""
92-
requirement_details = AT URL (WS requirement_marker)?
92+
requirement_details = AT URL (WS requirement_marker?)?
9393
| specifier WS? (requirement_marker)?
9494
"""
9595

@@ -108,6 +108,10 @@ def _parse_requirement_details(
108108

109109
tokenizer.expect("WS", expected="whitespace after URL")
110110

111+
# The input might end after whitespace.
112+
if tokenizer.check("END", peek=True):
113+
return (url, specifier, marker)
114+
111115
marker = _parse_requirement_marker(
112116
tokenizer, span_start=url_start, after="URL and whitespace"
113117
)

tests/test_requirements.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -581,14 +581,14 @@ def test_str_and_repr(
581581
self, extras: str, url_or_specifier: str, marker: str
582582
) -> None:
583583
# GIVEN
584-
to_parse = f"name{extras}{url_or_specifier}{marker}".strip()
584+
to_parse = f"name{extras}{url_or_specifier}{marker}"
585585

586586
# WHEN
587587
req = Requirement(to_parse)
588588

589589
# THEN
590-
assert str(req) == to_parse
591-
assert repr(req) == f"<Requirement({to_parse!r})>"
590+
assert str(req) == to_parse.strip()
591+
assert repr(req) == f"<Requirement({to_parse.strip()!r})>"
592592

593593
@pytest.mark.parametrize("dep1, dep2", EQUAL_DEPENDENCIES)
594594
def test_equal_reqs_equal_hashes(self, dep1: str, dep2: str) -> None:

0 commit comments

Comments
 (0)