def _pep517_metadata(cls, path): # type (Path) -> PackageInfo """ Helper method to use PEP-517 library to build and read package metadata. :param path: Path to package source to build and read metadata for. """ info = None try: info = cls.from_setup_files(path) if info.requires_dist is not None: return info except PackageInfoError: pass with temporary_directory() as tmp_dir: # TODO: cache PEP 517 build environment corresponding to each project venv venv_dir = Path(tmp_dir) / ".venv" EnvManager.build_venv(venv_dir.as_posix()) venv = VirtualEnv(venv_dir, venv_dir) dest_dir = Path(tmp_dir) / "dist" dest_dir.mkdir() try: venv.run("python", "-m", "pip", "install", "--disable-pip-version-check", "--ignore-installed", *PEP517_META_BUILD_DEPS) venv.run( "python", "-", input_=PEP517_META_BUILD.format(source=path.as_posix(), dest=dest_dir.as_posix()), ) return cls.from_metadata(dest_dir) except EnvCommandError as e: # something went wrong while attempting pep517 metadata build # fallback to egg_info if setup.py available cls._log("PEP517 build failed: {}".format(e), level="debug") setup_py = path / "setup.py" if not setup_py.exists(): raise PackageInfoError(path) cwd = Path.cwd() os.chdir(path.as_posix()) try: venv.run("python", "setup.py", "egg_info") return cls.from_metadata(path) except EnvCommandError: raise PackageInfoError(path) finally: os.chdir(cwd.as_posix()) if info: cls._log( "Falling back to parsed setup.py file for {}".format(path), "debug") return info # if we reach here, everything has failed and all hope is lost raise PackageInfoError(path)
def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): poetry = Factory().create_poetry(Path(".").resolve()) builder = WheelBuilder(poetry) dist_info = Path(metadata_directory, builder.dist_info) dist_info.mkdir(parents=True, exist_ok=True) if "scripts" in poetry.local_config or "plugins" in poetry.local_config: with (dist_info / "entry_points.txt").open("w", encoding="utf-8") as f: builder._write_entry_points(f) with (dist_info / "WHEEL").open("w", encoding="utf-8") as f: builder._write_wheel_file(f) with (dist_info / "METADATA").open("w", encoding="utf-8") as f: builder._write_metadata_file(f) return dist_info.name