pry-stack_explorer 0.2.3pre1 → 0.2.5pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +6 -1
- data/lib/pry-stack_explorer/version.rb +1 -1
- data/lib/pry-stack_explorer.rb +108 -28
- metadata +39 -31
data/Rakefile
CHANGED
@@ -22,7 +22,7 @@ def apply_spec_defaults(s)
|
|
22
22
|
s.email = 'jrmair@gmail.com'
|
23
23
|
s.description = s.summary
|
24
24
|
s.require_path = 'lib'
|
25
|
-
s.add_dependency("binding_of_caller","~>0.
|
25
|
+
s.add_dependency("binding_of_caller","~>0.6.0")
|
26
26
|
s.add_development_dependency("bacon","~>1.1.0")
|
27
27
|
s.homepage = "https://github.com/banister"
|
28
28
|
s.files = Dir["lib/**/*.rb", "test/*.rb", "CHANGELOG", "README.md", "Rakefile"]
|
@@ -33,6 +33,11 @@ task :pry do
|
|
33
33
|
exec("pry -I#{direc}/lib/ -r #{direc}/lib/#{PROJECT_NAME}")
|
34
34
|
end
|
35
35
|
|
36
|
+
desc "Run example"
|
37
|
+
task :example do
|
38
|
+
sh "ruby -I#{direc}/lib/ #{direc}/examples/example.rb "
|
39
|
+
end
|
40
|
+
|
36
41
|
desc "run tests"
|
37
42
|
task :test do
|
38
43
|
sh "bacon -Itest -rubygems -a"
|
data/lib/pry-stack_explorer.rb
CHANGED
@@ -7,12 +7,17 @@ require "binding_of_caller"
|
|
7
7
|
|
8
8
|
module PryStackExplorer
|
9
9
|
|
10
|
-
def self.
|
11
|
-
Thread.current[:
|
10
|
+
def self.add_frame_manager(bindings, _pry_)
|
11
|
+
Thread.current[:__pry_frame_managers__] ||= {}
|
12
|
+
Thread.current[:__pry_frame_managers__][_pry_] = FrameManager.new(bindings, _pry_)
|
12
13
|
end
|
13
14
|
|
14
|
-
def self.
|
15
|
-
Thread.current[:
|
15
|
+
def self.delete_frame_manager(_pry_)
|
16
|
+
Thread.current[:__pry_frame_managers__].delete(_pry_)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.frame_manager(_pry_)
|
20
|
+
Thread.current[:__pry_frame_managers__][_pry_]
|
16
21
|
end
|
17
22
|
|
18
23
|
def self.bindings_equal?(b1, b2)
|
@@ -26,9 +31,10 @@ module PryStackExplorer
|
|
26
31
|
attr_reader :binding_index
|
27
32
|
attr_accessor :bindings
|
28
33
|
|
29
|
-
def initialize(bindings)
|
34
|
+
def initialize(bindings, _pry_)
|
30
35
|
@bindings = bindings
|
31
36
|
@binding_index = 0
|
37
|
+
@pry = _pry_
|
32
38
|
end
|
33
39
|
|
34
40
|
def convert_from_one_index(n)
|
@@ -40,18 +46,43 @@ module PryStackExplorer
|
|
40
46
|
end
|
41
47
|
private :convert_from_one_index
|
42
48
|
|
43
|
-
def
|
49
|
+
def signature(b)
|
50
|
+
if b.eval('__method__')
|
51
|
+
"#{closure_type} in #{b.eval('self').class}##{b.eval('__method__')}"
|
52
|
+
else
|
53
|
+
if b.eval('self').is_a?(Module)
|
54
|
+
"#{closure_type} in <class:#{b.eval('self')}>"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def binding_info_for(b)
|
60
|
+
b_self = b.eval('self')
|
61
|
+
b_method = b.eval('__method__')
|
62
|
+
|
63
|
+
if b_method && b_method != :__binding__ && b_method != :__binding_impl__
|
64
|
+
b_method.to_s
|
65
|
+
elsif b_self.instance_of?(Module)
|
66
|
+
"<module:#{b_self}>"
|
67
|
+
elsif b_self.instance_of?(Class)
|
68
|
+
"<class:#{b_self}>"
|
69
|
+
else
|
70
|
+
"<main>"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def change_binding_to(index)
|
44
75
|
index = convert_from_one_index(index)
|
45
76
|
|
46
77
|
if index > bindings.size - 1
|
47
|
-
|
78
|
+
@pry.output.puts "Warning: At top of stack, cannot go further!"
|
48
79
|
elsif index < 0
|
49
|
-
|
80
|
+
@pry.output.puts "Warning: At bottom of stack, cannot go further!"
|
50
81
|
else
|
51
82
|
@binding_index = index
|
52
|
-
|
83
|
+
@pry.binding_stack[-1] = bindings[binding_index]
|
53
84
|
|
54
|
-
|
85
|
+
@pry.run_command "whereami"
|
55
86
|
end
|
56
87
|
end
|
57
88
|
end
|
@@ -60,41 +91,89 @@ module PryStackExplorer
|
|
60
91
|
command "up", "Go up to the caller's context" do |inc_str|
|
61
92
|
inc = inc_str.nil? ? 1 : inc_str.to_i
|
62
93
|
|
63
|
-
if !PryStackExplorer.frame_manager
|
94
|
+
if !PryStackExplorer.frame_manager(_pry_)
|
64
95
|
output.puts "Nowhere to go!"
|
65
96
|
else
|
66
|
-
binding_index = PryStackExplorer.frame_manager.binding_index
|
67
|
-
PryStackExplorer.frame_manager.change_binding_to binding_index + inc + 1
|
97
|
+
binding_index = PryStackExplorer.frame_manager(_pry_).binding_index
|
98
|
+
PryStackExplorer.frame_manager(_pry_).change_binding_to binding_index + inc + 1
|
68
99
|
end
|
69
100
|
end
|
70
101
|
|
71
102
|
command "down", "Go down to the callee's context." do |inc_str|
|
72
103
|
inc = inc_str.nil? ? 1 : inc_str.to_i
|
73
104
|
|
74
|
-
if !PryStackExplorer.frame_manager
|
105
|
+
if !PryStackExplorer.frame_manager(_pry_)
|
75
106
|
output.puts "Nowhere to go!"
|
76
107
|
else
|
77
|
-
binding_index = PryStackExplorer.frame_manager.binding_index
|
78
|
-
PryStackExplorer.frame_manager.change_binding_to binding_index - inc + 1
|
108
|
+
binding_index = PryStackExplorer.frame_manager(_pry_).binding_index
|
109
|
+
PryStackExplorer.frame_manager(_pry_).change_binding_to binding_index - inc + 1
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
command "show-stack", "Show all frames" do |*args|
|
114
|
+
opts = parse_options!(args) do |opt|
|
115
|
+
opt.banner unindent <<-USAGE
|
116
|
+
Usage: show-stack [OPTIONS]
|
117
|
+
Show all accessible stack frames.
|
118
|
+
e.g: show-stack -v
|
119
|
+
USAGE
|
120
|
+
|
121
|
+
opt.on :v, :verbose, "Include extra information."
|
122
|
+
end
|
123
|
+
|
124
|
+
if !PryStackExplorer.frame_manager(_pry_)
|
125
|
+
output.puts "No caller stack available!"
|
126
|
+
else
|
127
|
+
output.puts "\n#{text.bold('Showing all accessible frames in stack:')}\n--\n"
|
128
|
+
|
129
|
+
PryStackExplorer.frame_manager(_pry_).bindings.each_with_index do |b, i|
|
130
|
+
meth = b.eval('__method__')
|
131
|
+
b_self = b.eval('self')
|
132
|
+
|
133
|
+
desc = b.frame_description ? "#{text.bold('Description:')} #{b.frame_description}".ljust(40) :
|
134
|
+
"#{text.bold('Description:')} #{PryStackExplorer.frame_manager(_pry_).binding_info_for(b)}".ljust(40)
|
135
|
+
sig = meth ? "#{text.bold('Signature:')} #{Pry::Method.new(b_self.method(meth)).signature}".ljust(40) : "".ljust(32)
|
136
|
+
type = b.frame_type ? "#{text.bold('Type:')} #{b.frame_type}".ljust(20) : "".ljust(20)
|
137
|
+
slf = "#{text.bold('Self:')} #{b_self}".ljust(20)
|
138
|
+
path = "#{text.bold("@ File:")} #{b.eval('__FILE__')}:#{b.eval('__LINE__')}"
|
139
|
+
|
140
|
+
info = "##{i + 1} #{desc} #{sig} #{slf if opts[:v]} #{type \
|
141
|
+
if opts[:v]} #{path if opts[:v]}"
|
142
|
+
if i == PryStackExplorer.frame_manager(_pry_).binding_index
|
143
|
+
|
144
|
+
output.puts "=> #{info}"
|
145
|
+
else
|
146
|
+
output.puts " #{info}"
|
147
|
+
end
|
148
|
+
end
|
79
149
|
end
|
80
150
|
end
|
81
151
|
|
82
152
|
command "frame", "Switch to a particular frame." do |frame_num|
|
83
|
-
PryStackExplorer.frame_manager
|
153
|
+
if !PryStackExplorer.frame_manager(_pry_)
|
154
|
+
output.puts "nowhere to go!"
|
155
|
+
else
|
156
|
+
PryStackExplorer.frame_manager(_pry_).change_binding_to frame_num.to_i
|
157
|
+
end
|
84
158
|
end
|
85
159
|
|
86
160
|
command "frame-type", "Display current frame type." do
|
87
|
-
|
88
|
-
output.puts PryStackExplorer.frame_manager.bindings[bindex].frame_type
|
161
|
+
output.puts _pry_.binding_stack.last.frame_type
|
89
162
|
end
|
90
163
|
end
|
91
164
|
end
|
92
165
|
|
93
|
-
Pry.config.hooks.add_hook(:
|
94
|
-
|
95
|
-
|
166
|
+
Pry.config.hooks.add_hook(:after_session, :delete_frame_manager) do |_, _, _pry_|
|
167
|
+
PryStackExplorer.delete_frame_manager(_pry_)
|
168
|
+
end
|
169
|
+
|
170
|
+
Pry.config.hooks.add_hook(:when_started, :save_caller_bindings) do |binding_stack, _pry_|
|
171
|
+
target = binding_stack.last
|
172
|
+
|
173
|
+
if binding.of_caller(6).eval('__method__') == :pry
|
174
|
+
drop_number = 7
|
96
175
|
else
|
97
|
-
drop_number =
|
176
|
+
drop_number = 6
|
98
177
|
end
|
99
178
|
|
100
179
|
bindings = binding.callers.drop(drop_number)
|
@@ -107,7 +186,8 @@ Pry.config.hooks.add_hook(:when_started, :save_caller_bindings) do |target|
|
|
107
186
|
bindings.unshift(target)
|
108
187
|
end
|
109
188
|
|
110
|
-
|
189
|
+
binding_stack.replace([bindings.first])
|
190
|
+
PryStackExplorer.add_frame_manager(bindings, _pry_)
|
111
191
|
end
|
112
192
|
|
113
193
|
Pry.config.commands.import PryStackExplorer::StackCommands
|
@@ -115,12 +195,12 @@ Pry.config.commands.import PryStackExplorer::StackCommands
|
|
115
195
|
# monkey-patch the whereami command to show some frame information,
|
116
196
|
# useful for navigating stack.
|
117
197
|
Pry.config.commands.before_command("whereami") do |num|
|
118
|
-
if PryStackExplorer.frame_manager
|
119
|
-
bindings = PryStackExplorer.frame_manager.bindings
|
120
|
-
binding_index = PryStackExplorer.frame_manager.binding_index
|
198
|
+
if PryStackExplorer.frame_manager(_pry_)
|
199
|
+
bindings = PryStackExplorer.frame_manager(_pry_).bindings
|
200
|
+
binding_index = PryStackExplorer.frame_manager(_pry_).binding_index
|
121
201
|
|
122
202
|
output.puts "\n"
|
123
203
|
output.puts "#{Pry::Helpers::Text.bold('Frame number:')} #{binding_index + 1}/#{bindings.size}"
|
124
|
-
output.puts "#{Pry::Helpers::Text.bold('Frame type:')} #{bindings[binding_index].frame_type}"
|
204
|
+
output.puts "#{Pry::Helpers::Text.bold('Frame type:')} #{bindings[binding_index].frame_type}" if bindings[binding_index].frame_type
|
125
205
|
end
|
126
206
|
end
|
metadata
CHANGED
@@ -1,44 +1,48 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: pry-stack_explorer
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.3pre1
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease: 5
|
5
|
+
version: 0.2.5pre1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- John Mair (banisterfiend)
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2011-12-06 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: binding_of_caller
|
16
|
-
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
19
|
none: false
|
18
|
-
requirements:
|
20
|
+
requirements:
|
19
21
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.6.0
|
22
24
|
type: :runtime
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
26
27
|
name: bacon
|
27
|
-
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
30
|
none: false
|
29
|
-
requirements:
|
31
|
+
requirements:
|
30
32
|
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
33
|
+
- !ruby/object:Gem::Version
|
32
34
|
version: 1.1.0
|
33
35
|
type: :development
|
34
|
-
|
35
|
-
version_requirements: *70114011665900
|
36
|
+
version_requirements: *id002
|
36
37
|
description: Walk the stack in a Pry session
|
37
38
|
email: jrmair@gmail.com
|
38
39
|
executables: []
|
40
|
+
|
39
41
|
extensions: []
|
42
|
+
|
40
43
|
extra_rdoc_files: []
|
41
|
-
|
44
|
+
|
45
|
+
files:
|
42
46
|
- lib/pry-stack_explorer/version.rb
|
43
47
|
- lib/pry-stack_explorer.rb
|
44
48
|
- test/test.rb
|
@@ -47,26 +51,30 @@ files:
|
|
47
51
|
- Rakefile
|
48
52
|
homepage: https://github.com/banister
|
49
53
|
licenses: []
|
54
|
+
|
50
55
|
post_install_message:
|
51
56
|
rdoc_options: []
|
52
|
-
|
57
|
+
|
58
|
+
require_paths:
|
53
59
|
- lib
|
54
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
61
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version:
|
60
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
67
|
none: false
|
62
|
-
requirements:
|
63
|
-
- -
|
64
|
-
- !ruby/object:Gem::Version
|
68
|
+
requirements:
|
69
|
+
- - ">"
|
70
|
+
- !ruby/object:Gem::Version
|
65
71
|
version: 1.3.1
|
66
72
|
requirements: []
|
73
|
+
|
67
74
|
rubyforge_project:
|
68
|
-
rubygems_version: 1.8.
|
75
|
+
rubygems_version: 1.8.11
|
69
76
|
signing_key:
|
70
77
|
specification_version: 3
|
71
78
|
summary: Walk the stack in a Pry session
|
72
79
|
test_files: []
|
80
|
+
|