Pry
© John Mair (banisterfiend) 2018 (Creator)
© Kyrylo Silin (kyrylosilin) 2018 (Maintainer)
Alumni:
Links:
Pry — это консоль разработчика и альтернатива IRB с мощными возможностями самоанализа. Pry стремится быть больше, чем заменой IRB. Это попытка привнести программирование на основе REPL в язык Ruby.
edit Class#method
)cd
, ls
и др.)gem 'pry', '~> 0.14.2'
gem install pry
Pry довольно гибкий и позволяет значительно настраивать пользователя. Его можно легко читать из любого объекта, у которого есть метод readline
, и записывать в любой объект, у которого есть метод puts
. Многие другие аспекты Pry также настраиваются, что делает его хорошим выбором для реализации пользовательских оболочек.
Pry поставляется с исполняемым файлом, поэтому его можно вызывать в командной строке. Просто введите pry
, чтобы начать. Файл pryrc
в $XDG_CONFIG_HOME/pry/
или домашнем каталоге пользователя будет загружен, если он существует. Введите pry --help
в командной строке для получения дополнительной информации.
Почти каждая функция в сеансе Pry реализована как команда. Команды не являются методами и должны начинаться с начала строки без пробелов между ними. Команды поддерживают гибкий синтаксис и позволяют использовать «параметры» так же, как команды оболочки, например, следующая команда Pry покажет список всех частных методов экземпляра (в области видимости), начинающихся с «pa». ### Перемещение по состояниям
Pry позволяет нам перемещаться между различными областями видимости (объектами) с помощью команды cd
. Это позволяет исследовать представление программы или библиотеки во время выполнения. Чтобы просмотреть, какие переменные и методы доступны в определённой области видимости, мы используем универсальную команду ls.
Здесь мы начнём Pry на верхнем уровне, затем Pry в классе, а затем в переменной экземпляра внутри этого класса:
pry(main)> class Hello
pry(main)* @x = 20
pry(main)* end
=> 20
pry(main)> cd Hello
pry(Hello):1> ls -i
instance variables: @x
pry(Hello):1> cd @x
pry(20):2> self + 10
=> 30
pry(20):2> cd ..
pry(Hello):1> cd ..
pry(main)> cd ..
Число после :
в приглашении pry указывает уровень вложенности. Чтобы отобразить больше информации о вложении, используйте команду nesting
. Например:
pry("friend"):3> nesting
Nesting status:
0. main (Pry top level)
1. Hello
2. 100
3. "friend"
=> nil
Затем мы можем вернуться к любому из предыдущих уровней вложенности, используя команду jump-to
:
pry("friend"):3> jump-to 1
=> 100
pry(Hello):1>
Pry можно вызвать в середине работающей программы. Он открывает сеанс Pry в точке вызова и делает доступным всё состояние программы в этой точке. Его можно вызвать для любого объекта, используя синтаксис my_object.pry
, или для текущей привязки (или любой привязки), используя binding.pry
. Сеанс Pry начнётся в области действия объекта (или привязки). Когда сеанс заканчивается, программа продолжает работу с любыми внесёнными вами изменениями.
Эту функциональность можно использовать для таких целей, как отладка, реализация консолей разработчика и применение горячих исправлений.
Код:
# test.rb
require 'pry'
class A
def hello() puts "hello world!" end
end
a = A.new
# start a REPL session
binding.pry
# program resumes here (after pry session)
puts "program resumes here."
Сеанс Pry:
pry(main)> a.hello
hello world!
=> nil
pry(main)> def a.goodbye
pry(main)* puts "goodbye cruel world!"
pry(main)* end
=> :goodbye
pry(main)> a.goodbye
goodbye cruel world!
=> nil
pry(main)> exit
program resumes here.
Строка ввода, начинающаяся с точки, будет передана в командную оболочку. Это позволяет нам перемещаться по файловой системе, запускать редакторы и напрямую запускать git и rake из Pry.
Кроме того, мы можем использовать команду shell-mode
, чтобы включить текущий рабочий каталог в приглашение Pry и включить (ограниченное на данном этапе, извините) завершение имени файла. Мы также можем интерполировать код Ruby непосредственно в оболочку, используя обычный синтаксис интерполяции строк #{}
.
В приведённом ниже коде мы переключимся в режим shell-mode
и отредактируем файл pryrc
. Затем мы выведем его содержимое и перезагрузим файл.
pry(main)> shell-mode
pry main:/home/john/ruby/projects/pry $ .cd ~
pry main:/home/john $ .emacsclient .pryrc
pry main:/home/john $ .cat .pryrc
def hello_world
puts "hello world!"
end
pry main:/home/john $ load ".pryrc"
=> true
pry main:/home/john $ hello_world
hello world!
Мы также можем интерполировать код Ruby в оболочку. В приведённом ниже примере мы используем команду оболочки cat
для случайного файла из текущего каталога и подсчитываем количество строк в этом файле с помощью wc
:
pry main:/home/john $ .cat #{Dir['*.*'].sample} | wc -l
44
Вы можете просматривать исходный код метода с помощью команды show-source
. Почти все методы Ruby (и некоторые методы C, с гемом pry-doc) могут просматривать свой исходный код. Код, который длиннее страницы, отправляется через пейджер (например, less), и весь код правильно выделяется синтаксисом (даже код C).
Команда show-source
принимает два синтаксиса: типичный синтаксис ri Class#method
и просто имя метода, находящегося в области видимости. При желании вы можете передать параметр -l
команде show-source
, чтобы включить номера строк в вывод.
В следующем примере мы войдём в класс Pry
, перечислим методы экземпляра, начинающиеся с «se», и отобразим исходный код для set_input
. Метод set_last_result:
pry(main)> cd Pry
pry(Pry):1> ls -M --grep se
Pry#methods: raise_up raise_up! raise_up_common reset_eval_string select_prompt set_last_result
pry(Pry):1> show-source set_last_result -l
From: /home/john/ruby/projects/pry/lib/pry/pry_instance.rb:405:
Owner: Pry
Visibility: public
Signature: set_last_result(result, code=?)
Number of lines: 6
405: def set_last_result(result, code = "")
406: @last_remark_is_exception = false
407: @output_ring << result
408:
409: self.last_result = result unless code =~ /\A\s*\z/
410: end
Примечание: мы также можем просматривать методы C (из Ruby Core) с помощью плагина pry-doc; также демонстрируем альтернативный синтаксис для show-source:
pry(main)> show-source Array#select
From: array.c in Ruby Core (C Method):
Number of lines: 15
static VALUE
rb_ary_select(VALUE ary)
{
VALUE result;
long i;
RETURN_ENUMERATOR(ary, 0, 0);
result = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
rb_ary_push(result, rb_ary_elt(ary, i));
}
}
return result;
}
Один из вариантов использования Pry — исследовать программу во время выполнения, входя и выходя из объектов, просматривая и вызывая методы. В процессе исследования может быть полезно прочитать документацию по конкретному методу, который вы встречаете. Команда show-source поддерживает два синтаксиса — нормальный синтаксис ri, а также принимает имя любого метода, который в данный момент находится в области видимости.
Система документации Pry не полагается на предварительно сгенерированные rdoc или ri, вместо этого она захватывает комментарии непосредственно над методом по запросу. Это приводит к более быстрому извлечению документации и позволяет системе Pry извлекать документацию для методов, которые не были бы обнаружены с помощью rdoc. Pry также имеет базовое понимание форматов rdoc и yard и попытается соответствующим образом выделить синтаксис документации.
Тем не менее функциональность ri очень хороша и имеет преимущество перед системой Pry в том, что она позволяет искать документацию как для классов, так и для методов. Поэтому Pry хорошо интегрируется с ri через команду ri. Синтаксис команды точно такой же, как и в командной строке, поэтому нет необходимости заключать строки в кавычки.
В нашем примере мы войдём в класс Gem и просмотрим документацию для метода try_activate:
pry(main)> cd Gem
pry(Gem):1> show-source try_activate -d
From: /Users/john/rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems.rb:194:
Owner: #<Class:Gem>
Visibility: public
Signature: try_activate(path)
Number of lines: 28
Попробуйте активировать гем, содержащий путь. Возвращает true, если активация прошла успешно или не была необходима, потому что он уже был активирован. Возвращает false, если он не может найти путь в геме.
def self.try_activate(путь)
# находит самую последнюю версию... независимо от загруженных спецификаций и их зависимостей
# если другой гем имел требование, которое означало бы, что мы не должны
# активировать последнюю версию, то либо она уже была активирована,
# либо если это было неоднозначно (и, таким образом, неразрешено), код в нашем пользовательском
# require попытается активировать более конкретную версию.
spec = Gem::Specification.find_by_path путь
pry(Gem):1>
Мы также можем использовать ri обычным способом:
pry(main) ri Array#each
----------------------------------------------------------- Array#each
array.each {|item| block } -> array
------------------------------------------------------------------------
Вызывает _block_ один раз для каждого элемента в _self_, передавая этот элемент
в качестве параметра.
a = [ "a", "b", "c" ]
a.each {|x| print x, " -- " }
производит:
a -- b -- c --
Вы можете использовать edit Class#method или edit my_method (если метод находится в области действия), чтобы открыть метод для редактирования непосредственно в вашем любимом редакторе. Pry знает о нескольких разных редакторах и попытается открыть файл в строке, где определён метод. Pry.editor
Аксессор Pry.editor по умолчанию будет использовать переменную $EDITOR или, если таковой нет, nano в качестве резервного варианта по умолчанию. Файл, который редактируется, будет автоматически перезагружен после выхода из редактора — перезагрузку можно подавить, передав параметр --no-reload команде edit.
В приведённом ниже примере мы установим наш редактор по умолчанию на «emacsclient» и откроем метод Pry#repl для редактирования:
pry(main)> Pry.editor = "emacsclient"
pry(main)> edit Pry#repl
Многие другие команды доступны в Pry; чтобы увидеть полный список, введите help в командной строке. Краткое описание каждой команды предоставляется с основными инструкциями по использованию; некоторые команды имеют более обширную справку, доступ к которой можно получить, набрав command_name --help. В описании команды обычно указывается, доступна ли опция --help.
Вы можете запустить консоль Pry в среде вашего приложения, используя флаг -r:
pry -r ./config/environment
Или запустите консоль rails (bin/rails console), а затем введите pry. Также можно использовать Pry в качестве вашей консоли Rails, добавив гем pry-rails в свой Gemfile. Это заменяет стандартную консоль на Pry, а также загружает помощники консоли Rails и добавляет несколько полезных команд, специфичных для Rails.
Обратите внимание, что pry-rails в настоящее время не поддерживается.
Также ознакомьтесь с вики для получения дополнительной информации об интеграции Pry с Rails.
Подсветка синтаксиса включена в Pry по умолчанию. Если вы хотите изменить цвета, ознакомьтесь с гемом pry-theme.
Вы можете включить и отключить подсветку синтаксиса в сеансе с помощью команды toggle-color. Кроме того, вы можете отключить её навсегда, поместив строку Pry.color = false в файл pryrc.
Если у вас возникла проблема, вопрос или сообщение об ошибке, не стесняйтесь:
Проект использует лицензию MIT. Подробнее см. в файле LICENSE.md.
Pry — это в первую очередь работа Джона Мейра (banisterfiend), полный список участников см. на графике участников.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )