diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6255260a..66998737 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,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)