pry 0.9.4pre1-i386-mswin32 → 0.9.4pre2-i386-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +23 -0
- data/CONTRIBUTORS +13 -11
- data/README.markdown +2 -0
- data/Rakefile +16 -2
- data/TODO +8 -0
- data/lib/pry.rb +58 -9
- data/lib/pry/command_context.rb +11 -0
- data/lib/pry/command_processor.rb +43 -6
- data/lib/pry/command_set.rb +14 -4
- data/lib/pry/completion.rb +5 -5
- data/lib/pry/config.rb +6 -2
- data/lib/pry/default_commands/context.rb +83 -35
- data/lib/pry/default_commands/documentation.rb +37 -31
- data/lib/pry/default_commands/easter_eggs.rb +5 -0
- data/lib/pry/default_commands/input.rb +13 -10
- data/lib/pry/default_commands/introspection.rb +54 -40
- data/lib/pry/default_commands/shell.rb +9 -5
- data/lib/pry/helpers/base_helpers.rb +16 -5
- data/lib/pry/helpers/command_helpers.rb +41 -17
- data/lib/pry/helpers/text.rb +2 -1
- data/lib/pry/history.rb +61 -0
- data/lib/pry/plugins.rb +19 -8
- data/lib/pry/pry_class.rb +25 -62
- data/lib/pry/pry_instance.rb +105 -120
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +15 -14
- data/test/helper.rb +31 -0
- data/test/test_command_set.rb +7 -2
- data/test/test_completion.rb +7 -3
- data/test/test_default_commands/test_context.rb +185 -1
- data/test/test_default_commands/test_documentation.rb +10 -0
- data/test/test_default_commands/test_input.rb +16 -11
- data/test/test_default_commands/test_introspection.rb +10 -0
- data/test/test_default_commands/test_shell.rb +18 -0
- data/test/test_pry.rb +189 -40
- data/test/test_pry_history.rb +13 -13
- data/test/test_pry_output.rb +44 -0
- data/test/test_special_locals.rb +35 -0
- metadata +182 -173
data/CHANGELOG
CHANGED
@@ -8,6 +8,29 @@
|
|
8
8
|
* show-doc and stat now display method visibility (update WIKI)
|
9
9
|
* got rid of warnings caused by stricter ruby 1.9.3 rules
|
10
10
|
* remove interpolation of command names and fix interpolation error messag (update WIKI) (thanks ryanf!)
|
11
|
+
* 'nested sessions' now use binding stacks (so each instance manages its own collection of bindings without spawning other instances)
|
12
|
+
* changed `exit` command so that it now called Kernel#exit (after saving history)
|
13
|
+
* 'quit' now behaves like 'exit-all' (and aliased to exit-all) - it breaks out of the repl loop and sets empties the binding_stack
|
14
|
+
* 'cd ..' just pops a binding off the binding_stack with special behaviour when only one binding in stack - it breaks out of the repl loop
|
15
|
+
* added switch-to command (like jump-to but doesnt unwind the stack)
|
16
|
+
* show-method and show-doc now accept multiple method names
|
17
|
+
* control_d hook added (Pry.config.control_d_handler)
|
18
|
+
* behaviour of ^d is now to break out of current expr if in multi-line expr, or break out of current context if nested, or break out of pry repl loop if at top-level
|
19
|
+
* can no longer interpolate command name itself e.g #{x}-#{y} where x = "show" and y = "doc"
|
20
|
+
* ^C no longer captured
|
21
|
+
* got rid of Pry.active_instance, Pry.last_exception and friends.
|
22
|
+
* also special locals now shared among bindings in a pry instance (i.e _ex_ (and friends) re-injected into new binding entered with 'cd')
|
23
|
+
* renamed inp and out to _in_ and _out_ (to avoid collisions with actual locals in debugging scope)
|
24
|
+
* added third parameter to prompts, the pry instance itself (_pry) see https://github.com/pry/pry/issues/233 for why it's important
|
25
|
+
* cd behaviour when no args performs the same as `cd /`
|
26
|
+
* commands with keep_retval can now return nil (to suppress output now return 'void' instead)
|
27
|
+
* Pry::CommandProcessor::Result introduced
|
28
|
+
* Pry.view_clip() modified to be more robust and properly display Class#name
|
29
|
+
* edit command when invoked with no args now works like edit -t
|
30
|
+
* when edit is invoked (with no args or with -t) inside a multi-line expression input buffer, it dumps that buffer into a temp file and takes you to it
|
31
|
+
* got rid of Pry#null_input? since all that was needed was eval_string.empty?
|
32
|
+
* cd command now supports complex syntax: cd ../@y/y/../z
|
33
|
+
* JRuby is no longer a 2nd class citizen, almost full JRuby support, passing 100% tests
|
11
34
|
|
12
35
|
*/7/2011 version 0.9.3
|
13
36
|
* cat --ex (cats 5 lines above and below line in file where exception was raised)
|
data/CONTRIBUTORS
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
76 Rob Gleeson
|
3
|
-
|
4
|
-
46 Mon ouïe
|
5
|
-
18 David Palm
|
6
|
-
13 epitron
|
7
|
-
8 Conrad Irwin
|
8
|
-
6 Ryan Fitzgerald
|
9
|
-
2
|
10
|
-
2 Xavier Shay
|
11
|
-
|
1
|
+
564 John Mair
|
2
|
+
76 Rob Gleeson
|
3
|
+
50 Lee Jarvis
|
4
|
+
46 Mon ouïe
|
5
|
+
18 David Palm
|
6
|
+
13 epitron
|
7
|
+
8 Conrad Irwin
|
8
|
+
6 Ryan Fitzgerald
|
9
|
+
2 Darrick Wiebe
|
10
|
+
2 Xavier Shay
|
11
|
+
2 Eric Christopherson
|
12
|
+
1 Josh Cheek
|
13
|
+
1 Tim Pope
|
data/README.markdown
CHANGED
@@ -6,6 +6,8 @@ _Get to the code_
|
|
6
6
|
|
7
7
|
**Note that JRuby is not yet supported in this release, but will be
|
8
8
|
soon.**
|
9
|
+
|
10
|
+
**Please** [DONATE](http://www.pledgie.com/campaigns/15899) to the Pry project - Pry was a **huge** amount of work and every donation received is encouraging and supports Pry's continued development!
|
9
11
|
|
10
12
|
[Skip to the website (recommended)](http://pry.github.com) <br />
|
11
13
|
[Skip to the wiki](https://github.com/pry/pry/wiki)
|
data/Rakefile
CHANGED
@@ -22,8 +22,8 @@ def apply_spec_defaults(s)
|
|
22
22
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
23
23
|
s.add_dependency("ruby_parser",">=2.0.5")
|
24
24
|
s.add_dependency("coderay",">=0.9.8")
|
25
|
-
s.add_dependency("slop","~>1.
|
26
|
-
s.add_dependency("method_source",">=0.6.
|
25
|
+
s.add_dependency("slop","~>2.1.0")
|
26
|
+
s.add_dependency("method_source",">=0.6.5")
|
27
27
|
s.add_development_dependency("bacon",">=1.1.0")
|
28
28
|
s.add_development_dependency("open4", "~>1.0.1")
|
29
29
|
end
|
@@ -62,6 +62,20 @@ namespace :ruby do
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
namespace :jruby do
|
66
|
+
spec = Gem::Specification.new do |s|
|
67
|
+
apply_spec_defaults(s)
|
68
|
+
s.add_dependency("spoon", ">=0.0.1")
|
69
|
+
s.platform = "java"
|
70
|
+
end
|
71
|
+
|
72
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
73
|
+
pkg.need_zip = false
|
74
|
+
pkg.need_tar = false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
65
79
|
[:mingw32, :mswin32].each do |v|
|
66
80
|
namespace v do
|
67
81
|
spec = Gem::Specification.new do |s|
|
data/TODO
CHANGED
@@ -12,6 +12,14 @@
|
|
12
12
|
* fix history saving (should not save all of Readline::HISTORY, but only what changed)
|
13
13
|
* prevent blank lines going to Readline::HISTORY
|
14
14
|
* ensure that cat --ex emulates the `whereami` format - includes line numbers and formatted the same, etc
|
15
|
+
* rename inp and out to _inp_ and _out_ otherwise than can overwrite locals by those names when debugging (not good)
|
16
|
+
* add source file to stat command
|
17
|
+
* make plugins use hash instead of array
|
18
|
+
* ensure edit -t has 'edit' alias (no parameters) and dumps eval_string into buffer
|
19
|
+
* whitelist exceptions
|
20
|
+
* hooks system
|
21
|
+
* jruby shell command support
|
22
|
+
*
|
15
23
|
|
16
24
|
0.9.3
|
17
25
|
* hist command now excludes last line of input (the command invocation itself)
|
data/lib/pry.rb
CHANGED
@@ -19,11 +19,20 @@ class Pry
|
|
19
19
|
|
20
20
|
# The default prints
|
21
21
|
DEFAULT_PRINT = proc do |output, value|
|
22
|
-
begin
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
stringified = begin
|
23
|
+
value.pretty_inspect
|
24
|
+
rescue RescuableException => ex
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
unless String === stringified
|
29
|
+
# Read the class name off of the singleton class to provide a default inspect.
|
30
|
+
klass = (class << value; self; end).ancestors.first
|
31
|
+
stringified = "#<#{klass}:0x#{value.__id__.to_s(16)}>"
|
32
|
+
Helpers::BaseHelpers.stagger_output("output error: #{ex.inspect}", output) if ex
|
26
33
|
end
|
34
|
+
|
35
|
+
Helpers::BaseHelpers.stagger_output("=> #{Helpers::BaseHelpers.colorize_code(stringified)}", output)
|
27
36
|
end
|
28
37
|
|
29
38
|
# Will only show the first line of the backtrace
|
@@ -34,7 +43,7 @@ class Pry
|
|
34
43
|
|
35
44
|
# The default prompt; includes the target and nesting level
|
36
45
|
DEFAULT_PROMPT = [
|
37
|
-
proc { |target_self, nest_level|
|
46
|
+
proc { |target_self, nest_level, _|
|
38
47
|
if nest_level == 0
|
39
48
|
"pry(#{Pry.view_clip(target_self)})> "
|
40
49
|
else
|
@@ -42,23 +51,62 @@ class Pry
|
|
42
51
|
end
|
43
52
|
},
|
44
53
|
|
45
|
-
proc { |target_self, nest_level|
|
54
|
+
proc { |target_self, nest_level, _|
|
46
55
|
if nest_level == 0
|
47
56
|
"pry(#{Pry.view_clip(target_self)})* "
|
48
57
|
else
|
49
58
|
"pry(#{Pry.view_clip(target_self)}):#{Pry.view_clip(nest_level)}* "
|
50
59
|
end
|
51
60
|
}
|
52
|
-
|
61
|
+
]
|
62
|
+
# Deal with the ^D key being pressed, different behaviour in
|
63
|
+
# different cases:
|
64
|
+
# 1) In an expression - behave like `!` command (clear input buffer)
|
65
|
+
# 2) At top-level session - behave like `exit command (break out of repl loop)
|
66
|
+
# 3) In a nested session - behave like `cd ..` (pop a binding)
|
67
|
+
DEFAULT_CONTROL_D_HANDLER = proc do |eval_string, _pry_|
|
68
|
+
if !eval_string.empty?
|
69
|
+
# clear input buffer
|
70
|
+
eval_string.replace("")
|
71
|
+
elsif _pry_.binding_stack.one?
|
72
|
+
# ^D at top-level breaks out of loop
|
73
|
+
_pry_.binding_stack.clear
|
74
|
+
throw(:breakout)
|
75
|
+
else
|
76
|
+
# otherwise just pops a binding
|
77
|
+
_pry_.binding_stack.pop
|
78
|
+
end
|
79
|
+
end
|
53
80
|
|
54
81
|
# A simple prompt - doesn't display target or nesting level
|
55
82
|
SIMPLE_PROMPT = [proc { ">> " }, proc { " | " }]
|
56
83
|
|
57
84
|
SHELL_PROMPT = [
|
58
|
-
proc { |target_self, _| "pry #{Pry.view_clip(target_self)}:#{Dir.pwd} $ " },
|
59
|
-
proc { |target_self, _| "pry #{Pry.view_clip(target_self)}:#{Dir.pwd} * " }
|
85
|
+
proc { |target_self, _, _| "pry #{Pry.view_clip(target_self)}:#{Dir.pwd} $ " },
|
86
|
+
proc { |target_self, _, _| "pry #{Pry.view_clip(target_self)}:#{Dir.pwd} * " }
|
60
87
|
]
|
61
88
|
|
89
|
+
# As a REPL, we often want to catch any unexpected exceptions that may have
|
90
|
+
# been raised; however we don't want to go overboard and prevent the user
|
91
|
+
# from exiting Pry when they want to.
|
92
|
+
module RescuableException
|
93
|
+
def self.===(exception)
|
94
|
+
case exception
|
95
|
+
# Catch when the user hits ^C (Interrupt < SignalException), and assume
|
96
|
+
# that they just wanted to stop the in-progress command (just like bash etc.)
|
97
|
+
when Interrupt
|
98
|
+
true
|
99
|
+
# Don't catch signals (particularly not SIGTERM) as these are unlikely to be
|
100
|
+
# intended for pry itself. We should also make sure that Kernel#exit works.
|
101
|
+
when SystemExit, SignalException
|
102
|
+
false
|
103
|
+
# All other exceptions will be caught.
|
104
|
+
else
|
105
|
+
true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
62
110
|
end
|
63
111
|
|
64
112
|
require "method_source"
|
@@ -82,6 +130,7 @@ end
|
|
82
130
|
require "pry/version"
|
83
131
|
require "pry/history_array"
|
84
132
|
require "pry/helpers"
|
133
|
+
require "pry/history"
|
85
134
|
require "pry/command_set"
|
86
135
|
require "pry/commands"
|
87
136
|
require "pry/command_context"
|
data/lib/pry/command_context.rb
CHANGED
@@ -2,6 +2,13 @@ class Pry
|
|
2
2
|
# Command contexts are the objects runing each command.
|
3
3
|
# Helper modules can be mixed into this class.
|
4
4
|
class CommandContext
|
5
|
+
|
6
|
+
# represents a void return value for a command
|
7
|
+
VOID_VALUE = Object.new
|
8
|
+
|
9
|
+
# give it a nice inspect
|
10
|
+
def VOID_VALUE.inspect() "void" end
|
11
|
+
|
5
12
|
attr_accessor :output
|
6
13
|
attr_accessor :target
|
7
14
|
attr_accessor :captures
|
@@ -34,6 +41,10 @@ class Pry
|
|
34
41
|
Pry::Helpers::Text
|
35
42
|
end
|
36
43
|
|
44
|
+
def void
|
45
|
+
VOID_VALUE
|
46
|
+
end
|
47
|
+
|
37
48
|
include Pry::Helpers::BaseHelpers
|
38
49
|
include Pry::Helpers::CommandHelpers
|
39
50
|
end
|
@@ -2,6 +2,36 @@ require 'forwardable'
|
|
2
2
|
|
3
3
|
class Pry
|
4
4
|
class CommandProcessor
|
5
|
+
|
6
|
+
# Wraps the return result of process_commands, indicates if the
|
7
|
+
# result IS a command and what kind of command (e.g void)
|
8
|
+
class Result
|
9
|
+
attr_reader :retval
|
10
|
+
|
11
|
+
def initialize(is_command, keep_retval = false, retval = nil)
|
12
|
+
@is_command, @keep_retval, @retval = is_command, keep_retval, retval
|
13
|
+
end
|
14
|
+
|
15
|
+
# Is the result a command?
|
16
|
+
# @return [Boolean]
|
17
|
+
def command?
|
18
|
+
@is_command
|
19
|
+
end
|
20
|
+
|
21
|
+
# Is the result a command and if it is, is it a void command?
|
22
|
+
# (one that does not return a value)
|
23
|
+
# @return [Boolean]
|
24
|
+
def void_command?
|
25
|
+
(command? && !keep_retval?) || retval == CommandContext::VOID_VALUE
|
26
|
+
end
|
27
|
+
|
28
|
+
# Is the return value kept for this command? (i.e :keep_retval => true)
|
29
|
+
# @return [Boolean]
|
30
|
+
def keep_retval?
|
31
|
+
@keep_retval
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
5
35
|
extend Forwardable
|
6
36
|
|
7
37
|
attr_accessor :pry_instance
|
@@ -10,7 +40,7 @@ class Pry
|
|
10
40
|
@pry_instance = pry_instance
|
11
41
|
end
|
12
42
|
|
13
|
-
def_delegators :@pry_instance, :commands, :
|
43
|
+
def_delegators :@pry_instance, :commands, :output
|
14
44
|
|
15
45
|
# Is the string a valid command?
|
16
46
|
# @param [String] val The string passed in from the Pry prompt.
|
@@ -80,11 +110,17 @@ class Pry
|
|
80
110
|
# @param [String] eval_string The cumulative lines of input for
|
81
111
|
# multi-line input.
|
82
112
|
# @param [Binding] target The receiver of the commands.
|
113
|
+
# @return [Pry::CommandProcessor::Result] A wrapper object
|
114
|
+
# containing info about the result of the command processing
|
115
|
+
# (indicating whether it is a command and if it is what kind of
|
116
|
+
# command it is.
|
83
117
|
def process_commands(val, eval_string, target)
|
84
118
|
|
85
|
-
# no command was matched, so return to caller
|
86
119
|
command, captures, pos = command_matched(val, target)
|
87
|
-
|
120
|
+
|
121
|
+
# no command was matched, so return to caller
|
122
|
+
return Result.new(false) if !command
|
123
|
+
|
88
124
|
arg_string = val[pos..-1]
|
89
125
|
|
90
126
|
# remove the one leading space if it exists
|
@@ -96,12 +132,13 @@ class Pry
|
|
96
132
|
:val => val,
|
97
133
|
:arg_string => arg_string,
|
98
134
|
:eval_string => eval_string,
|
99
|
-
:nesting => nesting,
|
100
135
|
:commands => commands.commands,
|
101
136
|
:captures => captures
|
102
137
|
}
|
103
138
|
|
104
|
-
execute_command(target, command.name, options, *(captures + args))
|
139
|
+
ret = execute_command(target, command.name, options, *(captures + args))
|
140
|
+
|
141
|
+
Result.new(true, command.options[:keep_retval], ret)
|
105
142
|
end
|
106
143
|
|
107
144
|
# Execute a Pry command.
|
@@ -110,6 +147,7 @@ class Pry
|
|
110
147
|
# @param [String] command The name of the command to be run.
|
111
148
|
# @param [Hash] options The options to set on the Commands object.
|
112
149
|
# @param [Array] args The command arguments.
|
150
|
+
# @return [Object] The value returned by the command
|
113
151
|
def execute_command(target, command, options, *args)
|
114
152
|
context = CommandContext.new
|
115
153
|
|
@@ -127,7 +165,6 @@ class Pry
|
|
127
165
|
|
128
166
|
ret = commands.run_command(context, command, *args)
|
129
167
|
|
130
|
-
# Tick, tock, im getting rid of this shit soon.
|
131
168
|
options[:val].replace("")
|
132
169
|
|
133
170
|
ret
|
data/lib/pry/command_set.rb
CHANGED
@@ -15,7 +15,11 @@ class Pry
|
|
15
15
|
context.instance_eval(&stub_block)
|
16
16
|
else
|
17
17
|
ret = context.instance_exec(*correct_arg_arity(block.arity, args), &block)
|
18
|
-
|
18
|
+
if options[:keep_retval]
|
19
|
+
ret
|
20
|
+
else
|
21
|
+
Pry::CommandContext::VOID_VALUE
|
22
|
+
end
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
@@ -24,9 +28,15 @@ class Pry
|
|
24
28
|
case arity <=> 0
|
25
29
|
when -1
|
26
30
|
args
|
27
|
-
when
|
28
|
-
|
29
|
-
|
31
|
+
when 0
|
32
|
+
[]
|
33
|
+
when 1
|
34
|
+
# another jruby hack
|
35
|
+
if Pry::Helpers::BaseHelpers.jruby?
|
36
|
+
args[0..(arity - 1)]
|
37
|
+
else
|
38
|
+
args.values_at 0..(arity - 1)
|
39
|
+
end
|
30
40
|
end
|
31
41
|
end
|
32
42
|
end
|
data/lib/pry/completion.rb
CHANGED
@@ -94,7 +94,7 @@ class Pry
|
|
94
94
|
begin
|
95
95
|
candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
|
96
96
|
candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
|
97
|
-
rescue
|
97
|
+
rescue RescuableException
|
98
98
|
candidates = []
|
99
99
|
end
|
100
100
|
candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
|
@@ -114,7 +114,7 @@ class Pry
|
|
114
114
|
|
115
115
|
begin
|
116
116
|
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
117
|
-
rescue
|
117
|
+
rescue RescuableException
|
118
118
|
candidates = []
|
119
119
|
end
|
120
120
|
select_message(receiver, message, candidates)
|
@@ -126,7 +126,7 @@ class Pry
|
|
126
126
|
|
127
127
|
begin
|
128
128
|
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
129
|
-
rescue
|
129
|
+
rescue RescuableException
|
130
130
|
candidates = []
|
131
131
|
end
|
132
132
|
select_message(receiver, message, candidates)
|
@@ -149,7 +149,7 @@ class Pry
|
|
149
149
|
# Foo::Bar.func
|
150
150
|
begin
|
151
151
|
candidates = eval("#{receiver}.methods", bind).collect{|m| m.to_s}
|
152
|
-
rescue
|
152
|
+
rescue RescuableException
|
153
153
|
candidates = []
|
154
154
|
end
|
155
155
|
else
|
@@ -158,7 +158,7 @@ class Pry
|
|
158
158
|
ObjectSpace.each_object(Module){|m|
|
159
159
|
begin
|
160
160
|
name = m.name.to_s
|
161
|
-
rescue
|
161
|
+
rescue RescuableException
|
162
162
|
name = ""
|
163
163
|
end
|
164
164
|
next if name != "IRB::Context" and
|
data/lib/pry/config.rb
CHANGED
@@ -51,9 +51,9 @@ class Pry
|
|
51
51
|
# return value of that callable invocation is used as the exact
|
52
52
|
# shell command to invoke the editor.
|
53
53
|
# @example String
|
54
|
-
# Pry.editor = "emacsclient"
|
54
|
+
# Pry.config.editor = "emacsclient"
|
55
55
|
# @example Callable
|
56
|
-
# Pry.editor = proc { |file, line| "emacsclient #{file} +#{line}" }
|
56
|
+
# Pry.config.editor = proc { |file, line| "emacsclient #{file} +#{line}" }
|
57
57
|
# @return [String, #call]
|
58
58
|
attr_accessor :editor
|
59
59
|
|
@@ -107,6 +107,10 @@ class Pry
|
|
107
107
|
|
108
108
|
# @return [Integer] Amount of results that will be stored into out
|
109
109
|
attr_accessor :memory_size
|
110
|
+
|
111
|
+
# @return [Proc] The proc that manages ^D presses in the REPL.
|
112
|
+
# The proc is passed the current eval_string and the current pry instance.
|
113
|
+
attr_accessor :control_d_handler
|
110
114
|
end
|
111
115
|
end
|
112
116
|
|
@@ -6,75 +6,122 @@ class Pry
|
|
6
6
|
Context = Pry::CommandSet.new do
|
7
7
|
import Ls
|
8
8
|
|
9
|
-
command "cd", "
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
9
|
+
command "cd", "Move into a new context (use `cd ..` to go back and `cd /` to return to Pry top-level). Complex syntax (e.g cd ../@x/y) also supported." do |obj|
|
10
|
+
path = arg_string.split(/\//)
|
11
|
+
stack = _pry_.binding_stack.dup
|
12
|
+
|
13
|
+
# special case when we only get a single "/", return to root
|
14
|
+
stack = [stack.first] if path.empty?
|
15
|
+
|
16
|
+
resolve_failure = false
|
17
|
+
path.each do |context|
|
18
|
+
begin
|
19
|
+
case context.chomp
|
20
|
+
when ""
|
21
|
+
stack = [stack.first]
|
22
|
+
when "::"
|
23
|
+
stack.push(TOPLEVEL_BINDING)
|
24
|
+
when "."
|
25
|
+
next
|
26
|
+
when ".."
|
27
|
+
if stack.one?
|
28
|
+
_pry_.binding_stack.clear
|
29
|
+
throw(:breakout)
|
30
|
+
else
|
31
|
+
stack.pop
|
32
|
+
end
|
33
|
+
else
|
34
|
+
stack.push(Pry.binding_for(stack.last.eval(context)))
|
35
|
+
end
|
36
|
+
|
37
|
+
rescue RescuableException
|
38
|
+
output.puts "Bad object path: #{arg_string}. Failed trying to resolve: #{context}"
|
39
|
+
resolve_failure = true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
next if resolve_failure
|
44
|
+
|
45
|
+
_pry_.binding_stack = stack
|
46
|
+
end
|
47
|
+
|
48
|
+
command "switch-to", "Start a new sub-session on a binding in the current stack (numbered by nesting)." do |selection|
|
49
|
+
selection = selection.to_i
|
50
|
+
|
51
|
+
if selection < 0 || selection > _pry_.binding_stack.size - 1
|
52
|
+
output.puts "Invalid binding index #{selection} - use `nesting` command to view valid indices."
|
22
53
|
else
|
23
|
-
Pry.start
|
54
|
+
Pry.start(_pry_.binding_stack[selection])
|
24
55
|
end
|
25
56
|
end
|
26
57
|
|
27
58
|
command "nesting", "Show nesting information." do
|
28
|
-
nesting = opts[:nesting]
|
29
|
-
|
30
59
|
output.puts "Nesting status:"
|
31
60
|
output.puts "--"
|
32
|
-
|
61
|
+
_pry_.binding_stack.each_with_index do |obj, level|
|
33
62
|
if level == 0
|
34
|
-
output.puts "#{level}. #{Pry.view_clip(obj)} (Pry top level)"
|
63
|
+
output.puts "#{level}. #{Pry.view_clip(obj.eval('self'))} (Pry top level)"
|
35
64
|
else
|
36
|
-
output.puts "#{level}. #{Pry.view_clip(obj)}"
|
65
|
+
output.puts "#{level}. #{Pry.view_clip(obj.eval('self'))}"
|
37
66
|
end
|
38
67
|
end
|
39
68
|
end
|
40
69
|
|
41
|
-
command "jump-to", "Jump to a
|
70
|
+
command "jump-to", "Jump to a binding further up the stack, popping all bindings below." do |break_level|
|
42
71
|
break_level = break_level.to_i
|
43
|
-
|
72
|
+
nesting_level = _pry_.binding_stack.size - 1
|
44
73
|
|
45
74
|
case break_level
|
46
|
-
when
|
47
|
-
output.puts "Already at nesting level #{
|
48
|
-
when (0...
|
49
|
-
|
75
|
+
when nesting_level
|
76
|
+
output.puts "Already at nesting level #{nesting_level}"
|
77
|
+
when (0...nesting_level)
|
78
|
+
_pry_.binding_stack.slice!(break_level + 1, _pry_.binding_stack.size)
|
79
|
+
|
50
80
|
else
|
51
|
-
max_nest_level =
|
81
|
+
max_nest_level = nesting_level - 1
|
52
82
|
output.puts "Invalid nest level. Must be between 0 and #{max_nest_level}. Got #{break_level}."
|
53
83
|
end
|
54
84
|
end
|
55
85
|
|
56
|
-
command "exit", "End the current Pry session. Accepts optional return value. Aliases:
|
57
|
-
|
86
|
+
command "exit-all", "End the current Pry session (popping all bindings) and returning to caller. Accepts optional return value. Aliases: !!@" do
|
87
|
+
# clear the binding stack
|
88
|
+
_pry_.binding_stack.clear
|
89
|
+
|
90
|
+
# break out of the repl loop
|
91
|
+
throw(:breakout, target.eval(arg_string))
|
58
92
|
end
|
59
93
|
|
60
|
-
alias_command "
|
61
|
-
|
94
|
+
alias_command "!!@", "exit-all", ""
|
95
|
+
|
96
|
+
command "exit", "Pop the current binding and return to the one immediately prior. Note this does NOT exit the program. Aliases: quit", :keep_retval => true do
|
97
|
+
if _pry_.binding_stack.one?
|
98
|
+
# when breaking out of top-level then behave like `exit-all`
|
99
|
+
_pry_.binding_stack.clear
|
100
|
+
throw(:breakout, target.eval(arg_string))
|
101
|
+
else
|
102
|
+
# otherwise just pop a binding
|
103
|
+
popped_object = _pry_.binding_stack.pop.eval('self')
|
62
104
|
|
63
|
-
|
64
|
-
|
105
|
+
# return a user-specified value if given
|
106
|
+
if !arg_string.empty?
|
107
|
+
target.eval(arg_string)
|
108
|
+
else
|
109
|
+
popped_object
|
110
|
+
end
|
111
|
+
end
|
65
112
|
end
|
66
113
|
|
67
|
-
alias_command "
|
114
|
+
alias_command "quit", "exit", ""
|
68
115
|
|
69
116
|
command "exit-program", "End the current program. Aliases: quit-program, !!!" do
|
70
117
|
Pry.save_history if Pry.config.history.should_save
|
71
|
-
exit
|
118
|
+
Kernel.exit target.eval(arg_string).to_i
|
72
119
|
end
|
73
120
|
|
74
121
|
alias_command "quit-program", "exit-program", ""
|
75
122
|
alias_command "!!!", "exit-program", ""
|
76
123
|
|
77
|
-
command "!pry", "Start a Pry session on current self; this even works mid-expression." do
|
124
|
+
command "!pry", "Start a Pry session on current self; this even works mid multi-line expression." do
|
78
125
|
target.pry
|
79
126
|
end
|
80
127
|
|
@@ -100,6 +147,7 @@ class Pry
|
|
100
147
|
set_file_and_dir_locals(file)
|
101
148
|
output.puts "\n#{text.bold('From:')} #{file} @ line #{line_num} in #{klass}##{meth_name}:\n\n"
|
102
149
|
|
150
|
+
|
103
151
|
# This method inspired by http://rubygems.org/gems/ir_b
|
104
152
|
File.open(file).each_with_index do |line, index|
|
105
153
|
line_n = index + 1
|