Skip to content

Commit f0999f9

Browse files
authored
Allow pre-releases when detecting version conflicts (#394)
Resolves #393. This patch also removes unnecessary magic mock values from test_package.py.
1 parent 02f4f26 commit f0999f9

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

src/pipdeptree/_models/package.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def is_conflicting(self) -> bool:
232232
if self.is_missing:
233233
return True
234234

235-
return self.installed_version not in self._obj.specifier
235+
return not self._obj.specifier.contains(self.installed_version, prereleases=True)
236236

237237
@property
238238
def is_missing(self) -> bool:

tests/_models/test_package.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from unittest.mock import MagicMock, Mock
99

1010
import pytest
11+
from packaging.specifiers import SpecifierSet
1112

1213
from pipdeptree._models import DistPackage, ReqPackage
1314
from pipdeptree._models.package import Package
@@ -169,15 +170,15 @@ def test_dist_package_key_pep503_normalized() -> None:
169170

170171

171172
def test_req_package_key_pep503_normalized() -> None:
172-
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
173+
bar_req = MagicMock(specifier=[">=4.0"])
173174
bar_req.name = "bar.bar-bar-bar"
174175
rp = ReqPackage(bar_req)
175176
assert rp.key == "bar-bar-bar-bar"
176177

177178

178179
def test_req_package_render_as_root() -> None:
179180
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
180-
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
181+
bar_req = MagicMock(specifier=[">=4.0"])
181182
bar_req.name = "bar"
182183
rp = ReqPackage(bar_req, dist=bar)
183184
is_frozen = False
@@ -189,7 +190,7 @@ def test_req_package_render_as_root_with_frozen() -> None:
189190
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
190191
bar.read_text = Mock(return_value=json_text)
191192
d = DistPackage(bar)
192-
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
193+
bar_req = MagicMock(specifier=[">=4.0"])
193194
bar_req.name = "bar"
194195
rp = ReqPackage(bar_req, dist=d)
195196
is_frozen = True
@@ -199,16 +200,26 @@ def test_req_package_render_as_root_with_frozen() -> None:
199200

200201
def test_req_package_render_as_branch() -> None:
201202
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
202-
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
203+
bar_req = MagicMock(specifier=[">=4.0"])
203204
bar_req.name = "bar"
204205
rp = ReqPackage(bar_req, dist=bar)
205206
is_frozen = False
206207
assert rp.render_as_branch(frozen=is_frozen) == "bar [required: >=4.0, installed: 4.1.0]"
207208

208209

210+
def test_req_package_is_conflicting_handle_dev_versions() -> None:
211+
# ensure that we can handle development versions when detecting conflicts
212+
# see https://github.com/tox-dev/pipdeptree/issues/393
213+
bar = Mock(metadata={"Name": "bar"}, version="1.2.3.dev0")
214+
bar_req = MagicMock(specifier=SpecifierSet(">1.2.0"))
215+
bar_req.name = "bar"
216+
rp = ReqPackage(bar_req, dist=bar)
217+
assert not rp.is_conflicting()
218+
219+
209220
def test_req_package_as_dict() -> None:
210221
bar = Mock(metadata={"Name": "bar"}, version="4.1.0")
211-
bar_req = MagicMock(version="4.1.0", specifier=[">=4.0"])
222+
bar_req = MagicMock(specifier=[">=4.0"])
212223
bar_req.name = "bar"
213224
rp = ReqPackage(bar_req, dist=bar)
214225
result = rp.as_dict()
@@ -218,7 +229,7 @@ def test_req_package_as_dict() -> None:
218229

219230
def test_req_package_as_dict_with_no_version_spec() -> None:
220231
bar = Mock(key="bar", version="4.1.0")
221-
bar_req = MagicMock(version="4.1.0", specifier=[])
232+
bar_req = MagicMock(specifier=[])
222233
bar_req.name = "bar"
223234
rp = ReqPackage(bar_req, dist=bar)
224235
result = rp.as_dict()

0 commit comments

Comments
 (0)