diff --git a/lib/pry/default_commands/cd.rb b/lib/pry/default_commands/cd.rb index d0934dcc..97a435f4 100644 --- a/lib/pry/default_commands/cd.rb +++ b/lib/pry/default_commands/cd.rb @@ -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 diff --git a/lib/pry/helpers/base_helpers.rb b/lib/pry/helpers/base_helpers.rb index 01736845..a91283cf 100644 --- a/lib/pry/helpers/base_helpers.rb +++ b/lib/pry/helpers/base_helpers.rb @@ -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] old_stack The state of the old binding stack + # @return [Array, Array>] 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