Fabricius : Le grand projet d'une petite vie
Introduction
Pendant mes années au lycée, j'ai découvert la plateforme de communication Discord, une plateforme utile, où chaque personne ne peut créer son propre profil, et discuter avec d'autres personnes, en rejoignant une communauté.
À l'intérieur de ces communautés, il est très courant de voir qu'elles sont aidées par des robots, aussi appelés des bots.
Une des communautés sur Discord que j'ai rencontré est la communauté de Red-DiscordBot (Aussi appelé Red plus sobrement), leur but : Développer un bot Discord open-source et performant, que tout le monde peut étendre grâce à des modules. Chaque personne qui héberge leur propre instance de Red peuvent l'étendre de la manière qui l'entendent avec les modules qu'ils souhaitent.
Ainsi, une grande communauté de développeur à commencer à créer une multitude de modules pour Red, des plus petits aux plus ambitieux.
Cependant, lorsqu'un développeur avait une idée d'un module, il se retrouve généralement à refaire les premières manipulations, qui consiste à créer 3 fichiers qui ont généralement la même base :
-
Un __init__.py avec une fonction setup.
-
Un info.json avec les informations sur le module et son auteur.
-
Un fichier (avec le nom que l'on souhaite, il importe peu) qui définit les fonctionnalités du module, mais qui suit une base dans son contenu (Créer une classe, donner des informations de base, une commande, etc.).
Ainsi, moi, qui souhaitait aussi développer mes modules, n'aimait pas particulièrement créer cette base manuellement à chaque fois : je souhaitais automatiser cette tâche, et ainsi, le projet Fabricius a commencé ! Un échafaudeur de projets !
Késako ? Un échafaudeur ?
Un échafaudeur de projet, ça se résume à un principe simple : Créer la base d'un projet avec les informations donné par l'utilisateur.
En gros, on crée une base, on récupère des informations, on remplit la base avec ses informations, et on crée un nouveau projet ! Il ne reste plus qu'à en fait ce qu'on en souhaite !
Et pourquoi pas un outil existant ?
Red était codé en Python, donc les développeurs avaient l'habitude d'utiliser des outils Python comme black, isort, mypy, etc. Il était alors logique d'utiliser un outil Python aussi.
Dans la lignée des échafaudeurs de projets codés en Python, on retrouve deux outils :
CookieCutter
Copier
CookieCutter est définitivement le plus populaire, du haut de ses 20,000 étoiles sur GitHub, cependant, il y a quelques problèmes à utiliser cet outil :
Il est pauvrement maintenu
-
Il ne permet pas la validation (Ou la transformation) des données reçu par l'utilisateur
Il est peu customisable
-
L'outil crash beaucoup et n'est pas digne de confiance
-
Il oblige à suivre une forme particulière pour la base des projets
Bien que j'ai essayé cette outil, je n'ai jamais pu l'utiliser car il ne marche tout simplement... pas.
Puis viens Copier, cependant, cet outil est assez incroyable en lui-même : Il est maintenu et semble digne de confiance, en plus d'être assez customisable pour tous !
La raison pour laquelle je n'ai pas choisi cet outil est que je souhaitait me lancer un nouveau challenge : je voulais créer un nouvel outil qui puisse être comparable à CookieCutter, mais plus que ça, être un outil universel qui supporte sa propre syntaxe de base de projet, et supporter CookieCutter !
Pourquoi ? Afin de ne pas avoir à réécrire la roue ! Tout le monde ne souhaite pas forcément refaire leur base de projets, mais il serait bien plus facile de leur faire adopter un nouvel outil qui apporte les mêmes fonctionnalités ! C'est mon but.
J'avais aussi envie de prendre inspiration de l'outil de création de fichier de AdonisJS, qui, a mon sens, était plus propice et m'intéressais beaucoup plus ! Je ne voulais pas juste créer un outil, mais un outil qui lui même peut être étendu !
Pour le développement de Fabricius, j'avais décidé de quelques petits points clés à respecter. Simple, mais aussi complexes :
Être un outil qui fonctionne à 100%, donc testé.
Capable d'être étendu à l'aide de plugins.
-
Doit respecter au maximum la sécurité des utilisateurs (Empêcher du code malveillant ou involontaire).
Doit être entièrement typé.
-
Doit être résistant au futur : Facilité de rajouter des fonctionnalités, de modifier le code.
-
Respecter une structure de dossier pour aider à la programmation.
Informations technique
Fabricius a commencé son développement en juillet 2022, à ce jour, la dernière version mineure de Python était la 3.10, mais seulement quelques mois plus tard, la version 3.11 est sorti, en incluant de nouvelles fonctionnalités et un meilleur système pour le typage du language.
À ce jour, la version avec lequel Fabricius est développé est la version 3.12.0 de Python, une version avec une nouvelle syntaxe pour les objets génériques.
Fabricius est toujours un projet en cours de programmation, la majeure partie du temps qui est passé sur le projet est la conception et une réflexion sur comment le projet doit être réalisé, comment il doit être arrangé, et comment il doit fonctionner.
C'est très important de penser à ça le plus tôt possible pour que Fabricius puisse évoluer dans le futur, car Fabricius inclus une multitude de fonctionnalités :
-
Créer une interface de commande résistant à la casse (Réalisé avec click et rich et assisté par aspreno et clickloader).
-
Créer des classes pour représenter divers type d'objets : Fichier à créer, projet à créer, etc.
-
Rendre du texte avec les informations donnés par l'utilisateur (Réalisé avec jinja, chevron, str.format et string.Template).
-
Supporter un système d'extensions (Réalisé sur le concept des observateurs/écouteurs).
-
Réimplémenter le rendu des projets réalisé pour l'outil cookiecutter.
-
Être capable d'enregistrer les paramètres de l'utilisateur dans un fichier persistant (Assisté par platformdirs et pydantic).
Programmer tout ceci en un seul paquet est une énorme charge de travail, tout en voulant respecter des critères spécifiques de choix de design.
Mes ressources utiles
…mais bien sûr, dans ce genre de trajet, nous ne sommes jamais seuls ! Avec un projet aussi énorme, j'ai eu la chance de prendre appui sur des ressources très utiles que je suis heureux de partager dès que j'en ai la chance :
Refactoring Guru
Ce site est une petite perle pour n'importe qui, qui souhaite apprendre les design cruciaux de la programmation. On peut apprendre comment réarranger son code, comment l'améliorer, ou comment structurer son projet.
C'est grâce à ce site que j'ai pu apprendre plus de patterns en programmation, ou me rendre compte de ceux que j'utilisais déjà.
Programmer en Python, par Luciano Ramalho
Luciano Ramalho est un membre de la PSF (Python Software Foundation), il est donc une des personnes les plus aptes à faire connaitre les spécificités du langage Python, et c'est ce que son livre souhaite faire. Programmer en Python est une ressource très utile pour comprendre le langage, ses choix de designs (Comme les fonctions magiques), ou comment en prendre l'avantage de ses fonctionnalités les plus complexes. Une ressource nécessaire pour les programmeurs les plus aventureux !
Red-DiscordBot
La communauté à qui je dois tout.
C'est grâce à ces personnes,
animant cette petite communauté d'amis, qui m'ont aidé et poussé à
programmer et à devenir la personne que je souhaite devenir plus
tard. La communauté de Red inclus des personnes talentueuses, qui
m'ont appris à résoudre des problèmes, qui semble parfois impossible
à résoudre.
Je remercie particulièrement Jackub Kuczys (aka. Jackenmen) (Mainteneur principal de Red-DiscordBot), Danny (aka. Rapptz) (Créateur de discord.py), MAX (Contributeur), Logan Brown (aka. NeuroAssassin) (Contributeur), Thusuzzee, aikaterna, et tout les autres membres de la communauté pour leurs gentillesse et leurs connaissances.
Bon... Et bien, c'était un bon résumé de mon projet...
Je compte toujours travailler dessus pendant mon année universitaire, et achever ce que j'ai commencé. J'y compte beaucoup, c'est mon rêve de créer un outil "ultime", pour tous, un outil qui respecte une philosophie intelligente de développement.