From c1684f6125ec9a2fd2ad31fcdc642074eaff6a2b Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 17 Feb 2025 08:54:19 +0100 Subject: [PATCH] Generate a pip dependency summary file CURA-12400 So that we can use easily afterwards to gather some extra data about the packages (e.g. licences and sources) --- extensions/generators/VirtualPythonEnv.py | 25 ++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/extensions/generators/VirtualPythonEnv.py b/extensions/generators/VirtualPythonEnv.py index 612f8b9..ffe9cdb 100644 --- a/extensions/generators/VirtualPythonEnv.py +++ b/extensions/generators/VirtualPythonEnv.py @@ -1,5 +1,6 @@ import os import sys +import yaml from io import StringIO from shutil import which from pathlib import Path @@ -70,9 +71,13 @@ class VirtualPythonEnv: subprocess.run([py_interp_venv, "-m", "pip", "install", "--upgrade", "pip"], check=True) subprocess.run([py_interp_venv, "-m", "pip", "install", "wheel", "setuptools"], check=True) - requirements_core = self._make_pip_requirements_files("core") - requirements_dev = self._make_pip_requirements_files("dev") - requirements_installer = self._make_pip_requirements_files("installer") + requirements_summary = {} + + requirements_core = self._make_pip_requirements_files("core", requirements_summary) + requirements_dev = self._make_pip_requirements_files("dev", requirements_summary) + requirements_installer = self._make_pip_requirements_files("installer", requirements_summary) + + self._export_requirements_summary(requirements_summary) self._install_pip_requirements(requirements_core, env_vars, py_interp_venv) @@ -83,6 +88,11 @@ class VirtualPythonEnv: check_type=bool): self._install_pip_requirements(requirements_installer, env_vars, py_interp_venv) + def _export_requirements_summary(self, requirements_summary): + file_path = os.path.abspath("pip_requirements_summary.yml") + self.conanfile.output.info(f"Generating pip requirements summary at '{file_path}'") + save(self.conanfile, file_path, yaml.dump(requirements_summary, default_flow_style=False)) + def _install_pip_requirements(self, files_paths, env_vars, py_interp_venv): with env_vars.apply(): for file_path in files_paths: @@ -90,13 +100,13 @@ class VirtualPythonEnv: subprocess.run([py_interp_venv, "-m", "pip", "install", "-r", file_path], check=True) - def _make_pip_requirements_files(self, suffix): + def _make_pip_requirements_files(self, suffix, requirements_summary): actual_os = str(self.conanfile.settings.os) - pip_requirements = VirtualPythonEnv._populate_pip_requirements(self.conanfile, suffix, actual_os) + pip_requirements = VirtualPythonEnv._populate_pip_requirements(self.conanfile, suffix, actual_os, requirements_summary) for _, dependency in reversed(self.conanfile.dependencies.host.items()): - pip_requirements |= VirtualPythonEnv._populate_pip_requirements(dependency, suffix, actual_os) + pip_requirements |= VirtualPythonEnv._populate_pip_requirements(dependency, suffix, actual_os, requirements_summary) # We need to make separate files because pip accepts either files containing hashes for all or none of the packages requirements_basic_txt = [] @@ -137,7 +147,7 @@ class VirtualPythonEnv: @staticmethod - def _populate_pip_requirements(conanfile, suffix, actual_os): + def _populate_pip_requirements(conanfile, suffix, actual_os, requirements_summary): pip_requirements = {} data_key = f"pip_requirements_{suffix}" @@ -156,5 +166,6 @@ class VirtualPythonEnv: if (actual_package_version is None or (actual_package_version is not None and new_package_version is not None and new_package_version > actual_package_version)): pip_requirements[package_name] = package_desc + requirements_summary[package_name] = str(new_package_version) if new_package_version is not None else None return pip_requirements