diff --git a/src/packaging/specifiers.py b/src/packaging/specifiers.py index 13bc9bda..2c915553 100644 --- a/src/packaging/specifiers.py +++ b/src/packaging/specifiers.py @@ -1179,8 +1179,11 @@ def filter( return ( item for item in iterable - if (version := _coerce_version(item)) is None - or not version.is_prerelease + if ( + (version := _coerce_version(item if key is None else key(item))) + is None + or not version.is_prerelease + ) ) # PEP 440: exclude prereleases unless no final releases matched diff --git a/tests/test_specifiers.py b/tests/test_specifiers.py index f5949424..8f1ef10e 100644 --- a/tests/test_specifiers.py +++ b/tests/test_specifiers.py @@ -1440,6 +1440,28 @@ def test_specifierset_filter_with_key( expected = [items[index] for index in expected_indexes] assert result == expected + @pytest.mark.parametrize( + ("prereleases", "expected_indexes"), + [ + (None, [1]), + (True, [0, 1]), + (False, [1]), + ], + ) + def test_empty_specifierset_filter_with_key( + self, prereleases: bool | None, expected_indexes: list[int] + ) -> None: + items = [ + {"version": "2.0a1"}, + {"version": "2.1"}, + ] + + spec = SpecifierSet("", prereleases=prereleases) + result = list(spec.filter(items, key=lambda item: item["version"])) + + expected = [items[index] for index in expected_indexes] + assert result == expected + @pytest.mark.parametrize( ("specifier", "prereleases", "input", "expected"), [