Add a test demonstrating #7966

This commit is contained in:
Paul Moore 2020-04-03 10:51:22 +01:00
parent 87aaae0e08
commit 037791d170
2 changed files with 93 additions and 2 deletions

View File

@ -2,7 +2,10 @@ import json
import pytest
from tests.lib import create_basic_wheel_for_package
from tests.lib import (
create_basic_sdist_for_package,
create_basic_wheel_for_package,
)
def assert_installed(script, **kwargs):
@ -253,3 +256,41 @@ def test_new_resolver_ignore_installed(script):
assert script.site_packages / "base" in result.files_updated, (
"base 0.1.0 not reinstalled"
)
def test_new_resolver_only_builds_sdists_when_needed(script):
create_basic_wheel_for_package(
script,
"base",
"0.1.0",
depends=["dep"],
)
create_basic_sdist_for_package(
script,
"dep",
"0.1.0",
# Replace setup.py with something that fails
extra_files={"setup.py": "assert False"},
)
create_basic_sdist_for_package(
script,
"dep",
"0.2.0",
)
# We only ever need to check dep 0.2.0 as it's the latest version
script.pip(
"install", "--unstable-feature=resolver",
"--no-cache-dir", "--no-index",
"--find-links", script.scratch_path,
"base"
)
assert_installed(script, base="0.1.0", dep="0.2.0")
# We merge criteria here, as we have two "dep" requirements
script.pip(
"install", "--unstable-feature=resolver",
"--no-cache-dir", "--no-index",
"--find-links", script.scratch_path,
"base", "dep"
)
assert_installed(script, base="0.1.0", dep="0.2.0")

View File

@ -15,7 +15,7 @@ from textwrap import dedent
from zipfile import ZipFile
import pytest
from pip._vendor.six import PY2
from pip._vendor.six import PY2, ensure_binary, text_type
from scripttest import FoundDir, TestFileEnvironment
from pip._internal.index.collector import LinkCollector
@ -1036,6 +1036,56 @@ def create_basic_wheel_for_package(
return archive_path
def create_basic_sdist_for_package(
script, name, version, extra_files=None
):
files = {
"setup.py": """
from setuptools import find_packages, setup
setup(name={name!r}, version={version!r})
""",
}
# Some useful shorthands
archive_name = "{name}-{version}.tar.gz".format(
name=name, version=version
)
# Replace key-values with formatted values
for key, value in list(files.items()):
del files[key]
key = key.format(name=name)
files[key] = textwrap.dedent(value).format(
name=name, version=version
).strip()
# Add new files after formatting
if extra_files:
files.update(extra_files)
for fname in files:
path = script.temp_path / fname
path.parent.mkdir(exist_ok=True, parents=True)
path.write_bytes(ensure_binary(files[fname]))
# The base_dir cast is required to make `shutil.make_archive()` use
# Unicode paths on Python 2, making it able to properly archive
# files with non-ASCII names.
retval = script.scratch_path / archive_name
generated = shutil.make_archive(
retval,
'gztar',
root_dir=script.temp_path,
base_dir=text_type(os.curdir),
)
shutil.move(generated, retval)
shutil.rmtree(script.temp_path)
script.temp_path.mkdir()
return retval
def need_executable(name, check_cmd):
def wrapper(fn):
try: