Skip to content

Commit

Permalink
Allow pre-releases when detecting version conflicts (#394)
Browse files Browse the repository at this point in the history
Resolves #393.

This patch also removes unnecessary magic mock values from
test_package.py.
  • Loading branch information
kemzeb committed Jul 12, 2024
1 parent 02f4f26 commit f0999f9
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/pipdeptree/_models/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ def is_conflicting(self) -> bool:
if self.is_missing:
return True

return self.installed_version not in self._obj.specifier
return not self._obj.specifier.contains(self.installed_version, prereleases=True)

@property
def is_missing(self) -> bool:
Expand Down
23 changes: 17 additions & 6 deletions tests/_models/test_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from unittest.mock import MagicMock, Mock

import pytest
from packaging.specifiers import SpecifierSet

from pipdeptree._models import DistPackage, ReqPackage
from pipdeptree._models.package import Package
Expand Down Expand Up @@ -169,15 +170,15 @@ def test_dist_package_key_pep503_normalized() -> None:


def test_req_package_key_pep503_normalized() -> None:
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
bar_req = MagicMock(specifier=[">=4.0"])
bar_req.name = "bar.bar-bar-bar"
rp = ReqPackage(bar_req)
assert rp.key == "bar-bar-bar-bar"


def test_req_package_render_as_root() -> None:
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
bar_req = MagicMock(specifier=[">=4.0"])
bar_req.name = "bar"
rp = ReqPackage(bar_req, dist=bar)
is_frozen = False
Expand All @@ -189,7 +190,7 @@ def test_req_package_render_as_root_with_frozen() -> None:
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
bar.read_text = Mock(return_value=json_text)
d = DistPackage(bar)
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
bar_req = MagicMock(specifier=[">=4.0"])
bar_req.name = "bar"
rp = ReqPackage(bar_req, dist=d)
is_frozen = True
Expand All @@ -199,16 +200,26 @@ def test_req_package_render_as_root_with_frozen() -> None:

def test_req_package_render_as_branch() -> None:
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
bar_req = MagicMock(specifier=[">=4.0"])
bar_req.name = "bar"
rp = ReqPackage(bar_req, dist=bar)
is_frozen = False
assert rp.render_as_branch(frozen=is_frozen) == "bar [required: >=4.0, installed: 4.1.0]"


def test_req_package_is_conflicting_handle_dev_versions() -> None:
# ensure that we can handle development versions when detecting conflicts
# see https://github.com/tox-dev/pipdeptree/issues/393
bar = Mock(metadata={"Name": "bar"}, version="1.2.3.dev0")
bar_req = MagicMock(specifier=SpecifierSet(">1.2.0"))
bar_req.name = "bar"
rp = ReqPackage(bar_req, dist=bar)
assert not rp.is_conflicting()


def test_req_package_as_dict() -> None:
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
bar_req = MagicMock(specifier=[">=4.0"])
bar_req.name = "bar"
rp = ReqPackage(bar_req, dist=bar)
result = rp.as_dict()
Expand All @@ -218,7 +229,7 @@ def test_req_package_as_dict() -> None:

def test_req_package_as_dict_with_no_version_spec() -> None:
bar = Mock(key="bar", version="4.1.0")
bar_req = MagicMock(version="4.1.0", specifier=[])
bar_req = MagicMock(specifier=[])
bar_req.name = "bar"
rp = ReqPackage(bar_req, dist=bar)
result = rp.as_dict()
Expand Down

0 comments on commit f0999f9

Please sign in to comment.