Renamed Pry.get_context and moved to a more suitable place

This commit is contained in:
John Mair 2012-08-06 07:36:00 +12:00 committed by Jason Laster
parent 5e4463b50d
commit 5b292ff0f5
2 changed files with 72 additions and 68 deletions

View File

@ -22,7 +22,7 @@ class Pry
BANNER
def process
stack, old_stack = Pry.get_context(arg_string, _pry_, state.old_stack||[])
stack, old_stack = context_from_object_path(arg_string, _pry_, state.old_stack||[])
state.old_stack = old_stack
_pry_.binding_stack = stack unless stack.nil?
end
@ -31,61 +31,5 @@ class Pry
end
end
def self.get_context(arg_string, pry=nil, old_stack=[])
# Extract command arguments. Delete blank arguments like " ", but
# don't delete empty strings like "".
path = arg_string.split(/\//).delete_if { |a| a =~ /\A\s+\z/ }
stack = pry.binding_stack.dup
state_old_stack = old_stack
# Special case when we only get a single "/", return to root.
if path.empty?
state_old_stack = stack.dup unless old_stack.empty?
stack = [stack.first]
end
path.each_with_index do |context, i|
begin
case context.chomp
when ""
state_old_stack = stack.dup
stack = [stack.first]
when "::"
state_old_stack = stack.dup
stack.push(TOPLEVEL_BINDING)
when "."
next
when ".."
unless stack.size == 1
# Don't rewrite old_stack if we're in complex expression
# (e.g.: `cd 1/2/3/../4).
state_old_stack = stack.dup if path.first == ".."
stack.pop
end
when "-"
unless old_stack.empty?
# Interchange current stack and old stack with each other.
stack, state_old_stack = state_old_stack, stack
end
else
state_old_stack = stack.dup if i == 0
stack.push(Pry.binding_for(stack.last.eval(context)))
end
rescue RescuableException => e
# Restore old stack to its initial values.
state_old_stack = old_stack
output.puts "Bad object path: #{arg_string.chomp}. Failed trying to resolve: #{context}"
output.puts e.inspect
return nil, state_old_stack
end
end
return stack, state_old_stack
end
end

View File

@ -70,7 +70,7 @@ class Pry
end
def use_ansi_codes?
windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb"
windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb"
end
def colorize_code(code)
@ -141,16 +141,16 @@ class Pry
# FIXME! Another JRuby hack
def stagger_output(text, out = nil)
out ||= case
when respond_to?(:output)
# Mixin.
output
when Pry.respond_to?(:output)
# Parent.
Pry.output
else
# Sys.
$stdout
end
when respond_to?(:output)
# Mixin.
output
when Pry.respond_to?(:output)
# Parent.
Pry.output
else
# Sys.
$stdout
end
if text.lines.count < page_size || !Pry.pager
out.puts text
@ -222,6 +222,66 @@ class Pry
end
end
# @param [String] arg_string The object path expressed as a string.
# @param [Pry] _pry_ The relevant Pry instance.
# @param [Array<Binding>] old_stack The state of the old binding stack
# @return [Array<Array<Binding>, Array<Binding>>] An array
# containing two elements: The new `binding_stack` and the old `binding_stack`.
def context_from_object_path(arg_string, _pry_=nil, old_stack=[])
# Extract command arguments. Delete blank arguments like " ", but
# don't delete empty strings like "".
path = arg_string.split(/\//).delete_if { |a| a =~ /\A\s+\z/ }
stack = _pry_.binding_stack.dup
state_old_stack = old_stack
# Special case when we only get a single "/", return to root.
if path.empty?
state_old_stack = stack.dup unless old_stack.empty?
stack = [stack.first]
end
path.each_with_index do |context, i|
begin
case context.chomp
when ""
state_old_stack = stack.dup
stack = [stack.first]
when "::"
state_old_stack = stack.dup
stack.push(TOPLEVEL_BINDING)
when "."
next
when ".."
unless stack.size == 1
# Don't rewrite old_stack if we're in complex expression
# (e.g.: `cd 1/2/3/../4).
state_old_stack = stack.dup if path.first == ".."
stack.pop
end
when "-"
unless old_stack.empty?
# Interchange current stack and old stack with each other.
stack, state_old_stack = state_old_stack, stack
end
else
state_old_stack = stack.dup if i == 0
stack.push(Pry.binding_for(stack.last.eval(context)))
end
rescue RescuableException => e
# Restore old stack to its initial values.
state_old_stack = old_stack
output.puts "Bad object path: #{arg_string.chomp}. Failed trying to resolve: #{context}"
output.puts e.inspect
return nil, state_old_stack
end
end
return stack, state_old_stack
end
end
end
end