From 69a19b8804dcd6692f6971308b7dbdc5815e06c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20La=C3=ADns?= Date: Sat, 19 Jun 2021 18:27:28 +0100 Subject: [PATCH] build: fix calls on inexistent outdir with multiple levels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #316 Signed-off-by: Filipe LaĆ­ns --- CHANGELOG.rst | 11 +++++++++++ src/build/__init__.py | 2 +- tests/test_projectbuilder.py | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index dd43f31b..9790e904 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,6 +3,17 @@ Changelog +++++++++ + +Unreleased +========== + +- Fix invoking the backend on an inexistent output directory with multiple levels (`PR #318`_, Fixes `#316`_) + +.. _PR #318: https://github.com/pypa/build/pull/318 +.. _#316: https://github.com/pypa/build/issues/316 + + + 0.5.0 (19-06-2021) ================== diff --git a/src/build/__init__.py b/src/build/__init__.py index 11a045de..75ee7daa 100644 --- a/src/build/__init__.py +++ b/src/build/__init__.py @@ -383,7 +383,7 @@ def _call_backend(self, hook_name, outdir, config_settings=None, **kwargs): if not os.path.isdir(outdir): raise BuildException("Build path '{}' exists and is not a directory".format(outdir)) else: - os.mkdir(outdir) + os.makedirs(outdir) with self._handle_backend(hook_name): basename = callback(outdir, config_settings, **kwargs) # type: str diff --git a/tests/test_projectbuilder.py b/tests/test_projectbuilder.py index e9107653..a825410f 100644 --- a/tests/test_projectbuilder.py +++ b/tests/test_projectbuilder.py @@ -467,6 +467,28 @@ def test_prepare_not_dir_outdir(mocker, tmp_dir, test_flit_path): builder.prepare('wheel', out) +def test_no_outdir_single(mocker, tmp_dir, test_flit_path): + mocker.patch('pep517.wrappers.Pep517HookCaller.prepare_metadata_for_build_wheel', return_value='') + + builder = build.ProjectBuilder(test_flit_path) + + out = os.path.join(tmp_dir, 'out') + builder.prepare('wheel', out) + + assert os.path.isdir(out) + + +def test_no_outdir_multiple(mocker, tmp_dir, test_flit_path): + mocker.patch('pep517.wrappers.Pep517HookCaller.prepare_metadata_for_build_wheel', return_value='') + + builder = build.ProjectBuilder(test_flit_path) + + out = os.path.join(tmp_dir, 'does', 'not', 'exist') + builder.prepare('wheel', out) + + assert os.path.isdir(out) + + def test_runner_user_specified(tmp_dir, test_flit_path): def dummy_runner(cmd, cwd=None, env=None): raise RuntimeError('Runner was called')