Skip to content

Commit 00ca479

Browse files
committed
Add reprod for pre-existing build dir failure
1 parent 9999f0e commit 00ca479

File tree

1 file changed

+53
-6
lines changed

1 file changed

+53
-6
lines changed

tests/functional/test_new_resolver.py

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
import pytest
66

7+
from pip._vendor.packaging.utils import canonicalize_name
8+
79
from tests.lib import (
810
create_basic_sdist_for_package,
911
create_basic_wheel_for_package,
@@ -14,20 +16,25 @@
1416
def assert_installed(script, **kwargs):
1517
ret = script.pip('list', '--format=json')
1618
installed = set(
17-
(val['name'], val['version'])
19+
(canonicalize_name(val['name']), val['version'])
1820
for val in json.loads(ret.stdout)
1921
)
20-
assert set(kwargs.items()) <= installed, \
21-
"{!r} not all in {!r}".format(kwargs, installed)
22+
expected = set((canonicalize_name(k), v) for k, v in kwargs.items())
23+
assert expected <= installed, \
24+
"{!r} not all in {!r}".format(expected, installed)
2225

2326

2427
def assert_not_installed(script, *args):
2528
ret = script.pip("list", "--format=json")
26-
installed = set(val["name"] for val in json.loads(ret.stdout))
29+
installed = set(
30+
canonicalize_name(val["name"])
31+
for val in json.loads(ret.stdout)
32+
)
2733
# None of the given names should be listed as installed, i.e. their
2834
# intersection should be empty.
29-
assert not (set(args) & installed), \
30-
"{!r} contained in {!r}".format(args, installed)
35+
expected = set(canonicalize_name(k) for k in args)
36+
assert not (expected & installed), \
37+
"{!r} contained in {!r}".format(expected, installed)
3138

3239

3340
def assert_editable(script, *args):
@@ -801,3 +808,43 @@ def test_new_resolver_extra_merge_in_package(
801808
requirement + "[dev]",
802809
)
803810
assert_installed(script, pkg="1.0.0", dep="1.0.0", depdev="1.0.0")
811+
812+
813+
@pytest.mark.xfail(reason="pre-existing build directory")
814+
def test_new_resolver_build_directory_error_zazo_19(script):
815+
"""https://github.com/pradyunsg/zazo/issues/19#issuecomment-631615674
816+
817+
This will first resolve like this:
818+
819+
1. Pin pkg-b==2.0.0 (since pkg-b has fewer choices)
820+
2. Pin pkg-a==3.0.0 -> Conflict due to dependency pkg-b<2
821+
3. Pin pkg-b==1.0.0
822+
823+
Since pkg-b is only available as sdist, both the first and third steps
824+
would trigger building from source. This ensures the preparer can build
825+
different versions of a package for the resolver.
826+
827+
The preparer would fail with the following message if the different
828+
versions end up using the same build directory::
829+
830+
ERROR: pip can't proceed with requirements 'pkg-b ...' due to a
831+
pre-existing build directory (...). This is likely due to a previous
832+
installation that failed. pip is being responsible and not assuming it
833+
can delete this. Please delete it and try again.
834+
"""
835+
create_basic_wheel_for_package(
836+
script, "pkg_a", "3.0.0", depends=["pkg-b<2"],
837+
)
838+
create_basic_wheel_for_package(script, "pkg_a", "2.0.0")
839+
create_basic_wheel_for_package(script, "pkg_a", "1.0.0")
840+
841+
create_basic_sdist_for_package(script, "pkg_b", "2.0.0")
842+
create_basic_sdist_for_package(script, "pkg_b", "1.0.0")
843+
844+
script.pip(
845+
"install", "--unstable-feature=resolver",
846+
"--no-cache-dir", "--no-index",
847+
"--find-links", script.scratch_path,
848+
"pkg-a", "pkg-b",
849+
)
850+
assert_installed(script, pkg_a="3.0.0", pkg_b="1.0.0")

0 commit comments

Comments
 (0)