Skip to content

Commit 935e7eb

Browse files
committed
pyproject: only pass metadata_directory when it's not empty
Passing empty `metadata_directory` to `build_wheel` or `build_editable` can cause some PEP 517 backends to create a wheel without metadata. Fix #2880
1 parent d9091ea commit 935e7eb

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

docs/changelog/2880.bugfix.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
When building a ``wheel`` or ``editable`` package with a PEP 517 backend, no
2+
longer pass an empty ``metadata_directory`` to the backend ``build_wheel`` or
3+
``build_editable`` endpoint.
4+
5+
Some backends, such as PDM and poetry, will not generate package metadata in
6+
the presence of a ``metadata_directory``, even if it is empty.
7+
8+
Prior to this change, attempting to install a wheel created by tox using PDM or
9+
poetry would return an error like ``There is no item named
10+
'my-package.0.1.dist-info/WHEEL' in the archive`` - by :user:`masenf`.

src/tox/tox_env/python/virtual_env/package/pyproject.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ def meta_folder(self) -> Path:
137137
meta_folder.mkdir(exist_ok=True)
138138
return meta_folder
139139

140+
@property
141+
def meta_folder_if_populated(self) -> Path | None:
142+
"""Return the metadata directory if it contains any files, otherwise None."""
143+
meta_folder = self.meta_folder
144+
if meta_folder.exists() and tuple(meta_folder.iterdir()):
145+
return meta_folder
146+
return None
147+
140148
def register_run_env(self, run_env: RunToxEnv) -> Generator[tuple[str, str], PackageToxEnv, None]:
141149
yield from super().register_run_env(run_env)
142150
build_type = run_env.conf["package"]
@@ -210,7 +218,7 @@ def perform_packaging(self, for_env: EnvConfigSet) -> list[Package]:
210218
with self._pkg_lock:
211219
wheel = getattr(self._frontend, method)(
212220
wheel_directory=self.pkg_dir,
213-
metadata_directory=self.meta_folder,
221+
metadata_directory=self.meta_folder_if_populated,
214222
config_settings=self._wheel_config_settings,
215223
).wheel
216224
wheel = create_session_view(wheel, self._package_temp_path)

0 commit comments

Comments
 (0)