import os import pytest from .files import build_files from .textwrap import DALS futures = pytest.importorskip('concurrent.futures') importlib = pytest.importorskip('importlib') class BuildBackendBase(object): def __init__(self, cwd=None, env={}, backend_name='setuptools.build_meta'): self.cwd = cwd self.env = env self.backend_name = backend_name class BuildBackend(BuildBackendBase): """PEP 517 Build Backend""" def __init__(self, *args, **kwargs): super(BuildBackend, self).__init__(*args, **kwargs) self.pool = futures.ProcessPoolExecutor() def __getattr__(self, name): """Handles aribrary function invocations on the build backend.""" def method(*args, **kw): root = os.path.abspath(self.cwd) caller = BuildBackendCaller(root, self.env, self.backend_name) return self.pool.submit(caller, name, *args, **kw).result() return method class BuildBackendCaller(BuildBackendBase): def __call__(self, name, *args, **kw): """Handles aribrary function invocations on the build backend.""" os.chdir(self.cwd) os.environ.update(self.env) mod = importlib.import_module(self.backend_name) return getattr(mod, name)(*args, **kw) defns = [{ 'setup.py': DALS(""" __import__('setuptools').setup( name='foo', py_modules=['hello'], setup_requires=['six'], ) """), 'hello.py': DALS(""" def run(): print('hello') """), }, { 'setup.py': DALS(""" assert __name__ == '__main__' __import__('setuptools').setup( name='foo', py_modules=['hello'], setup_requires=['six'], ) """), 'hello.py': DALS(""" def run(): print('hello') """), }, { 'setup.py': DALS(""" variable = True def function(): return variable assert variable __import__('setuptools').setup( name='foo', py_modules=['hello'], setup_requires=['six'], ) """), 'hello.py': DALS(""" def run(): print('hello') """), }] @pytest.fixture(params=defns) def build_backend(tmpdir, request): build_files(request.param, prefix=str(tmpdir)) with tmpdir.as_cwd(): yield BuildBackend(cwd='.') def test_get_requires_for_build_wheel(build_backend): actual = build_backend.get_requires_for_build_wheel() expected = ['six', 'setuptools', 'wheel'] assert sorted(actual) == sorted(expected) def test_build_wheel(build_backend): dist_dir = os.path.abspath('pip-wheel') os.makedirs(dist_dir) wheel_name = build_backend.build_wheel(dist_dir) assert os.path.isfile(os.path.join(dist_dir, wheel_name)) def test_build_sdist(build_backend): dist_dir = os.path.abspath('pip-sdist') os.makedirs(dist_dir) sdist_name = build_backend.build_sdist(dist_dir) assert os.path.isfile(os.path.join(dist_dir, sdist_name)) def test_prepare_metadata_for_build_wheel(build_backend): dist_dir = os.path.abspath('pip-dist-info') os.makedirs(dist_dir) dist_info = build_backend.prepare_metadata_for_build_wheel(dist_dir) assert os.path.isfile(os.path.join(dist_dir, dist_info, 'METADATA'))