emacs et coala

DIY
temps de lecture ~13 min
  1. 1. Installation
  2. 2. Configuration Emacs
  3. 3. Configuration coala
  4. 4. Utilisation
  5. 5. Exemple en python
  6. 6. Conclusion

Si comme moi vous avez quelques années de développement derrière vous et qu’emacs est votre environnement de développement de coeur (si si, c’est possible), vous ne pouvez passer à côté de l’intégration de coala et flycheck pour effectuer du test continu pendant l’écriture de vos codes.

  • coala est un framework de test de source orienté contrôle de syntaxe (lint & fix). Disponible en ligne de commande et donc intégrable dans votre système d'intégration continue, il est également possible de le coupler avec certains environnements de développement dont emacs (mais aussi atom, sublime, vim, vs code).
  • flycheck est un module d'intégration de qualité dans emacs permettant de faire de l'analyse en continu, remplaçant de flymake. flycheck supporte la majorité des langages de programmation, exécute les analyses à la volée et rend visuelle l'interprétation des résultats directement dans le buffer de saisie du code.

Installation

L’installation de coala pour emacs nécessite un peu de travail préparatoire :

  • installer coala : l’outil étant en python3, il s’installe avec pip3
  • installer le plugin coala pour emacs : dans votre .emacs.d déposer le clone du repo coala-emacs depuis git
  • installer flycheck, documentation disponible sur le site de flycheck, via MELPA et une commande dans emacs qui déposera les modules nécessaires dans votre .emacs.d
  • un peu de configuration emacs pour démarrer
  • de la configuration de coala dans le répertoire de votre projet afin de spécifier les modules utilisés et éventuellement leurs options

Configuration Emacs

Dans mon .emacs (cf le contenu de votre variable emacs user-init-file), j’ai ajouté :

MELPA
1
2
3
4
(require 'package)
(add-to-list 'package-archives
'("MELPA Stable" . "https://stable.melpa.org/packages/") t)
(package-initialize)

le chargement de coala pour flycheck dans emacs :

coala for flycheck
1
(load-file "~/.emacs.d/coala-emacs/flycheck-coala.el")

puis le chargement de flycheck :

flycheck
1
(add-hook 'after-init-hook #'global-flycheck-mode)

puis la désactivation de quelques tests proposés par défaut, ici sur javascript, et python je vous le laisse pour exemple, car par très bien documenté par ailleurs :

flycheck disable some modules
1
2
3
4
5
(setq-default flycheck-disabled-checkers '(javascript-jshint
javascript-eslint
javascript-jscs
python-flake8
python-pylint))

Configuration coala

En ouvrant un fichier reconnu par flycheck (ici un pyhton), on peut tester la bonne installation de l’ensemble (un redémarrage préalable de votre emacs est nécessaire, ou l’évaluation des nouvelles lignes dans votre .emacs).

Si l’installation est correcte, apparaîtra à côté du type de langage de votre buffer une information de type FlyC, avec un suffixe positionné à * si l’analyse est en cours ou des valeurs numériques avec les métriques de qualité.

En utilisant C-c ! v, vous obtiendrez la configuration d’analyse de votre flycheck avec chacun des modules installé et utilisé.

coala nécessite désormais d’être paramétré, via un fichier .coafile dans le répertoire source ou son parent. Par exemple :

.coafile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[all]
enabled = True
[PEP8]
bears = PEP8Bear
[lint]
bears = PyLintBear
[flake]
bears = PyFlakesBear
enabled = false
[style]
bears = PyDocStyleBear
enabled = false
[Bandit]
bears = BanditBear

Le principe de fonctionnement se base sur des modules activés et paramétrés pour chaque type de test, la documentation sur le site de coala est assez complète pour chaque module, en revanche des outils tiers sont nécessaires au bon fonctionnement de certains bears.

Utilisation

L’utilisation de flycheck est suimple, quelques raccourcis sont à connaitre pour aller vite et profiter de l’analyse pour corriger à la volée les indications :

  • C-c ! v : donne la liste des modules flycheck activés
  • C-c ! l : ouvre un second buffer avec la liste des anomalies, la sélection de l’une d’entre elle pointe directement la section du source incriminé
  • C-c ! [n|p] : erreur suivante ou précédente, pour rester dans le buffer
  • C-c ! C : supprime toutes les marques du buffer, histoire de voir clair
  • C-c ! c : force la validation du buffer

Exemple en python

La démonstration ci-dessous est volontairement triviale, je vous laisse appliquer ceci sur vos codes sources afin de voir le fonctionnement plus fin et surtout dans la vraie vie.

test.py
1
print("Hello, World!")

Donne comme indication

résultat coala
1
C0111 - Missing module docstring

Ajoutons du code issu de forum :

test.py
1
2
3
4
5
6
7
8
9
""" un peu de doc en plus"""
print("Goodbye, World!")
a = 10
if ( a > 10 ) :
print "a est superieur a 10"
else :
print "a est inferieur a 10"

nous donne :

analyse FlyC:1/1
1
2
6 warning The code does not comply to PEP8. (coala)
7 error E0001 - Missing parentheses in call to 'print' (<string>, line 7) (coala)
  • ligne 6 : PEP8 nous conseille de supprimer les espaces inutiles
  • ligne 7 : quelques parenthèses seraient les bienvenues dans le print (python 3)
    la correction donne donc :
test.py
1
2
3
4
5
6
7
8
9
""" un peu de doc en plus"""
print("Goodbye, World!")
a = 10
if (a > 10):
print("a est superieur a 10")
else:
print("a est inferieur a 10")

nous donne :

analyse FlyC:1/0
1
8 error E0001 - invalid syntax (<string>, line 8) (coala)
  • effectivement, ligne 8, soucis d’indentation

et hop :

test.py
1
2
3
4
5
6
7
8
9
""" un peu de doc en plus"""
print("Goodbye, World!")
a = 10
if (a > 10):
print("a est superieur a 10")
else:
print("a est inferieur a 10")

Conclusion

Avec un peu de configuration, on peut même intégrer des outils modernes d’analyse de code à une solution d’édition de code assez ancienne, mais dont la communauté de passionnés est suffisamment importante pour en assurer la continuité.

Si vous n’utilisez pas emacs et que vous êtes arrivés jusqu’ici dans ce post 😉, retenez néanmoins que les outils sont disponibles en ligne de commande et peuvent (doivent) être intégrés à votre chaîne d’intégration continue afin de garantir un minimum de qualité au code que vous produisez.

Photo Markus Spiske

Alexandre Chauvin Hameau

2017-09-02T14:04:21