summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMasen Furer <m_github@0x26.net>2023-01-18 07:50:21 -0800
committerGitHub <noreply@github.com>2023-01-18 07:50:21 -0800
commit8323aaa78a00425b598b093ea0eae82b228fe6d6 (patch)
tree52d932c5532386ee4d97aef9798df01966c99d53
parent23510dc61a2e5e4fc5381a957e75f17796ace265 (diff)
downloadtox-git-8323aaa78a00425b598b093ea0eae82b228fe6d6.tar.gz
Include WHEEL metadata when using PDM and poetry backends (#2881)
Fix https://github.com/tox-dev/tox/issues/2880 Fix https://github.com/tox-dev/tox/issues/2870
-rw-r--r--docs/changelog/2880.bugfix.rst10
-rw-r--r--pyproject.toml2
-rw-r--r--src/tox/tox_env/python/virtual_env/package/pyproject.py10
-rw-r--r--tests/demo_pkg_inline/build.py26
4 files changed, 37 insertions, 11 deletions
diff --git a/docs/changelog/2880.bugfix.rst b/docs/changelog/2880.bugfix.rst
new file mode 100644
index 00000000..2ab4c11c
--- /dev/null
+++ b/docs/changelog/2880.bugfix.rst
@@ -0,0 +1,10 @@
+When building a ``wheel`` or ``editable`` package with a PEP 517 backend, no
+longer pass an empty ``metadata_directory`` to the backend ``build_wheel`` or
+``build_editable`` endpoint.
+
+Some backends, such as PDM and poetry, will not generate package metadata in
+the presence of a ``metadata_directory``, even if it is empty.
+
+Prior to this change, attempting to install a wheel created by tox using PDM or
+poetry would return an error like "There is no item named
+'my-package.0.1.dist-info/WHEEL' in the archive" - by :user:`masenf`.
diff --git a/pyproject.toml b/pyproject.toml
index c0b45419..0117ffbc 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -29,7 +29,7 @@ dependencies = [
"packaging>=23",
"platformdirs>=2.6.2",
"pluggy>=1",
- "pyproject-api>=1.4",
+ "pyproject-api>=1.5",
'tomli>=2.0.1; python_version < "3.11"',
"virtualenv>=20.17.1",
"filelock>=3.9",
diff --git a/src/tox/tox_env/python/virtual_env/package/pyproject.py b/src/tox/tox_env/python/virtual_env/package/pyproject.py
index 1cb31c6f..77508732 100644
--- a/src/tox/tox_env/python/virtual_env/package/pyproject.py
+++ b/src/tox/tox_env/python/virtual_env/package/pyproject.py
@@ -137,6 +137,14 @@ class Pep517VirtualEnvPackager(PythonPackageToxEnv, VirtualEnv):
meta_folder.mkdir(exist_ok=True)
return meta_folder
+ @property
+ def meta_folder_if_populated(self) -> Path | None:
+ """Return the metadata directory if it contains any files, otherwise None."""
+ meta_folder = self.meta_folder
+ if meta_folder.exists() and tuple(meta_folder.iterdir()):
+ return meta_folder
+ return None
+
def register_run_env(self, run_env: RunToxEnv) -> Generator[tuple[str, str], PackageToxEnv, None]:
yield from super().register_run_env(run_env)
build_type = run_env.conf["package"]
@@ -210,7 +218,7 @@ class Pep517VirtualEnvPackager(PythonPackageToxEnv, VirtualEnv):
with self._pkg_lock:
wheel = getattr(self._frontend, method)(
wheel_directory=self.pkg_dir,
- metadata_directory=self.meta_folder,
+ metadata_directory=self.meta_folder_if_populated,
config_settings=self._wheel_config_settings,
).wheel
wheel = create_session_view(wheel, self._package_temp_path)
diff --git a/tests/demo_pkg_inline/build.py b/tests/demo_pkg_inline/build.py
index 47df3a3d..22e5dda0 100644
--- a/tests/demo_pkg_inline/build.py
+++ b/tests/demo_pkg_inline/build.py
@@ -21,8 +21,7 @@ wheel = "{}/WHEEL".format(dist_info)
record = "{}/RECORD".format(dist_info)
content = {
logic: "def do():\n print('greetings from {}')".format(name),
- plugin: dedent(
- """
+ plugin: """
try:
from tox.plugin import impl
from tox.tox_env.python.virtual_env.runner import VirtualEnvRunner
@@ -37,14 +36,13 @@ content = {
@impl
def tox_register_tox_env(register: ToxEnvRegister) -> None:
register.add_run_env(ExampleVirtualEnvRunner)
- """,
- ),
- entry_points: dedent(
- """
+ """,
+}
+metadata_files = {
+ entry_points: """
[tox]
example = {}.example_plugin""".format(
- name,
- ),
+ name,
),
metadata: """
Metadata-Version: 2.1
@@ -88,12 +86,22 @@ content = {
}
-def build_wheel(wheel_directory, metadata_directory=None, config_settings=None): # noqa: U100
+def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): # noqa: U100
base_name = "{}-{}-py{}-none-any.whl".format(name, version, sys.version_info[0])
path = os.path.join(wheel_directory, base_name)
with ZipFile(path, "w") as zip_file_handler:
for arc_name, data in content.items(): # pragma: no branch
zip_file_handler.writestr(arc_name, dedent(data).strip())
+ if metadata_directory is not None:
+ for sub_directory, _, filenames in os.walk(metadata_directory):
+ for filename in filenames:
+ zip_file_handler.write(
+ os.path.join(metadata_directory, sub_directory, filename),
+ os.path.join(sub_directory, filename),
+ )
+ else:
+ for arc_name, data in metadata_files.items(): # pragma: no branch
+ zip_file_handler.writestr(arc_name, dedent(data).strip())
print("created wheel {}".format(path))
return base_name