Class: Pry::ObjectPath
Overview
‘ObjectPath` implements the resolution of “object paths”, which are strings that are similar to filesystem paths but meant for traversing Ruby objects. Examples of valid object paths include:
x
@foo/@bar
"string"/upcase
Pry/Method
Object paths are mostly relevant in the context of the ‘cd` command.
Constant Summary collapse
- SPECIAL_TERMS =
["", "::", ".", ".."]
Instance Method Summary collapse
-
#initialize(path_string, current_stack) ⇒ ObjectPath
constructor
A new instance of ObjectPath.
-
#resolve ⇒ Array<Binding>
A new stack resulting from applying the given path to the current stack.
Constructor Details
#initialize(path_string, current_stack) ⇒ ObjectPath
Returns a new instance of ObjectPath.
19 20 21 22 |
# File 'lib/pry/object_path.rb', line 19 def initialize(path_string, current_stack) @path_string = path_string @current_stack = current_stack end |
Instance Method Details
#resolve ⇒ Array<Binding>
Returns a new stack resulting from applying the given path to the current stack.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/pry/object_path.rb', line 26 def resolve scanner = StringScanner.new(@path_string.strip) stack = @current_stack.dup begin next_segment = "" loop do # Scan for as long as we don't see a slash next_segment << scanner.scan(/[^\/]*/) 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 until scanner.eos? stack end |