Pry -> REPL pour Ruby, qui en vaut la peine

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 .


Logo 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' # 'code', 'subl' 

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" # new lines between methods Pry.config.ls.heading_color = :magenta Pry.config.ls.public_method_color = :green Pry.config.ls.protected_method_color = :yellow Pry.config.ls.private_method_color = :bright_black 

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.


 # `awesome_print` gem is a great syntax colorized printing # look at `~/.aprc` for more settings for awesome_print begin require 'awesome_print' # The following line enables awesome_print for all pry output, # and it also enables paging Pry.config.print = proc {|output, value| Pry::Helpers::BaseHelpers.stagger_output("=> #{value.ai}", output)} # If you want awesome_print without automatic pagination, use the line below module AwesomePrint Formatter.prepend(Module.new do def awesome_self(object, type) return super(object, type) unless type == :string return super(object, type) unless @options[:string_limit] return super(object, type) unless object.inspect.to_s.length > @options[:string_limit] colorize(object.inspect.to_s[0..@options[:string_limit]] + "...", type) end end) end AwesomePrint.defaults = { :string_limit => 80, :indent => 2, :multiline => true } AwesomePrint.pry! rescue LoadError => err puts "gem install awesome_print # <-- highly recommended" end 

É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 # just to load necessary files $LOAD_PATH << File.dirname(File.realpath(__FILE__)) require "escaped_colors" module CodeRay module Encoders class Terminal < Encoder TERM_TOKEN_COLORS.each_pair do |key, value| TOKEN_COLORS[key] = value end end end end 

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!

Source: https://habr.com/ru/post/fr481728/


All Articles