Pry -> REPL für Ruby, das ist es wert

REPL


REPL in der Welt der kniehohen Entwicklung steht für Read → Evaluate → Print Loop . Gelesen, ausgeführt, gedruckt und so oft.


Ruby wird, wie viele andere Sprachen auch, mit einer eigenen REPL- Implementierung namens irb . Was, obwohl es primitive Aufgaben bewältigt, die Anforderungen des anspruchsvollen Entwicklers noch nicht voll erfüllen kann. Aber es gibt eine viel weiterentwickelte Alternative: pry .


Pry-Logo


Hier ist ein Auszug aus der offiziellen pry Website:


Pry ist eine leistungsstarke Alternative zum Standard-Ruby-IRB-Wrapper. Mit Syntax-Hervorhebung , flexibler Plugin-Architektur , Laufzeitaufrufen sowie Anzeige von Quelle und Dokumentation .

Und das ist nicht nur bla bla bla Werbung. Es stimmt. Ich werde zeigen, wie man pry installiert und konfiguriert, um den anspruchsvollsten Entwickler zufrieden zu stellen. Es wird davon ausgegangen, dass die aktuelle Arbeitsversion von Ruby auf dem Zielcomputer installiert ist und ausgeführt wird.


Vorbereitung


Gehen Sie zur Konsole und führen Sie den Befehl aus:


 $ gem install pry pry-theme awesome_print coderay 

Alles, wir sind komplett fertig. Lass uns pry ... und sicherstellen, dass es keinen Unterschied zu irb . Plötzlich nicht mehr sehr nett.


Dann lass uns pry ein bisschen schlauer zu sein.


Konfigurationsdatei


Das ist .pryrc . Es gibt bereits eine Konfigurationsdatei im Home-Verzeichnis, die pry darüber gibt, wie man in einer anständigen Gesellschaft aussieht und wie man sich verhält. Wenn nicht, können Sie es mit dem cd && touch .pryrc .


.pryrc Anweisungen zum Befüllen


Ich werde die verschiedenen Funktionen von pry Schritt für Schritt demonstrieren. Für die Ungeduldigen: gist .pryrc .


  • pry : Hier finden Sie jede Menge nützliche Informationen für erfahrene Stemmeisen.
  • Themen pry : Fragen, Antworten usw.

Standardeditor


 Pry.editor = 'vi' # 'code', 'subl' 

Konfiguriert den Editor, der zum Bearbeiten des aktuellen Kontexts verwendet wird ( edit ).


Eingabeaufforderung


 Pry.config.prompt = [ ->(_obj, _nest_level, _) { "✎ " }, ->(*) { " " } ] 

.pryrc ist nur eine .pryrc Datei, daher kann dieser Prozess jeden gewünschten Code ausführen oder sogar Bitcoins abbauen, während Sie auf die nächste Eingabeaufforderung warten.


Die erste Ebene und die verschachtelten Ebenen (innerhalb von Blöcken) können auf verschiedene Arten gezeichnet werden. Früher habe ich ein schwarz schattiertes Dreieck verwendet, das einen dummen Parser für die erste Ebene und ▷ für verschachtelte Parser ausschneidet. Nach und nach kam ich zu dem Schluss, dass das Fehlen von zusätzlichen Zeichen im Snippet das Kopieren des Fragments erheblich erleichtert. Deshalb so.


Farben


Um Themen zu unterstützen, wird pry-theme Gem verwendet. Ich benutze Syntax- PRY_BW=true pry (und wenn ich gelangweilt bin, PRY_BW=true pry ich PRY_BW=true pry ). Bei Ordnern, in denen Rails ausgeführt wird (mit Rails- Projekten), sind die Farben möglicherweise noch ausgefallener, aber ich hasse Rails . Was dort passiert, kann ich nicht mit Sicherheit sagen.


 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 

Die Geschichte


Dies ist nur eine Entdeckung. Drücken Sie im Debug-Modus oder wenn der Befehl unmittelbar zuvor ausgeführt wurde, einfach ⏎, und der Befehl wird wiederholt. Dies ist äußerst nützlich, wenn Sie zum Code im Debugger wechseln möchten (wenn Sie den Debugger natürlich überhaupt verwenden und nicht alle Fehler mit einem festen Aussehen beheben, den Debugger beispielsweise niemals wie mich starten).


 Pry.config.history.should_save = true Pry::Commands.command /^$/, "repeat last command" do _pry_.run_command Pry.history.to_a.last end 

Mannschaften


Debugger Das Fahrrad gehört nicht mir, ich habe diese fünf Zeilen nur von meinem Teamkollegen ausgeliehen, der sein ganzes Leben mit dem Debuggen verbringt, aber es funktioniert.


 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 

Modul / Klasse Beschreibung Konfiguration


 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 

Es gibt anscheinend nichts zu kommentieren.


Rufen Sie System Utilities auf


Pry unterstützt das Aufrufen von Systemdienstprogrammen (fügen Sie einfach einen Punkt vor dem Befehlsnamen ohne Leerzeichen, .ls oder .ps axu ).


Plugins


Nachfolgend finden Sie das einfachste Beispiel für die Plugin-Konfiguration. Niemand mag aufgeblähte Konfigurationen, wir polieren sie und tragen sie jahrzehntelang mit verschiedenen Maschinen herum. Das folgende Snippet ist nur ein Beispiel (für das awesome Plugin). Die Kommentare im Code sprechen für sich.


 # `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 

Kundenspezifische Teams


Habe ich schon erwähnt, dass pry sehr coole REPL ist? Wir können sogar einen eigenen pry definieren, der innerhalb von pry . Das folgende Beispiel zeigt, wie Sie einen sql Befehl erstellen, um reines SQL über die Konsole auszuführen (vorausgesetzt, wir haben eine funktionierende AR-Verbindung) - mit einer minimalen Anzahl von Tastenanschlägen.


 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 und Globals


Ja, wir können jeden Ruby-Code mit unseren eigenen Monkeypatches anpassen und ausführen, die nur in pry Sitzungen verfügbar sind. Ich finde diesen Code beispielsweise sehr praktisch, um Code zu testen, der mit Arrays und Hashes arbeitet.


 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) 

Hinweis: Wenn Sie der Meinung sind, dass das obige Snippet durch diese Integer#succ überkompliziert ist, haben Sie wahrscheinlich noch nie lange Hashes mit mehr als 26 Schlüsseln ausgeführt :)


Farbeinstellung


Alles, was unten steht, dient zum Anpassen der Farben mit coderay gem. Das Ergebnis ist es wert. Die Symbole sind rot und die Zahlen sind blau und der ganze 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 

Abschließend


Ich hoffe, dieser Beitrag gibt einen ersten Eindruck davon, was pry ist und warum es besser ist als irb . Ich habe mich nicht besonders auf den Debugging-Prozess konzentriert, hauptsächlich, weil ich nicht debugge, sondern den richtigen Code von Grund auf neu schreibe. Aber ich hoffe, dass mich diejenigen interessieren könnten, die diese Buchstabenkombination zum ersten Mal sehen - versuchen Sie es zumindest. Glaub mir, es lohnt sich.


Gute Nachbauten!

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


All Articles