diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2017-02-25 21:16:34 -0600 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2017-02-26 13:50:32 -0600 |
commit | d4c215a7c61fb1f94b88bd2aa0b332ebaff18193 (patch) | |
tree | cfc048da08515a73fb2c20d82d662146f8c39ac0 | |
parent | 387b40ea4084013bd2453ffa3ed2725b715530a6 (diff) | |
download | external_python_setuptools-d4c215a7c61fb1f94b88bd2aa0b332ebaff18193.tar.gz external_python_setuptools-d4c215a7c61fb1f94b88bd2aa0b332ebaff18193.tar.bz2 external_python_setuptools-d4c215a7c61fb1f94b88bd2aa0b332ebaff18193.zip |
Add a test capturing new proposed expectation that Setuptools' build dependencies should not require setuptools to build in order to avoid inevitable conflicts when bootstrapping from source. Packaging fails this test. Ref #980
-rw-r--r-- | setuptools/tests/test_integration.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/setuptools/tests/test_integration.py b/setuptools/tests/test_integration.py index a83d4fe8..cb62eb29 100644 --- a/setuptools/tests/test_integration.py +++ b/setuptools/tests/test_integration.py @@ -98,3 +98,53 @@ def test_pbr(install_context): def test_python_novaclient(install_context): _install_one('python-novaclient', install_context, 'novaclient', 'base.py') + +import re +import subprocess +import functools +import tarfile, zipfile + + +build_deps = ['appdirs', 'packaging', 'pyparsing', 'six'] +@pytest.mark.parametrize("build_dep", build_deps) +@pytest.mark.skipif(sys.version_info < (3, 6), reason='run only on late versions') +def test_build_deps_on_distutils(request, tmpdir_factory, build_dep): + """ + All setuptools build dependencies must build without + setuptools. + """ + if 'pyparsing' in build_dep: + pytest.xfail(reason="Project imports setuptools unconditionally") + build_target = tmpdir_factory.mktemp('source') + build_dir = download_and_extract(request, build_dep, build_target) + install_target = tmpdir_factory.mktemp('target') + output = install(build_dir, install_target) + for line in output.splitlines(): + match = re.search('Unknown distribution option: (.*)', line) + allowed_unknowns = [ + 'test_suite', + 'tests_require', + 'install_requires', + ] + assert not match or match.group(1).strip('"\'') in allowed_unknowns + + +def install(pkg_dir, install_dir): + with open(os.path.join(pkg_dir, 'setuptools.py'), 'w') as breaker: + breaker.write('raise ImportError()') + cmd = [sys.executable, 'setup.py', 'install', '--prefix', install_dir] + env = dict(os.environ, PYTHONPATH=pkg_dir) + output = subprocess.check_output(cmd, cwd=pkg_dir, env=env, stderr=subprocess.STDOUT) + return output.decode('utf-8') + + +def download_and_extract(request, req, target): + cmd = [sys.executable, '-m', 'pip', 'download', '--no-deps', + '--no-binary', ':all:', req] + output = subprocess.check_output(cmd, encoding='utf-8') + filename = re.search('Saved (.*)', output).group(1) + request.addfinalizer(functools.partial(os.remove, filename)) + opener = zipfile.ZipFile if filename.endswith('.zip') else tarfile.open + with opener(filename) as archive: + archive.extractall(target) + return os.path.join(target, os.listdir(target)[0]) |