From e362d9d7f66357f2e84a0a5031f3b0cef95ad4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=20=D0=94=D0=BE=D0=BD=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Thu, 7 Sep 2023 22:42:43 +0300 Subject: [PATCH] parse_{sdist,wheel}_filename: don't raise InvalidVersion Fixes #660. --- CHANGELOG.rst | 3 +++ src/packaging/utils.py | 18 ++++++++++++++++-- tests/test_utils.py | 10 +++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c1eb10b7..dcc70a5f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,9 @@ Changelog * Introduce ``metadata.Metadata`` (along with ``metadata.ExceptionGroup`` and ``metadata.InvalidMetadata``; :issue:`570`) * Introduce the ``validate`` keyword parameter to ``utils.validate_name()`` (:issue:`570`) * Introduce ``utils.is_normalized_name()`` (:issue:`570`) +* Make ``utils.parse_sdist_filename()` and ``utils.parse_wheel_filename()` + raise ``InvalidSdistFilename`` and ``InvalidWheelFilename``, respectively, + when the version component of the name is invalid 23.1 - 2023-04-12 ~~~~~~~~~~~~~~~~~ diff --git a/src/packaging/utils.py b/src/packaging/utils.py index 325687bd..c2c2f75a 100644 --- a/src/packaging/utils.py +++ b/src/packaging/utils.py @@ -121,7 +121,14 @@ def parse_wheel_filename( if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: raise InvalidWheelFilename(f"Invalid project name: {filename}") name = canonicalize_name(name_part) - version = Version(parts[1]) + + try: + version = Version(parts[1]) + except InvalidVersion as e: + raise InvalidWheelFilename( + f"Invalid wheel filename (invalid version): {filename}" + ) from e + if dashes == 5: build_part = parts[2] build_match = _build_tag_regex.match(build_part) @@ -154,5 +161,12 @@ def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") name = canonicalize_name(name_part) - version = Version(version_part) + + try: + version = Version(version_part) + except InvalidVersion as e: + raise InvalidSdistFilename( + f"Invalid sdist filename (invalid version): {filename}" + ) from e + return (name, version) diff --git a/tests/test_utils.py b/tests/test_utils.py index d6e810ac..87c86eef 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -136,6 +136,7 @@ def test_parse_wheel_filename(filename, name, version, build, tags): ("foo-1.0-py3-none-any.wheel"), # Incorrect file extension (`.wheel`) ("foo__bar-1.0-py3-none-any.whl"), # Invalid name (`__`) ("foo#bar-1.0-py3-none-any.whl"), # Invalid name (`#`) + ("foobar-1.x-py3-none-any.whl"), # Invalid version (`1.x`) # Build number doesn't start with a digit (`abc`) ("foo-1.0-abc-py3-none-any.whl"), ("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): assert parse_sdist_filename(filename) == (name, version) -@pytest.mark.parametrize(("filename"), [("foo-1.0.xz"), ("foo1.0.tar.gz")]) +@pytest.mark.parametrize( + ("filename"), + [ + ("foo-1.0.xz"), # Incorrect extension + ("foo1.0.tar.gz"), # Missing separator + ("foo-1.x.tar.gz"), # Invalid version + ], +) def test_parse_sdist_invalid_filename(filename): with pytest.raises(InvalidSdistFilename): parse_sdist_filename(filename)