REPL
REPL
dans le monde du développement à hauteur du genou signifie Lire → Évaluer → Imprimer la boucle . Lu, exécuté, imprimé et tant de fois.
Ruby, comme de nombreux autres langages, est livré avec sa propre implémentation REPL appelée irb
. Ce qui, bien qu'il fasse face à des tâches primitives, ne peut toujours pas satisfaire pleinement les exigences du développeur exigeant. Mais il existe une alternative beaucoup plus développée: le pry
.

Voici un extrait du site officiel de pry
:
Pry est une alternative puissante au wrapper Ruby IRB standard. Avec mise en évidence de la syntaxe , une architecture de plug-in flexible , des appels d' exécution et l'affichage de la source et de la documentation .
Et ce n'est pas seulement de la publicité bla bla bla. C'est vrai. Je vais montrer comment installer et configurer le pry
avec toutes les cloches et les sifflets pour satisfaire le développeur le plus sophistiqué. Il est supposé que la version de travail actuelle de Ruby est installée et fonctionne sur la machine cible.
La préparation
Accédez à la console et exécutez la commande:
$ gem install pry pry-theme awesome_print coderay
Tout, nous sommes complètement prêts. pry
... et assurez-vous qu'il n'y a pas de différence par rapport à irb
. Du coup pas très sympa.
Eh bien, pry
ĂŞtre un peu plus intelligent.
Fichier de configuration
C'est .pryrc
. Il existe déjà un fichier de configuration dans le répertoire personnel qui indique à pry
comment regarder et comment se comporter dans une société décente. Sinon, vous pouvez le créer avec la commande cd && touch .pryrc
.
.pryrc
remplissage délicat .pryrc
Je vais vous montrer pas à pas les différentes fonctionnalités du pry
. Pour les impatients: l' gist .pryrc
.
Éditeur par défaut
Pry.editor = 'vi'
Configure l'éditeur qui sera utilisé pour éditer le contexte actuel (commande d' edit
).
Invite de commande
Pry.config.prompt = [ ->(_obj, _nest_level, _) { "✎ " }, ->(*) { " " } ]
.pryrc
est juste un fichier .pryrc
, donc ce processus peut exécuter n'importe quel code que vous voulez, ou même extraire des bitcoins pendant que vous attendez l'invite suivante.
Le premier niveau et les niveaux imbriqués (à l'intérieur des blocs) peuvent être dessinés de différentes manières. Auparavant, j'utilisais un triangle ombré noir, qui coupe un analyseur muet pour le premier niveau et ▷ pour les imbriqués, mais est progressivement parvenu à la conclusion que l'absence de caractères étrangers à l'intérieur de l'extrait de code facilite la copie du fragment n'importe où. Donc donc.
Les couleurs
Pour prendre en charge les thèmes, une gemme de pry-theme
est utilisée. J'utilise la coloration syntaxique (et quand je m'ennuie, je lance PRY_BW=true pry
). Pour les dossiers exécutant Rails (contenant des projets Rails ), les couleurs peuvent être encore plus fantaisistes, mais je déteste Rails , et donc ce qui se passe là -bas, je ne peux pas le dire avec certitude.
unless ENV['PRY_BW'] Pry.color = true Pry.config.theme = "railscasts" Pry.config.prompt = PryRails::RAILS_PROMPT if defined?(PryRails::RAILS_PROMPT) Pry.config.prompt ||= Pry.prompt end
L'histoire
C'est juste une trouvaille. En mode débogage, ou si la commande a été exécutée juste avant, appuyez simplement sur ⏎ et elle sera répétée. Il est extrêmement utile pour passer au code dans le débogueur (si vous utilisez bien sûr le débogueur et ne corrigez pas toutes les erreurs avec un aspect fixe, sans jamais lancer le débogueur comme moi, par exemple).
Pry.config.history.should_save = true Pry::Commands.command /^$/, "repeat last command" do _pry_.run_command Pry.history.to_a.last end
Équipes
Débogueur Le vélo n'est pas le mien, je viens d'emprunter ces cinq lignes à mon coéquipier, qui passe toute sa vie en débogage, mais, disent-ils, ça marche.
Pry.commands.alias_command 'c', 'continue' rescue nil Pry.commands.alias_command 's', 'step' rescue nil Pry.commands.alias_command 'n', 'next' rescue nil Pry.commands.alias_command 'f', 'finish' rescue nil Pry.commands.alias_command 'l', 'whereami' rescue nil
Module / Classe Description Configuration
Pry.config.ls.separator = "\n"
Il semble qu'il n'y ait rien Ă commenter.
Appeler les utilitaires du système
Pry
prend en charge les utilitaires système d'appel (il suffit d'ajouter un point avant le nom de la commande sans espace, .ls
ou .ps axu
).
Plugins
Voici l'exemple le plus simple de configuration de plugin. Personne n'aime les configurations gonflées, nous les polissons et les transportons pendant des décennies avec différentes machines. L'extrait ci-dessous n'est qu'un exemple (pour le plugin awesome
). Les commentaires dans le code parlent d'eux-mĂŞmes.
Équipes personnalisées
Ai-je mentionné que pry
REPL très cool? Nous pouvons même définir notre propre ensemble de commandes à utiliser dans pry
. L'exemple ci-dessous montre comment créer une commande sql
pour exécuter du SQL pur à partir de la console (à condition que nous ayons une connexion AR fonctionnelle) - avec un nombre minimum de frappes.
default_command_set = Pry::CommandSet.new do command "sql", "Send sql over AR." do |query| if ENV['RAILS_ENV'] || defined?(Rails) pp ActiveRecord::Base.connection.select_all(query) else pp "No rails env defined" end end end Pry.config.commands.import default_command_set
Monkeypatches et Globals
Oui, nous pouvons personnaliser et exécuter n'importe quel code Ruby avec nos propres monkeypatches, qui ne seront disponibles que dans les sessions de pry
. Par exemple, je trouve ce code très pratique pour tester du code qui fonctionne avec des tableaux et des hachages.
class Array def self.sample(count = 10, &block) Array.new(count, &(block || :succ)) end end Hash.singleton_class.prepend(Module.new def sample(count = 10) (?a...count.times.reduce(?a) { |o| o.succ }). map(&:to_sym).zip(0...count).to_h end end)
Remarque: si vous pensez que l'extrait ci-dessus est trop compliqué par ce Integer#succ
, vous n'avez probablement jamais traité de longs hachages avec plus de 26 touches :)
Réglage des couleurs
Tout ce qui suit est pour ajuster les couleurs en utilisant gem coderay
. Le résultat en vaut la peine. Les symboles sont rouges, les chiffres sont bleus et tout ce jazz.
CodeRay.scan("example", :ruby).term
En conclusion
J'espère que ce post donne une première impression de ce qu'est le pry
et pourquoi il est meilleur irb
. Je ne me suis pas particulièrement concentré sur le processus de débogage, principalement parce que je ne débogue pas, mais que j'écris le code correct à partir de zéro. Mais j'espère que je pourrais intéresser ceux qui voient cette combinaison de lettres - faire pry
- pour la première fois - au moins essayer. Croyez-moi, ça vaut le coup.
Bonnes répliques!