diff --git a/tests/test_specifiers.py b/tests/test_specifiers.py index ab343083..28f67796 100644 --- a/tests/test_specifiers.py +++ b/tests/test_specifiers.py @@ -576,6 +576,11 @@ def test_specifiers_prereleases(self, specifier, version, expected): # Test overriding with the overall specifier (">=1.0.dev1", True, None, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), (">=1.0.dev1", False, None, ["1.0", "2.0a1"], ["1.0"]), + # Test when both specifier and filter have prerelease value + (">=1.0", True, False, ["1.0", "2.0a1"], ["1.0"]), + (">=1.0", False, True, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + (">=1.0", True, True, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + (">=1.0", False, False, ["1.0", "2.0a1"], ["1.0"]), ], ) def test_specifier_filter( @@ -749,6 +754,26 @@ def test_specifier_contains_installed_prereleases(self): (">=1.0.dev1", False, None, ["1.0", "2.0a1"], ["1.0"]), ("", True, None, ["1.0a1"], ["1.0a1"]), ("", False, None, ["1.0a1"], []), + # Test when both specifier and filter have prerelease value + (">=1.0", True, False, ["1.0", "2.0a1"], ["1.0"]), + (">=1.0", False, True, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + (">=1.0", True, True, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + (">=1.0", False, False, ["1.0", "2.0a1"], ["1.0"]), + # Test when there are multiple specifiers + (">=1.0,<=2.0", None, None, ["1.0", "1.5a1"], ["1.0"]), + (">=1.0,<=2.0dev", None, None, ["1.0", "1.5a1"], ["1.0", "1.5a1"]), + (">=1.0,<=2.0", True, None, ["1.0", "1.5a1"], ["1.0", "1.5a1"]), + (">=1.0,<=2.0", False, None, ["1.0", "1.5a1"], ["1.0"]), + (">=1.0,<=2.0dev", False, None, ["1.0", "1.5a1"], ["1.0"]), + (">=1.0,<=2.0dev", True, None, ["1.0", "1.5a1"], ["1.0", "1.5a1"]), + (">=1.0,<=2.0", None, False, ["1.0", "1.5a1"], ["1.0"]), + (">=1.0,<=2.0", None, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]), + (">=1.0,<=2.0dev", None, False, ["1.0", "1.5a1"], ["1.0"]), + (">=1.0,<=2.0dev", None, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]), + (">=1.0,<=2.0", True, False, ["1.0", "1.5a1"], ["1.0"]), + (">=1.0,<=2.0", False, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]), + (">=1.0,<=2.0dev", True, False, ["1.0", "1.5a1"], ["1.0"]), + (">=1.0,<=2.0dev", False, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]), ], ) def test_specifier_filter( diff --git a/tests/test_specifierset.py b/tests/test_specifierset.py new file mode 100644 index 00000000..6d918eaf --- /dev/null +++ b/tests/test_specifierset.py @@ -0,0 +1,47 @@ +import pytest + +from packaging.specifiers import SpecifierSet +from packaging.version import Version + + +class TestSpeicifierSet: + @pytest.mark.parametrize( + ("specifier", "specifier_prereleases", "prereleases", "input", "expected"), + [ + # General test of the filter method + ("", None, None, ["1.0", "2.0a1"], ["1.0"]), + (">=1.0.dev1", None, None, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + ("", None, None, ["1.0a1"], ["1.0a1"]), + (">=1.2.3", None, None, ["1.2", "1.5a1"], ["1.5a1"]), + (">=1.2.3", None, None, ["1.3", "1.5a1"], ["1.3"]), + ("", None, None, ["1.0", Version("2.0")], ["1.0", Version("2.0")]), + (">=1.0", None, None, ["2.0a1"], ["2.0a1"]), + ("!=2.0a1", None, None, ["1.0a2", "1.0", "2.0a1"], ["1.0"]), + ("==2.0a1", None, None, ["2.0a1"], ["2.0a1"]), + (">2.0a1", None, None, ["2.0a1", "3.0a2", "3.0"], ["3.0a2", "3.0"]), + ("<2.0a1", None, None, ["1.0a2", "1.0", "2.0a1"], ["1.0a2", "1.0"]), + ("~=2.0a1", None, None, ["1.0", "2.0a1", "3.0a2", "3.0"], ["2.0a1"]), + # Test overriding with the prereleases parameter on filter + ("", None, False, ["1.0a1"], []), + (">=1.0.dev1", None, False, ["1.0", "2.0a1"], ["1.0"]), + ("", None, True, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + # Test overriding with the overall specifier + ("", True, None, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + ("", False, None, ["1.0", "2.0a1"], ["1.0"]), + (">=1.0.dev1", True, None, ["1.0", "2.0a1"], ["1.0", "2.0a1"]), + (">=1.0.dev1", False, None, ["1.0", "2.0a1"], ["1.0"]), + ("", True, None, ["1.0a1"], ["1.0a1"]), + ("", False, None, ["1.0a1"], []), + ], + ) + def test_specifier_filter( + self, specifier_prereleases, specifier, prereleases, input, expected + ): + if specifier_prereleases is None: + spec = SpecifierSet(specifier) + else: + spec = SpecifierSet(specifier, prereleases=specifier_prereleases) + + kwargs = {"prereleases": prereleases} if prereleases is not None else {} + + assert list(spec.filter(input, **kwargs)) == expected