|
4 | 4 |
|
5 | 5 | import pytest
|
6 | 6 |
|
| 7 | +from pip._vendor.packaging.utils import canonicalize_name |
| 8 | + |
7 | 9 | from tests.lib import (
|
8 | 10 | create_basic_sdist_for_package,
|
9 | 11 | create_basic_wheel_for_package,
|
|
14 | 16 | def assert_installed(script, **kwargs):
|
15 | 17 | ret = script.pip('list', '--format=json')
|
16 | 18 | installed = set(
|
17 |
| - (val['name'], val['version']) |
| 19 | + (canonicalize_name(val['name']), val['version']) |
18 | 20 | for val in json.loads(ret.stdout)
|
19 | 21 | )
|
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) |
22 | 25 |
|
23 | 26 |
|
24 | 27 | def assert_not_installed(script, *args):
|
25 | 28 | 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 | + ) |
27 | 33 | # None of the given names should be listed as installed, i.e. their
|
28 | 34 | # 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) |
31 | 38 |
|
32 | 39 |
|
33 | 40 | def assert_editable(script, *args):
|
@@ -801,3 +808,43 @@ def test_new_resolver_extra_merge_in_package(
|
801 | 808 | requirement + "[dev]",
|
802 | 809 | )
|
803 | 810 | 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