Browse Source

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)
pull/24/head
Erwan MATHIEU 1 year ago
parent
commit
c1684f6125
  1. 25
      extensions/generators/VirtualPythonEnv.py

25
extensions/generators/VirtualPythonEnv.py

@ -1,5 +1,6 @@
import os import os
import sys import sys
import yaml
from io import StringIO from io import StringIO
from shutil import which from shutil import which
from pathlib import Path 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", "--upgrade", "pip"], check=True)
subprocess.run([py_interp_venv, "-m", "pip", "install", "wheel", "setuptools"], check=True) subprocess.run([py_interp_venv, "-m", "pip", "install", "wheel", "setuptools"], check=True)
requirements_core = self._make_pip_requirements_files("core") requirements_summary = {}
requirements_dev = self._make_pip_requirements_files("dev")
requirements_installer = self._make_pip_requirements_files("installer") 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) self._install_pip_requirements(requirements_core, env_vars, py_interp_venv)
@ -83,6 +88,11 @@ class VirtualPythonEnv:
check_type=bool): check_type=bool):
self._install_pip_requirements(requirements_installer, env_vars, py_interp_venv) 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): def _install_pip_requirements(self, files_paths, env_vars, py_interp_venv):
with env_vars.apply(): with env_vars.apply():
for file_path in files_paths: 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) 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) 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()): 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 # We need to make separate files because pip accepts either files containing hashes for all or none of the packages
requirements_basic_txt = [] requirements_basic_txt = []
@ -137,7 +147,7 @@ class VirtualPythonEnv:
@staticmethod @staticmethod
def _populate_pip_requirements(conanfile, suffix, actual_os): def _populate_pip_requirements(conanfile, suffix, actual_os, requirements_summary):
pip_requirements = {} pip_requirements = {}
data_key = f"pip_requirements_{suffix}" data_key = f"pip_requirements_{suffix}"
@ -156,5 +166,6 @@ class VirtualPythonEnv:
if (actual_package_version is None or 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)): (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 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 return pip_requirements

Loading…
Cancel
Save