pry-stack_explorer 0.3.9 → 0.4.0
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/README.md +1 -0
- data/lib/pry-stack_explorer/commands.rb +80 -51
- data/lib/pry-stack_explorer/version.rb +1 -1
- data/pry-stack_explorer.gemspec +2 -2
- data/test/test_commands.rb +79 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -33,6 +33,7 @@ After installing `pry-stack_explorer`, just start Pry as normal (typically via a
|
|
33
33
|
* Install the [gem](https://rubygems.org/gems/pry-stack_explorer): `gem install pry-stack_explorer`
|
34
34
|
* Read the [documentation](http://rdoc.info/github/banister/pry-stack_explorer/master/file/README.md)
|
35
35
|
* See the [source code](http://github.com/pry/pry-stack_explorer)
|
36
|
+
* See the [wiki](https://github.com/pry/pry-stack_explorer/wiki) for in-depth usage information.
|
36
37
|
|
37
38
|
Example: Moving around between frames
|
38
39
|
--------
|
@@ -85,50 +85,118 @@ module PryStackExplorer
|
|
85
85
|
"#{meth_obj.name_with_owner}(UNKNOWN) (undefined method)"
|
86
86
|
end
|
87
87
|
end
|
88
|
+
|
89
|
+
# Regexp.new(args[0])
|
90
|
+
def find_frame_by_regex(regex, up_or_down)
|
91
|
+
start_index = frame_manager.binding_index
|
92
|
+
|
93
|
+
if up_or_down == :down
|
94
|
+
enum = frame_manager.bindings[0..start_index - 1].reverse_each
|
95
|
+
else
|
96
|
+
enum = frame_manager.bindings[start_index + 1..-1]
|
97
|
+
end
|
98
|
+
|
99
|
+
new_frame = enum.find do |b|
|
100
|
+
b.eval("__method__").to_s =~ regex
|
101
|
+
end
|
102
|
+
|
103
|
+
frame_index = frame_manager.bindings.index(new_frame)
|
104
|
+
|
105
|
+
if frame_index
|
106
|
+
frame_index
|
107
|
+
else
|
108
|
+
raise Pry::CommandError, "No frame that matches #{regex.source} found!"
|
109
|
+
end
|
110
|
+
end
|
88
111
|
end
|
89
112
|
|
90
113
|
Commands = Pry::CommandSet.new do
|
91
|
-
create_command "up", "Go up to the caller's context.
|
114
|
+
create_command "up", "Go up to the caller's context." do
|
92
115
|
include FrameHelpers
|
93
116
|
|
94
117
|
banner <<-BANNER
|
95
118
|
Usage: up [OPTIONS]
|
96
119
|
Go up to the caller's context. Accepts optional numeric parameter for how many frames to move up.
|
97
|
-
|
98
|
-
e.g: up
|
120
|
+
Also accepts a string (regex) instead of numeric; for jumping to nearest parent method frame which matches the regex.
|
121
|
+
e.g: up #=> Move up 1 stack frame.
|
122
|
+
e.g: up 3 #=> Move up 2 stack frames.
|
123
|
+
e.g: up meth #=> Jump to nearest parent stack frame whose method matches /meth/ regex, i.e `my_method`.
|
99
124
|
BANNER
|
100
125
|
|
101
126
|
def process
|
102
|
-
inc = args.first.nil? ? 1 : args.first
|
127
|
+
inc = args.first.nil? ? "1" : args.first
|
103
128
|
|
104
129
|
if !frame_manager
|
105
130
|
raise Pry::CommandError, "Nowhere to go!"
|
106
131
|
else
|
107
|
-
|
132
|
+
if inc =~ /\d+/
|
133
|
+
frame_manager.change_frame_to frame_manager.binding_index + inc.to_i
|
134
|
+
elsif inc =~ /^[^-].*$/
|
135
|
+
new_frame_index = find_frame_by_regex(Regexp.new(inc), :up)
|
136
|
+
frame_manager.change_frame_to new_frame_index
|
137
|
+
end
|
108
138
|
end
|
109
139
|
end
|
110
140
|
end
|
111
141
|
|
112
|
-
create_command "down", "Go down to the callee's context.
|
142
|
+
create_command "down", "Go down to the callee's context." do
|
113
143
|
include FrameHelpers
|
114
144
|
|
115
145
|
banner <<-BANNER
|
116
146
|
Usage: down [OPTIONS]
|
117
147
|
Go down to the callee's context. Accepts optional numeric parameter for how many frames to move down.
|
118
|
-
|
119
|
-
e.g: down
|
148
|
+
Also accepts a string (regex) instead of numeric; for jumping to nearest child method frame which matches the regex.
|
149
|
+
e.g: down #=> Move down 1 stack frame.
|
150
|
+
e.g: down 3 #=> Move down 2 stack frames.
|
151
|
+
e.g: down meth #=> ump to nearest child stack frame whose method matches /meth/ regex, i.e `my_method`.
|
120
152
|
BANNER
|
121
153
|
|
122
154
|
def process
|
123
|
-
inc = args.first.nil? ? 1 : args.first
|
155
|
+
inc = args.first.nil? ? "1" : args.first
|
124
156
|
|
125
157
|
if !frame_manager
|
126
158
|
raise Pry::CommandError, "Nowhere to go!"
|
127
159
|
else
|
128
|
-
if
|
129
|
-
|
160
|
+
if inc =~ /\d+/
|
161
|
+
if frame_manager.binding_index - inc.to_i < 0
|
162
|
+
raise Pry::CommandError, "At bottom of stack, cannot go further!"
|
163
|
+
else
|
164
|
+
frame_manager.change_frame_to frame_manager.binding_index - inc.to_i
|
165
|
+
end
|
166
|
+
elsif inc =~ /^[^-].*$/
|
167
|
+
new_frame_index = find_frame_by_regex(Regexp.new(inc), :down)
|
168
|
+
frame_manager.change_frame_to new_frame_index
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
create_command "frame", "Switch to a particular frame." do
|
175
|
+
include FrameHelpers
|
176
|
+
|
177
|
+
banner <<-BANNER
|
178
|
+
Usage: frame [OPTIONS]
|
179
|
+
Switch to a particular frame. Accepts numeric parameter (or regex for method name) for the target frame to switch to (use with show-stack).
|
180
|
+
Negative frame numbers allowed. When given no parameter show information about the current frame.
|
181
|
+
|
182
|
+
e.g: frame 4 #=> jump to the 4th frame
|
183
|
+
e.g: frame meth #=> jump to nearest parent stack frame whose method matches /meth/ regex, i.e `my_method`
|
184
|
+
e.g: frame -2 #=> jump to the second-to-last frame
|
185
|
+
e.g: frame #=> show information info about current frame
|
186
|
+
BANNER
|
187
|
+
|
188
|
+
def process
|
189
|
+
if !frame_manager
|
190
|
+
raise Pry::CommandError, "nowhere to go!"
|
191
|
+
else
|
192
|
+
|
193
|
+
if args[0] =~ /\d+/
|
194
|
+
frame_manager.change_frame_to args[0].to_i
|
195
|
+
elsif args[0] =~ /^[^-].*$/
|
196
|
+
new_frame_index = find_frame_by_regex(Regexp.new(args[0]), :up)
|
197
|
+
frame_manager.change_frame_to new_frame_index
|
130
198
|
else
|
131
|
-
|
199
|
+
output.puts "##{frame_manager.binding_index} #{frame_info(target, true)}"
|
132
200
|
end
|
133
201
|
end
|
134
202
|
end
|
@@ -212,44 +280,5 @@ module PryStackExplorer
|
|
212
280
|
|
213
281
|
end
|
214
282
|
end
|
215
|
-
|
216
|
-
create_command "frame", "Switch to a particular frame. Accepts numeric parameter for the target frame to switch to (use with show-stack). Negative frame numbers allowed." do
|
217
|
-
include FrameHelpers
|
218
|
-
|
219
|
-
banner <<-BANNER
|
220
|
-
Usage: frame [OPTIONS]
|
221
|
-
Switch to a particular frame. Accepts numeric parameter (or regex for method name) for the target frame to switch to (use with show-stack).
|
222
|
-
Negative frame numbers allowed. When given no parameter show information about the current frame.
|
223
|
-
|
224
|
-
e.g: frame 4 #=> jump to the 4th frame
|
225
|
-
e.g: frame meth #=> jump to nearest parent stack frame whose method matches /meth/ regex, i.e `my_method`
|
226
|
-
e.g: frame -2 #=> jump to the second-to-last frame
|
227
|
-
e.g: frame #=> show information info about current frame
|
228
|
-
BANNER
|
229
|
-
|
230
|
-
def process
|
231
|
-
if !frame_manager
|
232
|
-
raise Pry::CommandError, "nowhere to go!"
|
233
|
-
else
|
234
|
-
|
235
|
-
if args[0] =~ /\d+/
|
236
|
-
frame_manager.change_frame_to args[0].to_i
|
237
|
-
elsif args[0] =~ /^[^-].*$/
|
238
|
-
new_frame_index = frame_manager.each_with_index.find_index do |b, i|
|
239
|
-
b.eval("__method__").to_s =~ Regexp.new(args[0]) && i > frame_manager.binding_index
|
240
|
-
end
|
241
|
-
|
242
|
-
if new_frame_index
|
243
|
-
frame_manager.change_frame_to new_frame_index
|
244
|
-
else
|
245
|
-
raise Pry::CommandError, "No parent frame that matches #{args[0]} found!"
|
246
|
-
end
|
247
|
-
|
248
|
-
else
|
249
|
-
output.puts "##{frame_manager.binding_index} #{frame_info(target, true)}"
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
283
|
end
|
255
284
|
end
|
data/pry-stack_explorer.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "pry-stack_explorer"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.4.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["John Mair (banisterfiend)"]
|
9
|
-
s.date = "2012-02-
|
9
|
+
s.date = "2012-02-17"
|
10
10
|
s.description = "Walk the stack in a Pry session"
|
11
11
|
s.email = "jrmair@gmail.com"
|
12
12
|
s.files = [".gemtest", ".gitignore", ".travis.yml", ".yardopts", "CHANGELOG", "Gemfile", "LICENSE", "README.md", "Rakefile", "examples/example.rb", "examples/example2.rb", "lib/pry-stack_explorer.rb", "lib/pry-stack_explorer/commands.rb", "lib/pry-stack_explorer/frame_manager.rb", "lib/pry-stack_explorer/version.rb", "lib/pry-stack_explorer/when_started_hook.rb", "pry-stack_explorer.gemspec", "test/helper.rb", "test/test_commands.rb", "test/test_frame_manager.rb", "test/test_stack_explorer.rb", "tester.rb"]
|
data/test/test_commands.rb
CHANGED
@@ -45,6 +45,44 @@ describe PryStackExplorer::Commands do
|
|
45
45
|
@o.first_method.should == :bang
|
46
46
|
@o.second_method.should == :bing
|
47
47
|
end
|
48
|
+
|
49
|
+
describe "by method name regex" do
|
50
|
+
it 'should move to the method name that matches the regex' do
|
51
|
+
redirect_pry_io(InputTester.new("@first_method = __method__",
|
52
|
+
"up bi",
|
53
|
+
"@second_method = __method__",
|
54
|
+
"exit-all"), out=StringIO.new) do
|
55
|
+
@o.bing
|
56
|
+
end
|
57
|
+
|
58
|
+
@o.first_method.should == :bang
|
59
|
+
@o.second_method.should == :bing
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should move through all methods that match regex in order' do
|
63
|
+
redirect_pry_io(InputTester.new("@first_method = __method__",
|
64
|
+
"up b",
|
65
|
+
"@second_method = __method__",
|
66
|
+
"up b",
|
67
|
+
"@third_method = __method__",
|
68
|
+
"exit-all"), out=StringIO.new) do
|
69
|
+
@o.bing
|
70
|
+
end
|
71
|
+
|
72
|
+
@o.first_method.should == :bang
|
73
|
+
@o.second_method.should == :bong
|
74
|
+
@o.third_method.should == :bing
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should error if it cant find frame to match regex' do
|
78
|
+
redirect_pry_io(InputTester.new("up conrad_irwin",
|
79
|
+
"exit-all"), out=StringIO.new) do
|
80
|
+
@o.bing
|
81
|
+
end
|
82
|
+
|
83
|
+
out.string.should =~ /Error: No frame that matches/
|
84
|
+
end
|
85
|
+
end
|
48
86
|
end
|
49
87
|
|
50
88
|
describe "down" do
|
@@ -75,6 +113,46 @@ describe PryStackExplorer::Commands do
|
|
75
113
|
@o.first_method.should == :bing
|
76
114
|
@o.second_method.should == :bang
|
77
115
|
end
|
116
|
+
|
117
|
+
describe "by method name regex" do
|
118
|
+
it 'should move to the method name that matches the regex' do
|
119
|
+
redirect_pry_io(InputTester.new("frame -1",
|
120
|
+
"down bo",
|
121
|
+
"@first_method = __method__",
|
122
|
+
"exit-all"), out=StringIO.new) do
|
123
|
+
@o.bing
|
124
|
+
end
|
125
|
+
|
126
|
+
@o.first_method.should == :bong
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should move through all methods that match regex in order' do
|
130
|
+
redirect_pry_io(InputTester.new("frame bing",
|
131
|
+
"@first_method = __method__",
|
132
|
+
"down b",
|
133
|
+
"@second_method = __method__",
|
134
|
+
"down b",
|
135
|
+
"@third_method = __method__",
|
136
|
+
"exit-all"), out=StringIO.new) do
|
137
|
+
@o.bing
|
138
|
+
end
|
139
|
+
|
140
|
+
@o.first_method.should == :bing
|
141
|
+
@o.second_method.should == :bong
|
142
|
+
@o.third_method.should == :bang
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should error if it cant find frame to match regex' do
|
146
|
+
redirect_pry_io(InputTester.new("frame -1",
|
147
|
+
"down conrad_irwin",
|
148
|
+
"exit-all"), out=StringIO.new) do
|
149
|
+
@o.bing
|
150
|
+
end
|
151
|
+
|
152
|
+
out.string.should =~ /Error: No frame that matches/
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
78
156
|
end
|
79
157
|
|
80
158
|
describe "frame" do
|
@@ -96,7 +174,7 @@ describe PryStackExplorer::Commands do
|
|
96
174
|
@o.bing
|
97
175
|
end
|
98
176
|
|
99
|
-
out.string.should =~ /Error: No
|
177
|
+
out.string.should =~ /Error: No frame that matches/
|
100
178
|
end
|
101
179
|
|
102
180
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: pry-stack_explorer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.4.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- John Mair (banisterfiend)
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-02-
|
13
|
+
date: 2012-02-17 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: binding_of_caller
|