Pry -> REPL para Ruby, que vale a pena

REPL


REPL no mundo do desenvolvimento até o joelho significa Ler → Avaliar → Imprimir loop . Leia, execute, imprima e tantas vezes.


Ruby, como muitos outros idiomas, vem com sua própria implementação REPL chamada irb . Que, embora lide com tarefas primitivas, ainda não pode satisfazer completamente as demandas do desenvolvedor exigente. Mas há uma alternativa muito mais desenvolvida: pry .


Pry Logo


Aqui está um trecho do site oficial de pry :


O Pry é uma alternativa poderosa ao invólucro padrão Ruby IRB. Com destaque de sintaxe , uma arquitetura de plug-in flexível , chamadas em tempo de execução e fonte e documentação de exibição.

E isso não é apenas publicidade blá blá blá. Isso é verdade Vou mostrar como instalar e configurar o pry com todos os sinos e assobios para satisfazer o desenvolvedor mais sofisticado. Supõe-se que a versão atual do Ruby esteja instalada e em execução na máquina de destino.


Preparação


Vá para o console e execute o comando:


 $ gem install pry pry-theme awesome_print coderay 

Tudo, estamos completamente prontos. Vamos dar uma pry ... e garantir que não haja diferença em relação ao irb . De repente, não é muito agradável.


Bem, então, vamos ensinar a pry ser um pouco mais inteligente.


Arquivo de configuração


Isso é .pryrc . Já existe um arquivo de configuração no diretório inicial que informa a aparência e como se comportar em uma sociedade decente. Caso contrário, você pode criá-lo com o cd && touch .pryrc .


Instruções delicadas de enchimento .pryrc


Vou demonstrar os vários recursos da pry passo a passo. Para os impacientes: gist .pryrc .



Editor padrão


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

Configura o editor que será usado para editar o contexto atual (comando de edit ).


Prompt de comando


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

.pryrc é apenas um arquivo de .pryrc , portanto, esse processo pode executar qualquer código que você desejar, ou até minerar bitcoins enquanto você espera o próximo prompt aparecer.


O primeiro nível e os níveis aninhados (blocos internos) podem ser desenhados de diferentes maneiras. Anteriormente, usei um triângulo sombreado preto, que corta um analisador de cores opaco para o primeiro nível e ▷ para os aninhados, mas gradualmente cheguei à conclusão de que a ausência de caracteres estranhos dentro do snippet facilita muito a cópia do fragmento em qualquer lugar. Portanto sim.


Cores


Para dar suporte a temas, é utilizada a gema de pry-theme . Eu uso cores de sintaxe (e, quando entediado, corro PRY_BW=true pry ). Para pastas executando o Rails (contendo projetos Rails ), as cores podem ser ainda mais sofisticadas, mas eu odeio o Rails e, portanto, o que está acontecendo lá, não tenho certeza.


 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 

A história


Esta é apenas uma descoberta. Enquanto estiver no modo de depuração, ou se o comando foi executado imediatamente antes disso, basta pressionar ⏎ e ele será repetido. É extremamente útil para alternar para o código no depurador (se você usar o depurador, é claro, e não corrigir todos os erros com uma aparência fixa, nunca inicie o depurador como eu, por exemplo).


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

Equipas


Depurador A moto não é minha, eu apenas peguei essas cinco linhas emprestadas do meu companheiro de equipe, que passa a vida toda na depuração, mas, dizem eles, funciona.


 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 

Módulo / Classe Descrição Configuração


 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 

Parece não haver nada para comentar.


Utilitários do sistema de chamada


Pry suporta a chamada de utilitários do sistema (basta adicionar um ponto antes do nome do comando sem espaço, .ls ou .ps axu ).


Plugins


Abaixo está o exemplo mais simples de configuração de plug-in. Ninguém gosta de configurações inchadas, nós as polimos e as transportamos por décadas com máquinas diferentes. O snippet abaixo é apenas um exemplo (para o awesome plugin). Os comentários no código falam por si.


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

Equipes personalizadas


Eu mencionei que pry REPL muito legal? Podemos até definir nosso próprio conjunto de comandos para serem usados ​​dentro do pry . O exemplo abaixo mostra como criar um comando sql para executar SQL puro a partir do console (desde que tenhamos uma conexão AR funcionando) - com um número mínimo de pressionamentos de tecla.


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


Sim, podemos personalizar e executar qualquer código Ruby com nossos próprios monkeypatches, que estarão disponíveis apenas em sessões de pry . Por exemplo, acho esse código muito conveniente para testar código que opera com matrizes e hashes.


 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) 

Nota: se você acha que o snippet acima é super complicado com esse Integer#succ , provavelmente nunca lidou com hashes longos com mais de 26 chaves :)


Ajuste de cor


Tudo abaixo é para ajustar cores usando a gema coderay . O resultado vale a pena. Os símbolos são vermelhos, e os números são azuis, e todo esse 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 

Em conclusão


Espero que este post dê uma primeira impressão do que é pry e por que é melhor que o irb . Não me concentrei particularmente no processo de depuração, principalmente porque não estou depurando, mas escrevendo o código correto do zero. Mas espero poder interessar àqueles que vêem essa combinação de letras - pry - pela primeira vez - pelo menos tentar. Acredite, vale a pena.


Boas réplicas!

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


All Articles