Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Accept locally installed prereleases #515

Merged
merged 1 commit into from Mar 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 9 additions & 2 deletions packaging/specifiers.py
Expand Up @@ -57,7 +57,8 @@ def __eq__(self, other: object) -> bool:
objects are equal.
"""

@abc.abstractproperty
@property
@abc.abstractmethod
def prereleases(self) -> Optional[bool]:
"""
Returns whether or not pre-releases as a whole are allowed by this
Expand Down Expand Up @@ -724,7 +725,10 @@ def __contains__(self, item: UnparsedVersion) -> bool:
return self.contains(item)

def contains(
self, item: UnparsedVersion, prereleases: Optional[bool] = None
self,
item: UnparsedVersion,
prereleases: Optional[bool] = None,
installed: Optional[bool] = None,
) -> bool:

# Ensure that our item is a Version or LegacyVersion instance.
Expand All @@ -746,6 +750,9 @@ def contains(
if not prereleases and item.is_prerelease:
return False

if installed and item.is_prerelease:
item = parse(item.base_version)

# We simply dispatch to the underlying specs here to make sure that the
# given version is contained within all of them.
# Note: This use of all() here means that an empty set of specifiers
Expand Down
9 changes: 9 additions & 0 deletions tests/test_specifiers.py
Expand Up @@ -819,6 +819,15 @@ def test_specifier_contains_prereleases(self):
assert spec.contains("1.0.dev1")
assert not spec.contains("1.0.dev1", prereleases=False)

def test_specifier_contains_installed_prereleases(self):
spec = SpecifierSet("~=1.0")
assert not spec.contains("1.0.0.dev1", installed=True)
assert spec.contains("1.0.0.dev1", prereleases=True, installed=True)

spec = SpecifierSet("~=1.0", prereleases=True)
assert spec.contains("1.0.0.dev1", installed=True)
assert not spec.contains("1.0.0.dev1", prereleases=False, installed=False)

@pytest.mark.parametrize(
("specifier", "specifier_prereleases", "prereleases", "input", "expected"),
[
Expand Down