1
1
Fork 0
mirror of https://github.com/pypa/pip synced 2023-12-13 21:30:23 +01:00

Fix building packages with backend-path in pyproject.toml

Closes gh-6599
This commit is contained in:
Thomas Kluyver 2019-11-23 14:38:27 +00:00
parent 3ff2513537
commit dd7b1ee5c3
4 changed files with 39 additions and 5 deletions

1
news/6599.bugfix Normal file
View file

@ -0,0 +1 @@
Fix building packages which specify ``backend-path`` in pyproject.toml.

View file

@ -39,7 +39,7 @@ def load_pyproject_toml(
setup_py, # type: str setup_py, # type: str
req_name # type: str req_name # type: str
): ):
# type: (...) -> Optional[Tuple[List[str], str, List[str]]] # type: (...) -> Optional[Tuple[List[str], str, List[str], List[str]]]
"""Load the pyproject.toml file. """Load the pyproject.toml file.
Parameters: Parameters:
@ -57,6 +57,8 @@ def load_pyproject_toml(
name of PEP 517 backend, name of PEP 517 backend,
requirements we should check are installed after setting requirements we should check are installed after setting
up the build environment up the build environment
directory paths to import the backend from (backend-path),
relative to the project root.
) )
""" """
has_pyproject = os.path.isfile(pyproject_toml) has_pyproject = os.path.isfile(pyproject_toml)
@ -167,6 +169,7 @@ def load_pyproject_toml(
) )
backend = build_system.get("build-backend") backend = build_system.get("build-backend")
backend_path = build_system.get("backend-path", [])
check = [] # type: List[str] check = [] # type: List[str]
if backend is None: if backend is None:
# If the user didn't specify a backend, we assume they want to use # If the user didn't specify a backend, we assume they want to use
@ -184,4 +187,4 @@ def load_pyproject_toml(
backend = "setuptools.build_meta:__legacy__" backend = "setuptools.build_meta:__legacy__"
check = ["setuptools>=40.8.0", "wheel"] check = ["setuptools>=40.8.0", "wheel"]
return (requires, backend, check) return (requires, backend, check, backend_path)

View file

@ -601,11 +601,11 @@ class InstallRequirement(object):
return return
self.use_pep517 = True self.use_pep517 = True
requires, backend, check = pyproject_toml_data requires, backend, check, backend_path = pyproject_toml_data
self.requirements_to_check = check self.requirements_to_check = check
self.pyproject_requires = requires self.pyproject_requires = requires
self.pep517_backend = Pep517HookCaller( self.pep517_backend = Pep517HookCaller(
self.unpacked_source_directory, backend self.unpacked_source_directory, backend, backend_path=backend_path,
) )
def prepare_metadata(self): def prepare_metadata(self):

View file

@ -6,12 +6,14 @@ from pip._internal.req import InstallRequirement
from tests.lib import make_test_finder, path_to_url from tests.lib import make_test_finder, path_to_url
def make_project(tmpdir, requires=[], backend=None): def make_project(tmpdir, requires=[], backend=None, backend_path=[]):
project_dir = tmpdir / 'project' project_dir = tmpdir / 'project'
project_dir.mkdir() project_dir.mkdir()
buildsys = {'requires': requires} buildsys = {'requires': requires}
if backend: if backend:
buildsys['build-backend'] = backend buildsys['build-backend'] = backend
if backend_path:
buildsys['backend-path'] = backend_path
data = pytoml.dumps({'build-system': buildsys}) data = pytoml.dumps({'build-system': buildsys})
project_dir.joinpath('pyproject.toml').write_text(data) project_dir.joinpath('pyproject.toml').write_text(data)
return project_dir return project_dir
@ -32,6 +34,34 @@ def test_backend(tmpdir, data):
assert req.pep517_backend.build_wheel("dir") == "Backend called" assert req.pep517_backend.build_wheel("dir") == "Backend called"
dummy_backend_code = """\
def build_wheel(
wheel_directory,
config_settings=None,
metadata_directory=None
):
return "Backend called"
"""
def test_backend_path(tmpdir, data):
"""Check we can call a backend inside the project"""
project_dir = make_project(
tmpdir, backend="dummy_backend", backend_path=['.']
)
(project_dir / 'dummy_backend.py').write_text(dummy_backend_code)
print(project_dir)
import os
print(os.listdir(project_dir))
req = InstallRequirement(None, None, source_dir=project_dir)
req.load_pyproject_toml()
env = BuildEnvironment()
assert hasattr(req.pep517_backend, 'build_wheel')
with env:
assert req.pep517_backend.build_wheel("dir") == "Backend called"
def test_pep517_install(script, tmpdir, data): def test_pep517_install(script, tmpdir, data):
"""Check we can build with a custom backend""" """Check we can build with a custom backend"""
project_dir = make_project( project_dir = make_project(