pry-stack_explorer 0.2.8pre8 → 0.2.8pre9
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 +4 -0
- data/lib/pry-stack_explorer.rb +8 -3
- data/lib/pry-stack_explorer/commands.rb +1 -1
- data/lib/pry-stack_explorer/frame_manager.rb +23 -11
- data/lib/pry-stack_explorer/version.rb +1 -1
- data/pry-stack_explorer.gemspec +4 -4
- data/test/helper.rb +1 -2
- data/test/test_commands.rb +130 -0
- data/test/test_stack_explorer.rb +210 -168
- metadata +4 -2
data/README.md
CHANGED
|
@@ -5,6 +5,10 @@ pry-stack_explorer
|
|
|
5
5
|
|
|
6
6
|
_Walk the stack in a Pry session_
|
|
7
7
|
|
|
8
|
+
**Please note, pry-stack_explorer has not been officially released yet and the prerelease gem that is available is NOT compatible with the current Pry gem (0.9.7.4).
|
|
9
|
+
The prerelease gem only exists for testing purposes among Pry core committers. This gem will be fully available soon, when the next Pry version (0.9.8) is released.**
|
|
10
|
+
|
|
11
|
+
|
|
8
12
|
pry-stack_explorer is a plugin for the [Pry](http://pry.github.com)
|
|
9
13
|
REPL that enables the user to navigate the call-stack.
|
|
10
14
|
|
data/lib/pry-stack_explorer.rb
CHANGED
|
@@ -26,7 +26,7 @@ module PryStackExplorer
|
|
|
26
26
|
# @param [Pry] _pry_ The Pry instance associated with the frame
|
|
27
27
|
# managers
|
|
28
28
|
# @return [Array] The stack of Pry::FrameManager objections
|
|
29
|
-
def self.
|
|
29
|
+
def self.frame_managers(_pry_)
|
|
30
30
|
init_frame_hash
|
|
31
31
|
Thread.current[:__pry_frame_managers__][_pry_]
|
|
32
32
|
end
|
|
@@ -45,6 +45,8 @@ module PryStackExplorer
|
|
|
45
45
|
Thread.current[:__pry_frame_managers__][_pry_].clear
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
class << self; alias_method :delete_frame_managers, :clear_frame_managers; end
|
|
49
|
+
|
|
48
50
|
# @return [PryStackExplorer::FrameManager] The currently active frame manager
|
|
49
51
|
def self.frame_manager(_pry_)
|
|
50
52
|
init_frame_hash
|
|
@@ -67,7 +69,9 @@ Pry.config.hooks.add_hook(:after_session, :delete_frame_manager) do |_, _, _pry_
|
|
|
67
69
|
end
|
|
68
70
|
|
|
69
71
|
Pry.config.hooks.add_hook(:when_started, :save_caller_bindings) do |binding_stack, options, _pry_|
|
|
70
|
-
options[:call_stack]
|
|
72
|
+
options[:call_stack] = true unless options.has_key?(:call_stack)
|
|
73
|
+
options[:initial_frame] = 0 unless options.has_key?(:initial_frame)
|
|
74
|
+
initial_frame = options[:initial_frame]
|
|
71
75
|
|
|
72
76
|
next if !options[:call_stack]
|
|
73
77
|
|
|
@@ -94,8 +98,9 @@ Pry.config.hooks.add_hook(:when_started, :save_caller_bindings) do |binding_stac
|
|
|
94
98
|
end
|
|
95
99
|
end
|
|
96
100
|
|
|
97
|
-
binding_stack.replace
|
|
101
|
+
binding_stack.replace [bindings[initial_frame]]
|
|
98
102
|
PryStackExplorer.create_and_push_frame_manager(bindings, _pry_)
|
|
103
|
+
PryStackExplorer.frame_manager(_pry_).set_binding_index_safely(initial_frame)
|
|
99
104
|
end
|
|
100
105
|
|
|
101
106
|
# Import the StackExplorer commands
|
|
@@ -21,7 +21,7 @@ module PryStackExplorer
|
|
|
21
21
|
else
|
|
22
22
|
binding_index = PryStackExplorer.frame_manager(_pry_).binding_index
|
|
23
23
|
if binding_index - inc < 0
|
|
24
|
-
|
|
24
|
+
raise Pry::CommandError, "At bottom of stack, cannot go further!"
|
|
25
25
|
else
|
|
26
26
|
PryStackExplorer.frame_manager(_pry_).change_frame_to binding_index - inc
|
|
27
27
|
end
|
|
@@ -41,8 +41,8 @@ module PryStackExplorer
|
|
|
41
41
|
|
|
42
42
|
# Ensure the Pry instance's active binding is the frame manager's
|
|
43
43
|
# active binding.
|
|
44
|
-
def refresh_frame
|
|
45
|
-
change_frame_to binding_index
|
|
44
|
+
def refresh_frame(run_whereami=true)
|
|
45
|
+
change_frame_to binding_index, run_whereami
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# @return [Binding] The currently active frame
|
|
@@ -50,24 +50,36 @@ module PryStackExplorer
|
|
|
50
50
|
bindings[binding_index]
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
# @param [Fixnum] index The index
|
|
56
|
-
def
|
|
57
|
-
|
|
53
|
+
# Set the binding index (aka frame index), but raising an Exception when invalid
|
|
54
|
+
# index received. Also converts negative indices to their positive counterparts.
|
|
55
|
+
# @param [Fixnum] index The index.
|
|
56
|
+
def set_binding_index_safely(index)
|
|
58
57
|
if index > bindings.size - 1
|
|
59
|
-
|
|
58
|
+
raise Pry::CommandError, "At top of stack, cannot go further!"
|
|
60
59
|
elsif index < -bindings.size
|
|
61
|
-
|
|
60
|
+
raise Pry::CommandError, "At bottom of stack, cannot go further!"
|
|
62
61
|
else
|
|
63
62
|
# wrap around negative indices
|
|
64
63
|
index = (bindings.size - 1) + index + 1 if index < 0
|
|
65
64
|
|
|
66
65
|
self.binding_index = index
|
|
67
|
-
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
# Change active frame to the one indexed by `index`.
|
|
70
|
+
# Note that indexing base is `0`
|
|
71
|
+
# @param [Fixnum] index The index of the frame.
|
|
72
|
+
def change_frame_to(index, run_whereami=true)
|
|
73
|
+
|
|
74
|
+
set_binding_index_safely(index)
|
|
75
|
+
|
|
76
|
+
if @pry.binding_stack.empty?
|
|
77
|
+
@pry.binding_stack.replace [bindings[binding_index]]
|
|
78
|
+
else
|
|
79
|
+
@pry.binding_stack[-1] = bindings[binding_index]
|
|
70
80
|
end
|
|
81
|
+
|
|
82
|
+
@pry.run_command "whereami" if run_whereami
|
|
71
83
|
end
|
|
72
84
|
|
|
73
85
|
end
|
data/pry-stack_explorer.gemspec
CHANGED
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |s|
|
|
4
4
|
s.name = "pry-stack_explorer"
|
|
5
|
-
s.version = "0.2.
|
|
5
|
+
s.version = "0.2.8pre9"
|
|
6
6
|
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
|
8
8
|
s.authors = ["John Mair (banisterfiend)"]
|
|
9
|
-
s.date = "2012-01-
|
|
9
|
+
s.date = "2012-01-08"
|
|
10
10
|
s.description = "Walk the stack in a Pry session"
|
|
11
11
|
s.email = "jrmair@gmail.com"
|
|
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", "pry-stack_explorer.gemspec", "test/helper.rb", "test/test_frame_manager.rb", "test/test_stack_explorer.rb", "tester.rb"]
|
|
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", "pry-stack_explorer.gemspec", "test/helper.rb", "test/test_commands.rb", "test/test_frame_manager.rb", "test/test_stack_explorer.rb", "tester.rb"]
|
|
13
13
|
s.homepage = "https://github.com/banister"
|
|
14
14
|
s.require_paths = ["lib"]
|
|
15
15
|
s.required_ruby_version = Gem::Requirement.new(">= 1.9.2")
|
|
16
16
|
s.rubygems_version = "1.8.11"
|
|
17
17
|
s.summary = "Walk the stack in a Pry session"
|
|
18
|
-
s.test_files = ["test/helper.rb", "test/test_frame_manager.rb", "test/test_stack_explorer.rb"]
|
|
18
|
+
s.test_files = ["test/helper.rb", "test/test_commands.rb", "test/test_frame_manager.rb", "test/test_stack_explorer.rb"]
|
|
19
19
|
|
|
20
20
|
if s.respond_to? :specification_version then
|
|
21
21
|
s.specification_version = 3
|
data/test/helper.rb
CHANGED
|
@@ -29,10 +29,9 @@ class << Pry
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
#Pry.config.hooks.clear(:before_session)
|
|
33
|
-
|
|
34
32
|
AfterSessionHook = Pry.config.hooks.get_hook(:after_session, :delete_frame_manager)
|
|
35
33
|
WhenStartedHook = Pry.config.hooks.get_hook(:when_started, :save_caller_bindings)
|
|
34
|
+
|
|
36
35
|
Pry.reset_defaults
|
|
37
36
|
|
|
38
37
|
class InputTester
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
|
|
3
|
+
describe PryStackExplorer::StackCommands do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
Pry.config.hooks.add_hook(:when_started, :save_caller_bindings, &WhenStartedHook)
|
|
7
|
+
Pry.config.hooks.add_hook(:after_session, :delete_frame_manager, &AfterSessionHook)
|
|
8
|
+
|
|
9
|
+
@o = Object.new
|
|
10
|
+
class << @o; attr_accessor :first_method, :second_method, :third_method; end
|
|
11
|
+
def @o.bing() bong end
|
|
12
|
+
def @o.bong() bang end
|
|
13
|
+
def @o.bang() Pry.start(binding) end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
after do
|
|
17
|
+
Pry.config.hooks.delete_hook(:when_started, :save_caller_bindings)
|
|
18
|
+
Pry.config.hooks.delete_hook(:after_session, :delete_frame_manager)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe "up" do
|
|
22
|
+
it 'should move up the call stack one frame at a time' do
|
|
23
|
+
redirect_pry_io(InputTester.new("@first_method = __method__",
|
|
24
|
+
"up",
|
|
25
|
+
"@second_method = __method__",
|
|
26
|
+
"up",
|
|
27
|
+
"@third_method = __method__",
|
|
28
|
+
"exit-all"), out=StringIO.new) do
|
|
29
|
+
@o.bing
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
@o.first_method.should == :bang
|
|
33
|
+
@o.second_method.should == :bong
|
|
34
|
+
@o.third_method.should == :bing
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'should move up the call stack two frames at a time' do
|
|
38
|
+
redirect_pry_io(InputTester.new("@first_method = __method__",
|
|
39
|
+
"up 2",
|
|
40
|
+
"@second_method = __method__",
|
|
41
|
+
"exit-all"), out=StringIO.new) do
|
|
42
|
+
@o.bing
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
@o.first_method.should == :bang
|
|
46
|
+
@o.second_method.should == :bing
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe "down" do
|
|
51
|
+
it 'should move down the call stack one frame at a time' do
|
|
52
|
+
def @o.bang() Pry.start(binding, :initial_frame => 1) end
|
|
53
|
+
|
|
54
|
+
redirect_pry_io(InputTester.new("@first_method = __method__",
|
|
55
|
+
"down",
|
|
56
|
+
"@second_method = __method__",
|
|
57
|
+
"exit-all"), out=StringIO.new) do
|
|
58
|
+
@o.bing
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
@o.first_method.should == :bong
|
|
62
|
+
@o.second_method.should == :bang
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should move down the call stack two frames at a time' do
|
|
66
|
+
def @o.bang() Pry.start(binding, :initial_frame => 2) end
|
|
67
|
+
|
|
68
|
+
redirect_pry_io(InputTester.new("@first_method = __method__",
|
|
69
|
+
"down 2",
|
|
70
|
+
"@second_method = __method__",
|
|
71
|
+
"exit-all"), out=StringIO.new) do
|
|
72
|
+
@o.bing
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
@o.first_method.should == :bing
|
|
76
|
+
@o.second_method.should == :bang
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe "frame" do
|
|
81
|
+
it 'should move to the given frame in the call stack' do
|
|
82
|
+
redirect_pry_io(InputTester.new("frame 2",
|
|
83
|
+
"@first_method = __method__",
|
|
84
|
+
"exit-all"), out=StringIO.new) do
|
|
85
|
+
@o.bing
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
@o.first_method.should == :bing
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "negative indices" do
|
|
92
|
+
it 'should work with negative frame numbers' do
|
|
93
|
+
o = Object.new
|
|
94
|
+
class << o; attr_accessor :frame; end
|
|
95
|
+
def o.alpha() binding end
|
|
96
|
+
def o.beta() binding end
|
|
97
|
+
def o.gamma() binding end
|
|
98
|
+
|
|
99
|
+
call_stack = [o.alpha, o.beta, o.gamma]
|
|
100
|
+
method_names = call_stack.map { |v| v.eval('__method__') }.reverse
|
|
101
|
+
(1..3).each_with_index do |v, idx|
|
|
102
|
+
redirect_pry_io(InputTester.new("frame -#{v}",
|
|
103
|
+
"@frame = __method__",
|
|
104
|
+
"exit-all"), out=StringIO.new) do
|
|
105
|
+
Pry.start(o, :call_stack => call_stack)
|
|
106
|
+
end
|
|
107
|
+
o.frame.should == method_names[idx]
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'should convert negative indices to their positive counterparts' do
|
|
112
|
+
o = Object.new
|
|
113
|
+
class << o; attr_accessor :frame_number; end
|
|
114
|
+
def o.alpha() binding end
|
|
115
|
+
def o.beta() binding end
|
|
116
|
+
def o.gamma() binding end
|
|
117
|
+
|
|
118
|
+
call_stack = [o.alpha, o.beta, o.gamma]
|
|
119
|
+
(1..3).each_with_index do |v, idx|
|
|
120
|
+
redirect_pry_io(InputTester.new("frame -#{v}",
|
|
121
|
+
"@frame_number = PryStackExplorer.frame_manager(_pry_).binding_index",
|
|
122
|
+
"exit-all"), out=StringIO.new) do
|
|
123
|
+
Pry.start(o, :call_stack => call_stack)
|
|
124
|
+
end
|
|
125
|
+
o.frame_number.should == call_stack.size - v
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
data/test/test_stack_explorer.rb
CHANGED
|
@@ -1,168 +1,210 @@
|
|
|
1
|
-
require 'helper'
|
|
2
|
-
|
|
3
|
-
describe PryStackExplorer do
|
|
4
|
-
|
|
5
|
-
describe "Pry.start" do
|
|
6
|
-
before do
|
|
7
|
-
Pry.config.hooks.add_hook(:when_started, :save_caller_bindings, &WhenStartedHook)
|
|
8
|
-
Pry.config.hooks.add_hook(:after_session, :delete_frame_manager, &AfterSessionHook)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
o.
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
PE.
|
|
128
|
-
PE.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
PE.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
PE.
|
|
145
|
-
PE.
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
PE.create_and_push_frame_manager(
|
|
152
|
-
PE.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
bindings
|
|
160
|
-
PE.
|
|
161
|
-
PE.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
1
|
+
require 'helper'
|
|
2
|
+
|
|
3
|
+
describe PryStackExplorer do
|
|
4
|
+
|
|
5
|
+
describe "Pry.start" do
|
|
6
|
+
before do
|
|
7
|
+
Pry.config.hooks.add_hook(:when_started, :save_caller_bindings, &WhenStartedHook)
|
|
8
|
+
Pry.config.hooks.add_hook(:after_session, :delete_frame_manager, &AfterSessionHook)
|
|
9
|
+
|
|
10
|
+
@o = Object.new
|
|
11
|
+
class << @o; attr_reader :frame; end
|
|
12
|
+
def @o.bing() bong end
|
|
13
|
+
def @o.bong() bang end
|
|
14
|
+
def @o.bang() Pry.start(binding) end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
after do
|
|
18
|
+
Pry.config.hooks.delete_hook(:when_started, :save_caller_bindings)
|
|
19
|
+
Pry.config.hooks.delete_hook(:after_session, :delete_frame_manager)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe ":initial_frame option" do
|
|
23
|
+
it 'should default to first frame when no option provided' do
|
|
24
|
+
redirect_pry_io(StringIO.new("@frame = __method__\nexit\n"), out=StringIO.new) do
|
|
25
|
+
@o.bing
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@o.frame.should == :bang
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'should begin session at specified frame' do
|
|
32
|
+
o = Object.new
|
|
33
|
+
class << o; attr_reader :frame; end
|
|
34
|
+
def o.bing() bong end
|
|
35
|
+
def o.bong() bang end
|
|
36
|
+
def o.bang() Pry.start(binding, :initial_frame => 1) end
|
|
37
|
+
|
|
38
|
+
redirect_pry_io(StringIO.new("@frame = __method__\nexit\n"), out=StringIO.new) do
|
|
39
|
+
o.bing
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
o.frame.should == :bong
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'should begin session at specified frame when using :call_stack' do
|
|
46
|
+
o = Object.new
|
|
47
|
+
class << o; attr_accessor :frame; end
|
|
48
|
+
def o.alpha() binding end
|
|
49
|
+
def o.beta() binding end
|
|
50
|
+
def o.gamma() binding end
|
|
51
|
+
|
|
52
|
+
redirect_pry_io(StringIO.new("@frame = __method__\nexit\n"), out=StringIO.new) do
|
|
53
|
+
Pry.start(binding, :call_stack => [o.gamma, o.beta, o.alpha], :initial_frame => 1)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
o.frame.should == :beta
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe ":call_stack option" do
|
|
62
|
+
it 'should invoke a session with the call stack set' do
|
|
63
|
+
redirect_pry_io(StringIO.new("show-stack\nexit\n"), out=StringIO.new) do
|
|
64
|
+
@o.bing
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
out.string.should =~ /bang.*?bong.*?bing/m
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'should set no call stack when :call_stack => false' do
|
|
71
|
+
o = Object.new
|
|
72
|
+
def o.bing() bong end
|
|
73
|
+
def o.bong() bang end
|
|
74
|
+
def o.bang() Pry.start(binding, :call_stack => false) end
|
|
75
|
+
|
|
76
|
+
redirect_pry_io(StringIO.new("show-stack\nexit\n"), out=StringIO.new) do
|
|
77
|
+
o.bing
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
out.string.should =~ /No caller stack/
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'should set custom call stack when :call_stack => [b1, b2]' do
|
|
84
|
+
o = Object.new
|
|
85
|
+
def o.alpha() binding end
|
|
86
|
+
def o.beta() binding end
|
|
87
|
+
def o.gamma() binding end
|
|
88
|
+
|
|
89
|
+
redirect_pry_io(StringIO.new("show-stack\nexit\n"), out=StringIO.new) do
|
|
90
|
+
Pry.start(binding, :call_stack => [o.beta, o.gamma, o.alpha])
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
out.string.should =~ /beta.*?gamma.*?alpha/m
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it 'should raise if custom call stack does not contain bindings or is empty' do
|
|
97
|
+
redirect_pry_io(StringIO.new("show-stack\nexit\n"), out=StringIO.new) do
|
|
98
|
+
lambda { Pry.start(binding, :call_stack => [1, 2, 3]) }.should.raise ArgumentError
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
redirect_pry_io(StringIO.new("show-stack\nexit\n"), out=StringIO.new) do
|
|
102
|
+
lambda { Pry.start(binding, :call_stack => []) }.should.raise ArgumentError
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe "unit tests for PryStackExplorer class methods" do
|
|
109
|
+
before do
|
|
110
|
+
@pry_instance = Pry.new
|
|
111
|
+
@bindings = [binding, binding]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
after do
|
|
115
|
+
PE.clear_frame_managers(@pry_instance)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe "PryStackExplorer.create_and_push_frame_manager" do
|
|
119
|
+
|
|
120
|
+
it "should create and push one new FrameManager" do
|
|
121
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
122
|
+
PE.frame_manager(@pry_instance).is_a?(PE::FrameManager).should == true
|
|
123
|
+
PE.frame_managers(@pry_instance).count.should == 1
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "should create and push multiple FrameManagers" do
|
|
127
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
128
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
129
|
+
PE.frame_managers(@pry_instance).count.should == 2
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'should push FrameManagers to stacks based on Pry instance' do
|
|
133
|
+
p2 = Pry.new
|
|
134
|
+
bindings = [binding, binding]
|
|
135
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
136
|
+
PE.create_and_push_frame_manager(bindings, p2)
|
|
137
|
+
PE.frame_managers(@pry_instance).count.should == 1
|
|
138
|
+
PE.frame_managers(p2).count.should == 1
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
describe "PryStackExplorer.frame_manager" do
|
|
143
|
+
it "should have the correct bindings" do
|
|
144
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
145
|
+
PE.frame_manager(@pry_instance).bindings.should == @bindings
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should return the last pushed FrameManager" do
|
|
149
|
+
bindings = [binding, binding]
|
|
150
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
151
|
+
PE.create_and_push_frame_manager(bindings, @pry_instance)
|
|
152
|
+
PE.frame_manager(@pry_instance).bindings.should == bindings
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "should return the correct FrameManager for the given Pry instance" do
|
|
156
|
+
bindings = [binding, binding]
|
|
157
|
+
p2 = Pry.new
|
|
158
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
159
|
+
PE.create_and_push_frame_manager(bindings, p2)
|
|
160
|
+
PE.frame_manager(@pry_instance).bindings.should == @bindings
|
|
161
|
+
PE.frame_manager(p2).bindings.should == bindings
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
describe "PryStackExplorer.pop_frame_manager" do
|
|
166
|
+
it "should remove FrameManager from stack" do
|
|
167
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
168
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
169
|
+
PE.pop_frame_manager(@pry_instance)
|
|
170
|
+
PE.frame_managers(@pry_instance).count.should == 1
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "should return the most recently added FrameManager" do
|
|
174
|
+
bindings = [binding, binding]
|
|
175
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
176
|
+
PE.create_and_push_frame_manager(bindings, @pry_instance)
|
|
177
|
+
PE.pop_frame_manager(@pry_instance).bindings.should == bindings
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
it "should remove FrameManager from the appropriate stack based on Pry instance" do
|
|
181
|
+
p2 = Pry.new
|
|
182
|
+
bindings = [binding, binding]
|
|
183
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
184
|
+
PE.create_and_push_frame_manager(bindings, p2)
|
|
185
|
+
PE.pop_frame_manager(@pry_instance)
|
|
186
|
+
PE.frame_managers(@pry_instance).count.should == 0
|
|
187
|
+
PE.frame_managers(p2).count.should == 1
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
describe "PryStackExplorer.clear_frame_managers" do
|
|
192
|
+
it "should clear all FrameManagers for a Pry instance" do
|
|
193
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
194
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
195
|
+
PE.clear_frame_managers(@pry_instance)
|
|
196
|
+
PE.frame_managers(@pry_instance).count.should == 0
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "should clear all FrameManagers for a Pry instance" do
|
|
200
|
+
p2 = Pry.new
|
|
201
|
+
bindings = [binding, binding]
|
|
202
|
+
PE.create_and_push_frame_manager(@bindings, @pry_instance)
|
|
203
|
+
PE.create_and_push_frame_manager(bindings, p2)
|
|
204
|
+
PE.clear_frame_managers(@pry_instance)
|
|
205
|
+
PE.frame_managers(p2).count.should == 1
|
|
206
|
+
PE.frame_managers(@pry_instance).count.should == 0
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
metadata
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: pry-stack_explorer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: 5
|
|
5
|
-
version: 0.2.
|
|
5
|
+
version: 0.2.8pre9
|
|
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-01-
|
|
13
|
+
date: 2012-01-08 00:00:00 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: binding_of_caller
|
|
@@ -82,6 +82,7 @@ files:
|
|
|
82
82
|
- lib/pry-stack_explorer/version.rb
|
|
83
83
|
- pry-stack_explorer.gemspec
|
|
84
84
|
- test/helper.rb
|
|
85
|
+
- test/test_commands.rb
|
|
85
86
|
- test/test_frame_manager.rb
|
|
86
87
|
- test/test_stack_explorer.rb
|
|
87
88
|
- tester.rb
|
|
@@ -114,5 +115,6 @@ specification_version: 3
|
|
|
114
115
|
summary: Walk the stack in a Pry session
|
|
115
116
|
test_files:
|
|
116
117
|
- test/helper.rb
|
|
118
|
+
- test/test_commands.rb
|
|
117
119
|
- test/test_frame_manager.rb
|
|
118
120
|
- test/test_stack_explorer.rb
|