Skip to content

Commit

Permalink
Improve the message around expecting a semicolon
Browse files Browse the repository at this point in the history
This makes it clearer that another character can be used.
  • Loading branch information
pradyunsg committed Sep 15, 2024
1 parent a716c52 commit 6a5fb0c
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 7 deletions.
14 changes: 8 additions & 6 deletions src/packaging/_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def _parse_requirement_details(
return (url, specifier, marker)

marker = _parse_requirement_marker(
tokenizer, span_start=url_start, after="URL and whitespace"
tokenizer, span_start=url_start, expected="URL and whitespace"
)
else:
specifier_start = tokenizer.position
Expand All @@ -124,27 +124,29 @@ def _parse_requirement_details(
marker = _parse_requirement_marker(
tokenizer,
span_start=specifier_start,
after=(
"version specifier"
expected=(
"comma (within version specifier), semicolon (after version specifier)"
if specifier
else "name and no valid version specifier"
else
"semicolon (after name with no version specifier)"
),
)

return (url, specifier, marker)


def _parse_requirement_marker(
tokenizer: Tokenizer, *, span_start: int, after: str
tokenizer: Tokenizer, *, span_start: int, expected: str
) -> MarkerList:
"""
requirement_marker = SEMICOLON marker WS?
"""

if not tokenizer.check("SEMICOLON"):
tokenizer.raise_syntax_error(
f"Expected end or semicolon (after {after})",
f"Expected {expected} or end",
span_start=span_start,
span_end=None,
)
tokenizer.read()

Expand Down
18 changes: 17 additions & 1 deletion tests/test_requirements.py
Original file line number Diff line number Diff line change
Expand Up @@ -569,11 +569,27 @@ def test_error_on_random_char_after_specifier(self) -> None:
# THEN
assert ctx.exconly() == (
"packaging.requirements.InvalidRequirement: "
"Expected end or semicolon (after version specifier)\n"
"Expected comma (within version specifier), semicolon (after version specifier) or end\n"
" name >= 1.0 #\n"
" ~~~~~~~^"
)

def test_error_on_missing_comma_in_specifier(self) -> None:
# GIVEN
to_parse = "name >= 1.0 <= 2.0"

# WHEN
with pytest.raises(InvalidRequirement) as ctx:
Requirement(to_parse)

# THEN
assert ctx.exconly() == (
"packaging.requirements.InvalidRequirement: "
"Expected comma (within version specifier), semicolon (after version specifier) or end\n"
" name >= 1.0 <= 2.0\n"
" ~~~~~~~^^^^^^"
)


class TestRequirementBehaviour:
def test_types_with_nothing(self) -> None:
Expand Down

0 comments on commit 6a5fb0c

Please sign in to comment.