Skip to content

Commit 524b701

Browse files
authored
parse_{sdist,wheel}_filename: don't raise InvalidVersion (#721)
1 parent b509bef commit 524b701

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

CHANGELOG.rst

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ Changelog
1111
* Introduce ``metadata.Metadata`` (along with ``metadata.ExceptionGroup`` and ``metadata.InvalidMetadata``; :issue:`570`)
1212
* Introduce the ``validate`` keyword parameter to ``utils.validate_name()`` (:issue:`570`)
1313
* Introduce ``utils.is_normalized_name()`` (:issue:`570`)
14+
* Make ``utils.parse_sdist_filename()` and ``utils.parse_wheel_filename()`
15+
raise ``InvalidSdistFilename`` and ``InvalidWheelFilename``, respectively,
16+
when the version component of the name is invalid
1417

1518
23.1 - 2023-04-12
1619
~~~~~~~~~~~~~~~~~

src/packaging/utils.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,14 @@ def parse_wheel_filename(
121121
if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None:
122122
raise InvalidWheelFilename(f"Invalid project name: {filename}")
123123
name = canonicalize_name(name_part)
124-
version = Version(parts[1])
124+
125+
try:
126+
version = Version(parts[1])
127+
except InvalidVersion as e:
128+
raise InvalidWheelFilename(
129+
f"Invalid wheel filename (invalid version): {filename}"
130+
) from e
131+
125132
if dashes == 5:
126133
build_part = parts[2]
127134
build_match = _build_tag_regex.match(build_part)
@@ -154,5 +161,12 @@ def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]:
154161
raise InvalidSdistFilename(f"Invalid sdist filename: {filename}")
155162

156163
name = canonicalize_name(name_part)
157-
version = Version(version_part)
164+
165+
try:
166+
version = Version(version_part)
167+
except InvalidVersion as e:
168+
raise InvalidSdistFilename(
169+
f"Invalid sdist filename (invalid version): {filename}"
170+
) from e
171+
158172
return (name, version)

tests/test_utils.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def test_parse_wheel_filename(filename, name, version, build, tags):
136136
("foo-1.0-py3-none-any.wheel"), # Incorrect file extension (`.wheel`)
137137
("foo__bar-1.0-py3-none-any.whl"), # Invalid name (`__`)
138138
("foo#bar-1.0-py3-none-any.whl"), # Invalid name (`#`)
139+
("foobar-1.x-py3-none-any.whl"), # Invalid version (`1.x`)
139140
# Build number doesn't start with a digit (`abc`)
140141
("foo-1.0-abc-py3-none-any.whl"),
141142
("foo-1.0-200-py3-none-any-junk.whl"), # Too many dashes (`-junk`)
@@ -154,7 +155,14 @@ def test_parse_sdist_filename(filename, name, version):
154155
assert parse_sdist_filename(filename) == (name, version)
155156

156157

157-
@pytest.mark.parametrize(("filename"), [("foo-1.0.xz"), ("foo1.0.tar.gz")])
158+
@pytest.mark.parametrize(
159+
("filename"),
160+
[
161+
("foo-1.0.xz"), # Incorrect extension
162+
("foo1.0.tar.gz"), # Missing separator
163+
("foo-1.x.tar.gz"), # Invalid version
164+
],
165+
)
158166
def test_parse_sdist_invalid_filename(filename):
159167
with pytest.raises(InvalidSdistFilename):
160168
parse_sdist_filename(filename)

0 commit comments

Comments
 (0)