Les IDE traditionnels possèdent généralement des outils avec une interface graphique pour déboguer. Pry, quant à lui, offre les mêmes possibilités en utilisant des lignes de commande. Pry est un REPL (Read-Eval-Print Loop) qui permet de naviguer dans le code afin d’expliquer un bogue ou de comprendre le fonctionnement interne d’une Gem. Nous allons voir comment faire dans cet article.
Pry offre énormément de possibilités, comme éditer le code ou voir la
documentation de fonctions. Pour afficher la liste des commandes disponibles,
vous pouvez exécuter la fonction help
dans Pry et il est possible d’exécuter
chaque commande avec l’argument --help
pour plus de détails.
Cet article n’a pas pour but d’expliquer le fonctionnement interne de Pry ou d’explorer toutes les commandes, mais se concentre uniquement sur la navigation.
Exemple de code
Voici un premier code d’exemple permettant de jouer avec Pry :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Affichage des variables
À l’exécution du programme, Pry s’arrête à la ligne suivant require 'pry'; binding.pry
.
1 2 3 4 |
|
La commande ls
, très similaire à celle de Linux pour explorer les fichiers et
dossiers, nous offre la possibilité d’explorer les objets que contexte dans
lequel nous nous trouvons.
1 2 3 4 |
|
Il est possible de lister uniquement les méthodes avec l’argument -m.
1 2 |
|
L’argument -i
permet de lister les variables d’instances.
1 2 |
|
-G
, correspondant à la fonction grep, permet de rechercher dans les noms. ls
-G d
permet de chercher toutes les méthodes ou les variables contenant un “d”
comme ici :
1 2 3 4 |
|
Il est possible de lister les méthodes d’une variable en la spécifiant à la
commande. Tous ces éléments peuvent être combinés. Il est donc possible de
regarder toutes les méthodes contenant “cap” dans la variable @name
.
1 2 |
|
La commande cd permet de changer le contexte afin d’explorer une variable.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Navigation dans le code
Grâce à pry-byebug, il est possible d’exécuter pas à pas un programme. Avec quelques commandes, je vais tenter de comprendre comment ActiveRecord communique avec la base de données pour lister des enregistrements. Voici un exemple de code, tiré de mon dernier article sur ActiveRecord, qui donne un point de départ à l’inspection :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
À l’exécution du programme, nous avons cet affichage :
1 2 3 4 5 6 7 8 |
|
À partir de là, il est possible de continuer l’exécution en entrant dans la méthode User#all
en utilisant la commande step
.
1 2 3 4 5 6 7 8 9 10 |
|
La méthode est maintenant affichée. Pour continuer l’exécution en restant dans
la même méthode, il est possible d’utiliser la commande next
.
1 2 3 4 5 6 7 8 9 10 |
|
Afin d’aller plus en profondeur et voir le fonctionnement interne d’ActiveRecord, j’ai tout simplement exécuté plusieurs fois la commande step
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
La navigation avec Pry nous a donc permis de comprendre qu’ActiveRecord utilise
Arel. Pour reprendre l’exécution normale du programme, il est possible
d’utiliser la commande continue
.
La commande finish
permet de continuer l’exécution jusqu’a ce qu’il y ait un changement
de fenêtre. Malheureusement, je la trouve très peu utile et elle me perd dans le
code plutôt qu’elle ne m’aide.
Toutes les commandes de navigations possèdent des alias. Il est possible de uniquement le premier caractère pour exécuter la commande et utiliser s
, n
, f
et c
.
Réafficher la position actuelle
L’affichage peut rapidement devenir chargé. Pour revoir la position actuelle du curseur, il est possible d’exécuter la commande whereami
.
Répititions des commandes
Afin de répéter la commande précédemment utilisée en appuyant sur la touche “Entrée”, il est possible d’ajouter, dans le fichier ~/.pryrc
, ce code :
1 2 3 |
|
Cet ajout va permettre de rendre beaucoup plus agréable la navigation.
Breakpoints
Pry nous offre la possibilité d’ajouter des points d’arrêts. Il est possible d’arrêter l’exécution en spécifiant un fichier et une ligne.
1
|
|
En exécutant la fonction continue
, le programme s’arrête donc à la ligne spécifiée.
1 2 3 4 5 |
|
Dans ce cas, il se peut que l’on souhaite voir le comportement de la méthode
merge
qui est appelée à la variable retournée par la méthode relation
.
Premièrement, il est nécessaire de savoir de quels classe ou module fait la
méthode merge
.
1 2 |
|
À partir de là, il est possible de placer un point d’arrêt directement sur cette méthode.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
À la prochaine exécution, pry s’arrêtera au début de l’exécution de cette méthode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Il est possible de lister les points d’arrêts définis grâce à la commande breaks
.
1 2 3 4 5 6 |
|
Il est également possible de désactiver temporairement un point d’arrêt.
1 2 3 4 5 6 |
|
On peut les désactiver tous.
1 2 3 4 5 6 |
|
De la même manière, il est possible de supprimer un ou plusieurs points d’arrêts.
1 2 3 |
|
Il est existe d’autres possibilités fournies par Pry à ce niveau, comme l’arrêt suivant des conditions. Je vous invite à consulter la documentation pour en savoir plus.
Conclusion
Pry est un outil essentiel dans le développement avec Ruby et devient plus puissant que les outils fournis par des IDE quand on sait l’utiliser de manière efficace. Dans les prochains articles, je vais utiliser ces techniques pour comprendre le fonctionnement de Rails.