Améliorer son code Ruby avec reek

En cherchant des outils pour Ruby sur ruby-toolbox.com, je suis tombé sur reek.
Reek est un programme écrit par Kevin Rutherford dont le rôle est de détecter les code smells. Exactement le genre d’outil que je cherchais. Voici donc un aperçu de reek.

Installation

De manière classique, l’installation se passe avec gem ; les dépendances sont installées automatiquement.

 gem install reek

Si vous voulez le code, les derniers développement, le projet est sur GitHub:

Test de reek

Le wiki du projet ne mentionne pas (encore) la version 1.9.2 de ruby dans sa liste de compatibilité, mais je n’ai rencontré aucun problème en utilisant cette version.

À la racine de mon projet, je lance reek sur le dossier contenant les sources ruby (lib/) ainsi:

 reek lib

Et voici un bout de la sortie dans la console :

 lib/yabu/message.rb -- 0 warnings
 lib/yabu/options.rb -- 2 warnings:
   Options#initialize contains iterators nested 2 deep (NestedIterators)
   Options#initialize has the variable name 'e' (UncommunicativeName)
 lib/yabu/recovery.rb -- 3 warnings:
   Yabu::Recovery#find_newest_backup refers to backups more than self (LowCohesion)
   Yabu::Recovery#get_all_backups refers to file more than self (LowCohesion)
   Yabu::Recovery#restore has approx 8 statements (LongMethod)
 lib/yabu/yabu-config.rb -- 0 warnings

Voyez le wiki pour connaître la liste des code smells detectés par reek.
Vous pouvez constatez que la sortie console est assez pénible à lire. Je pense que cela ne pose pas trop de souci quand on utilise reek au quotidien, puisqu’on est censé réparer les problèmes qu’il rapporte. Toutefois, lorsqu’on l’utilise pour la première fois sur un projet déjà bien avancé, c’est assez fatiguant.
J’ai écrit un petit script sed pour « aérer » un peu cette sortie. Voici le script, que j’ai nommé reek.sed et placé à la racine du projet:

 #! /bin/sed -f
 /warning/a\

 /warning/i\

Combiné à l’option --quiet de reek:

 reek --quiet lib | ./reek.sed

la sortie est un peu plus lisible:

 lib/yabu/options.rb -- 2 warnings: 

   Options#initialize contains iterators nested 2 deep (NestedIterators)
   Options#initialize has the variable name 'e' (UncommunicativeName)

 lib/yabu/recovery.rb -- 3 warnings:

   Yabu::Recovery#find_newest_backup refers to backups more than self (LowCohesion)
   Yabu::Recovery#get_all_backups refers to file more than self (LowCohesion)
   Yabu::Recovery#restore has approx 8 statements (LongMethod)

Configurer reek

Le fichier de configuration de reek se trouve dans son dossier config/ et est nommé defaults.reek. Il est au format yaml et assez simple à lire. Voici par exemple la section sur le code smell LongMethod :

 LongMethod: 
   max_statements: 5
   exclude: 
   - initialize
   enabled: true

On comprend facilement qu’une méthode est considérée comme trop longue (max_statements) au dessus de 5 lignes (ce qui en surprendra certain(e)), que reek ne prend pas en compte les constructeurs (- initialize) pour ce code smell et que ce code smell est activé (enabled: true).

Pas besoin de changer la configuration par défaut, reek s’adapte à vos projets. Si vous estimez que 10 lignes maximum par méthode c’est mieux, il vous suffit de placer le fichier suivant à la racine de votre projet, en lui donnant une extension .reek:

 LongMethod: 
   max_statements: 10

Vous pouvez tout configurer ainsi.

Publicités

, ,

  1. Poster un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :