diff options
author | Masen Furer <m_github@0x26.net> | 2023-01-18 07:50:21 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-18 07:50:21 -0800 |
commit | 8323aaa78a00425b598b093ea0eae82b228fe6d6 (patch) | |
tree | 52d932c5532386ee4d97aef9798df01966c99d53 | |
parent | 23510dc61a2e5e4fc5381a957e75f17796ace265 (diff) | |
download | tox-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.rst | 10 | ||||
-rw-r--r-- | pyproject.toml | 2 | ||||
-rw-r--r-- | src/tox/tox_env/python/virtual_env/package/pyproject.py | 10 | ||||
-rw-r--r-- | tests/demo_pkg_inline/build.py | 26 |
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 |