import glob import os import sys import pytest from pytest import yield_fixture from pytest_fixture_config import yield_requires_config import pytest_virtualenv from .textwrap import DALS from .test_easy_install import make_nspkg_sdist @pytest.fixture(autouse=True) def pytest_virtualenv_works(virtualenv): """ pytest_virtualenv may not work. if it doesn't, skip these tests. See #1284. """ venv_prefix = virtualenv.run( 'python -c "import sys; print(sys.prefix)"', capture=True, ).strip() if venv_prefix == sys.prefix: pytest.skip("virtualenv is broken (see pypa/setuptools#1284)") @yield_requires_config(pytest_virtualenv.CONFIG, ['virtualenv_executable']) @yield_fixture(scope='function') def bare_virtualenv(): """ Bare virtualenv (no pip/setuptools/wheel). """ with pytest_virtualenv.VirtualEnv(args=( '--no-wheel', '--no-pip', '--no-setuptools', )) as venv: yield venv SOURCE_DIR = os.path.join(os.path.dirname(__file__), '../..') def test_clean_env_install(bare_virtualenv): """ Check setuptools can be installed in a clean environment. """ bare_virtualenv.run(' && '.join(( 'cd {source}', 'python setup.py install', )).format(source=SOURCE_DIR)) def test_pip_upgrade_from_source(virtualenv): """ Check pip can upgrade setuptools from source. """ dist_dir = virtualenv.workspace if sys.version_info < (2, 7): # Python 2.6 support was dropped in wheel 0.30.0. virtualenv.run('pip install -U "wheel<0.30.0"') # Generate source distribution / wheel. virtualenv.run(' && '.join(( 'cd {source}', 'python setup.py -q sdist -d {dist}', 'python setup.py -q bdist_wheel -d {dist}', )).format(source=SOURCE_DIR, dist=dist_dir)) sdist = glob.glob(os.path.join(dist_dir, '*.zip'))[0] wheel = glob.glob(os.path.join(dist_dir, '*.whl'))[0] # Then update from wheel. virtualenv.run('pip install ' + wheel) # And finally try to upgrade from source. virtualenv.run('pip install --no-cache-dir --upgrade ' + sdist) def test_test_command_install_requirements(bare_virtualenv, tmpdir): """ Check the test command will install all required dependencies. """ bare_virtualenv.run(' && '.join(( 'cd {source}', 'python setup.py develop', )).format(source=SOURCE_DIR)) def sdist(distname, version): dist_path = tmpdir.join('%s-%s.tar.gz' % (distname, version)) make_nspkg_sdist(str(dist_path), distname, version) return dist_path dependency_links = [ str(dist_path) for dist_path in ( sdist('foobar', '2.4'), sdist('bits', '4.2'), sdist('bobs', '6.0'), sdist('pieces', '0.6'), ) ] with tmpdir.join('setup.py').open('w') as fp: fp.write(DALS( ''' from setuptools import setup setup( dependency_links={dependency_links!r}, install_requires=[ 'barbazquux1; sys_platform in ""', 'foobar==2.4', ], setup_requires='bits==4.2', tests_require=""" bobs==6.0 """, extras_require={{ 'test': ['barbazquux2'], ':"" in sys_platform': 'pieces==0.6', ':python_version > "1"': """ pieces foobar """, }} ) '''.format(dependency_links=dependency_links))) with tmpdir.join('test.py').open('w') as fp: fp.write(DALS( ''' import foobar import bits import bobs import pieces open('success', 'w').close() ''')) # Run test command for test package. bare_virtualenv.run(' && '.join(( 'cd {tmpdir}', 'python setup.py test -s test', )).format(tmpdir=tmpdir)) assert tmpdir.join('success').check()