Usando Pry no dia a dia de desenvolvimento

Artigos - 15/Abr/2020 - por Henrique Morato

O Interactive Ruby Shell (IRB) é um REPL (Read-Eval-Print-Loop) usado no dia a dia por muitos Rubistas para testar trechos de código. Mas ele é bastante "limitado", principalmente em versões anteriores à versão 2.7.x do Ruby, onde várias funções não funcionam tão bem como deveriam, como é o caso do uso de múltiplas linhas.

O Pry então surgiu como uma alternativa muito mais poderosa que o IRB. Algumas das suas principais vantagens:

  • Syntax highlighting
  • Autocomplete
  • Inspecção e navegação de objetos
  • Editar code em tempo real para rodar novamente
  • Debug

Instalação

Vamos começar instalando o Pry e o Pry doc para termos acesso ao Pry e a parte de documentação.

$ gem install pry  pry-doc

Podemos começar a utilizar as funções do Pry digitando pry no terminal:

$ pry

Se você usa Rails, pode utilizar a gem pry-rails que usa Pry ao abrir o rails console.

Navegação

Vamos testar alguns comandos de inspecção e navegação, como o cd e o ls:

pry (main):0 > array = [1, 2, 3, 4, 5]
# => [1, 2, 3, 4, 5]

pry (main):0 > cd array


pry ([1, 2, 3, 4, 5]):1 > self
# => [1, 2, 3, 4, 5]

Como você pode ver, agora estamos dentro da variável array que criamos anteriormente. Ao utilizar o comando ls você lista todos os métodos de um objeto ou classe.

Vale lembrar que se quiser saber mais sobre o comando você pode pedir auxílio da doc com ls -h

pry ([1, 2, 3, 4, 5]):1 > ls
# Enumerable#methods:
#  chain
#  chunk_while
#  detect
#  each_entry
#  each_with_index
#  entries
#  find_all
#  grep
#  group_by
#  lazy
#  member?
#  minmax
#  partition
#  slice_after
#  slice_when
#  to_set
#  chunk
#  collect_concat
#  each_con
#  (...)

Como estamos dentro do objeto, nós podemos também chamar métodos diretamente.

pry ([1, 2, 3, 4, 5]):1 > sum
# => 15

Para "sair" do objeto podemos usar o comando cd .. ou exit.

pry ([1, 2, 3, 4, 5]):1 > cd ..
pry (main):0 >

Documentação

Uma das minhas funcionalidades preferidas do Pry é o acesso rápido à documentação usando o comando show-doc

pry (main):0 > show-doc Array#map

# From: array.c (C Method):
# Owner: Array
# Visibility: public
# Signature: map()
# Number of lines: 12

# Invokes the given block once for each element of self.

# Creates a new array containing the values returned by the block.

# See also Enumerable#collect.

# If no block is given, an Enumerator is returned instead.

#   a = [ "a", "b", "c", "d" ]
#   a.collect {|x| x + "!"}           #=> ["a!", "b!", "c!", "d!"]
#   a.map.with_index {|x, i| x * i}   #=> ["", "b", "cc", "ddd"]
#   a                                 #=> ["a", "b", "c", "d"]

Debugging

O Pry também é muito conhecido pelas ferramentas de debug. Você pode requerer o pry no seu código com require 'pry' e a qualquer momento do codigo colocar a linha binding.pry.

require 'pry'

def meu_metodo
  array = [1, 2, 3, 4, 5]
  binding.pry
end

meu_metodo

Ao rodar esse arquivo no momento da linha do binding.pry, seu código irá parar e você poderá interagir com o código como se estivesse naquela linha.

Uma outra gem bastante famosa que enriquece essa capacidade é a pry-byebug,que usa as capacidades do Pry em conjunto com muitas funcionalidades úteis de debug da gem Byebug.

Assim, na etapa de debug, você pode usar comandos como:

  • step - para entrar na execução da próxima linha ou método.
  • next - roda a próxima linha no mesmo frame.
  • finish - executa a stack atual.
  • continue - continua a execução.

Isso torna bem mais fácil continuar rodando o código, terminar a execução e ir para a próxima linha. Outros comandos, como up, down, frame, backtrace, também podem ser utilizados.

Conclusão

O Pry possui outras funcionalidades muito úteis além das apresentadas neste artigo. Se você quiser se aprofundar nesse assunto, indicamos os materiais a seguir para consultar:

  • Na wiki do Pry você pode conferir diversos guias, screencasts e palestras.
  • Uma outra boa referência é a palestra do Philippe Hardardt no canal do Guru SP talks onde ele faz um debug em tempo real de uma representação do jogo da vida de Conway em Ruby.
Foto de perfil do autor
Henrique Morato

Dev