Cungkil -> REPL untuk Ruby, yang sangat berharga

REPL


REPL dalam dunia pengembangan setinggi lutut adalah untuk Baca → Evaluasi → Loop Cetak . Baca, dieksekusi, dicetak, dan berkali-kali.


Ruby, seperti banyak bahasa lainnya, hadir dengan implementasi REPL sendiri yang disebut irb . Yang, meskipun mengatasi tugas-tugas primitif, masih tidak dapat sepenuhnya memenuhi tuntutan pengembang yang cerdas. Tetapi ada alternatif yang jauh lebih berkembang: pry .


Pry Logo


Berikut ini kutipan dari situs web resmi pry :


Pry adalah alternatif yang kuat untuk bungkus standar Ruby IRB. Dengan penyorotan sintaksis , arsitektur plugin yang fleksibel , panggilan runtime, dan melihat sumber dan dokumentasi .

Dan ini bukan hanya iklan bla bla bla. Ini benar Saya akan menunjukkan cara menginstal dan mengkonfigurasi pry dengan semua lonceng dan peluit untuk memuaskan pengembang paling canggih. Diasumsikan bahwa versi kerja Ruby saat ini diinstal dan dijalankan pada mesin target.


Persiapan


Pergi ke konsol dan jalankan perintah:


 $ gem install pry pry-theme awesome_print coderay 

Semuanya, kami sepenuhnya siap. Ayo jalankan ... ... dan pastikan tidak ada perbedaan dibandingkan dengan irb . Tiba-tiba tidak terlalu baik.


Kalau begitu, mari kita ajar anak pry menjadi sedikit lebih pintar.


File konfigurasi


Ini .pryrc . Sudah ada file konfigurasi di direktori home yang memberi tahu cara melihat dan bagaimana berperilaku dalam masyarakat yang layak. Jika tidak, Anda dapat membuatnya dengan perintah cd && touch .pryrc .


Mengisi instruksi .pryrc


Saya akan menunjukkan berbagai fitur langkah demi langkah. Untuk yang tidak sabar: gist .pryrc .


  • pry guide : berikut adalah pry informasi berguna untuk prist yang berpengalaman,
  • tema pry : pertanyaan, jawaban, dll.

Editor default


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

Mengkonfigurasi editor yang akan digunakan untuk mengedit konteks saat ini (perintah edit ).


Command prompt


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

.pryrc hanyalah file .pryrc , sehingga proses ini dapat mengeksekusi kode apa pun yang Anda inginkan, atau bahkan menambang bitcoin saat Anda menunggu prompt berikutnya muncul.


Tingkat pertama dan tingkat bersarang (blok dalam) dapat ditarik dengan cara yang berbeda. Sebelumnya, saya menggunakan segitiga berarsir hitam, yang memotong parser bodoh untuk tingkat pertama dan ▷ untuk yang bersarang, tetapi secara bertahap sampai pada kesimpulan bahwa tidak adanya karakter asing di dalam snippet membuatnya lebih mudah untuk menyalin fragmen di mana saja. Oleh karena itu begitu.


Warna


Untuk mendukung tema, pry-theme gem digunakan. Saya menggunakan pewarnaan sintaks (dan ketika bosan, saya menjalankan PRY_BW=true pry ). Untuk folder yang menjalankan Rails (berisi proyek Rails ) warnanya bisa lebih mewah, tapi saya benci Rails , dan karena itu apa yang terjadi di sana, saya tidak bisa mengatakannya dengan pasti.


 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 

Ceritanya


Ini hanya sebuah penemuan. Saat dalam mode debug, atau jika perintah dijalankan segera sebelum itu, cukup tekan ⏎ dan itu akan diulang. Ini sangat berguna untuk beralih ke kode di debugger (jika Anda, tentu saja, menggunakan debugger sama sekali, dan jangan memperbaiki semua kesalahan dengan tampilan tetap, misalnya tidak pernah meluncurkan debugger seperti saya, misalnya).


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

Tim


Debugger Motor itu bukan milik saya, saya hanya meminjam lima baris ini dari rekan setim saya, yang menghabiskan seluruh hidupnya dalam debugging, tetapi, kata mereka, itu berhasil.


 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 / Kelas Deskripsi Konfigurasi


 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 

Tampaknya tidak ada yang perlu dikomentari.


Panggil Utilitas Sistem


Pry mendukung utilitas sistem panggilan (cukup tambahkan satu titik sebelum nama perintah tanpa spasi, .ls , atau .ps axu ).


Plugin


Di bawah ini adalah contoh paling sederhana dari konfigurasi plugin. Tidak ada yang suka konfigurasi kembung, kami memolesnya dan membawanya sekitar selama beberapa dekade dengan mesin yang berbeda. Cuplikan di bawah ini hanyalah contoh (untuk plugin yang awesome ). Komentar dalam kode berbicara sendiri.


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

Tim khusus


Apakah saya menyebutkan bahwa mungkinkah REPL yang sangat keren? Kita bahkan dapat mendefinisikan set perintah kita sendiri untuk digunakan di dalam pry . Contoh di bawah ini menunjukkan cara membuat perintah sql untuk mengeksekusi SQL murni dari konsol (asalkan kita memiliki koneksi AR yang berfungsi) - dengan jumlah penekanan tombol minimum.


 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 

Monkeipatch dan Global


Ya, kami dapat mengkustomisasi dan mengeksekusi kode Ruby apa pun dengan monkeypatch kami sendiri, yang hanya akan tersedia dalam sesi pry . Sebagai contoh, saya menemukan kode ini sangat nyaman untuk menguji kode yang beroperasi dengan array dan hash.


 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) 

Catatan: jika Anda berpikir cuplikan di atas terlalu rumit oleh Integer#succ , Anda mungkin tidak pernah berurusan dengan hash panjang dengan lebih dari 26 kunci :)


Penyesuaian warna


Semuanya di bawah ini untuk menyesuaikan warna menggunakan permata coderay . Hasilnya sepadan. Simbol-simbolnya merah, dan angkanya biru, dan semua jazz itu.


 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 

Kesimpulannya


Saya harap posting ini memberikan kesan pertama tentang apa itu pry dan mengapa lebih baik daripada irb . Saya tidak terlalu fokus pada proses debugging, terutama karena saya tidak melakukan debugging, tetapi menulis kode yang benar dari awal. Tapi saya harap saya bisa menarik perhatian mereka yang melihat kombinasi huruf ini - pry - untuk pertama kalinya - setidaknya mencoba. Percayalah, itu sepadan.


Replika yang bagus!

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


All Articles