pry--pry/lib/pry/default_commands/context.rb

168 lines
5.4 KiB
Ruby
Raw Normal View History

require "pry/default_commands/ls"
require "pry/default_commands/cd"
2012-04-01 02:24:28 +00:00
require "pry/default_commands/find_method"
class Pry
module DefaultCommands
2011-05-07 05:32:05 +00:00
Context = Pry::CommandSet.new do
import Ls
import Cd
2012-04-01 02:24:28 +00:00
import FindMethod
create_command "whereami" do
description "Show code surrounding the current context."
banner <<-BANNER
Usage: whereami [OPTIONS]
BANNER
def setup
@method = Pry::Method.from_binding(target)
2012-06-04 03:09:00 +00:00
@file = target.eval('__FILE__')
@line = target.eval('__LINE__')
end
2012-06-11 06:37:47 +00:00
def options(opt)
opt.on :q, :quiet, "Don't display anything in case of an error"
end
2012-06-04 03:09:00 +00:00
def code
2012-06-11 06:37:47 +00:00
@code ||= if show_method?
Pry::Code.from_method(@method)
else
2012-06-15 13:25:07 +00:00
Pry::Code.from_file(@file).around(@line, window_size)
2012-06-11 06:37:47 +00:00
end
2012-06-04 03:09:00 +00:00
end
2012-06-04 03:09:00 +00:00
def location
"#{@file} @ line #{show_method? ? @method.source_line : @line} #{@method && @method.name_with_owner}"
end
2012-04-14 05:15:50 +00:00
2012-06-04 03:09:00 +00:00
def process
2012-06-11 06:37:47 +00:00
if opts.quiet? && (internal_binding? || !code?)
return
elsif internal_binding?
2012-06-15 13:25:07 +00:00
output.puts "Could not find local context, did you use \`binding.pry\`?"
2012-06-11 06:37:47 +00:00
return
end
2012-06-04 03:09:00 +00:00
set_file_and_dir_locals(@file)
2012-06-04 03:09:00 +00:00
output.puts "\n#{text.bold('From:')} #{location}:\n\n"
output.puts code.with_line_numbers.with_marker(@line)
output.puts
end
2012-04-18 06:49:00 +00:00
private
2012-06-11 06:37:47 +00:00
def internal_binding?
@method && ['__binding__', '__binding_impl__'].include?(@method.name)
end
def show_method?
2012-06-04 03:09:00 +00:00
args.empty? && @method && @method.source? && @method.source_range.count < 20 &&
# These checks are needed in case of an eval with a binding and file/line
# numbers set to outside the function. As in rails' use of ERB.
@method.source_file == @file && @method.source_range.include?(@line)
end
2012-06-11 06:37:47 +00:00
def code?
!!code
rescue MethodSource::SourceNotFoundError
false
end
2012-06-15 13:25:07 +00:00
def window_size
if args.empty?
Pry.config.default_window_size
else
args.first.to_i
end
end
end
create_command "pry-backtrace", "Show the backtrace for the Pry session." do
banner <<-BANNER
Usage: pry-backtrace [OPTIONS] [--help]
Show the backtrace for the position in the code where Pry was started. This can be used to
infer the behavior of the program immediately before it entered Pry, just like the backtrace
property of an exception.
(NOTE: if you are looking for the backtrace of the most recent exception raised,
just type: `_ex_.backtrace` instead, see https://github.com/pry/pry/wiki/Special-Locals)
e.g: pry-backtrace
BANNER
def process
output.puts "\n#{text.bold('Backtrace:')}\n--\n"
stagger_output _pry_.backtrace.join("\n")
end
end
command "reset", "Reset the REPL to a clean state." do
output.puts "Pry reset."
exec "pry"
end
2012-05-28 23:37:02 +00:00
create_command(/wtf([?!]*)/, "Show the backtrace of the most recent exception") do
options :listing => 'wtf?'
banner <<-BANNER
Show's a few lines of the backtrace of the most recent exception (also available
as _ex_.backtrace).
If you want to see more lines, add more question marks or exclamation marks:
e.g.
pry(main)> wtf?
pry(main)> wtf?!???!?!?
To see the entire backtrace, pass the -v/--verbose flag:
e.g.
pry(main)> wtf -v
BANNER
def options(opt)
opt.on(:v, :verbose, "Show the full backtrace.")
end
def process
raise Pry::CommandError, "No most-recent exception" unless _pry_.last_exception
output.puts "#{text.bold('Exception:')} #{_pry_.last_exception.class}: #{_pry_.last_exception}\n--"
if opts.verbose?
output.puts Code.new(_pry_.last_exception.backtrace, 0, :text).with_line_numbers.to_s
else
output.puts Code.new(_pry_.last_exception.backtrace.first([captures[0].size, 0.5].max * 10), 0, :text).with_line_numbers.to_s
end
end
end
2012-03-08 05:54:19 +00:00
# N.B. using a regular expresion here so that "raise-up 'foo'" does the right thing.
2012-05-28 23:37:02 +00:00
create_command(/raise-up(!?\b.*)/, :listing => 'raise-up') do
2012-03-24 18:04:03 +00:00
description "Raise an exception out of the current pry instance."
2012-03-08 05:54:19 +00:00
banner <<-BANNER
Raise up, like exit, allows you to quit pry. Instead of returning a value however, it raises an exception.
If you don't provide the exception to be raised, it will use the most recent exception (in pry _ex_).
e.g. `raise-up "get-me-out-of-here"` is equivalent to:
`raise "get-me-out-of-here"
raise-up`
When called as raise-up! (with an exclamation mark), this command raises the exception through
any nested prys you have created by "cd"ing into objects.
BANNER
def process
2012-03-24 18:04:03 +00:00
return stagger_output help if captures[0] =~ /(-h|--help)\b/
# Handle 'raise-up', 'raise-up "foo"', 'raise-up RuntimeError, 'farble' in a rubyesque manner
2012-03-08 05:54:19 +00:00
target.eval("_pry_.raise_up#{captures[0]}")
end
end
end
end
end