Skip to content

Commit 8323aaa

Browse files
authored
Include WHEEL metadata when using PDM and poetry backends (#2881)
Fix #2880 Fix #2870
1 parent 23510dc commit 8323aaa

File tree

4 files changed

+37
-11
lines changed

4 files changed

+37
-11
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`.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies = [
2929
"packaging>=23",
3030
"platformdirs>=2.6.2",
3131
"pluggy>=1",
32-
"pyproject-api>=1.4",
32+
"pyproject-api>=1.5",
3333
'tomli>=2.0.1; python_version < "3.11"',
3434
"virtualenv>=20.17.1",
3535
"filelock>=3.9",

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)

tests/demo_pkg_inline/build.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
record = "{}/RECORD".format(dist_info)
2222
content = {
2323
logic: "def do():\n print('greetings from {}')".format(name),
24-
plugin: dedent(
25-
"""
24+
plugin: """
2625
try:
2726
from tox.plugin import impl
2827
from tox.tox_env.python.virtual_env.runner import VirtualEnvRunner
@@ -37,14 +36,13 @@ def id() -> str:
3736
@impl
3837
def tox_register_tox_env(register: ToxEnvRegister) -> None:
3938
register.add_run_env(ExampleVirtualEnvRunner)
40-
""",
41-
),
42-
entry_points: dedent(
43-
"""
39+
""",
40+
}
41+
metadata_files = {
42+
entry_points: """
4443
[tox]
4544
example = {}.example_plugin""".format(
46-
name,
47-
),
45+
name,
4846
),
4947
metadata: """
5048
Metadata-Version: 2.1
@@ -88,12 +86,22 @@ def tox_register_tox_env(register: ToxEnvRegister) -> None:
8886
}
8987

9088

91-
def build_wheel(wheel_directory, metadata_directory=None, config_settings=None): # noqa: U100
89+
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): # noqa: U100
9290
base_name = "{}-{}-py{}-none-any.whl".format(name, version, sys.version_info[0])
9391
path = os.path.join(wheel_directory, base_name)
9492
with ZipFile(path, "w") as zip_file_handler:
9593
for arc_name, data in content.items(): # pragma: no branch
9694
zip_file_handler.writestr(arc_name, dedent(data).strip())
95+
if metadata_directory is not None:
96+
for sub_directory, _, filenames in os.walk(metadata_directory):
97+
for filename in filenames:
98+
zip_file_handler.write(
99+
os.path.join(metadata_directory, sub_directory, filename),
100+
os.path.join(sub_directory, filename),
101+
)
102+
else:
103+
for arc_name, data in metadata_files.items(): # pragma: no branch
104+
zip_file_handler.writestr(arc_name, dedent(data).strip())
97105
print("created wheel {}".format(path))
98106
return base_name
99107

0 commit comments

Comments
 (0)