from __future__ import unicode_literals import contextlib import io import os import shutil import sys import tarfile import textwrap import time import pytest def DALS(s): "dedent and left-strip" return textwrap.dedent(s).lstrip() def _tarfile_open_ex(*args, **kwargs): """ Extend result as a context manager. """ return contextlib.closing(tarfile.open(*args, **kwargs)) if sys.version_info[:2] < (2, 7) or (3, 0) <= sys.version_info[:2] < (3, 2): tarfile_open = _tarfile_open_ex else: tarfile_open = tarfile.open def make_sdist(dist_path, files): """ Create a simple sdist tarball at dist_path, containing the files listed in ``files`` as ``(filename, content)`` tuples. """ with tarfile_open(dist_path, 'w:gz') as dist: for filename, content in files: file_bytes = io.BytesIO(content.encode('utf-8')) file_info = tarfile.TarInfo(name=filename) file_info.size = len(file_bytes.getvalue()) file_info.mtime = int(time.time()) dist.addfile(file_info, fileobj=file_bytes) @pytest.fixture def venv(virtualenv): yield virtualenv # Workaround virtualenv not cleaning itself as it should... virtualenv.delete = True virtualenv.teardown() @pytest.mark.parametrize('setuptools_req, test_args', ( ('setuptools==27.2.0', ''), ('setuptools==27.2.0', '--extras'), ('setuptools==27.3.0', ''), ('setuptools==27.3.0', '--extras'), ('setuptools==32.3.1', ''), ('setuptools==32.3.1', '--extras'), ('setuptools==36.3.0', ''), ('setuptools==36.3.0', '--extras'), ('setuptools' , ''), ('setuptools' , '--extras'), )) def test_egg_fetcher(venv, setuptools_req, test_args): test_args = test_args.split() # Install pytest & pytest-runner. venv.run('python setup.py develop', cwd=os.getcwd()) venv.run('pip install pytest') # Install setuptools version. venv.run('pip install -U'.split() + [setuptools_req]) # For debugging purposes. venv.run('pip freeze --all') # Prepare fake index. index_dir = (venv.workspace / 'index').mkdir() for n in range(5): dist_name = 'barbazquux' + str(n + 1) dist_version = '0.1' dist_sdist = '%s-%s.tar.gz' % (dist_name, dist_version) dist_dir = (index_dir / dist_name).mkdir() make_sdist(dist_dir / dist_sdist, ( ('setup.py', textwrap.dedent( ''' from setuptools import setup setup( name={dist_name!r}, version={dist_version!r}, py_modules=[{dist_name!r}], ) ''' ).format(dist_name=dist_name, dist_version=dist_version)), (dist_name + '.py', ''), )) with (dist_dir / 'index.html').open('w') as fp: fp.write(DALS( '''
{dist_sdist}