Diagnostics : module pypkgs (mode paquetage)

Le module pypkgs.py de buildez.sys inclue des primitives permettant de tester un paquetage donné pour récolter les informations liés à son installation. Des méthodes basées sur importlib, pip, conda ou mamba, sont utilisables. Chaque approche apporte des données dont une partie peut être différente, par exemple seules les méthodes conda et mamba nous permettent d’accéder au build d’un paquetage. Importlib est une bibliothèque de Python et s’utilise directement, mais pour utiliser pip, conda, mamba, il faut mettre en place un appel externe via un sous-processus, avec éventuellement un échange de données en Json. Une approche simple, mais qui doit être précise en termes de programmation. Dans cette note, seules les fonctions de pypkgs à destination d’un paquetage donné (unique) seront décrites, une autre note abordant les primitives liées à des listes de paquetages.

1. Prérequis

Pour que le module fonctionne, il faut instancier un dictionnaire qui sera utilisé par toutes les fonctions, de manière à partager le recueil d’informations. Il faut également mettre en place une fonction de score, qui va augmenter la valeur d’un score au fur et à mesure de l’ajout d’informations.

Initialisation du dictionnaire commun

Chaque méthode (importlib, pip, conda …) va mettre à jour les champs du dictionnaire pdict en fonction des informations qu’elle nous amène (pour un paquetage donné). Le dictionnaire est initialisé par la fonction pypkgs_init_pdict :

Toutes les méthodes nous renverront le nom du paquetage, mais importlib n’a pas toujours accès à la version, pip n’a pas accès au build … nous allons utiliser les différentes fonctions (pypkgs_init_pdict), pypkgs_importlib, pypkgs_pkg_pip, pypkgs_pkg_conda_json, pypkgs_pkg_conda_json … comme une fusée à plusieurs étages, chaque méthode complétant les champs de pdict. L’avantage c’est d’avoir quelque chose de robuste, mais l’inconvénient c’est que plus nous utiliserons d’étages, plus le processus prendra du temps.

La fonction de score

Elle sert à renseigner le champ pdict[score] en utilisant un tableau de bits, avec un bit par méthode. Si le résultat de la méthode est satisfaisant (nous avons récolté des données) le bit correspondant passe de 0 à 1. 

Nous notons que les bits meta et files ne correspondent pas vraiment à une méthode (cf. pip). Ces éléments sont des options de importlib, on peut activer cette méthode à plusieurs niveaux de précision.

Actuellement les 6 premiers bits sont utilisés, ce qui laisse un peu de marge. Une fois que la table est mise à jour, une valeur numérique (entier) est calculée (0 à 255). la fonction pypkgs_scoring est complétée par une fonction pypkgs_scoring_explain qui renvoie la valeur du score en affichant les contributions de chaque méthode.

Retour en haut