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
.

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'
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"
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.
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
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!