class Pry::ObjectPath
@see github.com/pry/pry/wiki/State-navigation<br>Object paths are mostly relevant in the context of the ‘cd` command.
Pry/Method
“string”/upcase
@foo/@bar
x
Examples of valid object paths include:
that are similar to filesystem paths but meant for traversing Ruby objects.
`ObjectPath` implements the resolution of “object paths”, which are strings
def complete?(segment)
def complete?(segment) SPECIAL_TERMS.include?(segment) || Pry::Code.complete_expression?(segment) end
def handle_failure(context, err)
def handle_failure(context, err) msg = [ "Bad object path: #{@path_string.inspect}", "Failed trying to resolve: #{context.inspect}", "Exception: #{err.inspect}" ].join("\n") command_error = CommandError.new(msg) command_error.set_backtrace(err.backtrace) raise command_error end
def initialize(path_string, current_stack)
-
current_stack(Array) -- The current state of the binding -
path_string(String) -- The object path expressed as a string.
def initialize(path_string, current_stack) @path_string = path_string @current_stack = current_stack end
def resolve
-
(Array- a new stack resulting from applying the given)
def resolve scanner = StringScanner.new(@path_string.strip) stack = @current_stack.dup loop do begin next_segment = "" loop do # Scan for as long as we don't see a slash next_segment += scanner.scan(%r{[^/]*}) if complete?(next_segment) || scanner.eos? scanner.getch # consume the slash break else next_segment += scanner.getch # append the slash end end case next_segment.chomp when "" stack = [stack.first] when "::" stack.push(TOPLEVEL_BINDING) when "." next when ".." stack.pop unless stack.size == 1 else stack.push(Pry.binding_for(stack.last.eval(next_segment))) end rescue RescuableException => e return handle_failure(next_segment, e) end break if scanner.eos? end stack end