Re-découvrons le langage Go avec "pullpigo", un petit projet d'expérimentation
Développant au quotidien en Java, j'avais envie d'apprendre quelques rudiments du langage de programmation Go. Pour ce faire, j'ai implémenté un petit outil en ligne de commande (CLI) afin d'afficher des informations sur les pull requests GitHub. J'ai créé ainsi un petit projet, versionné dans GitHub, pullpigo. Son but est d'afficher le nombre d'événements du type "tant d'événements créés par tel auteur GitHub (commiter)" en utilisant une API publique de GitHub.
Notez que j'ai déjà implémenté un outil similaire dans d'autres langages (que je voulais aussi découvrir ou approfondir) : en Clojure (cf. hubstats), Kotlin (cf. pullpitoK) et Rust (cf. pullpito).
Les exécutables natifs sont rapides 🚀
Compilons pullpigo :
$ go clean
$ time go build
go build 1.05s user 0.58s system 105% cpu 1.559 total
Puis lançons le :
time ./pullpigo -repo=vidal-community/atom-jaxb
GitHub repository 'vidal-community/atom-jaxb'
2 events created by amairi
1 events created by fchetouani
6 events created by AElMehdiVidal
3 events created by jcgay
./pullpigo -repo=vidal-community/atom-jaxb 0.07s user 0.03s system 20% cpu 0.482 total
Comparons ces temps avec ceux d'un projet similaire implémenté en Kotlin, (pullpitoK) :
$ ./gradlew clean
$ time ./gradlew build --quiet
./gradlew build --quiet 1.37s user 0.17s system 39% cpu 3.932 total
$ time ./gradlew run --quiet --args "vidal-community/atom-jaxb"
pull requests for "vidal-community/atom-jaxb" ->
opened per author
amairi: 1
commented per author
AElMehdiVidal: 1
jcgay: 1
closed per author
./gradlew run --quiet --args "vidal-community/atom-jaxb" 1.37s user 0.18s system 62% cpu 2.473 total
Compilation rapide + exécution rapide = ❤️
Les librairies et l'outillage standards de Go sont complets 📦
Pour appeler l'API REST v3 'events' de GitHub, j'avais besoin de : un client HTTP, un parser JSON ainsi qu'un framework de test. C'est cool, tout est présent dans les librairies de base : testing, HTTP client et JSON parsing.
J'ai donc pu implémenter mon outil sans utiliser une seule librairie tierce !
J'ai également apprécié l'outillage (notez mon background Java) :
-
pour formatter le code, il sufffit de lancer la commande
go fmt
, sans aucune configuration. -
pour analyser statiquement son code, un code linter est également inclus. Il suffit d'installer https://github.com/golang/linttype et de lancer la commande
golint
, sans configuration (pour être franc, ce linter ne m'a pas aidé pour coder pullpigo mais je trouve ça génial que cet outil existe).
Opportunités "annexes" 😎
En dehors du langage et des libraries, ce petit projet a aussi été l'occasion d'essayer et d'apprendre de nouveaux outils. En l’occurrence :
-
Visual Studio Code, un environnement de développement (Integrated Development Environment) que je n'utilise pas professionnellement.
-
GitHub Actions, une plate-forme pour l'intégration continue : chaque commit git GitHub déclenche la compilation et les tests unitaires. Bien que je n'avais jamaais utilisé GitHub Actions, ça a été rapide à mettre en place (quelques minutes). En en plus, c'est gratuit !
Un autre point bonus, j'ai apprécié de discuter et d'échanger avec des gens que je connais (et pas uniquement de "googler").
Dans mon cas, mes "amis Golang" ont été :
-
Jean-Christophe qui m'a motivé et m'a aidé à corriger un problème de parsing JSON. 😅
-
Florent qui m'a donné des pointeurs sympas vers des librairies : testing/quick pour le property-based testing, ginkgo pour les test style BDD et gomega pour les assertions de test. A essayer ! 😎
La suite ? 🔮
Quelques pistes :
-
Améliorer les messages en sortie. Par exemple, afficher les compteurs par type d'événements ("pull requests créés", "pull requests fusionnées" etc.)
-
Récupérer les données de l'API
GraphQL
de GitHub (GitHub's GraphQL API v4) de façon à ne pas être limité aux 300 derniers événements (c'est une limitation de l'API GitHub REST). -
Utiliser des dépendances pour les tests (assertions plus faciles, property-based testing etc.) et en profiter pour découvrir la gestion des dépendances en Go.
A suivre !