Skip to content

Commit

Permalink
Merge pull request #2 from pry/tabcomplete_take2
Browse files Browse the repository at this point in the history
Renamed Pry.get_context and moved to a more suitable place
  • Loading branch information
jasonLaster committed Aug 5, 2012
2 parents cfd36d8 + f4af4ea commit 25de725
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 68 deletions.
58 changes: 1 addition & 57 deletions lib/pry/default_commands/cd.rb
Expand Up @@ -22,7 +22,7 @@ module DefaultCommands
BANNER BANNER


def process 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 state.old_stack = old_stack
_pry_.binding_stack = stack unless stack.nil? _pry_.binding_stack = stack unless stack.nil?
end end
Expand All @@ -31,61 +31,5 @@ def process
end end
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 end


82 changes: 71 additions & 11 deletions lib/pry/helpers/base_helpers.rb
Expand Up @@ -70,7 +70,7 @@ def create_command_stub(names, description, options, block)
end end


def use_ansi_codes? def use_ansi_codes?
windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb" windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb"
end end


def colorize_code(code) def colorize_code(code)
Expand Down Expand Up @@ -141,16 +141,16 @@ def simple_pager(text, output=output())
# FIXME! Another JRuby hack # FIXME! Another JRuby hack
def stagger_output(text, out = nil) def stagger_output(text, out = nil)
out ||= case out ||= case
when respond_to?(:output) when respond_to?(:output)
# Mixin. # Mixin.
output output
when Pry.respond_to?(:output) when Pry.respond_to?(:output)
# Parent. # Parent.
Pry.output Pry.output
else else
# Sys. # Sys.
$stdout $stdout
end end


if text.lines.count < page_size || !Pry.pager if text.lines.count < page_size || !Pry.pager
out.puts text out.puts text
Expand Down Expand Up @@ -222,6 +222,66 @@ def lesspipe(*args)
end end
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 end
end end

0 comments on commit 25de725

Please sign in to comment.