2011-05-20 02:39:26 -04:00
|
|
|
require 'ostruct'
|
2011-05-18 23:31:21 -04:00
|
|
|
require 'forwardable'
|
2011-05-28 07:58:27 -04:00
|
|
|
require 'pry/config'
|
2011-05-18 23:31:21 -04:00
|
|
|
|
2010-12-25 08:59:37 -05:00
|
|
|
class Pry
|
|
|
|
|
2011-04-16 17:17:30 -04:00
|
|
|
# The RC Files to load.
|
2012-08-05 15:04:03 -04:00
|
|
|
HOME_RC_FILE = "~/.pryrc"
|
2012-07-03 23:09:01 -04:00
|
|
|
LOCAL_RC_FILE = "./.pryrc"
|
2011-04-16 17:17:30 -04:00
|
|
|
|
2012-11-02 09:27:30 -04:00
|
|
|
# @return [Hash] Pry's `Thread.current` hash
|
2013-01-15 17:29:23 -05:00
|
|
|
def self.current
|
2012-11-02 09:27:30 -04:00
|
|
|
Thread.current[:__pry__] ||= {}
|
|
|
|
end
|
|
|
|
|
2010-12-25 08:59:37 -05:00
|
|
|
# class accessors
|
|
|
|
class << self
|
2011-05-18 23:31:21 -04:00
|
|
|
extend Forwardable
|
2010-12-29 04:14:12 -05:00
|
|
|
|
2011-05-28 07:58:27 -04:00
|
|
|
# convenience method
|
|
|
|
def self.delegate_accessors(delagatee, *names)
|
|
|
|
def_delegators delagatee, *names
|
|
|
|
def_delegators delagatee, *names.map { |v| "#{v}=" }
|
|
|
|
end
|
|
|
|
|
2011-04-07 04:38:50 -04:00
|
|
|
# Get/Set the Proc that defines extra Readline completions (on top
|
|
|
|
# of the ones defined for IRB).
|
|
|
|
# @return [Proc] The Proc that defines extra Readline completions (on top
|
|
|
|
# @example Add file names to completion list
|
|
|
|
# Pry.custom_completions = proc { Dir.entries('.') }
|
2011-04-06 12:59:09 -04:00
|
|
|
attr_accessor :custom_completions
|
|
|
|
|
2011-05-24 04:16:46 -04:00
|
|
|
# @return [Fixnum] The current input line.
|
2011-05-24 08:34:55 -04:00
|
|
|
attr_accessor :current_line
|
2011-05-24 04:16:46 -04:00
|
|
|
|
|
|
|
# @return [Array] The Array of evaluated expressions.
|
2011-05-24 08:34:55 -04:00
|
|
|
attr_accessor :line_buffer
|
2011-05-24 04:16:46 -04:00
|
|
|
|
2011-05-24 20:48:53 -04:00
|
|
|
# @return [String] The __FILE__ for the `eval()`. Should be "(pry)"
|
|
|
|
# by default.
|
|
|
|
attr_accessor :eval_path
|
|
|
|
|
2011-05-28 07:58:27 -04:00
|
|
|
# @return [OpenStruct] Return Pry's config object.
|
|
|
|
attr_accessor :config
|
|
|
|
|
2011-09-05 16:52:49 -04:00
|
|
|
# @return [History] Return Pry's line history object.
|
2011-09-05 04:46:16 -04:00
|
|
|
attr_accessor :history
|
2011-09-05 04:45:58 -04:00
|
|
|
|
2011-05-28 07:58:27 -04:00
|
|
|
# @return [Boolean] Whether Pry was activated from the command line.
|
|
|
|
attr_accessor :cli
|
|
|
|
|
2012-03-31 17:18:03 -04:00
|
|
|
# @return [Boolean] Whether Pry sessions are quiet by default.
|
|
|
|
attr_accessor :quiet
|
|
|
|
|
2013-01-19 21:50:38 -05:00
|
|
|
# @return [Exception, nil] The last pry internal error.
|
|
|
|
# (a CommandError in most cases)
|
|
|
|
attr_accessor :last_internal_error
|
|
|
|
|
2011-05-20 02:39:26 -04:00
|
|
|
# plugin forwardables
|
2011-05-18 23:31:21 -04:00
|
|
|
def_delegators :@plugin_manager, :plugins, :load_plugins, :locate_plugins
|
2011-05-20 02:39:26 -04:00
|
|
|
|
2011-05-28 07:58:27 -04:00
|
|
|
delegate_accessors :@config, :input, :output, :commands, :prompt, :print, :exception_handler,
|
2012-12-28 16:35:14 -05:00
|
|
|
:hooks, :color, :pager, :editor, :memory_size, :extra_sticky_locals
|
2011-05-15 05:58:27 -04:00
|
|
|
end
|
|
|
|
|
2012-07-03 23:09:01 -04:00
|
|
|
# Load the given file in the context of `Pry.toplevel_binding`
|
|
|
|
# @param [String] file_name The unexpanded file path.
|
2013-02-17 23:43:07 -05:00
|
|
|
def self.load_file_at_toplevel(file)
|
|
|
|
toplevel_binding.eval(File.read(file), file)
|
|
|
|
rescue RescuableException => e
|
|
|
|
puts "Error loading #{file}: #{e}\n#{e.backtrace.first}"
|
2012-07-03 23:09:01 -04:00
|
|
|
end
|
|
|
|
|
2013-02-17 23:43:07 -05:00
|
|
|
# Load HOME_RC_FILE and LOCAL_RC_FILE if appropriate
|
2011-10-18 12:55:31 -04:00
|
|
|
# This method can also be used to reload the files if they have changed.
|
2013-02-17 23:43:07 -05:00
|
|
|
def self.load_rc_files
|
|
|
|
rc_files_to_load.each do |file|
|
|
|
|
load_file_at_toplevel(file)
|
|
|
|
end
|
2010-12-25 08:59:37 -05:00
|
|
|
end
|
2011-04-16 17:17:30 -04:00
|
|
|
|
2012-07-03 23:09:01 -04:00
|
|
|
# Load the local RC file (./.pryrc)
|
2013-02-17 23:43:07 -05:00
|
|
|
def self.rc_files_to_load
|
|
|
|
files = []
|
|
|
|
files << HOME_RC_FILE if Pry.config.should_load_rc
|
|
|
|
files << LOCAL_RC_FILE if Pry.config.should_load_local_rc
|
|
|
|
files.map { |file| real_path_to(file) }.compact.uniq
|
|
|
|
end
|
|
|
|
|
|
|
|
# Expand a file to its canonical name (following symlinks as appropriate)
|
|
|
|
def self.real_path_to(file)
|
2013-02-18 02:21:54 -05:00
|
|
|
expanded = Pathname.new(File.expand_path(file)).realpath.to_s
|
|
|
|
# For rbx 1.9 mode [see rubinius issue #2165]
|
|
|
|
File.exist?(expanded) ? expanded : nil
|
2013-02-17 23:43:07 -05:00
|
|
|
rescue Errno::ENOENT
|
|
|
|
nil
|
2012-07-03 23:09:01 -04:00
|
|
|
end
|
|
|
|
|
2011-07-24 23:04:44 -04:00
|
|
|
# Load any Ruby files specified with the -r flag on the command line.
|
|
|
|
def self.load_requires
|
|
|
|
Pry.config.requires.each do |file|
|
|
|
|
require file
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-11-22 12:06:27 -05:00
|
|
|
# Trap interrupts on jruby, and make them behave like MRI so we can
|
|
|
|
# catch them.
|
|
|
|
def self.load_traps
|
|
|
|
trap('INT'){ raise Interrupt }
|
|
|
|
end
|
|
|
|
|
2011-11-12 10:31:43 -05:00
|
|
|
# Do basic setup for initial session.
|
|
|
|
# Including: loading .pryrc, loading plugins, loading requires, and
|
|
|
|
# loading history.
|
|
|
|
def self.initial_session_setup
|
2011-11-14 09:16:38 -05:00
|
|
|
|
|
|
|
return if !initial_session?
|
|
|
|
|
2011-11-12 10:31:43 -05:00
|
|
|
# note these have to be loaded here rather than in pry_instance as
|
2011-11-29 07:35:45 -05:00
|
|
|
# we only want them loaded once per entire Pry lifetime.
|
2013-02-17 23:43:07 -05:00
|
|
|
load_rc_files
|
2012-01-24 07:07:50 -05:00
|
|
|
load_plugins if Pry.config.should_load_plugins
|
2011-11-12 10:31:43 -05:00
|
|
|
load_requires if Pry.config.should_load_requires
|
|
|
|
load_history if Pry.config.history.should_load
|
2011-11-22 12:06:27 -05:00
|
|
|
load_traps if Pry.config.should_trap_interrupts
|
2011-11-12 10:31:43 -05:00
|
|
|
|
|
|
|
@initial_session = false
|
|
|
|
end
|
|
|
|
|
2010-12-29 04:14:12 -05:00
|
|
|
# Start a Pry REPL.
|
2012-12-28 00:52:58 -05:00
|
|
|
# This method also loads `~/.pryrc` and `./.pryrc` as necessary the
|
2011-03-04 07:37:59 -05:00
|
|
|
# first time it is invoked.
|
2010-12-29 04:14:12 -05:00
|
|
|
# @param [Object, Binding] target The receiver of the Pry session
|
2010-12-30 10:01:11 -05:00
|
|
|
# @param [Hash] options
|
|
|
|
# @option options (see Pry#initialize)
|
2010-12-29 04:14:12 -05:00
|
|
|
# @example
|
|
|
|
# Pry.start(Object.new, :input => MyInput.new)
|
2012-11-08 02:09:31 -05:00
|
|
|
def self.start(target=nil, options={})
|
2012-10-31 04:42:55 -04:00
|
|
|
return if ENV['DISABLE_PRY']
|
2012-11-14 00:59:59 -05:00
|
|
|
|
|
|
|
if in_critical_section?
|
|
|
|
output.puts "ERROR: Pry started inside Pry."
|
|
|
|
output.puts "This can happen if you have a binding.pry inside a #to_s or #inspect function."
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2012-12-18 04:12:57 -05:00
|
|
|
options[:target] = Pry.binding_for(target || toplevel_binding)
|
2012-01-20 04:08:28 -05:00
|
|
|
|
2011-11-14 09:16:38 -05:00
|
|
|
initial_session_setup
|
2011-11-29 07:35:45 -05:00
|
|
|
|
2012-12-28 00:52:58 -05:00
|
|
|
# Unless we were given a backtrace, save the current one
|
2012-12-20 02:05:32 -05:00
|
|
|
if options[:backtrace].nil?
|
|
|
|
options[:backtrace] = caller
|
2012-01-19 23:39:25 -05:00
|
|
|
|
2012-12-28 00:52:58 -05:00
|
|
|
# If Pry was started via `binding.pry`, elide that from the backtrace
|
2012-12-20 02:05:32 -05:00
|
|
|
if options[:backtrace].first =~ /pry.*core_extensions.*pry/
|
2012-12-21 02:10:17 -05:00
|
|
|
options[:backtrace].shift
|
2012-12-20 02:05:32 -05:00
|
|
|
end
|
2012-01-17 23:20:13 -05:00
|
|
|
end
|
2011-11-29 07:35:45 -05:00
|
|
|
|
2012-12-21 03:02:13 -05:00
|
|
|
driver = options[:driver] || Pry::REPL
|
2012-05-25 10:49:50 -04:00
|
|
|
|
2011-11-29 07:35:45 -05:00
|
|
|
# Enter the matrix
|
2012-12-21 03:02:13 -05:00
|
|
|
driver.start(options)
|
2012-11-08 02:21:52 -05:00
|
|
|
rescue Pry::TooSafeException
|
2012-11-08 02:09:31 -05:00
|
|
|
puts "ERROR: Pry cannot work with $SAFE > 0"
|
|
|
|
raise
|
2010-12-25 08:59:37 -05:00
|
|
|
end
|
|
|
|
|
2012-06-17 06:50:18 -04:00
|
|
|
# Execute the file through the REPL loop, non-interactively.
|
|
|
|
# @param [String] file_name File name to load through the REPL.
|
|
|
|
def self.load_file_through_repl(file_name)
|
|
|
|
require "pry/repl_file_loader"
|
|
|
|
REPLFileLoader.new(file_name).load
|
|
|
|
end
|
|
|
|
|
2011-09-15 05:08:05 -04:00
|
|
|
# An inspector that clips the output to `max_length` chars.
|
2011-09-08 18:35:21 -04:00
|
|
|
# In case of > `max_length` chars the `#<Object...> notation is used.
|
2011-02-13 10:49:53 -05:00
|
|
|
# @param obj The object to view.
|
2011-09-08 18:35:21 -04:00
|
|
|
# @param max_length The maximum number of chars before clipping occurs.
|
2011-02-13 10:49:53 -05:00
|
|
|
# @return [String] The string representation of `obj`.
|
2011-09-04 06:38:01 -04:00
|
|
|
def self.view_clip(obj, max_length = 60)
|
2011-09-07 15:11:11 -04:00
|
|
|
if obj.kind_of?(Module) && obj.name.to_s != "" && obj.name.to_s.length <= max_length
|
2011-09-04 06:38:01 -04:00
|
|
|
obj.name.to_s
|
2011-09-07 15:11:11 -04:00
|
|
|
elsif TOPLEVEL_BINDING.eval('self') == obj
|
|
|
|
# special case for 'main' object :)
|
2011-09-09 02:12:26 -04:00
|
|
|
obj.to_s
|
2011-09-08 02:30:23 -04:00
|
|
|
elsif [String, Numeric, Symbol, nil, true, false].any? { |v| v === obj } && obj.inspect.length <= max_length
|
2011-09-07 23:36:24 -04:00
|
|
|
obj.inspect
|
2011-09-07 11:39:22 -04:00
|
|
|
else
|
2011-09-08 02:30:23 -04:00
|
|
|
"#<#{obj.class}>"#:%x>"# % (obj.object_id << 1)
|
2011-02-13 10:49:53 -05:00
|
|
|
end
|
2011-09-04 06:38:01 -04:00
|
|
|
|
2011-09-07 23:36:24 -04:00
|
|
|
rescue RescuableException
|
2011-09-04 06:38:01 -04:00
|
|
|
"unknown"
|
2011-02-13 10:49:53 -05:00
|
|
|
end
|
|
|
|
|
2011-05-28 07:58:27 -04:00
|
|
|
# Load Readline history if required.
|
|
|
|
def self.load_history
|
2011-12-02 00:03:36 -05:00
|
|
|
Pry.history.load
|
2011-05-28 07:58:27 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# @return [Boolean] Whether this is the first time a Pry session has
|
|
|
|
# been started since loading the Pry class.
|
|
|
|
def self.initial_session?
|
|
|
|
@initial_session
|
|
|
|
end
|
|
|
|
|
2011-02-18 12:01:21 -05:00
|
|
|
# Run a Pry command from outside a session. The commands available are
|
|
|
|
# those referenced by `Pry.commands` (the default command set).
|
2012-06-27 01:30:00 -04:00
|
|
|
# @param [String] command_string The Pry command (including arguments,
|
2011-02-18 12:01:21 -05:00
|
|
|
# if any).
|
|
|
|
# @param [Hash] options Optional named parameters.
|
2011-02-18 13:01:02 -05:00
|
|
|
# @return [Object] The return value of the Pry command.
|
2013-02-05 13:34:28 -05:00
|
|
|
# @option options [Object, Binding] :target The object to run the
|
2011-02-18 12:01:21 -05:00
|
|
|
# command under. Defaults to `TOPLEVEL_BINDING` (main).
|
|
|
|
# @option options [Boolean] :show_output Whether to show command
|
2011-05-27 12:08:08 -04:00
|
|
|
# output. Defaults to true.
|
2011-02-18 12:01:21 -05:00
|
|
|
# @example Run at top-level with no output.
|
|
|
|
# Pry.run_command "ls"
|
|
|
|
# @example Run under Pry class, returning only public methods.
|
2013-02-05 13:34:28 -05:00
|
|
|
# Pry.run_command "ls -m", :target => Pry
|
2011-02-18 12:01:21 -05:00
|
|
|
# @example Display command output.
|
|
|
|
# Pry.run_command "ls -av", :show_output => true
|
2011-05-27 12:08:08 -04:00
|
|
|
def self.run_command(command_string, options={})
|
2011-02-18 12:01:21 -05:00
|
|
|
options = {
|
2013-02-05 13:34:28 -05:00
|
|
|
:target => TOPLEVEL_BINDING,
|
2011-05-27 12:08:08 -04:00
|
|
|
:show_output => true,
|
2011-03-05 09:17:54 -05:00
|
|
|
:output => Pry.output,
|
|
|
|
:commands => Pry.commands
|
2011-02-18 12:01:21 -05:00
|
|
|
}.merge!(options)
|
2011-04-16 17:17:30 -04:00
|
|
|
|
2013-02-05 13:34:28 -05:00
|
|
|
# :context for compatibility with <= 0.9.11.4
|
|
|
|
target = options[:context] || options[:target]
|
2011-05-27 12:08:08 -04:00
|
|
|
output = options[:show_output] ? options[:output] : StringIO.new
|
2011-02-18 12:01:21 -05:00
|
|
|
|
2013-02-05 13:34:28 -05:00
|
|
|
pry = Pry.new(:output => output, :target => target, :commands => options[:commands])
|
|
|
|
pry.eval command_string
|
2011-02-18 12:01:21 -05:00
|
|
|
end
|
|
|
|
|
2011-04-25 12:17:20 -04:00
|
|
|
def self.default_editor_for_platform
|
2011-12-26 19:28:48 -05:00
|
|
|
return ENV['VISUAL'] if ENV['VISUAL'] and not ENV['VISUAL'].empty?
|
|
|
|
return ENV['EDITOR'] if ENV['EDITOR'] and not ENV['EDITOR'].empty?
|
|
|
|
|
2011-12-26 19:48:59 -05:00
|
|
|
if Helpers::BaseHelpers.windows?
|
2011-12-26 19:28:48 -05:00
|
|
|
'notepad'
|
2011-04-25 12:17:20 -04:00
|
|
|
else
|
2011-12-27 17:59:08 -05:00
|
|
|
%w(editor nano vi).detect do |editor|
|
|
|
|
system("which #{editor} > /dev/null 2>&1")
|
2011-12-26 16:39:39 -05:00
|
|
|
end
|
2011-04-25 12:17:20 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-10-27 04:51:51 -04:00
|
|
|
def self.auto_resize!
|
2013-02-08 01:41:37 -05:00
|
|
|
ver = Readline::VERSION
|
|
|
|
if ver[/edit/i]
|
|
|
|
warn <<-EOT
|
|
|
|
Readline version #{ver} detected - will not auto_resize! correctly.
|
|
|
|
For the fix, use GNU Readline instead:
|
|
|
|
https://github.com/guard/guard/wiki/Add-proper-Readline-support-to-Ruby-on-Mac-OS-X
|
|
|
|
EOT
|
|
|
|
return
|
|
|
|
end
|
2012-10-27 04:51:51 -04:00
|
|
|
trap :WINCH do
|
2013-01-30 22:14:06 -05:00
|
|
|
begin
|
2013-03-02 19:01:55 -05:00
|
|
|
Readline.set_screen_size(*Terminal.size!)
|
2013-01-30 22:14:06 -05:00
|
|
|
rescue => e
|
|
|
|
warn "\nPry.auto_resize!'s Readline.set_screen_size failed: #{e}"
|
|
|
|
end
|
|
|
|
begin
|
|
|
|
Readline.refresh_line
|
|
|
|
rescue => e
|
|
|
|
warn "\nPry.auto_resize!'s Readline.refresh_line failed: #{e}"
|
|
|
|
end
|
2012-10-27 04:51:51 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-05-24 04:16:46 -04:00
|
|
|
def self.set_config_defaults
|
2011-05-20 02:39:26 -04:00
|
|
|
config.input = Readline
|
|
|
|
config.output = $stdout
|
|
|
|
config.commands = Pry::Commands
|
2012-08-22 15:12:31 -04:00
|
|
|
config.prompt_name = DEFAULT_PROMPT_NAME
|
2011-05-20 02:39:26 -04:00
|
|
|
config.prompt = DEFAULT_PROMPT
|
|
|
|
config.print = DEFAULT_PRINT
|
|
|
|
config.exception_handler = DEFAULT_EXCEPTION_HANDLER
|
2011-09-17 21:45:46 -04:00
|
|
|
config.exception_whitelist = DEFAULT_EXCEPTION_WHITELIST
|
2012-01-15 01:30:32 -05:00
|
|
|
config.default_window_size = 5
|
2011-05-20 02:39:26 -04:00
|
|
|
config.hooks = DEFAULT_HOOKS
|
2011-12-27 17:38:25 -05:00
|
|
|
config.color = Helpers::BaseHelpers.use_ansi_codes?
|
2011-05-20 02:39:26 -04:00
|
|
|
config.pager = true
|
2011-09-17 02:35:17 -04:00
|
|
|
config.system = DEFAULT_SYSTEM
|
2011-05-20 02:39:26 -04:00
|
|
|
config.editor = default_editor_for_platform
|
2011-05-28 07:58:27 -04:00
|
|
|
config.should_load_rc = true
|
2012-07-03 23:09:01 -04:00
|
|
|
config.should_load_local_rc = true
|
2011-12-27 17:38:25 -05:00
|
|
|
config.should_trap_interrupts = Helpers::BaseHelpers.jruby?
|
2011-07-25 01:57:40 -04:00
|
|
|
config.disable_auto_reload = false
|
2011-07-26 03:34:54 -04:00
|
|
|
config.command_prefix = ""
|
2012-06-23 18:06:32 -04:00
|
|
|
config.auto_indent = Helpers::BaseHelpers.use_ansi_codes?
|
2011-10-28 02:57:01 -04:00
|
|
|
config.correct_indent = true
|
2013-01-15 18:21:44 -05:00
|
|
|
config.collision_warning = false
|
2012-11-08 02:58:18 -05:00
|
|
|
config.output_prefix = "=> "
|
2011-06-02 05:41:41 -04:00
|
|
|
|
2012-09-06 02:14:53 -04:00
|
|
|
if defined?(Bond) && Readline::VERSION !~ /editline/i
|
2012-12-28 18:19:21 -05:00
|
|
|
config.completer = Pry::BondCompleter.start
|
2012-09-06 02:14:53 -04:00
|
|
|
else
|
2012-12-28 18:19:21 -05:00
|
|
|
config.completer = Pry::InputCompleter.start
|
2012-09-06 02:14:53 -04:00
|
|
|
end
|
|
|
|
|
2011-12-11 03:16:09 -05:00
|
|
|
config.gist ||= OpenStruct.new
|
2012-01-15 15:21:28 -05:00
|
|
|
config.gist.inspecter = proc(&:pretty_inspect)
|
2011-12-11 03:16:09 -05:00
|
|
|
|
2012-01-24 07:07:50 -05:00
|
|
|
config.should_load_plugins = true
|
2011-05-28 07:58:27 -04:00
|
|
|
|
2011-07-24 23:04:44 -04:00
|
|
|
config.requires ||= []
|
|
|
|
config.should_load_requires = true
|
|
|
|
|
2011-05-28 07:58:27 -04:00
|
|
|
config.history ||= OpenStruct.new
|
2011-06-09 06:25:06 -04:00
|
|
|
config.history.should_save = true
|
|
|
|
config.history.should_load = true
|
2012-02-15 06:24:03 -05:00
|
|
|
config.history.file = File.expand_path("~/.pry_history") rescue nil
|
|
|
|
|
|
|
|
if config.history.file.nil?
|
|
|
|
config.should_load_rc = false
|
|
|
|
config.history.should_save = false
|
|
|
|
config.history.should_load = false
|
|
|
|
end
|
2011-06-05 12:37:54 -04:00
|
|
|
|
2011-08-29 10:21:51 -04:00
|
|
|
config.control_d_handler = DEFAULT_CONTROL_D_HANDLER
|
|
|
|
|
2011-06-05 12:37:54 -04:00
|
|
|
config.memory_size = 100
|
2011-09-07 11:39:22 -04:00
|
|
|
|
2012-03-13 22:33:51 -04:00
|
|
|
config.extra_sticky_locals = {}
|
|
|
|
|
2011-10-08 19:47:21 -04:00
|
|
|
config.ls ||= OpenStruct.new({
|
2013-01-17 00:29:32 -05:00
|
|
|
:heading_color => :bright_blue,
|
2011-10-08 19:47:21 -04:00
|
|
|
|
2011-10-10 00:41:33 -04:00
|
|
|
:public_method_color => :default,
|
2013-01-17 00:29:32 -05:00
|
|
|
:private_method_color => :blue,
|
|
|
|
:protected_method_color => :blue,
|
2011-10-08 19:47:21 -04:00
|
|
|
:method_missing_color => :bright_red,
|
|
|
|
|
2012-10-02 07:37:01 -04:00
|
|
|
:local_var_color => :yellow,
|
|
|
|
:pry_var_color => :default, # e.g. _, _pry_, _file_
|
2011-10-08 19:47:21 -04:00
|
|
|
|
|
|
|
:instance_var_color => :blue, # e.g. @foo
|
|
|
|
:class_var_color => :bright_blue, # e.g. @@foo
|
|
|
|
|
2011-10-10 00:41:33 -04:00
|
|
|
:global_var_color => :default, # e.g. $CODERAY_DEBUG, $eventmachine_library
|
2011-10-08 19:47:21 -04:00
|
|
|
:builtin_global_color => :cyan, # e.g. $stdin, $-w, $PID
|
|
|
|
:pseudo_global_color => :cyan, # e.g. $~, $1..$9, $LAST_MATCH_INFO
|
|
|
|
|
2012-04-04 17:15:23 -04:00
|
|
|
:constant_color => :default, # e.g. VERSION, ARGF
|
2011-10-08 19:47:21 -04:00
|
|
|
:class_constant_color => :blue, # e.g. Object, Kernel
|
|
|
|
:exception_constant_color => :magenta, # e.g. Exception, RuntimeError
|
2012-04-04 17:15:23 -04:00
|
|
|
:unloaded_constant_color => :yellow, # Any constant that is still in .autoload? state
|
2011-10-08 19:47:21 -04:00
|
|
|
|
|
|
|
# What should separate items listed by ls? (TODO: we should allow a columnar layout)
|
|
|
|
:separator => " ",
|
|
|
|
|
|
|
|
# Any methods defined on these classes, or modules included into these classes, will not
|
|
|
|
# be shown by ls unless the -v flag is used.
|
|
|
|
# A user of Rails may wih to add ActiveRecord::Base to the list.
|
|
|
|
# add the following to your .pryrc:
|
|
|
|
# Pry.config.ls.ceiling << ActiveRecord::Base if defined? ActiveRecordBase
|
|
|
|
:ceiling => [Object, Module, Class]
|
|
|
|
})
|
2011-05-23 06:29:02 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# Set all the configurable options back to their default values
|
|
|
|
def self.reset_defaults
|
2011-05-24 04:16:46 -04:00
|
|
|
set_config_defaults
|
2011-05-20 02:39:26 -04:00
|
|
|
|
2011-05-28 07:58:27 -04:00
|
|
|
@initial_session = true
|
|
|
|
|
|
|
|
self.custom_completions = DEFAULT_CUSTOM_COMPLETIONS
|
|
|
|
self.cli = false
|
2011-08-22 05:19:20 -04:00
|
|
|
self.current_line = 1
|
|
|
|
self.line_buffer = [""]
|
2011-05-28 07:58:27 -04:00
|
|
|
self.eval_path = "(pry)"
|
2011-10-19 01:49:11 -04:00
|
|
|
|
|
|
|
fix_coderay_colors
|
|
|
|
end
|
|
|
|
|
|
|
|
# To avoid mass-confusion, we change the default colour of "white" to
|
2011-10-25 01:17:27 -04:00
|
|
|
# "blue" enabling global legibility
|
2011-10-19 01:49:11 -04:00
|
|
|
def self.fix_coderay_colors
|
|
|
|
to_fix = if (CodeRay::Encoders::Terminal::TOKEN_COLORS rescue nil)
|
|
|
|
# CodeRay 1.0.0
|
|
|
|
CodeRay::Encoders::Terminal::TOKEN_COLORS
|
|
|
|
else
|
|
|
|
# CodeRay 0.9
|
|
|
|
begin
|
|
|
|
require 'coderay/encoders/term'
|
|
|
|
CodeRay::Encoders::Term::TOKEN_COLORS
|
2012-05-28 19:37:02 -04:00
|
|
|
rescue
|
2011-10-19 01:49:11 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-10-25 01:17:27 -04:00
|
|
|
to_fix[:comment] = "0;34" if to_fix
|
2010-12-25 08:59:37 -05:00
|
|
|
end
|
|
|
|
|
2011-05-18 23:31:21 -04:00
|
|
|
# Basic initialization.
|
|
|
|
def self.init
|
2011-05-20 02:39:26 -04:00
|
|
|
@plugin_manager ||= PluginManager.new
|
2011-05-28 07:58:27 -04:00
|
|
|
self.config ||= Config.new
|
2011-09-05 04:46:16 -04:00
|
|
|
self.history ||= History.new
|
2011-09-05 04:45:58 -04:00
|
|
|
|
2011-05-18 23:31:21 -04:00
|
|
|
reset_defaults
|
|
|
|
locate_plugins
|
|
|
|
end
|
2010-12-25 08:59:37 -05:00
|
|
|
|
2011-02-16 11:27:55 -05:00
|
|
|
# Return a `Binding` object for `target` or return `target` if it is
|
|
|
|
# already a `Binding`.
|
|
|
|
# In the case where `target` is top-level then return `TOPLEVEL_BINDING`
|
|
|
|
# @param [Object] target The object to get a `Binding` object for.
|
|
|
|
# @return [Binding] The `Binding` object.
|
|
|
|
def self.binding_for(target)
|
2012-04-05 15:01:45 -04:00
|
|
|
if Binding === target
|
2011-02-16 11:27:55 -05:00
|
|
|
target
|
|
|
|
else
|
2011-07-16 12:40:44 -04:00
|
|
|
if TOPLEVEL_BINDING.eval('self') == target
|
2011-02-16 11:27:55 -05:00
|
|
|
TOPLEVEL_BINDING
|
|
|
|
else
|
|
|
|
target.__binding__
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2011-05-18 23:31:21 -04:00
|
|
|
|
2012-10-13 17:00:36 -04:00
|
|
|
def self.toplevel_binding
|
2013-03-02 19:01:55 -05:00
|
|
|
unless defined?(@toplevel_binding) && @toplevel_binding
|
2012-10-13 17:00:36 -04:00
|
|
|
# Grab a copy of the TOPLEVEL_BINDING without any local variables.
|
|
|
|
# This binding has a default definee of Object, and new methods are
|
|
|
|
# private (just as in TOPLEVEL_BINDING).
|
|
|
|
TOPLEVEL_BINDING.eval <<-RUBY
|
|
|
|
def self.__pry__
|
|
|
|
binding
|
|
|
|
end
|
|
|
|
Pry.toplevel_binding = __pry__
|
|
|
|
class << self; undef __pry__; end
|
|
|
|
RUBY
|
|
|
|
end
|
|
|
|
@toplevel_binding.eval('private')
|
|
|
|
@toplevel_binding
|
|
|
|
end
|
2012-11-14 00:59:59 -05:00
|
|
|
|
2013-03-02 19:01:55 -05:00
|
|
|
def self.toplevel_binding=(binding)
|
|
|
|
@toplevel_binding = binding
|
|
|
|
end
|
|
|
|
|
2012-11-14 00:59:59 -05:00
|
|
|
def self.in_critical_section?
|
2013-03-02 19:01:55 -05:00
|
|
|
@critical_section ||= 0
|
|
|
|
@critical_section > 0
|
2012-11-14 00:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.critical_section(&block)
|
2013-03-02 19:01:55 -05:00
|
|
|
@critical_section ||= 0
|
|
|
|
@critical_section += 1
|
2012-11-14 00:59:59 -05:00
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
@critical_section -= 1
|
|
|
|
end
|
2012-06-11 01:57:40 -04:00
|
|
|
end
|
|
|
|
|
2011-05-18 23:31:21 -04:00
|
|
|
Pry.init
|