import io import os import shutil import sys import tarfile import textwrap import time import itertools import pytest def DALS(s): "dedent and left-strip" return textwrap.dedent(s).lstrip() 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() setuptools_reqs = ( ['setuptools', 'setuptools==38.4.1'] if sys.version_info < (3, 10) else ['setuptools', 'setuptools==49.0.0'] ) args_variants = ['', '--extras'] @pytest.mark.xfail('platform.system() == "Windows"') @pytest.mark.parametrize( 'setuptools_req, test_args', itertools.product(setuptools_reqs, args_variants) ) def test_egg_fetcher(venv, setuptools_req, test_args): test_args = test_args.split() # Install pytest & pytest-runner. venv.run('pip install pytest .', cwd=os.getcwd()) # 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}