diff --git a/src/installer/utils.py b/src/installer/utils.py index cb412d72..18955adb 100644 --- a/src/installer/utils.py +++ b/src/installer/utils.py @@ -109,7 +109,9 @@ def parse_wheel_filename(filename: str) -> WheelFilename: wheel_info = _WHEEL_FILENAME_REGEX.match(filename) if not wheel_info: raise ValueError(f"Not a valid wheel filename: {filename}") - return WheelFilename(*wheel_info.groups()) + parsed = wheel_info.groups() + normalized_name = normalize_distribution_name(parsed[0]) + return WheelFilename(normalized_name, *parsed[1:]) def copyfileobj_with_hashing( diff --git a/tests/test_utils.py b/tests/test_utils.py index bf59962e..883145ea 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -93,6 +93,11 @@ class TestParseWheelFilename: "tensorflow-2.3.0-cp38-cp38-win_amd64.whl", WheelFilename("tensorflow", "2.3.0", None, "cp38-cp38-win_amd64"), ), + # Non-canonicalized real wheel names + ( + "Quart-0.18.0-py3-none-any.whl", + WheelFilename("quart", "0.18.0", None, "py3-none-any"), + ), ], ) def test_valid_cases(self, string, expected):