Contribuer à une librairie Python
Principes
- Faire un dossier (ex :
source
)
- Dans
source
, cloner la librairie à laquelle on veut contribuer via
git clone [repo concerné]
- Faire un dossier pour l’environnement
pip
(ex : pip_env_lib
)
- Dans
pip_env_lib
, installer l’environnement pip via pipenv install
- Dans
pip_env_lib
, lancer le « shell pip » via pip shell
- Rarement documenté et important :
– aller dans le dossier source
– faire pip install -e .
pip install -e .
(n’oubliez pas le .
qui change tout, cela indique le répertoire à utiliser) signifie « si jamais le shell Python en cours essaie d’accéder à la librairie à laquelle on veut contribuer, aller la chercher dans source
». En fait, concrètement parlant, pip
fait simplement un lien symbolique entre le dossier source d’installation de pip
(ici c’est pip_env_lib
), et le dossier source
. N’oubliez pas que cela ne concerne le shell Python en cours (ici pip_env_lib
).
L’avantage pratique de ce « lien symbolique », c’est qu’il est directement relié au code source. Donc, lorsqu’on modifie le code source de la librairie elle-même (dossier source
), elle est immédiatement disponible. Si on fait donc des fichiers de tests unitaires, il suffit de les relancer, les modifications du code source sont toujours instantanément prises en compte. Toujours dans le shell Python en cours (ici pip_env_lib
).
Résumé : exemple de code
mkdir [source]
cd [source]
git clone [repo concerné]
cd ..
mkdir [pip_env]
cd [pip_env]
pipenv --python 3 install
pip shell
pip install -e .
.. et les modifications dans [source]
peuvent commencer !
PyPI : nouveau package / contribution
La documentation détaillée en anglais se trouve ici.
Bien meilleure que ce qui suit, mais longue, longue…
Voici les notes prises à la volées, d’un contributeur plutôt habitué à faire des contributions dans le monde Python.
Toute nouvelle note / correction éventuelle est la bienvenue.
Il y a trois choses différentes qu’on a tendance à confondre, mais qui n’ont fondamentalement aucun rapport. On a tendance à les confondre parce qu’on essaie d’utiliser, pour des raisons pratiques, le même nom, mais dans trois cadres différents.
Ces trois choses à bien dissocier sont :
– le nom du package PyPI : dans le fichier de déploiement setup.py
, il est défini dans le paramètre « name
» de la commande setup()
. C’est ce qui est vu dans PyPI
.
– le nom du projet qu’on met dans github : c’est le répertoire qui contient tous les fichiers du projet (= il peut être totalement différent, en général on s’arrange pour les appeler d’un nom différent) = c’est ce qu’on clone dans l’ordre git clone [repo concerné]
– le développeur final qui fait un « import
» dans son code : ce module là peut être aussi différent, car c’est du Python. En général, c’est le répertoire de premier niveau du package (il doit contenir, bien sûr, « __init__.py
» pour être vu comme un package et importable par Python). En général : « from [ma lib] import [quelque chose]
« .
En général, on essaie de s’arranger pour que le nom du package sur PyPI
soit le même que le nom du package dans le code Python même.
Mais s’il est déjà pris (dans un des trois contextes), il faut forcément utiliser un autre nom, et c’est là qu’il faut faire attention à ne pas se mélanger les pinceaux.
Pour faire un nouveau package sur PyPI
le plus homogène possible :
- essayer de faire un projet « vide »
- faites une version squelette « alpha1 »
- faites une mise à jour sur
PyPI
: si ça fonctionne, alors vous pouvez continuer. Sinon, il faut utiliser un autre nom
Versionning
Dans PyPI
, les versions sont obligatoirement du type «a.b.c
».
En général :
[a].[b].[c]
[a] = fonctionnalités totalement nouvelles / incompatibilité
[b] = améliorations / nouvelles "petites" fonctionnalités
[c] = correctifs bogues
setup.py
Lorsque vous faites une nouvelle contribution, vous devez obligatoirement fournir un fichier setup.py
.
Dans ce fichier, setup.py
, il y a une fonction, ici aussi, obligatoire : setup()
.
Cette fonction, parmi tous les paramètres, a un paramètre particulier : classifiers
qui permet au niveau de PyPI
de dire « ce package est rangé dans telle(s) catégorie(s) ». La liste des expressions disponibles se trouve ici.